如何实例化一个 vba 类并从 vb.net 调用一个方法?
Posted
技术标签:
【中文标题】如何实例化一个 vba 类并从 vb.net 调用一个方法?【英文标题】:How to instantiate a vba class and call a method from vb.net? 【发布时间】:2015-08-21 17:00:51 【问题描述】:我猜很多人都是这样,我正坐在一个 ms 访问应用程序中,它混合了表、VBA 模块和 VBA 类。我打算将该应用程序迁移到 VB.NET。
但是这需要一些时间,我想利用自动化将代码缓慢移动到 VB.NET
现在我可以从我的 VB.NET 应用程序中调用常规的 SUB 和函数,但想知道是否有一种方法可以调用用户定义对象的方法。
粗略的例子我想做的事
VBA
'Class1
Public Sub Test()
Print "Hello world"
End Sub
'Module1
Public oClass1 as Class1
Public Sub Init()
Set oClass1 = New Class1
End Sub
VB.Net
' Left out the opening of the access db
oAccess.Run("Init")
oAccess.Run("oClass1.Test())
有可能吗?
【问题讨论】:
将代码/功能移植到 VB.NET 不是更容易吗?我不确定你是否可以从 VB.NET 调用 VBA,但它可能会比它的价值更多,IMO。 尝试从 NET 创建 vba 类的实例可能会涉及 COM,这比移植代码更复杂,我认为。 你可以试试CallByName
support.microsoft.com/en-us/kb/186143
【参考方案1】:
Application.Run
方法需要一个字符串,其中包含“要运行的函数或子过程的名称” 作为其第一个参数。但是 "oClass1.Test" 两者都不是。
您可以通过创建另一个包装您的 oClass1.Test
方法的 VBA 过程来解决该问题,然后运行包装过程...
oAccess.Run("Wrap_oClass1_Test") ' no parentheses after procedure name
Public Sub Wrap_oClass1_Test()
oClass1.Test
End Sub
我确认当从 VBScript 调用时,该方法适用于您的其余示例代码,因此我相信它也应该适用于 VB.Net。
Tim 的 CallByName
suggestion 看起来也很有希望,但我没有测试那个。
【讨论】:
谢谢你们,我想我会尝试结合使用 CallByName 和 Wrap 方法。这样,每个对象实例只需要一个包装过程。我会报告的以上是关于如何实例化一个 vba 类并从 vb.net 调用一个方法?的主要内容,如果未能解决你的问题,请参考以下文章