VBA: 从模板创建新文档,搜索和替换文本
VBA: Create new document from template, search and replace text
我试了一整天都没有找到合适的解决方案,论坛是我最后的希望。
我想达到什么目的?
我有一个 Word 模板(.dotm 文件),我基于它创建了一个新文档。
在新文档中,我想用另一个值替换某个文本。
然后应使用替换的文本保存该文件。
这已经有效了:
- 创建新文件
- 正在保存新文件
当我尝试替换文本时出现以下情况:
要替换的文本在模板中被替换。新文件保持不变。
我尝试过什么来解决这个问题?
- 激活新文档所在的 Word 实例。
- 设置选择和范围(我很难控制选择对象中是否有正确的选择)。
我的代码是这样的:
'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 文件的程序。
我寻求帮助并感谢任何想法!
抱歉我的代码中有德语注释,请随时提问 :)
已经非常感谢了!
使用您发布的代码不可能更改模板中的任何内容,除非您已经打开模板并且它是活动文档。
您的代码一团糟,因为它在 wdDocument
、ActiveDocument
和 Selection
之间切换。
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
我试了一整天都没有找到合适的解决方案,论坛是我最后的希望。
我想达到什么目的? 我有一个 Word 模板(.dotm 文件),我基于它创建了一个新文档。 在新文档中,我想用另一个值替换某个文本。 然后应使用替换的文本保存该文件。
这已经有效了:
- 创建新文件
- 正在保存新文件
当我尝试替换文本时出现以下情况: 要替换的文本在模板中被替换。新文件保持不变。
我尝试过什么来解决这个问题?
- 激活新文档所在的 Word 实例。
- 设置选择和范围(我很难控制选择对象中是否有正确的选择)。
我的代码是这样的:
'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 文件的程序。
我寻求帮助并感谢任何想法!
抱歉我的代码中有德语注释,请随时提问 :)
已经非常感谢了!
使用您发布的代码不可能更改模板中的任何内容,除非您已经打开模板并且它是活动文档。
您的代码一团糟,因为它在 wdDocument
、ActiveDocument
和 Selection
之间切换。
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