2010-11-17 82 views
7

我已經成功了就可以按照張貼在這裏Execute .NET 3.0 code from Office 2003使用標準的.NET庫與VBA

步驟來運行我自己的.NET代碼是否有使用標準的.NET庫,而無需編寫的包裝方式?這樣我們可以避免必須在客戶機上的GAC中註冊和安裝自定義DLL。

我發現已經在C:\ Windows \ Microsof.NET \ Framework文件夾中的tlb文件,並且已經能夠添加對mscorlib.dll的引用。查看RijndaelManaged的文檔,該類似乎是COM可見的。

我能夠創建一個實例,但只要嘗試使用它,我就會遇到錯誤(例如「類型不匹配」)。

Sub Macro1() 
    Dim aesImplementation As New RijndaelManaged 

    Set key = aesImplementation.GenerateKey() 
    Set iv = aesImplementation.GenerateIV() 
End Sub 

我願意接受任何黑客,你必須提供!

+2

我沒有答案回覆::使用

Sub Macro1() Dim aesImplementation As New RijndaelManaged aesImplementation.GenerateKey Key = aesImplementation.Key aesImplementation.GenerateIV IV = aesImplementation.IV End Sub 

或更好,而不是至少在調試的時候,你可以看到是否施工過程中發生錯誤或當你調用該方法,因爲。沒有包裝的.NET,但如果你是VBA的新手,你需要知道聲明'As New'並沒有像在.NET中一樣實例化任何東西。我不清楚你的錯誤是在實例化還是在'Set'上提出的。 (我假設你已經聲明你的'關鍵'變量是正確的類型,等等。)請參閱http://stackoverflow.com/questions/2478097/vba-difference-in-two-ways-of-declaring-a - 新對象試圖瞭解 - 爲什麼/ 2480559#2480559 – jtolle 2010-11-17 15:11:40

+0

這太瘋狂了爲什麼有新的語法,如果它沒有實例化一個新的對象?!它似乎在這種情況下創建了一個實例,但我會記住,至少「As New」不是最佳實踐。 我沒有明確聲明關鍵對象的原因是因爲我得到「無法分配給數組」錯誤,如果我這樣做。很明顯,當你嘗試分配給不同類型的數組時,會發生這種錯誤。 – 2010-11-19 02:49:53

+1

這不是很多工作來節省一些工作嗎?我的意思是,如果你的用戶允許你運行一個宏,爲什麼不運行一個實際的.NET應用程序呢? .NET中的Office互操作似乎相當不錯,所以您可以同等或更好地操作文檔! – 2010-11-20 02:12:05

回答

1

尚不可能。 VBA(用於應用程序的VB)不是VB,而是一個單獨的交易,模仿舊版VB的基本語法。這幾乎就像使用一個非常簡潔的老式VB版本。實際上,VBScript與VBA最爲匹配。也許有一天,微軟將建立直接與GAC合作的方法,但在那之前(並且那一天可能意味着COM的死亡,我敢肯定),你會使用COM CreateObject()方法,添加對COM的引用註冊庫到您的Office項目,或直接引用您的Office項目中的VBA/COM兼容的DLL或TLB文件。

在默認的GAC中有很多支持COM的庫,但是對於大多數人來說,你首先要在VB.Net或C#中創建一個Com Callable Wrapper。

相反,幾乎所有的MS Office應用程序都是COM可調用的,所以您可以通過VB.Net項目來處理已安裝的Office應用程序。

+3

通過添加對mscorlib.dll的引用,您可以在標準.NET庫中創建任何具有無參數公共構造函數的類的對象。你會發現這非常有限。 – AndASM 2014-10-12 16:46:46

+1

「VBScript與VBA最爲匹配」 - VBA比* VBScript更接近傳統VB6:https://msdn.microsoft.com/en-us/library/ms970436.aspx – Joe 2017-01-27 22:11:44

1

您應該能夠以這種方式使用ComVisible .NET類。但GenerateKeyGenerateIV方法沒有返回值。嘗試:

Sub Macro1() 
    Dim aesImplementation As RijndaelManaged 
    Set aesImplementation = New RijndaelManaged 

    aesImplementation.GenerateKey 
    Key = aesImplementation.Key 
    aesImplementation.GenerateIV 
    IV = aesImplementation.IV 
End Sub