C# EXCEL・DLLを作ってVBAで使う

C#プログラミング
スポンサーリンク

C# サンプル プログラム一覧


VBAでも複雑な処理を作る場合、ゴリゴリ書けば何とかなると思いますが

C#に比べるとデバッグ機能、扱えるメソッド、速度面など不便な面も多々あると思います。

複雑な処理はC#で作り(DLL)、VBAではDLLを使うだけにしたいと考えることもあると思います。

このサンプルは、C#で作ったメソッドをEXCELで使うシンプルなものです。

サンプルの内容

・メソッドで参照渡しの引数を受け取り、その引数を編集します。

・メソッドで処理結果をBooleanで返します。

・上記メソッドを含むDLLを作成します。

・作成したDLLをEXCELで使えるように登録します。

・EXCELでC#で作成したメソッドを使います。

スポンサーリンク

DLL作成

 
 

Visual Studio を管理者で起動します。

※常に管理者で起動する設定は

こちらの記事(Visual Studioを常に管理者で起動する)

参照して下さい。

 
 
 

「新しいプロジェクトの作成」をクリックします。

 
 

「クラスライブラリ(.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から参照可能です。

 

VBAで使う

 
 

「開発」→「Visual Basic」をクリックします。

※「開発」が表示されていない場合には

こちらの記事(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 佐藤が表示されます。

 
 

以上です。

 
スポンサーリンク
タイトルとURLをコピーしました