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

时间:2015-06-16 18:37:41

标签: vba ms-word word-vba

这是我的场景:用户合并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

1 个答案:

答案 0 :(得分:2)

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

如果您要检索当前打开的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以保存自定义属性。假设您使用值“CS32.dotx”创建自定义属性“OriginalName”(可以是任何值)。因此,当您打开CS32.doc并运行邮件合并时,生成的“表单信函”文档将包含原始文档的相同自定义属性。在这种情况下,“OriginalName”属性将包含您手动输入的值。在VBA中,您可以通过ActiveDocument.CustomDocumentProperties("OriginalName")

检索自定义属性的名称

我希望它有所帮助。问候。