使用正则表达式从excel vba宏中搜索word文件

时间:2016-09-06 13:45:02

标签: regex excel vba ms-word

我有大量的txt文件,我想搜索特定的单词。我的方法是使用excel宏在word中打开txt文件,然后搜索我在excel文件中提供的单词列表的每个出现。它给出了一个列表,列出了每个文档中每个单词的出现频率。我已设法使用以下代码:

Sub CounterofWords()

Application.ScreenUpdating = False

    Dim wdApp As Word.Application
    Set wdApp = CreateObject("Word.application")
    wdApp.Visible = False

For d = 1 To 23

    Dim wdDoc As Word.Document


    FName = "C:\Users\Andreas\Desktop\test\" & Cells(d + 1, 11) & "_htm.txt"
    On Error GoTo txtdesign
    Set wdDoc = wdApp.Documents.Open(filename:=FName)

i = 15

Do While Cells(1, i) <> ""

iCount = 0
Application.ScreenUpdating = False

With wdApp.Selection.Find
 .ClearFormatting
 .Text = Cells(1, i).Value
        Do While .Execute
            iCount = iCount + 1
            wdApp.Selection.MoveRight
        Loop
End With
Cells(d + 1, i).Value = iCount

i = i + 1
Loop





wdDoc.Close savechanges:=False
Set wdDoc = Nothing

Next d

wdApp.Quit
Set wdApp = Nothing

Application.ScreenUpdating = True

Exit Sub

txtdesign:
FName = "C:\Users\Andreas\Desktop\test\" & Cells(d + 1, 11) & "_txt.txt"
Resume

End Sub

Here you can see the relevant part of my spreadsheet, where I ran the macro for the first 23 documents.

到目前为止一切正常。现在我希望能够搜索正则表达式。我需要这样做以避免在我的搜索中使用某些单词组合。

似乎是一个问题,我不能写像

With wdApp.Selection.regex

无论如何,我不知道如何在这种情况下使正则表达式工作并感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

VBA中的Find方法使用此标志限制了模式匹配:

Selection.Find.MatchWildcards = True

注意:您的代码无法获得正确的结果,因为搜索每个单词的位置都是从前一个单词在文档中停止的位置开始的。您需要“移动”到每个文档的顶部:

Selection.HomeKey Unit:=wdStory

但是如果你需要使用正则表达式进行更复杂的模式匹配,那么在引用“Microsoft VBScript Regular Expressions 5.5”之后,你需要使用RegExp类的不同方法。请参阅此SO问题的接受答案中的一个很好的解释:How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops

以下是使用正则表达式的示例:

Do While Cells(1, i) <> ""
    Application.ScreenUpdating = False
    Dim regEx As New RegExp
    Dim Matches As MatchCollection

    With regEx
        .Global = True
        .IgnoreCase = True
        .Pattern = Cells(1, i).Value
    End With

    Set Matches = regEx.Execute(wdDoc.Content.Text)
    Cells(d + 1, i).Value = Matches.Count
    i = i + 1
Loop