ステップ1 プログラムの準備
C#のクラスライブラリを利用してます。名前は「ClassLibrary2」としました。
ここでは、文字列型の名前を引数として与えると、goodmorning関数。「こんにちは○○さん。」という文字を返す関数を作りました。goodmorning関数を呼び出せるようにpublic修飾子を指定しています。クラス名はClass1としました。
ステップ2 プログラムをVBAで呼び出せるよう修正
ここからが、VBAで呼び出せるようにするための部分です。
usingにSystem.Runtime.InterpServices;を追加し、Class1にClassIdというメンバーを作り、その文字列をGuid(Globally Unique IDentifier)として設定します。 ClassIdに与える文字列は次の
手順で生成します。
メニュー「ツール->GUIDの作成」を選択してください。GUIDの作成のウィンドウが開きます。
レジストリ形式を指定して、新規GUIDをクリックし、コピーをクリックすると、生成されたGUIDがコピーされるので、先ほどのClassIdのところに貼り付けてください。この時、余分な「{」と「}」は削除してください。
ステップ3 プログラムがVBAで呼ばれるようにコンパイル環境を設定しdllを作成
メニュー「プロジェクト->プロパティ」を開き、「アプリケーション」タブを開きます。
「アセンブリ情報」ボタンがあるので、クリックします。
開いたダイアログの下の方に「アセンブリをCOM参照可能にする」にチェックを入れて「OK」を押します。
これで、環境が整ったので、ビルドすると、COM参照可能なdllが作成されます。
ステップ4 dllをレジストリに登録する
作成されたdllをわかり易い場所に置きましょう。ここでは、作成したClassLibrary2.dllをC:\mylibに置きました。
管理者権限でコマンドプロンプトを開いてください。.Netに付属しているRegAsm.exeを使ってレジストに登録します。
まず、dllがあるフォルダーに移動します。
cd C:\mydll\
を入力してenterを押してください。
次に、RegAsm.exeを実行します。オプションとして/tlb、/codeを付けます。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /tlb /code ./ClassLibrary2.dll
を入力してenterを押してください。v4.0.30319の部分はお使いの環境によって違うので、お使いの環境に合わせて変更してください。
このとき、署名がないないので、厳密な名前をつけて再登録してください。 といった注意が表示されますが、注意だけで、ちゃんと正常に登録されました書いてあります。
これで、レジストリへの登録が完了しました。
では、実際にExcelのマクロからdllを呼びだしてみます。メニュー「ツール->マクロ->Visual Basic Editor」を選択して、Visual Basic Editorを起動してください。
Visual Basic Editorの「ツール->参照設定」を選択すると、参照設定ダイアログが開きます。
この中から作成したdllの名前を探してチェックを付けてOKしてください。今の場合は、ClassLibrary2になります。
プログラムですが、abcという関数を作成します(正確にはSubプロシージャですが)。まず利用するクラスのインスタンスを作成します。今の場合はClassLibrary2.dllのClass1を利用するために、xxxという変数にインスタンスを作成しました。
後は、Class1のメゾットであるgoodmorningに文字列hogeを代入して呼び出し、その文字列型の返り値をyyyで受け取り、A1セルに代入しています。
ボタン1に作成したabc関数を登録して実行すると、
このようにちゃんと「こんにちはhogeさん。」と表示されました。
今回はあまり役に立たないプログラムですが、vbaでは面倒なプログラムもC#では簡単にプログラムできたりするので、いろいろ作ってみてはいかがでしょうか?