打开表单后,如何在Word文档的末尾添加子文档?

时间:2018-08-01 13:51:14

标签: vba ms-word word-vba

我正在尝试编写一个宏,该宏在打开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

1 个答案:

答案 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