我正在尝试编写一个宏,该宏在打开Word文档时将子文档添加到Word文档的末尾。有问题的文档中已经有一些文本,因此在运行宏之前,我想将光标移动到文档的末尾。我可以使用以下代码来实现此目的:Selection.EndKey Unit:=wdStory
在打开文档后运行宏 时效果很好,但是如果我使用Sub在打开文档后立即运行宏:
Private Sub Document_Open()
Selection.EndKey Unit:=wdStory
'Add subdocuments based on user input to a form
'(See edit below)
End Sub
在ThisDocument对象中,子文档添加在文档的开头。这可能是因为光标尚未出现,所以Selection
尚未“存在”。
在打开文档时如何运行宏,但是在文档末尾添加子文档?
我尝试过先写出空格以使光标产生但没有变化...
也欢迎其他方法的建议。
编辑: ThisDocument中的代码:
Private Sub Document_Open()
CreateWorkbook.Show
End Sub
调用表格CreateWorkbook,并单击按钮:
Private Sub GenerateButton_Click()
Dim i As Integer
Dim rng As Word.Range
Set rng = ActiveDocument.Content
rng.Collapse wdCollapseEnd
'ModulesListBox is a user input box that is a list of paths to the subdocuments
For i = 0 To ModulesListBox.ListCount - 1
docpath = ModulesListBox.List(i)
rng.Subdocuments.AddFromFile docpath
Next i
End Sub
答案 0 :(得分:1)
由于Document_Open
事件首先调用UserForm,因此Word确实需要访问文档的机会。以下在我的测试中起作用。
'ThisDocument code:
Option Explicit
Private Sub Document_Open()
Dim f As UserForm1
Set f = New UserForm1
Set f.rng = ThisDocument.Content
f.Show
End Sub
请注意如何将用户表单声明为对象-UserForm实际上是 class (与ThisDocument相同),但是VBA允许您处理它而无需专门编码为类。通常,这是可行的,但并非总是如此。因此,声明了该对象,并为其分配了UserForm类的新实例。
Range
在UserForm类中声明为类级别的公共成员。在Open事件中将其设置为文档的正文。
然后显示用户窗体,下面的代码。
此时,可以访问Range对象,并且可以进行实际工作。也就是说,似乎Subdocuments.AddFromFile
依赖于选择,就像它依赖于“大纲视图”一样。这可能是 ,因为该功能可以追溯到WordBasic的旧时代,并且从未更改为遵守VBA原则。
'Code in the UserForm
Option Explicit
Public rng As Word.Range
Private Sub CommandButton1_Click()
Me.rng.Collapse 0
'rng.Text = "Test text"
ThisDocument.ActiveWindow.View = wdOutlineView
Me.rng.Select
Selection.Range.Subdocuments.AddFromFile ("C:\Test\CCRanges.docx")
Application.ScreenRefresh
End Sub