1

这是我之前关于 GetObject这个代码的问题的后续内容:

Dim wb As Object ' Lotus123.Document
wb = GetObject("S:\Temp\T\0375D.WK3", "Lotus123.Workbook")

在 VBA 中工作正常,但在 VB.net 中失败并出现错误:FileNotFoundException:“在自动化操作期间找不到文件名或类名。”

我用 Process Monitor 检查了这个过程,发现:VBA 和 VB.net 都检查了这些键:

HKCR\Lotus123.Workbook\CLSID\(Default)
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}
HKCU\Software\Classes

然后 VB.net 简单地停止

但是 VBA 继续使用这些键

HKLM\SOFTWARE\Microsoft\COM3\REGDBVersion
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\InprocServer32    NAME NOT FOUND
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\InprocServerX86   NAME NOT FOUND
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\InprocServer32    NAME NOT FOUND
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\InprocServerX86   NAME NOT FOUND
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\LocalServer32 SUCCESS
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\LocalServer32\(Default) SUCCESS 

最后一个给出奖励: 数据:c:\lotus\123\123w.exe 然后VBA继续用指定的文件打开123w.exe程序。

那么为什么VB.net 找不到类名呢?我不明白为什么它只是停止寻找。

4

3 回答 3

0

由于某种原因,VB.net 找不到类名“Lotus123.Workbook”,所以我尝试获取没有类名的文件,它工作正常。

Dim wb As Object ' Lotus123.Document
wb = GetObject("S:\Temp\T\0375D.WK3")
于 2015-09-03T04:10:56.140 回答
0

文件名(获取电子表格文档)与返回应用程序对象父级的 Lotus123.Workbook 之间似乎存在不匹配。

下面的代码适用于 XP 32 位和 Win8 64 位。我用进程监视器检查了引擎盖下发生的事情。CreateObject 使用给定对象检查注册表中的 CLSID。然后它使用 CLSID 查找必要的信息。

Public Shared Function GetLotusWB(ByVal sFile As String) As Object

    'HKCU takes precedence if exists
    'HKCU\Software\Classes\Lotus123.Workbook\CLSID
    'HKCU\Software\Classes\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}

    'normally this is used because Lotus123 doesn't create HKCU entries
    'HKCR\Lotus123.Workbook\CLSID = {29130007-2EED-1069-BF5D-00DD011186B7}
    'HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\InprocHandler32 = ole32.dll
    'HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\LocalServer32 = C:\Lotus\123\123w.exe

    'using object as that sometimes works better
    Dim LotusObj As Object = CreateObject("Lotus123.Workbook")

    'get application
    'need a reference to Lotus 123 else declare as Object
    Dim LotusApp As Lotus123.Application = LotusObj.Application
    'FAILS: LotusApp.Visible = True

    'open file; also works fine As Lotus123.Document
    Dim ldoc As Object = LotusApp.OpenDocument(sFile)

    'visible and activate (must declare as Object else gives exception)
    Dim appObject As Object = ldoc.Application 
    appObject.Visible = True
    ldoc.Activate()

    Return ldoc

End Function

在 VB.net 中,这不起作用Dim wb As Object: wb = GetObject(sFile, "Lotus123.Workbook")(在 VBA 中工作)

在 Win8 64bit 中这wb = GetObject(sFile)不起作用;只是挂起。

于 2015-12-17T06:30:52.977 回答
-1

您需要安装 office api 或 PIA (Primary Interop Assemblies) 才能使其正常工作

你可以在这里找到 Office 2010 的 PIA http://www.microsoft.com/en-us/download/details.aspx?id=3508

通过google搜索找到其他版本

于 2014-01-09T11:28:53.953 回答