建立一個 TestVBA 的C#專案,修改Class1.cs為VBAFunc.cs,在VBAFunc.cs中輸入以下程式碼。
C#程式碼。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace TestVBA { [ComVisible(true)] [ClassInterface(ClassInterfaceType.AutoDual)] public class VBAFunc { [ComVisible(true)] public int Multiply(int a, int b) { return a * b; } } }第5行:使用System.Runtime.InteropServices。
第9行:可加可不加,若添加 ComVisible 屬性可設為 true 或 false。
第10行:VBA要使用引用設定的函數,不能使用[ClassInterface(ClassInterfaceType.None)],必須要使用[ClassInterface(ClassInterfaceType.AutoDual)]。
第13行:要讓外部使用的函數一定要添加 [ComVisible(true)] 屬性,這樣才能讓函數註冊成COM元件,且一定設定為true,將無法提供COM對外界面或接口。
第11、14行:一定要是 public。
可將TestVBA 的C#專案內添加 interface,當class有添加[ClassInterface(ClassInterfaceType.None)]屬性當下存取Multiply函數。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace TestVBA { public interface IVBAFunc { [DispId(1)] int Multiply(int a, int b); } [ClassInterface(ClassInterfaceType.None)] public class VBAFunc : IVBAFunc { [ComVisible(true)] public int Multiply(int a, int b) { return a * b; } } }對 TestVBA 專案進行屬性設定。
Step 1. 點選 Application 頁籤中的「Assembly Information」按鈕。
Step 2. 勾選 「Make assembly COM-Visible」。
Step 3. 點選 Build 頁籤中的「 Register for COM interop」。
Step 4. 選擇Release模式建立DLL,執行後在Release資料夾中會產生TestVBA.dll、TestVBA.pdb、TestVBA.tlb,TestVBA.tlb是後面會需要使用到。
Step 5. 開啟 Excel VBE環境輸入以下程式碼。
Sub TestVBA() Dim tool As TestVBA.VBAFunc Set tool = New TestVBA.VBAFunc MsgBox tool.Multiply(2, 3) Set tool = Nothing End Sub
Step 6. 設定引用項目,「工具」、「設定引用項目」。
Step 7. 點選瀏覽按鈕,找到 TestVBA.tlb並新增。
Step 8. 執行VBA程式碼。
PS:這方法產生的DLL並沒有導出任何函數。
參考資料:
- Make a C# DLL and use it from Excel VBA code
- 使用 COM 屬性建立介面
- CA1408:不要使用 AutoDual ClassInterfaceType
- .NET 2.0 筆記 - 建立 COM+ 元件