Как я могу искать несколько слов в одной функции в VBA в Word? - PullRequest
0 голосов
/ 28 октября 2019

У меня есть макрос, который ищет слово («январь») и преобразует пространство рядом с ним в защищенное пространство. То, что я хотел бы сделать, это искать и другие месяцы года. Есть ли способ поиска других месяцев в рамках одной и той же функции, вместо того, чтобы копировать и вставлять мой код 11 раз, каждый раз находя другой месяц? Вот мой код до сих пор. Меня интересует только изменение строки поиска, если это возможно, так как все остальное работает нормально, и я не очень хорош в VBA, в принципе, все остальное очень быстро становится слишком запутанным. Lol.

У меня есть другаяФункция поиска, которая делает то же самое, но после любой цифры ("([0-9])") и работает, я просто хочу сократить 12 потенциальных функций поиска до одной.


Dim sFindText As String
    sFindText = "January "
    Selection.Find.Execute sFindText
    Do Until Selection.Find.Found = False
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.TypeBackspace
    Selection.TypeText Text:=" "
    Selection.Find.Execute
    Loop
End Sub

Ответы [ 3 ]

1 голос
/ 06 ноября 2019

Следующий код работает для меня.

Он начинается с помещения названий месяцев в массив. В цикле в массиве каждое имя отправляется в процедуру FindMonths вместе с объектом Range, который нужно найти. Ввод кода, который должен повторяться в своей собственной процедуре, избавляет от необходимости набирать его.

Обратите внимание, как процесс Find работает с Range (а не Selection объектом). Как правило, отслеживание происходящего более надежно с диапазоном, чем с выбором.

Обратите внимание, также, что после обработки одного "найденного" Range устанавливается для расширения от точки после того, как найден один экземпляр месяца, до конца документа. Это гарантирует, что будет найден весь, а не только первый экземпляр месяца.

Sub ProcessMonths()
    Dim sFindText As String
    Dim aMonths As Variant
    Dim i As Long

    aMonths = Array("January", "February", "March", "April", "May", "June", "July", "August", _
                    "September", "October", "November", "December")
    For i = LBound(aMonths) To UBound(aMonths)
        sFindText = aMonths(i)
        FindMonths sFindText, ActiveDocument.content
    Next
End Sub

Sub FindMonths(month As String, searchRange As Range)
    Dim bFound As Boolean

    bFound = searchRange.Find.Execute(month)
    Do While bFound
        searchRange.Collapse wdCollapseEnd
        searchRange.Delete wdCharacter, 1
        searchRange.Text = Chr(160)
        searchRange.End = searchRange.Document.content.End
        bFound = searchRange.Find.Execute(month)
    Loop

End Sub
0 голосов
/ 28 октября 2019

For Each звучит как хороший шаг вперед. Вот пример того, как я поместил бы ваш код (непроверенный) в блок For Each с циклом по массиву месяцев года.

Dim item As Variant
Dim months(1 To 2) as String
Dim str As String

months(1) = "January ": months(2) = "February "

For Each item In months
    Selection.Find.Execute item
    Do Until Selection.Find.Found = False
        Selection.MoveRight Unit:=wdCharacter, Count:=1
        Selection.TypeBackspace
        Selection.TypeText Text:=" "
        Selection.Find.Execute
    Loop
Next
0 голосов
/ 28 октября 2019

Да, создайте массив месяцев, а затем выполните цикл для каждого из них. Просто:

Dim arrMonths() As Variant
Dim i As Long

arrMonths = Array("Jan", "Feb", ..., "Dec")

For i = LBound(arrMonths) To UBound(arrMonths)
    sFindText = arrMonths(i)
    Selection.Find.Execute sFindText
    Do Until Selection.Find.Found = False
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.TypeBackspace
    Selection.TypeText Text:=" "
    Selection.Find.Execute
    Loop
Next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...