【问题标题】:How to get document name from Word merge document after merging in VBA在 VBA 中合并后如何从 Word 合并文档中获取文档名称
【发布时间】:2015-09-01 17:50:45
【问题描述】:

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

【问题讨论】:

  • 谢谢。忘记缩进代码了。

标签: vba ms-word


【解决方案1】:

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

如果您尝试检索当前打开的 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 并运行 Mail Merge 时,生成的“Form Letters”文档将包含指向其原始模板的链接。在这种情况下是 CS32.dotx。在 VBA 中,您可以通过 ActiveDocument.AttachedTemplate 检索模板的名称

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

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

【讨论】:

  • 感谢罗德里戈的意见。 Word 完成邮件合并后,它会为合并的文档创建一个名称,称为“套用信函”。VBA 代码“ActiveDocument.Name”在我的宏中返回此名称。我想要 Word 模板的名称。在我的例子中,Word 文档模板的名称是 CS32.doc,数据源的名称是 CS32.da1(逗号分隔的文本文件)。当我合并时,Word 给合并的文档命名为“我想要的格式信函”检索原始模板的名称 CS32.docx。我希望这是有道理的。
  • 嗨@KentE,我根据您的 cmets 编辑了答案。我希望它对你有帮助。不幸的是,邮件合并生成的文件没有保留任何指向原始文件的链接。请检查我的答案并告诉我。
  • 选项 1 不是一个选项,但选项 2 可能有效,非常巧妙。它需要更改所有文档并添加此自定义属性,但在文档合并后 VBA 代码成功检索原始文档名称。我会说这回答了这个问题。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多