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 组件。”并不意外。
由于某种原因,VB.net找不到类名“Lotus123.Workbook”,所以我尝试获取没有类名的文件,它在XP中工作正常。
Dim wb As Object ' Lotus123.Document
wb = GetObject("S:\Temp\T\0375D.WK3")
编辑:在 Win8 64 位中,上述内容不起作用;只是挂起。
下面的代码适用于 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”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)