トップ > 備忘録 > VBAで扱えるDLLの作成

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つがあれば良い。

【関連記事】
 ・「VBAをVBに変換」
 ・「速度比較検証」

【お薦め】マクロ・プロシージャを管理する無料のツール!
 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 を作る。」


ページトップへ戻る
Copyright(C) 2009- 坂江 保 All Rights Reserved.