Тема: Положение курсора внутри поля
Здравствуйте.
Подскажите, как проверить что курсор находится внутри значения поля (например Ref).
Связанно с этим: как определить что в выделенном фрагменте находится ЧАСТЬ значения поля.
С уважением
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте.
Подскажите, как проверить что курсор находится внутри значения поля (например Ref).
Связанно с этим: как определить что в выделенном фрагменте находится ЧАСТЬ значения поля.
С уважением
Начиная с Word 2013 появилось такое:
Selection.Information(wdInFieldCode)
Selection.Information(wdInFieldResult)
А в 2010 ?
Для старых версий Word, можно использовать:
Selection.NextField
Selection.PreviousField
Range.GoToPrevious(wdGoToField)
Range.GoToNext(wdGoToField)
Это переходы к соседним полям. Извратившись, можно определить и то поле, где курсор сейчас.
Да, блин. Извращаться придется по полной:
1. Запомнить позицию
2. Перейти к следующему полю (если таково будет!, а если нет?)
3. Выделить предыдущее поле
4. Сравнить запомненную позицию с текущим выделением
Жесть!
Не может такого быть, что бы не было другого ответа. Ведь при ЛКМ по тексту, являющемуся полем мы в контекстном меню имеем пункты связанные с полями.
Ну да, там сложный замут с этими переходами.
Есть еще поиск (либо ^d, либо символов с кодом 19 и 21), но он работает только в режиме промотра кодов полей.
А такой вариант подойдет?
Sub cur_in_field()
Dim myRange As Range
Dim i As Long
Set myRange = Selection.Range
myRange.Expand Unit:=wdWord
If myRange.Fields.Count > 0 Then
MsgBox "курсор находится в поле"
Else
MsgBox "курсор не находится в поле"
End If
End Sub
Expand Unit:=wdWord
Не пройдет в режиме кодов, может и еще когда.
Нашел попроще вариант, если использовать свойство Field.Index:
Dim R As Range, F As Field, i As Long
Set R = Selection.Range
R.Start = 0
i = R.Fields.Count
Set F = R.Fields(i) ' предположительно оно, если существует
Boris_R, такой вариант не пройдет, потому как даже при нахождении курсора внутри поля myRange.Fields.Count вернет значение ноль. Поле будет засчитано только в том случае если оно целиком находится внутри myRange.
Вождь, это касается и R.Fields.Count.
Нужна функция, которая однозначно дает ответ о нахождении в диапазоне выделения хотя бы части диапазона поля.
Boris_R, такой вариант не пройдет...
Вождь, это касается и R.Fields.Count...
А в чем проблема? Осталось только проверить существование поля F и попадание Selection в область этого поля, то есть в области F.Code и F.Result. Простейшие операции.
Целиком макрос не писал, так как непонятно, что вам нужно проверить: Selection целиком внутри поля или пересечение Selection с полем.
А такой код подойдет?
Sub ChecField()
'Проверка нахождения курсора внутри поля
Dim i As Long
Dim myRange As Range
Dim selRange As Range
Set selRange = Selection.Range 'запоминаем положение курсора
Set myRange = ActiveDocument.Characters(1)
If selRange.Fields.Count > 0 Then
MsgBox "Внутри выделения находятся поля в количестве " & selRange.Fields.Count & "шт."
Exit Sub
End If
myRange.End = Selection.End + 1
myRange.Select 'если курсор внутри поля, то после выполнения метода .Select
' выделение расширяется до конца поля (за исключением случая,
' когда курсор находится перед первым символом поля
' поэтому расширяем диапазон на символ
i = Selection.Fields.Count
If Selection.Range.End - 1 > selRange.End Then
MsgBox "Выделение находится внутри поля" & vbCr & "Code = " & ActiveDocument.Fields(i).Code & vbCr _
& "Result = " & ActiveDocument.Fields(i).Result & vbCr
Else: MsgBox "курсор не находится в поле"
End If
selRange.Select 'восстанавливаем положение курсора
End Sub
На моих примерах с полями REF работает
А такой код подойдет?...
Изменение Selection - как бы минус, в работу не вникал.
Самому нужен похожий макрос, потому сваял это:
Function Range_InField(ByRef oRange As Range, Optional ByRef oField As Field) As Boolean
' проверка нахождения области внутри поля
' (схлопнутая область с края поля, не считается внутри)
' oRange - вход: проверяемая облаять
' oField - выход: поле, внутри которого находится область
' возврат: True, если область внутри поля
Range_InField = False
Set oField = Nothing
If oRange Is Nothing Then Exit Function
Dim R As Range, F As Field, i As Long
Set R = oRange.Duplicate
i = R.Fields.Count
' несколько полей
If i > 1 Then Exit Function
' одно поле
If i = 1 Then
Set F = R.Fields(1)
If oRange.Start < F.Code.Start - 1 Then Exit Function
If oRange.End > F.Result.End + 1 Then Exit Function
' пересечение с полем
Else
R.Start = 0
i = R.Fields.Count
If R.Fields.Count <= 0 Then Exit Function
Set F = R.Fields(i)
If oRange.End < F.Code.Start Then Exit Function
If oRange.Start > F.Result.End Then Exit Function
End If
' успех
Set oField = F
Range_InField = True
End Function
Потратил выходные дни на попытку отыскать "фирменное решение" от производителя. К своему сожалению ничего пока найти не удается. Такое ощущение, что этот вопрос не поднимался ранее.
Буду благодарен за рекомендации в "направлениях поиска".
..."фирменное решение" от производителя...
Вот оно и появилось в Word 2013. Из этого делаем вывод, что раньше ничего похожего не было
Еще раз хочу заметить:
mikkelle пишет:
Не может такого быть, что бы не было другого ответа. Ведь при ЛКМ по тексту, являющемуся полем мы в контекстном меню имеем пункты связанные с полями.
Эта же функция как то реализовывалась!?
Эта же функция как то реализовывалась!?
Это VBA идет как дополнение к Word, а не наоборот Что разработчики захотели, то и вынесли в VBA. Много чего нет.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться