C#プログラマーがExcel VBAをやることになった時に読む記事
やりたいこと
C#で書いたプログラムをExcel VBAで動かす!
読者の方への貢献
C#プログラムを簡単にVBAへ展開するツールを提供します。(ドラッグ&ドロップでコンパイルやレジストリ関係が完了)
早速、ツールを公開します。以下からダウンロード出来ます。
使い方・手順
1.C#ソースファイルをコンパイルします。
ここではダウンロードしたファイルを基に説明します。
「sample.cs」を「01_compiler_PleaseDragSourceIn.bat」にドラッグ&ドロップ!以上!ファイルと同じ階層に、「sample.dll」が作成されます。
なのですが、人によってはコンパイラのディレクトリやバージョンが違うかもしれないです。サンプルでは「"C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe"」を使用しています。
一応「sample.cs」のコードを貼ります。
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace TestCs {
[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("c9accfa4-7054-496d-a889-47a761bcf4b2")]
public interface IParson {
[Description("コンストラクタ")]
void Init(string name, int age);
[Description("名前")]
string Name();
[Description("年齢")]
int Age();
[Description("挨拶")]
string Greet();
}
[ClassInterface(ClassInterfaceType.None), ProgId("Parson.TestCs"), Guid("f7ed7007-7983-4b8b-86e5-519a04d534ae")]
public class Parson:IParson {
private string _name = "";
private int _age = 0;
public void Init(string name, int age){
this._name = name;
this._age = age;
}
public string Name(){
return this._name;
}
public int Age(){
return this._age;
}
public string Greet(){
return "Hello, VBA";
}
}
}
Initで初期化して、Name,Age,Greetメソッドを呼び出す形です。
2.1で作成したDLLファイルをレジストリに登録する
同じフォルダ階層にある「sample.dll」を「02_regdll_PleaseDragDllIn.bat」へドラッグ&ドロップ!以上!
同階層に「sample.tlb」が作成されます。
3.VBEditorで参照設定して、コードを実行
Excel → alt + F11 → ツール → 参照設定 → 「sample」にチェック&OK。
以下のコードでテスト出来ます。
Sub test()
Dim p As New Parson
Call p.Init("bob", 19)
Debug.Print p.Name
Debug.Print p.age
Debug.Print p.Greet
End Sub
実行(F5)して、イミディエイトウィンドウ(Ctrl + G)に表示されていれば成功です。
インテリセンスも効いていて良い感じです。
ちなみにオブジェクトブラウザ(F2)に説明が記載されています。C#ソースのDescriptionが効いています。
以上となります。何かの役に立てば幸いです。