如何在VBA合并Word文档后获取文档名称

3
这是我的场景:用户合并一个Word文档,我在快速访问工具栏上有一个按钮,执行一个使用Shell Execute来传递参数的宏。

这个工作,但是我需要的参数是Word文档的名称。当我查询活动文档时,它被称为“表单信函”。

有没有办法在VBA代码中获得Word文档(模板)名称,以便在文档合并后使用?我知道Word在合并后更改了名称,我需要包含合并字段的Word文档名称。

Const SW_SHOW = 1
Const SW_SHOWMAXIMIZED = 3

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
    ByVal hwnd As Long, ByVal lpOperation As String, _
    ByVal lpFile As String, ByVal lpParameters As String, _
    ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Sub RunYourProgram()
    l = Len(ActiveDocument)
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' The line below retrieves name, "FORM LETTER"(strips off .doc)
    ' rather than name of Word document template
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Doc_Name = Mid(ActiveDocument, 1, l - 4)
    Dim RetVal As Long
    On Error Resume Next
    RetVal = ShellExecute(0, "open", "M:\gendoc\FG_To_ECF.exe", _
        Doc_Name, "c:\Certificates", SW_SHOWNORMAL)
End Sub

谢谢。忘了缩进代码。 - KentE
1个回答

4

我不确定我是否正确理解了你的问题。

如果你想要获取当前打开的Word文档的文件名,你需要使用ActiveDocument.FullName(包含完整路径)或者ActiveDocument.Name(仅包含文件名和扩展名)。

在你所举的例子中,代码如下:

Const SW_SHOW = 5
Const SW_SHOWMAXIMIZED = 3
Const SW_SHOWNORMAL = 1

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Sub RunYourProgram()

    Dim RetVal As Long

    On Error Resume Next
    RetVal = ShellExecute(0, "open", "M:\gendoc\FG_To_ECF.exe", ActiveDocument.Name, "c:\Certificates", SW_SHOWNORMAL)

End Sub

更新:

好的@KentE,我想现在我明白你需要什么了。不幸的是,邮件合并生成的最终文件中没有任何地方包含原始文件的名称。我认为有两种可能的解决方案:

1)您可以将原始文档保存为真正的模板。在您的情况下,CS32.doc必须保存为.dot或.dotx扩展名。因此,当您打开CS32.dotx并运行邮件合并时,生成的“表单信函”文档将包含指向其原始模板的链接。在这种情况下,即CS32.dotx。在VBA中,您可以通过ActiveDocument.AttachedTemplate检索模板的名称。

2)或者您可以更改CS32.doc以保留自定义属性。假设您创建了自定义属性“OriginalName”,并将其值设置为“CS32.dotx”(可以是任何值)。因此,当您打开CS32.doc并运行邮件合并时,生成的“表单信函”文档将包含与原始文档相同的自定义属性。在这种情况下,“OriginalName”属性将包含您手动输入的值。在VBA中,您可以通过ActiveDocument.CustomDocumentProperties("OriginalName")检索自定义属性的名称。

希望对您有所帮助。问候。


感谢您的输入,Rodrigo。在Word完成邮件合并后,它会为合并文档创建一个名为“表单信函”的名称。VBA代码“ActiveDocument.Name”在我的宏中返回此名称。我想要的是Word模板的名称。在我的情况下,Word文档模板的名称是CS32.doc,数据源的名称是CS32.da1(逗号分隔文本文件)。当我进行合并时,Word会将合并后的文档命名为“表单信函”,我想要检索原始模板的名称CS32.docx。希望这样说得清楚。 - KentE
嗨@KentE,我根据您的评论编辑了答案。希望它能对您有所帮助。不幸的是,邮件合并生成的文件没有保留任何链接到原始文件的内容。请检查我的答案并告诉我。 - Rodrigo V
选项1不可行,但选项2可能有效,非常流畅。需要更改所有文档并添加此自定义属性,但在文档合并后,VBA代码可以成功检索原始文档名称。我认为这回答了问题。非常感谢! - KentE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接