【ExcelVBA】ExcelからC#で作成したDLLを呼び出す方法(COM経由/COMインターフェース)
スポンサーリンク

概要

本記事では、Excel側のVBAからC#で作成したDLLの関数を呼び出す方法を紹介します。

VBAでごりごりコードを書く作業が苦手(苦痛)且つ、C#での開発に慣れている方は、今回の記事が参考になるのではないかと思います。

今回は、C#のDLLに指定ディレクトリ以下のファイルリストを取得する関数を実装してみたいと思います。

手順

DLL側作業

  1. DLLプロジェクト作成…C#でクラスライブラリプロジェクトを作成します。
  2. DLLプロジェクト設定…COM運用できるようにプロジェクトを設定します。
  3. DLL実装…DLLに関数を実装します。
  4. DLL登録…DLLをシステムに登録します。

Excel側作業

  1. 参照設定…Excel側作業:Excelの参照設定にDLLを追加します。
  2. DLL呼出…Excel側作業:ExcelからDLLを呼び出します。

【手順1】DLLプロジェクト作成

VisualStudio起動

プロジェクト作成ダイアログ起動

上部メニュー⇒「File」⇒「New」⇒「Project」

クラスライブラリ選択

左部ツリー⇒「Installed」⇒「Templates」⇒「Visual C#」

中部リスト⇒「Class Library」

プロジェクト名決定

ダイアログ下部「Name」にプロジェクト名を入力します。

ダイアログ下部「OK」ボタンをクリックします。

【手順2】DLLプロジェクト設定

プロジェクト設定画面起動

上部メニュー⇒「Project」⇒「ExcelAddin Properties」

COM設定1

プロジェクト設定画面の左部から「Application」を選択します。

プロジェクト設定画面の右部から「Assembly Information...」ボタンをクリックします。

Assembly Information 下部「Make Assembly COM-Visible」をチェックし、「OK」ボタンをクリックします。

COM設定2

プロジェクト設定画面の左部「Build」を選択します。

プロジェクト設定画面の下部「Register for COM interop」をチェックします。

プロジェクト設定保存

[Ctrl]+[S]キーで設定を保存します。又は、[Alt]+[B],[B]キーでビルドを行います。

【手順3】DLL実装

インターフェースクラス作成

  1. 下記コード、IExcelAddinクラスが該当します。
  2. 外部に公開する関数のインターフェースを定義します。
  3. クラス属性「ComVisible」に「true」を設定し、このクラスをCOM経由で公開します。

実装クラス作成

  1. 下記コード、ExcelAddinクラスが該当します。
  2. 外部に公開する関数の実装を行います。
  3. IExcelAddinクラスを継承します。

コード

using System.Linq;
using System.IO;
using System.Runtime.InteropServices;

namespace ExcelAddin
{
    [ComVisible(true)]
    public interface IExcelAddin
    {
        int GetFileList(string searchPath, string searchPattern, ref string[] fileList);
    }
    [ClassInterface(ClassInterfaceType.None)]
    public class ExcelAddin : IExcelAddin
    {
        /// <summary>
        /// ファイルリスト取得(サブディレクトリ含む)
        /// </summary>
        /// <param name="searchPath">検索パス</param>
        /// <param name="searchPattern">検索パターン(ワイルドカード)</param>
        /// <param name="fileList">取得ファイルリスト</param>
        /// <returns>取得ファイルリスト個数</returns>
        public int GetFileList(string searchPath, string searchPattern, ref string[] fileList)
        {
            // get file list
            fileList = Directory.GetFiles(searchPath, searchPattern, SearchOption.AllDirectories);
            // get file count
            int fileCount = 0;
            fileCount = fileList.Count();
            return fileCount;
        }
    }
}

【手順4】DLL登録

作成したDLLをCOMコンポーネントとしてシステムに登録します。

実行ダイアログ起動

[Win]+[R]キーで実行ダイアログを起動します。

管理者権限でコマンドプロンプト起動

「cmd」と入力します。

[Shift]+[Ctrl]+[Enter]キーを押下する。

DLL登録

以下から登録コマンドを1つ(下記注意参照)実行し、DLLをシステムに登録します。

コード

"C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" "C:\Work\ExcelAddin.dll" /tlb /codebase
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "C:\Work\ExcelAddin.dll" /tlb /codebase
"C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe" "C:\Work\ExcelAddin.dll" /tlb /codebase
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" "C:\Work\ExcelAddin.dll" /tlb /codebase
注意
  1. プラットフォームと.NETFrameworkバージョンに対応するRegAsm.exeを使用してください。
    • プラットフォームが32bitの場合 ⇒ パス"Framework"
    • プラットフォームが64bitの場合 ⇒ パス"Framework64"
    • .NETFrameworkのバージョンが4未満の場合 ⇒ パス"v2.0.50727"
    • .NETFrameworkのバージョンが4以上の場合 ⇒ パス"v4.0.30319"
  2. 上記コマンドの"C:\Work\ExcelAddin.dll"部分は、自分の環境に合わせ変更してください。

DLL登録解除

この操作は、DLLが不要になった場合のみ実行してください。

以下から解除コマンドを1つ(下記注意参照)実行し、DLLをシステムから削除します。

コード

"C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" "C:\Work\ExcelAddin.dll" /tlb /u
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "C:\Work\ExcelAddin.dll" /tlb /u
"C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe" "C:\Work\ExcelAddin.dll" /tlb /u
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" "C:\Work\ExcelAddin.dll" /tlb /u
注意
  1. プラットフォームと.NETFrameworkバージョンに対応するRegAsm.exeを使用してください。
  2. 上記コマンドの"C:\Work\ExcelAddin.dll"部分は、自分の環境に合わせ変更してください。

【手順5】参照設定

Excel起動

VBA開発環境起動

Excel上部メニュー⇒「開発」⇒「Visual Basic」をクリックします。

参照設定画面起動

VBA上部メニュー⇒「ツール」⇒「参照設定」をクリックします。

DLL参照追加

左部リスト⇒「ExcelAddin」チェック⇒「OK」ボタンをクリックします。

※Excelに作成したDLLの参照を追加します。

【手順6】DLL呼出

標準モジュール作成

VBA上部メニュー⇒「挿入」⇒「標準モジュール」をクリックします。

呼出コード実装

作成した標準モジュールに以下のコードを実装します。

コード

Sub Function1()
    
    Dim searchPath As String
    Dim searchPattern As String
    Dim fileList() As String
    Dim fileCount As Integer
    
    'DLLロード
    Dim addin As ExcelAddin.ExcelAddin
    Set addin = New ExcelAddin.ExcelAddin
    
    'ファイルリスト取得
    searchPath = "C:\Temp"  '検索パス
    searchPattern = "*.*"   '検索パターン(ワイルドカード)
    fileCount = addin.GetFileList(searchPath, searchPattern, fileList)
    
    'ファイルリスト出力
    For Each file In fileList
        Debug.Print (file)
    Next
    
End Sub

DLL実行

VBA上部メニュー⇒「実行」⇒「マクロの実行」をクリックします。

「マクロ」ダイアログ⇒「マクロ名」から実行する関数名を選択⇒「実行」ボタンをクリックします。

コードを実行すると、イミディエイトウィンドウに取得したファイルリストが表示されます。

外部リンク

本記事は、以下のページを参考に実際に作成してみました。

VBAまたはVBSからCOM経由で使用できる.NETのライブラリの作成方法

スポンサーリンク
おすすめの記事