1

Тема: Положение курсора внутри поля

Здравствуйте.

Подскажите, как проверить что курсор находится внутри значения поля (например Ref).
Связанно с этим: как определить что в выделенном фрагменте находится ЧАСТЬ значения поля.

С уважением

2

Re: Положение курсора внутри поля

Начиная с Word 2013 появилось такое:

Selection.Information(wdInFieldCode)
Selection.Information(wdInFieldResult)
Макросы под заказ и готовый пакет - mtdmacro.ru

3

Re: Положение курсора внутри поля

А в 2010 ?

4

Re: Положение курсора внутри поля

Для старых версий Word, можно использовать:

Selection.NextField
Selection.PreviousField 
Range.GoToPrevious(wdGoToField)
Range.GoToNext(wdGoToField)

Это переходы к соседним полям. Извратившись, можно определить и то поле, где курсор сейчас.

Макросы под заказ и готовый пакет - mtdmacro.ru

5

Re: Положение курсора внутри поля

Да, блин. Извращаться придется по полной:
1. Запомнить позицию
2. Перейти к следующему полю (если таково будет!, а если нет?)
3. Выделить предыдущее поле
4. Сравнить запомненную позицию с текущим выделением
Жесть!

Не может такого быть, что бы не было другого ответа. Ведь при ЛКМ по тексту, являющемуся полем мы в контекстном меню имеем пункты связанные с полями.

6

Re: Положение курсора внутри поля

Ну да, там сложный замут с этими переходами.

Есть еще поиск (либо ^d, либо символов с кодом 19 и 21), но он работает только в режиме промотра кодов полей.

Макросы под заказ и готовый пакет - mtdmacro.ru

7

Re: Положение курсора внутри поля

А такой вариант подойдет?

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

8

Re: Положение курсора внутри поля

Boris_R пишет:

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) ' предположительно оно, если существует
Макросы под заказ и готовый пакет - mtdmacro.ru

9

Re: Положение курсора внутри поля

Boris_R, такой вариант не пройдет, потому как даже при нахождении курсора внутри поля myRange.Fields.Count вернет значение ноль. Поле будет засчитано только в том случае если оно целиком находится внутри myRange.

Вождь, это касается и R.Fields.Count.

Нужна функция, которая однозначно дает ответ о нахождении в диапазоне выделения хотя бы части диапазона поля.

10

Re: Положение курсора внутри поля

mikkelle пишет:

Boris_R, такой вариант не пройдет...
Вождь, это касается и R.Fields.Count...

А в чем проблема? Осталось только проверить существование поля F и попадание Selection в область этого поля, то есть в области F.Code и F.Result. Простейшие операции.

Целиком макрос не писал, так как непонятно, что вам нужно проверить: Selection целиком внутри поля или пересечение Selection с полем.

Макросы под заказ и готовый пакет - mtdmacro.ru

11

Re: Положение курсора внутри поля

А такой код подойдет?

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 работает

12

Re: Положение курсора внутри поля

Boris_R пишет:

А такой код подойдет?...

Изменение 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
Макросы под заказ и готовый пакет - mtdmacro.ru

13

Re: Положение курсора внутри поля

Потратил выходные дни на попытку отыскать "фирменное решение" от производителя. К своему сожалению ничего пока найти не удается. Такое ощущение, что этот вопрос не поднимался ранее.
Буду благодарен за рекомендации в "направлениях поиска".

14

Re: Положение курсора внутри поля

mikkelle пишет:

..."фирменное решение" от производителя...

Вот оно и появилось в Word 2013. Из этого делаем вывод, что раньше ничего похожего не было sad

Макросы под заказ и готовый пакет - mtdmacro.ru

15

Re: Положение курсора внутри поля

Еще раз хочу заметить:

mikkelle пишет:

Не может такого быть, что бы не было другого ответа. Ведь при ЛКМ по тексту, являющемуся полем мы в контекстном меню имеем пункты связанные с полями.

Эта же функция как то реализовывалась!?

16

Re: Положение курсора внутри поля

mikkelle пишет:

Эта же функция как то реализовывалась!?

Это VBA идет как дополнение к Word, а не наоборот smile Что разработчики захотели, то и вынесли в VBA. Много чего нет.

Макросы под заказ и готовый пакет - mtdmacro.ru