使用 Excel VBA 从 Word 文档中提取公司属性

Posted

技术标签:

【中文标题】使用 Excel VBA 从 Word 文档中提取公司属性【英文标题】:Extracting the Company property from a Word document using Excel VBA 【发布时间】:2015-02-23 22:23:13 【问题描述】:

我正在使用 Excel 2010 和 VBA 重新组织 C:\ 驱动器上的一些 Word 文档,并且我想将每个文档的“公司”属性拉入包含文档列表的工作表中。每个文档的完整文件路径出现在 A 行(如:“C:\folder\subfolder\file.doc”),我想在 F 行填充相应的“Company”属性。

我正在尝试为自定义 Excel 函数 DocCompany 编写一个宏,该函数将使用包含本地文件路径的文本字符串来返回文件路径标识的文档的“公司”属性。 我对 Last Modified 和 File Size 属性的运气更好,因为它们都有专用的 VBA 函数(分别为 FILEDATETIME 和 FILELEN)。在每种情况下,我所要做的就是为自定义 Excel 函数编写一个宏,该函数返回位于工作表中的文件路径字符串的 VBA 函数的结果。

给定以下函数, =GetFileDateTime(A1) 将返回由 A1 中包含的文件路径字符串标识的文档的最后保存日期。

Function GetFileDateTime(FileName As String) As Date
    GetFileDateTime = FileDateTime(FileName)
End Function

给定以下函数, =FileSize(A1) 将返回由 A1 中包含的文件路径字符串标识的文档的文件大小(以字节为单位)。

Function FileSize(FileName As String)
    FileSize = FileLen(FileName)
End Function

但是,Company 属性没有对应的 VBA 函数,因此(如上所述),我想编写一个宏定义一个自定义 Excel 函数 DocCompany,它将接受本地文件路径字符串作为输入并使用它来输出 Company文档的属性。

这是我的宏现在的样子:

Function CompanyID(FileName As String) As String
    CompanyID = Documents(FileName).Open
    Documents(FileName).BuiltinDocumentProperties (wdPropertyCompany)
End Function

当我尝试保存它时,Excel 返回错误消息“编译错误:未定义子或函数”。然后它在第二行中选择对“Documents”集合的引用。

当我能找到的每个引用都确认它实际上是一个对象或集合时,为什么 Excel 坚持我将“文档”定义为一个变量?我该怎么做才能使此代码正常工作?我需要采取不同的方法吗?

【问题讨论】:

您可以像this answer 中所示将其作为UDF 工作,但是,如果您每次都必须创建一个Word 应用程序对象,那么UDF 的运行速度将会非常缓慢。您还需要确保在处理每个创建的 Word 应用程序对象时一丝不苟 【参考方案1】:

当我能找到的每个引用都确认它实际上是一个对象或集合时,为什么 Excel 坚持我将“文档”定义为一个变量?

由于Documents 不是 Excel 对象模型的一部分,它被解释为一个变量。您需要将 Word 绑定到 Excel 实例,并引用 Word 应用程序类的该实例。

Function CompanyID(FileName As String) As String
    Dim wdApp as Object 'WOrd.Application
    Dim doc as Object 'Word.Document
    Const wdPropertyCompany as Long = 21 'Explicit reference for late-bound Word Application

    Set wdApp = CreateObject("Word.Application")
    Set doc = wdApp.Documents.Open(FileName)
    CompanyID = doc.BuiltinDocumentProperties (wdPropertyCompany)
    doc.Close False

End Function

【讨论】:

应该是Set doc = wdApp.Documents.Open(FileName),否则会出现“Bad filename”错误 谢谢! Excel 会让您以某种方式指示您打算访问 Word 对象模型,这是有道理的。但是,当我执行您的宏时,我收到一个“#NAME”错误。当我选择显示计算步骤...时,它会显示一个另存为窗口,其中包含另存为中函数实例引用的文档名称i> 字段。我应该告诉你列表中的文档没有打开(?) Documents 对象似乎被定义为打开的文档——这个宏是否需要“打开文档”任务,或者你可以访问关闭的文档属性吗? (看来你应该可以。) 尝试doc.Close False 阻止SaveAs 对话框(这应该可以防止错误)。【参考方案2】:
Function F_snb(c00)
  With GetObject(c00)
    F_snb = .BuiltinDocumentProperties(21)
    .Close 0
  End With
End Function

在 A2 中:G:\OF\example.docx

在 D2 中:=F_snb(A2)

【讨论】:

谢谢你,@snb!将 M_snb 替换为我的函数名称,并尝试通过在另一个单元格“=CompanyID(A1)”中将文件路径作为字符串引用来在我的工作表中实现。我得到一个“#NAME?”错误。当我显示计算步骤时,会出现一个带有公司属性的消息框。如何放弃消息框并将公司属性显示为公式结果?

以上是关于使用 Excel VBA 从 Word 文档中提取公司属性的主要内容,如果未能解决你的问题,请参考以下文章

VBA批量提取word表格中的自我评分

如何用EXCEL的VBA控制WORD文档?

从excel VBA转到word doc中的特定行

在EXCEL中用VBA怎样操作WORD文档中嵌入的EXCEL表格?

如何用VBA将EXCEL中的若干的数据导入不同的word文档

使用VBA提取word文档的段落号