0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ExcelVBAで使えるCOMコンポーネントを作る

Posted at

環境

  • 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を作成、その内容をコピーしてコードに貼り付けます。
image.png

[InterfaceType属性]

COMインターフェースの公開方法を指定します。
設定値は以下の通り。

ComInterfaceType 値 動作
InterfaceIsIUnknown 事前バインディングのみ有効
InterfaceIsIDispatch 遅延バインディングのみ有効
InterfaceIsDual 事前バインディングと遅延バインディングの両方が有効
InterfaceIsIInspectable Windowsランタイムインターフェース

事前バインディングと遅延バインディングについてはMicrosoftのサイトに説明があります。

簡単に言えば、変数型を宣言時に決めるか、代入時に決めるかの違いです。
事前バインディングは型を宣言時に決めておく必要がありますが、実行速度やコーディング時の保管機能等メリットが多くあります。
遅延バインディングはObject型で変数を宣言しておき、代入時に型を決められるというメリットがありますが、事前バインディングのメリットが無くなってしまいます。
基本的にはどちらも許容するInterfaceIsDualを設定しておくとよいです。

Description属性

関数、変数の説明を記入することができます。
ここで記入した内容はVBAのオブジェクトブラウザ上で表示されるので忘れずに書きましょう。
image.png

クラスの実装

先ほど作成したインターフェースを実装したクラスを作成します。

クラスサンプル
[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オブジェクトの登録に成功すると、一覧にプロジェクト名で追加されています。
image.png

使い方は通常のクラスオブジェクトと同じです。
image.png

まとめ

COMコンポーネントが使えるようになると、C#で処理を書けるので実装の幅が広がりました。
特に、VBAではできないスレッド処理が使えるというのが個人的に一番大きなメリットではないかと思っています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?