如何发现文件的Oleobject ClassType?

时间:2018-12-05 13:33:27

标签: excel vba ms-word

我陷入了如何确定代码中将这些文件嵌入到Word文档中所需的文件的类类型的问题:

Selection.InlineShapes.AddOLEObject ClassType:="AcroExch.Document.11", _
        FileName:="C:\Work\Dashbaord & ".pdf", LinkToFile:=False, _
        DisplayAsIcon:=False

我需要嵌入csv,pdf,xlsx和txt文件。如何自动循环播放文件夹中的所有文件并自动确定每个文件的ClassType

1 个答案:

答案 0 :(得分:1)

为了将文件作为OLE对象插入,文件类型需要在计算机上安装可用的OLE Server,或者文件格式必须是Windows Packager机制可以“包装”为OLE类型的格式。在执行此方法之前,您需要确保尝试使用此类文档的任何人在打开该文档的计算机上都安装了相应的OLE Server软件。仅仅因为创建嵌入式OLE对象的计算机可以这样做,并不意味着稍后可以使用另一台计算机处理结果。

OLE Server软件将在注册表中注明。 Microsoft Office应用程序(Word,Excel,PowerPoint等)可以用作OLE服务器。在注册表中,您将找到相应的条目,例如Word.DocumentExcel.Workbook ...或AcroExch.Document,用于PDF文件 如果Microsoft Office和Adobe Acrobat Reader是已安装。

弄清楚要使用哪个ClassType的一种方法是手动插入每种文件类型并检查生成的Embed字段代码。

要在注册表中查找ClassType,可以在Word中使用以下代码示例。 Word具有功能System.PrivateProfileString,该功能包装了对注册表的Windows API调用。它可用于检索和写入信息。 (此代码不会循环目录中的文件,因为问题在于如何确定ClassType。为简单起见,文件扩展名是硬编码的。)

没有OLE服务器的文件类型在注册表项的默认值中将没有.。例如,.txt文件被列为txtfile。您可能需要当心某些文件类型。例如,在我的安装中,一个csv文件被列为Excel.CSV,可能不是您想要的...

Sub RetrieveOLEInfo()
    Dim fileExt As String
    Dim regKey As String
    Dim oleServer As String

    fileExt = "docx"
    regKey = "HKEY_Classes_Root\."
    oleServer = System.PrivateProfileString("", regKey & fileExt, "")
    'Debug.Print oleServer
    If InStr(oleServer, ".") = 0 Then
        Debug.Print "Insert as a Package"
    Else
        Debug.Print "Insert as: " & oleServer
    End If
End Sub