我正在使用带有用户表单的Word模板。用户打开模板以启动新文档,并在表单中输入数据。然后将数据插入文档中的书签。我正在使用以下子项在书签中插入数据。传递给sub的变量是要插入文本的书签的名称,以及要插入的文本。
Public Sub UpdateBookmark(BookmarkToUpdate As String, ByVal TextToUse As String)
Dim BMRange As Range
Set BMRange = ActiveDocument.Bookmarks(BookmarkToUpdate).Range
BMRange.Text = TextToUse
ActiveDocument.Bookmarks.Add BookmarkToUpdate, BMRange
End Sub
这很好用,除了在某些情况下用户在填写表单之前会标记到其他word文档。当他们这样做时,焦点留在他们使用的另一个文档上,因此我对ActiveDocument的引用意味着脚本在另一个文档而不是新模板文档中查找书签。
是否有替代方法可以使用ActiveDocument查找从模板创建的新文档中的书签?或者有没有办法告诉我的脚本更改焦点(激活)正在执行它的新文档?
非常感谢任何建议 - 我花了很长时间用谷歌搜索和试验但是找不到适用于这个特定问题的解决方案(或者我只是对Word对象模型不够了解我自己)。
答案 0 :(得分:0)
有几种方法可以处理它,最简单的方法是对全局/公共变量进行范围化并在过程的早期(即,在打开UserForm之前或在{{1期间)分配它}或_Initialize
事件程序)。
_Activate
注意公共变量Set myDocument = ActiveDocument
'Or alternatively,
' = Documents.Add(...) etc.
必须位于普通代码模块中,而不是类或用户表单模块。
然后在您的表单过程中,将Public myDocument as Document
替换为变量:
ActiveDocument
或者你可以更狭窄地调整范围,但是你需要将它传递给需要它的程序,例如:
Public Sub UpdateBookmark(BookmarkToUpdate As String, ByVal TextToUse As String)
Dim BMRange As Range
Set BMRange = myDocument.Bookmarks(BookmarkToUpdate).Range
BMRange.Text = TextToUse
myDocument.Bookmarks.Add BookmarkToUpdate, BMRange
End Sub
修改程序:
Call UpdateBookmark(myDocument, BookmarkToUpdate, TextToUse)
进一步阅读:
虽然这是使用Excel中的示例,但是当您可以更有效地直接引用它们时,相同的一般原则适用于避免依赖选择和激活对象。 / p>
How to avoid using Select in Excel VBA macros
(Word不是我的专业领域,根据我有限的经验,避免在Word中使用Public Sub UpdateBookmark(myDocument as Document, BookmarkToUpdate As String, ByVal TextToUse As String)
Dim BMRange As Range
Set BMRange = myDocument.Bookmarks(BookmarkToUpdate).Range
BMRange.Text = TextToUse
myDocument.Bookmarks.Add BookmarkToUpdate, BMRange
End Sub
对象更加困难