2017年7月8日土曜日

C#でEXCELのVBAで利用できるdllを作成する方法

 Excelでマクロは便利ですが、VBAに慣れていないのでプログラムを作成するのが面倒です。そこで、COMの仕組みを利用してC#で作成したdllをVBAから利用する方法をご紹介します。


ステップ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の部分はお使いの環境によって違うので、お使いの環境に合わせて変更してください。
このとき、署名がないないので、厳密な名前をつけて再登録してください。 といった注意が表示されますが、注意だけで、ちゃんと正常に登録されました書いてあります。

これで、レジストリへの登録が完了しました。



ステップ4  dllを呼び出してみる


では、実際に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#では簡単にプログラムできたりするので、いろいろ作ってみてはいかがでしょうか?




ビットコインは上がる?下がる?将来予想してみた

先日、ビットコインキャッシュ(BCH)を購入方法の記事を書きましたが(ビットコインキャッシュの購入方法は こちら から)、その時には100万円超えたばかりだったビットコイン(BTC)がすでに200万円を超えました(2017/12/08現在)。驚くような上昇です。 今後、ビット...