VBA: 从模板创建新文档,搜索和替换文本

VBA: Create new document from template, search and replace text

我试了一整天都没有找到合适的解决方案,论坛是我最后的希望。

我想达到什么目的? 我有一个 Word 模板(.dotm 文件),我基于它创建了一个新文档。 在新文档中,我想用另一个值替换某个文本。 然后应使用替换的文本保存该文件。

这已经有效了:

当我尝试替换文本时出现以下情况: 要替换的文本在模板中被替换。新文件保持不变。

我尝试过什么来解决这个问题?

我的代码是这样的:

'Platzierungsdatei öffnen
Set excel = CreateObject("excel.application")
excel.Workbooks.Open FileName:=pfadUrkunden

'Word Instanz öffnen
Dim wdDocument As Object
Dim Word As Object
Set Word = CreateObject("Word.Application")
 
Do While excel.Worksheets("TN").Cells(iIndex, 1).Value <> ""
    sName = excel.Worksheets("TN").Cells(iIndex, 1).Value
     
    Set wdDocument = Word.Documents.Add(vorlagePfad)
    Word.Visible = True
    '[Vorname Nachname] ersetzen
    Word.Activate
    ActiveDocument.Shapes.Range(Array("Textfeld 2")).Select
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "[Vorname Nachname]"
        .Replacement.Text = sName
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
     
    ausgabeOrdner = ausgabeOrdner & "\" & sName
    wdDocument.SaveAs (ausgabeOrdner)

    '+55 um nur einen Eintrag zu testen
    iIndex = iIndex + 55
Loop
 
Word.Quit
Set Word = Nothing

excel.Quit

我有 Office 365,正在尝试 运行 来自 .dotm 文件的程序。

我寻求帮助并感谢任何想法!

抱歉我的代码中有德语注释,请随时提问 :)

已经非常感谢了!

使用您发布的代码不可能更改模板中的任何内容,除非您已经打开模板并且它是活动文档

您的代码一团糟,因为它在 wdDocumentActiveDocumentSelection 之间切换。

ActiveDocument 应替换为 wdDocument,因为这是您的代码应该使用的文档。这消除了与其他打开的文档混淆的任何可能性,并且避免了激活工作文档的需要。

最好避免

Selection,因为在 VBA 中工作时很少需要 select 任何东西。由于您不会 select 编辑任何内容,因此无需使 Word 可见。

Set wdDocument = Word.Documents.Add(vorlagePfad)
'[Vorname Nachname] ersetzen
With wdDocument.Shapes("Textfeld 2").TextFrame.TextRange.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "[Vorname Nachname]"
    .Replacement.Text = sName
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Execute Replace:=wdReplaceAll
End With