VBAから扱えるDLLの作成2017.10.31
Visual Studio Community 2017 を利用し、VBAから扱えるDLLを作成するためのコードとメモです。
DLLとは? Weblio 辞書 > コンピュータ > IT用語辞典 > DLLの意味・解説
DLLの利点 MSDNライブラリ > DLL利点
ポイント
・Visual Studio 2017
・VBEの設定
・DLLを作成したパソコンとは別のパソコンでの設定
Visual Studio 2017は、マイクロソフトが提供する開発ツール。「Community」「Professional」「Enterprise」の3種類があるが、「Community」は無償で利用できる。
詳しい説明は省くが、次のサイトがわかりやすく参考になる。
[連載:簡単! Visual Studio 2017入門:]
作成手順
1.Visual Studio 2017 を管理者として実行する
DLLを作成するためには、Visual Studio 2017 を管理者として実行する必要がある。ショートカットを右クリックで表示されるメニューから、「管理者として実行」を選択する。
2.プロジェクトを新規作成する
「ファイル」 → 「新規作成」 → 「プロジェクト」
「Visual Basic」 → 「クラス ライブラリ(.NET Framework)」
今回「名前」はSampleにする。名前を入力したら「OK」を押す。(画像クリックで拡大↓)
3.プロジェクトの設定
プロジェクトが作成されるので、VBAで扱えるよう設定を行う。
ソリューションエクスプローラーのプロジェクト名(Sample)を右クリックし、表示されるメニューの「プロパティ」を選択。
上から2つ目の「コンパイル*」を選択し、COM相互運用機能の登録(E)のチェックボックス(ページ下部にある)にチェックを入れる。
※---ここから次の※までを2019/5/1に追記
同「プロパティ」メニューの「アプリケーション」→「アセンブリ情報」を選択。
「アセンブリをCOM参照可能にする」にチェックが入っているか確認する。チェックが入っていない場合は入れる。
※---
4.コードの入力
「Class1.vb*」タブをクリックし、次のようにコードを入力。
※今回のコードでは、Imports Systemはなくても問題ないが、以後の汎用性を考え入れてある。
Imports System Namespace MyClass1 Public Class MyClass1 Public Function Hello(ByVal sName As String) As String Return "Hello!! " & sName End Function End Class End Namespace
5.DLL作成
メニューバーの下に表示されている「開始」を押し、ソリューションをビルドする。
次のように警告はでるが、下の出力欄に「ビルド:1 正常終了、・・・」と表示されていたら成功。
6.VBEの設定(参照の追加)
次は、VBEの設定。Excelを開き、VBEを起ち上げる。ショートカット:[alt] +[F11]
メニューバーの「ツール」 → 「参照設定」をクリック。
.NETのクラス ライブラリへの参照を追加する。
具体的には、作成したクラス「Sample」を探し、チェックボックスにチェックを入れ、「OK」を押す。
7.VBEにコード入力
標準モジュールを挿入し、そこにコードを入力。
まずは、.NET クラス ライブラリをインスタンス化する。
参照が適切であれば、インテリセンスが表示されるはずである。
Hello関数も入力する。
Sub test() Dim objMyClass As New Sample.MyClass1 MsgBox objMyClass.Hello("Sakae") End Sub
マクロ「test」を実行し、次のようにメッセージボックスが表示されたら成功である。
8.関数のインテリセンス
DLLの作成と呼び出しは確認できた。使い勝手を考えると、インテリセンスに関数も表示されることが望ましい。
調べてみると、COMオブジェクトはインターフェースを通してやりとりするらしい。そこで、インターフェースを実装する。併せて、表示の属性も設定している。
詳しい説明は省くが、次のサイトを参考にした。
[Excel から使うマネージDLL を作る。]
Visual Studio 2017 に戻り、コードを補足する。(画像クリックで拡大↓)
Imports System Imports System.Runtime.InteropServices Namespace MyClass1 <ComVisible(True)> Public Interface IMyClass1 Function Hello(ByVal sName As String) As String End Interface <ClassInterface(ClassInterfaceType.None)> Public Class MyClass1 Implements IMyClass1 Public Function Hello(ByVal sName As String) As String Implements IMyClass1.Hello Return "Hello!! " & sName End Function End Class End Namespace
再度ビルドし、DLLを作成する。
Excelを起ち上げ、VBEを開き確認。インテリセンスが効いているのがわかる。
別のパソコンでの設定
Visual Studio でビルドに成功すると、その段階でDLLファイルが、そのパソコンのレジストリに登録されるようで、登録を意識することなく、Excel(VBA)から使用できる。ビルドを行ったのみでVBEでの参照設定にファイル名がでてくることから、そのことがわかる。
DLLファイルを、作成したパソコンとは別のパソコンで動作させるためには、「リリースビルド」と「レジストリへの登録」が必要。
1.リリースビルド
メニューバーの下の「Debug」になっている部分を「Release」にし「開始」を押す。
リリースビルドが成功すると、Releaseフォルダが作成され、その中にDLLファイルが作成されている。
2.レジストリへの登録
DLLのレジストリへの登録は、RegAsm.exe(アセンブリ登録ツール)を用いる。
参考:初心者備忘録 beginner's memo 「VBAから扱えるDLLをC#で書いてみる。」
コマンドプロンプト(管理者権限で起動)で、 RegAsm.exeのパスや、DLLファイルのパスを入力し、設定する必要があるのだが、ドラッグ&ドロップで、マネージドDLLをRegsamで登録するスクリプトが紹介されている記事があった。kinuasa氏が作成したものである。非常に便利である!
参考:初心者備忘録 ドラッグされたマネージドDLLをRegAsmで登録するスクリプト
スクリプトファイルの作り方は、登録用コードをコピーし、メモ帳に貼り付け、保存時に拡張子を.vbsにする。
登録解除用のコードも、先のサイトに記載されているので、併せて作っておくと良い。
vbsファイルが作成されるので、そこにリリースビルドしたDLLファイルをドラッグ&ドロップする。Releaseフォルダにある、tlb、pdb、xmlファイルは使わない。
問題がなければ、これで登録されるはずである。
別のパソコンで、DLLファイルを使用する場合は、リリースビルドしたDLLファイルと、登録、解除用のスクリプトファイルの3つがあれば良い。
Excelマクロ管理ツール
参考サイト
@IT > Insider.NET > 連載:簡単! Visual Studio 2017入門:
@IT > Insider.NET > .NET TIPS > VBAで独自の.NETライブラリを使うには?[VB]
実験ぶろぐ(仮)試供品 「C#で実装したコードをVBAとかVBから使う方法」
初心者備忘録 beginner's memo 「VBAから扱えるDLLをC#で書いてみる。」
初心者備忘録 ドラッグされたマネージドDLLをRegAsmで登録するスクリプト
supermab's blog 「Excel から使うマネージDLL を作る。」