最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2017年1月31日 星期二

.NET C# 建立 COM元件 (1) --- 製作 Excel VBA 前期綁定元件

近期使用C#串接Google Sheet,遇到C# DLL無法直接被使用,查了一下才知道C#產生.net DLL無法使用COM環境上,上網找了一些資料,剛好搜尋到研就如何在C#建立COM DLL給VBA使用,花了一點時間研究了一下順道紀錄。
建立一個 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並沒有導出任何函數。

參考資料: