Хобрук: Ваш путь к мастерству в программировании

Использование регулярного выражения для поиска в текстовом файле из макроса excel vba

У меня есть большое количество txt-файлов, в которых я хочу найти определенные слова. Мой подход заключается в использовании макроса excel для открытия файлов 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

Здесь вы можете увидеть соответствующую часть моей электронной таблицы, где я запускал макрос для первых 23 документов.< /а>

Пока все работает нормально. Теперь я хочу иметь возможность искать регулярные выражения. Мне это нужно, например, чтобы избежать определенных комбинаций слов в моем поиске.

Кажется, проблема в том, что я не могу написать что-то вроде

With wdApp.Selection.regex

В любом случае, я не знаю, как заставить регулярное выражение работать в такой ситуации, и ценю вашу помощь!


Ответы:


1

Метод Find в VBA имеет ограниченное сопоставление с образцом, используя этот флаг:

Selection.Find.MatchWildcards = True

Примечание: ваш код не даст правильных результатов, поскольку поиск каждого слова начинается с того места, где в документе заканчивалось предыдущее. Вам нужно «переместиться» в начало документа для каждого из них:

Selection.HomeKey Unit:=wdStory

Но если вам нужно более сложное сопоставление с образцом с использованием регулярных выражений, вам понадобится другой подход, используя класс RegExp после ссылки на «Регулярные выражения Microsoft VBScript 5.5». Посмотрите отличное объяснение в принятом ответе на этот вопрос SO: in-cell-and-loops">Как использовать регулярные выражения (Regex) в Microsoft Excel как в ячейке, так и в циклах.

Вот пример использования регулярного выражения:

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
06.09.2016
  • Спасибо за вашу помощь. Мне нужен класс RegExp, и я уже просмотрел упомянутую вами статью. К сожалению, я не могу понять, как заставить его работать в моем случае, когда я хочу использовать регулярное выражение для поиска слова из макроса vba excel. 06.09.2016
  • @AndreasK: я добавил пример кода с использованием регулярного выражения, который ожидает, что ваш шаблон регулярного выражения будет на листе Excel, а не в терминах поиска в виде обычного текста. Посмотрите, если это ответ, который вы ищете. 08.09.2016
  • Новые материалы

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..