首页 > 解决方案 > 如何在 Word 中的 VBA 中的一个函数中搜索多个单词?

问题描述

我有一个宏,它可以搜索一个单词(“January”)并将其旁边的空间转换为受保护的空间。我想做的是搜索一年中的其他月份。有没有办法在同一个函数中搜索其他月份,而不是复制和粘贴我的代码 11 次,每次都搜索不同的月份?到目前为止,这是我的代码。我只对更改搜索文本行感兴趣,如果可能的话,因为其余的工作正常而且我不太擅长 VBA,基本上其他任何事情都会很快变得太混乱哈哈。

我有另一个搜索功能,它的功能相同,但跟随任何数字(“([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

标签: vbams-word

解决方案


以下代码适用于我。

它首先将月份名称放入一个数组中。在数组的循环中,每个名称与要搜索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

推荐阅读