ОБНОВЛЕНИЕ: Следуя предложению Синди ниже, я использовал функцию 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, который я до сих пор не полностью понимаю. Я не программист, я просто техник-писатель-самоучка в некотором кодировании, задача которого - автоматизировать преобразование документов.
Должен быть лучший способ сравнить точку выбора, чтобы проверить, находится ли она в пределах именованного диапазона, но я не могу ее найти. Любые указатели, которые вы можете дать мне, искренне приветствуются!