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 佐藤が表示されます。


以上です。