从Excel VBA

时间:2018-06-01 13:39:26

标签: excel vba excel-vba replace ms-word

我正在尝试根据Excel中的数据打开特定的Word模板(该部分正在运行)。然后,一旦模板打开,我试图根据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 :(得分:0)

您可能希望在打开/创建单词对象时包含错误处理。我发现,如果我已经有一个单词的实例,它实际上可能会崩溃应用程序。这可能会导致您的程序出现问题。

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。您可能想要做的是使用宏录制器检查查找/替换代码,然后将其提升到循环中。它可以节省大量的调试时间。

答案 1 :(得分:0)

问题来自于在代码中使用Find.Wrap = wdFindContinue

此属性指示Word继续执行查找 - 类似于用户持续按下"查找下一个"在对话框中。它应该很少(更像是从不)在编码时使用,因为它可能导致非结束循环,如本例所示。

在这种情况下,由于正在使用wdReplaceAll - 意味着代码在一个步骤中完成 - Wrap并不一定需要指定。但通常的好习惯是使用Find.Wrap = wdFindStop