2015-08-21 33 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方法的組合。這樣我只需要每個對象實例一個包裝程序。我會回報 –

相關問題