2015-08-21 32 views
2

正如我猜很多人,我坐在一个MS访问应用程序与混合表,VBA模块和VBA类。我打算将该应用程序迁移到VB.NET。如何实例化一个vba类并从vb.net调用一个方法?

然而这将需要一些时间,我想利用自动化的慢慢代码迁移到VB.NET

现在我可以打电话定期SUB和功能从我的VB.NET应用程序,但不知道是否有是调用用户定义对象的方法的一种方法。

粗糙例子就是我想要做的

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()) 

它甚至有可能?

+2

将代码/功能移植到VB.NET不是更容易吗?我不确定你是否可以从VB.NET调用VBA,但它可能比它值得的更多的工作,IMO。 – Tim

+0

试图从.NET创建一个vba类的实例很可能涉及到COM,如果你移植了代码,这会使事情复杂化得更多,我想。 – Plutonix

+0

你可以试试'CallByName' https://support.microsoft.com/en-us/kb/186143 –

回答

2

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的CallByNamesuggestion也看起来很有希望,但我没有测试那个。

+0

谢谢大家,我想我会尝试CallByName和Wrap方法的组合。这样我只需要每个对象实例一个包装程序。我会回报 –

相关问题