выполнение поиска и замены в слове документа из Excel VBA - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь открыть определенные шаблоны Word на основе данных из Excel (эта часть работает).Затем, когда шаблон открыт, я пытаюсь выполнить поиск на основе тегов в документе Excel и заменяю их соответствующими данными в том же столбце.Когда я запускаю макрос, он открывает шаблон и просто вращается и вращается, не давая мне вывод.Вот код:

` Sub New_Purification_SOP()
    '
    ' New_Purification_SOP Macro
    ''Open an existing Word Document from Excel
      Dim objWord As Object
      Dim myValue As Variant
      Dim PurCol As Variant
     'open input box requesting line of the material to be made
      myValue = InputBox("Select Row to create SOP")

      Set objWord = CreateObject("Word.Application")
      objWord.Visible = True
      'Change the directory path and file name to the location
      'of the document you want to open from Excel
       If ActiveSheet.Cells(myValue, 10) = "Supe" And _
          ActiveSheet.Cells(myValue, 12) = "IgG1" Then
         objWord.Documents.Open "S:\generic filename"
         With objWord
            For PurCol = 3 To 13 'move through columns left to right
               TagName = .Cells(10, PurCol).Value 'get tag name from row
               TagValue = .Cells(myValue, PurCol).Value 'get tag name from row
               With objWord.Content.Find
                     .Text = TagName
                     .Replacement.Text = TagValue
                     .Wrap = wdFindContinue
                     .Execute Replace:=wdReplaceAll  'Forward = True, Wrap = _ 
                        wdFindContinue
                End With
            Next PurCol
       End With`
...

Я очень новичок в VBA, поэтому, пожалуйста, критикуйте столько, сколько пожелаете.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Проблема связана с использованием Find.Wrap = wdFindContinue в вашем коде.

Это свойство инструктирует Word продолжать выполнять поиск - что-то вроде того, как пользователь постоянно нажимает «Найти далее» в диалоговом окне.Его редко (больше как никогда) следует использовать при кодировании, так как это может привести к бесконечному циклу, как в этом случае.

В этом случае, поскольку используется wdReplaceAll - это означает, что код завершаетсяза один шаг - Wrap не обязательно указывать.Но в целом хорошей практикой является использование Find.Wrap = wdFindStop.

0 голосов
/ 01 июня 2018

Возможно, вы захотите включить обработку ошибок в ваше открытие / создание объекта word.Я обнаружил, что если у меня уже есть экземпляр слова, это может привести к сбою приложения.Это может способствовать вашей проблеме с вашей программой.

source: https://stackoverflow.com/questions/17177412/close-release-word-object-in-vba
On Error Resume Next
Set objWord = GetObject(, "Word.Application")

'We've tried to get Word but if it's nothing then it isn't open
If objWord Is Nothing Then
    Set objWord = CreateObject("Word.Application")
End If

'It's good practice to reset error warnings
On Error GoTo 0

После этого поиск и замена неисправностей может оказаться болезненной задачей.В этой статье вы узнаете, почему: https://gregmaxey.com/word_tip_pages/words_fickle_vba_find_property.html. Что вы можете сделать, это использовать макрос-рекордер для проверки кода поиска / замены, а затем просто поднять его в свой цикл.Это может сэкономить много времени на отладку.

...