为什么代码不能在VB.net中运行,而是在VBA中运行; GetObject的

时间:2014-01-08 18:51:11

标签: vb.net vba createobject

VBA代码效果很好:

Sub testVBA()

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

End Sub

VB.net代码失败:

Sub TestVBNet()

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

End Sub

在VB.net中,我收到一个FileNotFoundException:“在自动化操作期间找不到文件名或类名。”

因为我可以从VBA运行它,这意味着文件存在并且类名存在。那么为什么它不起作用,如何在VB.net中修复它。

编辑:我想我不确定如何开始诊断:显然这个类存在于我的计算机上,但不知何故VB.net无法找到它。也许VB.net使用不同的方法来激活类。可能缺少注册表项。我很高兴有任何建议。

编辑2:我也尝试使用CreateObject并得到此错误:“无法创建ActiveX组件。”不出意外。

3 个答案:

答案 0 :(得分:2)

由于某些原因,VB.net找不到类名“Lotus123.Workbook”,所以我尝试获取没有类名的文件,它在XP中运行良好。

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

编辑:在Win8 64bit中,上述功能不起作用;只是挂了。

以下代码适用于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

这很有效,因为它创建了用于获取应用程序对象的“Lotus123.Workbook”。

答案 1 :(得分:0)

将文件加载到Excel工作簿中。它应该能够动态转换lotus123工作簿。

答案 2 :(得分:-2)

首先,检查以确保您的内容(我认为在工具菜单包含引用或类似内容)包括引用Lotus123.Document的库。有可能是在“Microsoft Excel 14.0对象库”或类似的。

我听说它说VB is not VBA