我希望在excel中创建一个via脚本,用excel中的一些文本替换word doc中的文本持有者。
我可以使用via脚本打开doc这个单词,然后以新名称保存doc。但它不会执行替换文本部分:(
Private Sub CommandButton1_Click()
Dim wdApp As Object
Dim wdDoc As Object
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = False
Set wdDoc = wdApp.Documents.Open("temp.docx")
With wdDoc.Content.Find
.ClearFormatting
.Text = "<<name>>"
With .Replacement
.ClearFormatting
.Font.Bold = True
.Text = "John Smith"
End With
.Execute Replace:=wdReplaceAll
End With
wdDoc.SaveAs2 Filename:=("temp2.docx")
Set wdApp = Nothing
Set wdDoc = Nothing
End Sub
我试过在这里做搜索,但看不到我错在哪里:(
目前它打开word文档并将其保存在新名称下,但不替换查找并替换文本。任何人都可以看到我出错的地方,并告诉我如何做到正确吗?
答案 0 :(得分:0)
当我在Word中为您的问题描述设置测试时,输入&lt;&lt; name&gt;&gt;我看到Word用特殊符号替换了两个带角度的括号。并且它提供了撤消自动更正的可能性。
在它们上查询ASC(Selection.Text)会给出Chr(171)和Chr(187),它们也是双角括号符号,但在Find中使用它们不起作用。查询AscW()显示两个符号是Unicode 8810和8811,因此需要对它们进行不同的搜索。
假设您的案例中存在问题,则以下方法有效:
With wdDoc.content.Find
.ClearFormatting
.Text = ChrW(8810) & "name" & ChrW(8811) '"<<name>>"
With .Replacement
.ClearFormatting
.Font.Bold = True
.Text = "John Smith"
End With
.Execute Replace:=wdReplaceAll
End With
除了你的代码之外 - 还有其他可能严重的问题(内存泄漏):
如果你这样做:wdApp.Visible = False
那么你需要绝对肯定从内存中删除Word:
wdDoc.Close
wdApp.Quit
Set wdDoc = Nothing
Set wdApp = Nothing
与Excel不同,Word在对象超出范围(宏结束)时不会自动退出。它将保持打开状态,您可以在任务管理器中看到它。
此外,您需要按照实例化它们的相反顺序释放对象 - wdDoc 之前 wdApp。
答案 1 :(得分:0)
在Word文档中设置一些DocVariables,然后在Excel中运行下面的代码。
Sub PushToWord()
Dim objWord As New Word.Application
Dim doc As Word.Document
Dim bkmk As Word.Bookmark
sWdFileName = Application.GetOpenFilename(, , , , False)
Set doc = objWord.Documents.Open(sWdFileName)
'On Error Resume Next
objWord.ActiveDocument.variables("BrokerFirstName").Value = Range("BrokerFirstName").Value
objWord.ActiveDocument.variables("BrokerLastName").Value = Range("BrokerLastName").Value
objWord.ActiveDocument.variables("Ryan").Value = Range("Ryan").Value
objWord.ActiveDocument.Fields.Update
'On Error Resume Next
objWord.Visible = True
End Sub
您可以通过在Word中设置书签,并将数据从Excel中的字段推送到Word中的字段(书签)来使用基本相同的过程。
Sub PushToWord()
Dim objWord As New Word.Application
Dim doc As Word.Document
Dim bkmk As Word.Bookmark
sWdFileName = Application.GetOpenFilename(, , , , False)
Set doc = objWord.Documents.Open(sWdFileName)
On Error Resume Next
ActiveDocument.Variables("BrokerFirstName").Value = Range("B1").Value
ActiveDocument.Variables("BrokerLastName").Value = Range("B2").Value
ActiveDocument.Fields.Update
On Error Resume Next
objWord.Visible = True
End Sub
答案 2 :(得分:-3)
着名的希望 - 为所有带有标题的现场案例设置一个按钮:&#34;让它好起来!&#34;
在部分上划分任务:
- 从excel中获取&#34; ...文本...&#34;
- &#34;替换word doc中的文字...&#34;在previouse步骤中从Excel中获取文本
通过两个单独的程序为每个任务执行,
从第三个程序召集他们。