Visual Basic в Word: сравнить выделение в пределах диапазона - PullRequest
0 голосов
/ 26 октября 2018

ОБНОВЛЕНИЕ: Следуя предложению Синди ниже, я использовал функцию InRange. Моя функция выполняет итерации через операцию поиска. Но функция не может вернуть FALSE, когда выбор находится за пределами именованного диапазона. См. «Сбой здесь» ниже. Спасибо.

Используя Visual Basic, мне нужно проверить, находится ли место выбора в документе Word в пределах именованного диапазона. Много лет назад я использовал этот код для этого:

ActiveDocument.Bookmarks("typdef").Select

While ((WordBasic.CmpBookmarks("\Sel", "typedef") = 8 _
Or WordBasic.CmpBookmarks("\Sel", "typedef") = 6 _
Or WordBasic.CmpBookmarks("\Sel", "typedef") = 10) _
And leaveloop <> 1
...
If WordBasic.CmpBookmarks("\Sel", "\EndOfDoc") = 0 Then
    leaveloop = 1
End If
Wend

Вот обновленная функция, которую я написал:

Function FormatSpecHeadReturn(strStyle)

Dim rngBookmark As Word.Range
Dim rngSelection As Word.Range

Set rngBookmark = ActiveDocument.Bookmarks("SpecBodyPairRange").Range
Set rngSelection = Selection.Range

var = rngSelection.InRange(rngBookmark)
Debug.Print var

Do While rngSelection.InRange(rngBookmark) = True

Selection.Find.Style = ActiveDocument.Styles(strStyle)
Selection.Find.Replacement.ClearFormatting
With Selection.Find
    .Text = "^p"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindAsk
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute
Selection.HomeKey

' FAILING HERE: Returns TRUE when selection point 
' is outside SpecBodyPairRange
var = rngSelection.InRange(rngBookmark)
Debug.Print var

Selection.HomeKey Unit:=wdLine, Extend:=wdMove
Selection.InsertBefore Chr(182)
Selection.EndKey
Selection.InsertAfter vbTab
Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdMove

    If rngSelection.InRange(rngBookmark) <> True Then Exit Do
  Loop
End Function

Я использовал CmpBookmarks в этом текущем проекте, но он не возвращал достоверно значение текущего местоположения. Когда точка выбора находится в пределах именованного диапазона, она возвращает 8 для двух циклов, а затем возвращает 6. Когда точка выбора находится за пределами именованного диапазона, CmpBookmarks возвращает 6.

Очевидно, что CmpBookmarks устарела. Я не могу найти возвращаемые значения, которые производит CmpBookmarks, и я не могу найти современную эквивалентную функцию.

Признаюсь, я не понимаю разницу между именованным диапазоном "SpecBodyPairRange" и диапазоном, назначенным для r, здесь:

Dim R As Range

Я вижу, что в данном случае буква r содержит весь документ. Я изучал интерфейс диапазона и интерфейс выбора в Microsoft.Office.Interop.Word, который я до сих пор не полностью понимаю. Я не программист, я просто техник-писатель-самоучка в некотором кодировании, задача которого - автоматизировать преобразование документов.

Должен быть лучший способ сравнить точку выбора, чтобы проверить, находится ли она в пределах именованного диапазона, но я не могу ее найти. Любые указатели, которые вы можете дать мне, искренне приветствуются!

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Чтобы определить, находится ли один Range в другом, используйте метод InRange:

Dim rngBookmark as Word.Range
Dim rngSelection as Word.Range

Set rngBookmark = ActiveDocument.Bookmarks("typeDef").Range
Set rngSelection = Selection.Range
If rngSelection.InRange(rngBookmark) = True Then
  'Do something
End If
0 голосов
/ 26 октября 2018

Вы можете использовать метод InRange VBA. Например:

Function FormatSpecHeadReturn(strStyle)
Dim Rng As Range
With ActiveDocument
  Set Rng = .Bookmarks("SpecBodyPairRange").Range
  With .Bookmarks("SpecBodyPairRange").Range
    With .Find
      .ClearFormatting
      .Replacement.ClearFormatting
      .Text = "^p"
      .Replacement.Text = ""
      .Style = strStyle
      .Format = True
      .Forward = True
      .Wrap = wdFindStop
      .MatchWildcards = False
      .Execute
    End With
    Do While .Find.Found
      If .InRange(Rng) = False Then Exit Do
      .Style = "SpecHead"
      .Paragraphs.First.InsertBefore Chr(182)
      .InsertAfter vbTab
      .Collapse wdCollapseEnd
      .Find.Execute
    Loop
  End With
End With
End Function
0 голосов
/ 26 октября 2018

Не большой человек Word VBA, но вы можете просто сравнить свойства Start и End?

Dim bm As Bookmark

Set bm = ActiveDocument.Bookmarks("tester")
Debug.Print "Bookmark", bm.Start, bm.End
Debug.Print "Selection", Selection.Start, Selection.End
...