VBA поиск заменить текст в текстовом документе из Excel - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь создать документ Excel, в который я могу вставить список слов для поиска и замены.Я хочу использовать документ Excel для поиска и замены этих слов в текстовом документе.

У меня возникли проблемы с получением кода для работы.

Sub SearchReplace()

Dim WordDoc As Object, N As Variant, i As Integer, j As Integer
i = Range("C2").Value  'pulls length of list from an excel function located in cell C2
N = Range("B4:C" & CStr(i + 3)).Value
Set WordDoc = CreateObject(Class:="Word.Application")
    WordDoc.Visible = True
WordDoc.Documents.Open Filename:="C:\WordTest.docm"
WordDoc.Activate
With WordDoc.ActiveDocument
    For j = 1 To i
    With .Range
        With .Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .MatchWildcards = False
            .Wrap = wdFindContinue
            .Text = N(1, j)
            .Replacement.Text = N(2, j)
            .Execute
         End With
    End With
    Next j
End With
WordDoc.Quit
Set WordDoc = Nothing
End Sub

Я исправил код на основерекомендации, и я больше не получаю никаких ошибок.Однако, похоже, что код не находит и не заменяет что-либо в указанном документе word.Я попытался упростить код, чтобы проверить часть поиска и замены, набрав определенное слово «текст» и определенное слово «заменить», чтобы найти и заменить в документе слова, который содержит слово «текст».Это по-прежнему не приводит к изменениям.Я удалил строку, которая закрывала документ на тот случай, если проблема заключалась в том, что документ не был сохранен после обновления, но это также не увенчалось успехом, поэтому я добавил WordDoc.Quit обратно в код.

Sub SearchReplace()

Dim WordDoc As Object, N As Variant, i As Integer, j As Integer

i = Range("C2").Value  'pulls length of list from an excel function 
located in cell C2
N = Range("B4:C" & CStr(i + 3)).Value
Set WordDoc = CreateObject(Class:="Word.Application")
WordDoc.Visible = True
WordDoc.Documents.Open Filename:="C:\WordTest.docm"
WordDoc.Documents("WordTest.docm").Activate
With WordDoc.ActiveDocument
For j = 1 To i
With .Range
    With .Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .MatchWildcards = False
        .Wrap = 1
        .Text = "text" 'N(j, 1)
        .Replacement.Text = "replace" 'N(j, 2)
        .Execute 2
     End With
End With
Next j
End With
WordDoc.Quit
Set WordDoc = Nothing
End Sub

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Мне удалось получить код для работы.Код выполняет поиск в указанном документе Microsoft Word из Excel, используя список строк поиска и замены из листа Excel (B4: B5004 (поиск), C4: C5005 (замена)), хранящихся в массиве в коде.

Чтобы код работал, мне нужно было включить библиотеку объектов Microsoft Word 16.

Из окна редактора Excel VBA.Инструменты> Ссылки, а затем убедитесь, что проверена библиотека объектов Microsoft Word 16.0.

Option Explicit

Sub SearchReplace()

   Dim WordApp As Object, WordDoc As Object, N As Variant, i As Integer, j As Integer
   i = Range("C2").Value  'pulls length of list from an excel function located in cell C2 =COUNTIF(B4:B5005,"*")
   N = Range("B4:C" & CStr(i + 3)).Value
   Set WordApp = CreateObject(Class:="Word.Application")
   Set WordDoc = WordApp.Documents.Open("C:\WordTest.docm")    
   WordDoc.Visible = True
   For j = 1 To i
        With WordApp
           With WordDoc.Content.Find
                .Text = N(j, 1)
                .Replacement.Text = N(j, 2)
                .Wrap = wdFindContinue
                .MatchWholeWord = True
                .Execute Replace:=wdReplaceAll
          End With
        End With
    Next j
    WordApp.ActiveDocument.Save
    WordApp.ActiveDocument.Close
    WordApp.Quit

    Set WordApp = Nothing
    Set WordDoc = Nothing
End Sub
0 голосов
/ 14 ноября 2018

Проблема «Ошибка компиляции: переменная не определена» связана с использованием вами позднего связывания с именованной константой Word.Либо измените

.Wrap = wdFindContinue

на:

.Wrap =  1

или вставьте:

Const wdFindContinue as Long = 1

вверху кода.

В любом случаев существующем коде ваш существующий код ничего не заменит.Вместо:

.Execute

вам необходимо либо:

.Execute 2

, либо:

.Execute wdReplaceAll

(для замены всех экземпляров), либо:

.Execute 1

или:

.Execute wdReplaceOne

(для замены только первого экземпляра)

Как и в случае с wdFindContinue, вам необходимо дополнить wdReplaceAll или wdReplaceOne с помощью:

Const wdReplaceAll as Long = 2

или:

Const wdReplaceOne as Long = 1

в зависимости от ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...