見出し画像

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が効いています。

キャプチャ

 以上となります。何かの役に立てば幸いです。

いいなと思ったら応援しよう!