環境
- Excel for Microsoft365(64bit)
- Visual Studio2022
経緯
大抵の処理はExcelVBAで問題なく実装できますが、中には.NETのAPIを使いたいシーンが出てくることがあります。
そんな時、C#のCOMコンポーネントを作成してExcelVBAで使用する事になりましたので、方法についてまとめておきます。
COMコンポーネントのプロジェクト作成と設定
Visual Studioでクラスライブラリのプロジェクトを作成します。
作成後、プロジェクトのプロパティを以下の設定を変更します。
- 「ビルド」の「COM相互運用機能の登録」にチェックを入れる
- 「アプリケーション」>「アセンブリ情報」の「アセンブリをCOM参照可能にする」にチェックを入れる
公開インターフェースの定義
インターフェースを実装し、GUID属性とInterfaceType属性を設定します。
[Guid("3DAEF636-1FF7-4ABA-9E5B-47D06BF21E2B")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ISampleCalc
{
[Description("加算処理")]
int Add(int a, int b);
}
[GUID属性]
他のCOMコンポーネントと識別するために一意の値を設定します。
Visual Studioであれば、「ツール」>「GUIDの作成」から作成できます。
任意の形式を選択して新規GUIDを作成、その内容をコピーしてコードに貼り付けます。
[InterfaceType属性]
COMインターフェースの公開方法を指定します。
設定値は以下の通り。
ComInterfaceType 値 | 動作 |
---|---|
InterfaceIsIUnknown | 事前バインディングのみ有効 |
InterfaceIsIDispatch | 遅延バインディングのみ有効 |
InterfaceIsDual | 事前バインディングと遅延バインディングの両方が有効 |
InterfaceIsIInspectable | Windowsランタイムインターフェース |
事前バインディングと遅延バインディングについてはMicrosoftのサイトに説明があります。
簡単に言えば、変数型を宣言時に決めるか、代入時に決めるかの違いです。
事前バインディングは型を宣言時に決めておく必要がありますが、実行速度やコーディング時の保管機能等メリットが多くあります。
遅延バインディングはObject型で変数を宣言しておき、代入時に型を決められるというメリットがありますが、事前バインディングのメリットが無くなってしまいます。
基本的にはどちらも許容するInterfaceIsDualを設定しておくとよいです。
Description属性
関数、変数の説明を記入することができます。
ここで記入した内容はVBAのオブジェクトブラウザ上で表示されるので忘れずに書きましょう。
クラスの実装
先ほど作成したインターフェースを実装したクラスを作成します。
[Guid("5559398B-CF78-4418-A065-CFE6A8F2BEA6")]
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(ISampleCalc))]
public class SampleCalc: ISampleCalc
{
public int Add(int a, int b)
{
return a + b;
}
}
[ComVisible属性]
クラスがCOMとして参照可能かを指定します。
既定値は表示(true)ですが、明示するために設定します。
[ClassInterface属性]
COMクラスのインターフェースの種類を指定します。
ComDefaultInterface属性と組み合わせて、公開するインターフェースを決定します。
ClassInterface値 | 詳細 |
---|---|
AutoDispatch | 遅延バインディングのみをサポートし、インターフェースは公開されない |
AutoDual | 事前バインディング、遅延バインディングをサポートし、自動的にインターフェースを生成する |
None | 自動的にインターフェースを生成しない |
[ComDefaultInterface属性]
COMインターフェースを指定するために使用します。
インターフェースを指定することで、実装されているインターフェースが明確にすることができます。
ExcelVBAでCOMオブジェクトを呼び出す
「ツール」>「参照設定」の一覧からCOMコンポーネントを探してチェックを入れます。
COMオブジェクトの登録に成功すると、一覧にプロジェクト名で追加されています。
まとめ
COMコンポーネントが使えるようになると、C#で処理を書けるので実装の幅が広がりました。
特に、VBAではできないスレッド処理が使えるというのが個人的に一番大きなメリットではないかと思っています。