VBAでも複雑な処理を作る場合、ゴリゴリ書けば何とかなると思いますが
C#に比べるとデバッグ機能、扱えるメソッド、速度面など不便な面も多々あると思います。
複雑な処理はC#で作り(DLL)、VBAではDLLを使うだけにしたいと考えることもあると思います。
このサンプルは、C#で作ったメソッドをEXCELで使うシンプルなものです。
サンプルの内容
・メソッドで参照渡しの引数を受け取り、その引数を編集します。
・メソッドで処理結果をBooleanで返します。
・上記メソッドを含むDLLを作成します。
・作成したDLLをEXCELで使えるように登録します。
・EXCELでC#で作成したメソッドを使います。
DLL作成
「新しいプロジェクトの作成」をクリックします。
「クラスライブラリ(.NET Framework)」を選択し
「次へ」をクリックします。
「プロジェクト名」「場所」(保存場所)を指定します。
サンプルではプロジェクト名はデフォルトの「ClassLibrary1」
場所は変更していますが、どこでもOKです。
「プロジェクト」→「ClassLibrary1のプロパティ」をクリックします。
「アプリケーション」タブの「アセンブリ情報」をクリックします。
「アセンブリをCOM参照可能にする」をチェックします。
次に「OK」をクリックします。
「ビルド」タブをクリックします。
「COM相好運用機能の登録」をチェックします。
「署名」タブをクリックします。
次に「アッセンブリに署名する」をチェックし
リストから新規作成を選択します。
新規作成する適当なキーファイル名を入力します。
次に「キーファイルをパスワードで保護する」のチェックを外し
「OK」をクリックします。
プロジェクトにキーファイルが作成されます。
「Class1.cs」をダブルクリックします。
コード入力画面が表示されます。
プログラムを書きます。
下記のプログラムをコピペして下さい。
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace Sample
{
/// <summary>
/// サンプル
/// </summary>
[ComVisible(true)]
public interface ISample
{
/// <summary>
/// 苗字に挨拶をつけて返す
/// </summary>
/// <param name="surname">苗字</param>
/// <returns>true/false</returns>
[Description("苗字に挨拶をつけて返す")]
Boolean GetHello(ref string surname);
}
[ClassInterface(ClassInterfaceType.None)]
public class Tools : ISample
{
/// <summary>
/// 苗字に挨拶をつけて返す
/// </summary>
/// <param name="surname">苗字</param>
/// <returns>true/false</returns>
public Boolean GetHello(ref string surname)
{
surname = "hello " + surname;
return true;
}
}
}
【プログラムの補足説明】
[ComVisible(true)] … interfaceをCOMに公開する。
public interface ISample
[Description(“苗字に挨拶をつけて返す”)] … VBAのオブジェクト ブラウザ等でみたときFunctionの説明に表示される。
Boolean GetHello(ref string surname);
[ClassInterface(ClassInterfaceType.None)] … 実装しているインターフェイスを通じて機能を公開する。
public class Tools : ISample
「ビルド」→「ソリューションのビルド」をクリックします。
ビルドされます。
DLLが作成されます。
DLL登録(ビルド環境では不要です、ビルド時に自動登録されます)
作成したDLLを適当な場所にコピーします。
コマンドプロンプトを管理者として実行します。
(タスクバーの検索から「CMD」を入力、「管理者として実行する」をクリックします。)
COM へのアセンブリ登録をします。
例.
“C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe” “D:\サンプルDLL\ClassLibrary1.dll” /tlb /codebase
※ v4.0.30319のFrameworkを指定していますが、インストールされているバージョンに書き換えて下さい。
コマンドを実行すると登録された旨のメッセージが表示されます。
指定したDLLと同じフォルダにtlbファイルが出力されます。これでEXCELから参照可能になります。
◆不要になり、解除するには下記の例で解除できます。
例.
“C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe” “D:\サンプルDLL\ClassLibrary1.dll” /tlb /u
これでEXCELから参照可能です。
「ツール」→「参照設定」をクリックします。
「ClassLibrary1」をチェックします。
次に「OK」をクリックします。
「開発」→「挿入」→「コマンドボタン」(ActiveXコントロール)をクリックします。
適当な場所をクリックするとコマンドボタンが配置されます。
コマンドボタンをダブルクリックします。
プログラムを書きます。
下記のプログラムをコピペして下さい。
Private Sub CommandButton1_Click()
'Toolsクラスのインスタンスを宣言する
Dim o As New ClassLibrary1.Tools
'文字列を宣言する
Dim s As String
'苗字をセットする
s = "佐藤"
'GetHelloメソッドを呼び出す
If o.GetHello(s) = True Then
'編集された文字列を表示する
MsgBox s
End If
End Sub
「デザインモード」をクリックして解除します。
次に「CommandButton1」をクリックします。
メッセージボックスに
dll内で編集された文字列の
hello 佐藤が表示されます。
以上です。