Я думаю, что код ниже решит вашу проблему. Однако, поскольку нам нужно использовать альтернативный шаблон поиска, функциональности поиска Word будет недостаточно. Чтобы компенсировать это, я создал закладку (невидимый маркер в Word, к которому можно получить доступ через код VBA), где бы ни была скобка, и использовал эту систему для чередования шаблона поиска.
Первый шаг - создание закладок. Два отдельных поиска - по одному для левой и правой скобок - завершают это. Каждой закладке присваивается имя «Закладка» с добавлением номера, чтобы они имели цифровую маркировку в порядке появления.
Public Sub PlaceBookmarks()
Dim SearchRange As Range
Dim BookmarkRange As Range
Dim x As Integer
x = 1
Set SearchRange = ActiveDocument.Range
SearchRange.Find.ClearFormatting
With SearchRange.Find
.Text = "(\])"
.Forward = True
.Wrap = wdFindStop 'end bookmark creation at end of document
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
While .Execute
If .Found = True Then
.Parent.Select
Selection.Collapse
Selection.MoveRight unit:=wdCharacter, Count:=1 'place bookmark to right of bracket
Set BookmarkRange = Selection.Range
ActiveDocument.Bookmarks.Add "Bookmark" & x, BookmarkRange
x = x + 2
End If
Wend
End With
x = 2
Set SearchRange = ActiveDocument.Range
SearchRange.Find.ClearFormatting
With SearchRange.Find
.Text = "(\[)"
.Forward = True
.Wrap = wdFindStop 'end bookmark creation at end of document
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
While .Execute
If .Found = True Then
.Parent.Select
Selection.Collapse
Selection.MoveRight unit:=wdCharacter, Count:=1 'place bookmark to right of bracket
Set BookmarkRange = Selection.Range
ActiveDocument.Bookmarks.Add "Bookmark" & x, BookmarkRange
x = x + 2
End If
Wend
End With
End Sub
Далее следует добавить код для настройки расположения закладок, определения диапазона необходимого текста и выполнения любых необходимых операций. Я настроил расположение закладок так, чтобы диапазон текста, необходимый для поиска, не включал скобки. Если вам нужно включить скобки в текст, который проходит упомянутые вами проверки, то при необходимости измените его.
Public Sub FindRange()
Dim BookmarkCount As Integer
Dim x As Integer
Dim BookmarkRange As Range
Dim FirstPatternRange As Range
BookmarkCount = ActiveDocument.Bookmarks.Count
With ActiveDocument
For x = 1 To BookmarkCount
If .Bookmarks.Exists("Bookmark" & x + 1) Then
'Move end bookmark to exclude bracket
.Bookmarks("Bookmark" & x + 1).Select
Selection.MoveLeft unit:=wdCharacter, Count:=1
Set BookmarkRange = Selection.Range
.Bookmarks.Add "Bookmark" & x + 1, BookmarkRange 'this moves the bookmark by re-adding it
Set FirstPatternRange = .Range(.Bookmarks("Bookmark" & x).Range.Start, .Bookmarks("Bookmark" & x + 1).Range.End)
'Perform checks on data between ][
'Move leading bookmark to exclude bracket
.Bookmarks("Bookmark" & x + 1).Select
Selection.MoveRight unit:=wdCharacter, Count:=1
Set BookmarkRange = Selection.Range
.Bookmarks.Add "Bookmark" & x + 1, BookmarkRange 'this moves the bookmark by re-adding it
'Move trailing bookmark to exclude bracket
.Bookmarks("Bookmark" & x + 2).Select
Selection.MoveLeft unit:=wdCharacter, Count:=1
Set BookmarkRange = Selection.Range
.Bookmarks.Add "Bookmark" & x + 2, BookmarkRange 'this moves the bookmark by re-adding it
Set FirstPatternRange = .Range(.Bookmarks("Bookmark" & x + 1).Range.Start, .Bookmarks("Bookmark" & x + 2).Range.End)
'Perform checks on data between []
'Reset trailing bookmark for next iteration
.Bookmarks("Bookmark" & x + 2).Select
Selection.MoveRight unit:=wdCharacter, Count:=1
Set BookmarkRange = Selection.Range
.Bookmarks.Add "Bookmark" & x + 2, BookmarkRange 'this moves the bookmark by re-adding it
x = x + 1
End If
Next
End With
End Sub
Если вы планируете выполнять операции VBA над текстом в будущем, вы, вероятно, захотите написать For Each / Next, чтобы удалить все созданные закладки. Надеюсь, это поможет.