.NET TIPS C#でVBA向けの.NETライブラリ(COMコンポーネント)を作成するには?[C#]デジタルアドバンテージ 一色 政彦2011/10/06 |
|
|
「TIPS:VBAで独自の.NETライブラリを使うには?」では、Microsoft Office製品(WordやExcelなど)に独自の処理を追加するためのVBA(Visual Basic for Applications)マクロで、.NET Frameworkで作成した独自のクラスを活用する方法を紹介した。そこでは、VBAと親和性が高いVB(Visual Basic)を使ってVBA向けの.NETライブラリ(=COMコンポーネント)を作成したが、もちろんこのときにC#を使うこともできる。本稿ではその方法を紹介する。
●C#によるVBA向けの.NETライブラリの作成
最初に、VBA向けに.NETのクラス・ライブラリを作成しよう。
管理者としてVisual StudioのIDEを立ち上げ、メニューバーから[ファイル]−[新規作成]−[プロジェクト]を実行すると表示される[新しいプロジェクト]ダイアログで、左側のツリーから[Visual C#]−[Windows]を選択して、右側のテンプレート一覧で「クラス ライブラリ」を選択し、[名前]欄に適当な名前(例:「ClassLibraryForVBA」)を指定して、[OK]ボタンをクリックする。これにより、クラス・ライブラリのひな型が作成される。
[ソリューション エクスプローラー]に「Class1.cs」ファイルが作成しているので、今回は、このファイルのClass1クラスを「WebPage」クラスに変更する。まずは、ファイル名を「WebPage.cs」に変更する。
そして、それらのファイルの内容を下記のコードに書き換える。
|
|
VBA向けの.NETライブラリに含まれるクラスのサンプル・コード(WebPage.cs) | |
※このコードで使われているWebClient.DownloadStringメソッドは、.NET Framework 2.0以降でのみ利用できる。 |
このコードで記述したWebPageクラスは、GetTextメソッド(=引数としてURLアドレスを受け取り、戻り値としてWebページのテキスト・データを返すメソッド)を実装したシンプルなクラスである。
フィールド変数ClassIdが重要である。これは、VBAマクロのコードからCOM経由でWebPageクラスにアクセスしてもらうために必要となる、一意で独自のGUIDである。
独自のGUIDは、メニューバーから[ツール]−[GUID の作成]を実行すると表示される[GUID の作成]ダイアログで生成できる(次の画面を参照)。
[GUID の作成]ダイアログを使った新しいGUIDの作成 |
このダイアログで[新規 GUID]ボタンをクリックして、新しいGUIDを生成する。[GUID 形式]としては[4. レジストリ形式 {xxxxxxx-xxxx ... xxxx}]ラジオボタンを選択したうえで[コピー]ボタンをクリックする。そして、先ほどのコードの「<独自GUID>」の部分にペーストする。「{D12ADC7D-B8F8-441F-9C66-4542507FDB21}」のような文字列が貼り付けられるので、前後の「{」と「}」は削除する。これを先ほどの「<独自GUID>」部分に対して行う。その結果、例えば次のようなコードになる。
|
|
独自のGUIDを指定したコード箇所(WebPage.cs) |
以上でVBA向けの.NETライブラリの実装は完了である。
次に、このクラス・ライブラリ(=.dllファイル)がCOMとして使えるように設定する。
具体的には、[ソリューション エクスプローラー]内のプロジェクト項目の右クリック・メニューから[プロパティ]を実行してプロジェクト・プロパティを開き、そこで[アプリケーション]タブを開き、[アセンブリ情報]ボタンをクリックすると表示されるダイアログで[アセンブリを COM 参照可能にする]チェックボックスにチェックを入れる(※Visual Studio 2005以降の場合。Visual Studio 2003以前では、「AssemblyInfo.cs」ファイルに「[assembly: System.Runtime.InteropServices.ComVisible(true)]」というコードを追記する)。次の画面は、その例である。
[アセンブリ情報]ボタンをクリック |
[アセンブリを COM 参照可能にする]の設定 |
さらに[コンパイル]タブを開き(※Visual Studio 2005以降の場合。Visual Studio 2003以前では[構成プロパティ]−[ビルド]を選択し)、[COM 相互運用機能の登録]チェックボックスにチェックを入れる。次の画面は、その例である。
[COM 相互運用機能の登録]の設定 |
最後にソリューション全体をビルドして.dllファイルを作成しよう。ここでは、「ClassLibraryForVBA.dll」ファイル(ClassLibraryForVBAアセンブリ)が作成される。
●VBAでの.NETライブラリの利用
以上の作業で、.NETライブラリがCOMコンポーネントとして利用できる。それでは、「TIPS:VBAで独自の.NETライブラリを使うには?」の後半と同じ内容になるが、先ほど作成した.NETのクラス・ライブラリ(=.dllファイル)をVBAから呼び出してみよう。
Microsoft Wordを起動したら、ショートカット・キー[Alt]+[F11]を押してVisual Basic Editorを起動し、[プロジェクト]ウィンドウ内の[Normal]−[標準モジュール]を選択した状態で、メニューバーから[挿入]−[標準モジュール]を実行する。
VBAマクロの標準モジュールの作成 |
これにより、[プロジェクト]ウィンドウ内の[Normal]−[標準モジュール]配下に、「Module1」という名前の項目が作成される。この名前を変更しておこう。[プロパティ]ウィンドウ内の[(オブジェクト名)]欄の「Module1」を「UsingDotNetModule」に変更する。
次に、.NETのクラス・ライブラリ(=ClassLibraryForVBA.dllファイル)への参照を追加する。具体的には、メニューバーから[ツール]−[参照設定]を実行すると表示される[参照設定]ダイアログで、次の画面のように[参照可能なライブラリ ファイル]一覧から[ClassLibraryForVBA]項目のチェックボックスにチェックを入れて[OK]ボタンをクリックする。
.NETクラス・ライブラリへの参照の追加 |
さらに、[プロジェクト]ウィンドウで「UsingDotNetModule」標準モジュール項目をダブルクリックして、コード・エディタを開き、下記のコードを記述する。
|
|
.NETライブラリに含まれるクラスを利用するVBAマクロのサンプル・コード(「UsingDotNetModule」標準モジュール) |
以上で、.NETライブラリを利用するVBAマクロは完成である。
このまま、「GetPageHtml」という名前の通常のVBAマクロとして利用できるが、その前にいったんテストしておこう。コード・エディタで「Sub GetPageHtml()」上に文字入力カーソル(=キャレット)を置いた状態で[F5]キーを実行する。これによりVBAマクロが実行され、次の画面のようにWordドキュメントに「http://www.google.co.jp」のWebページのHTMLコードがWordドキュメント内に出力される。
.NETクラス・ライブラリを利用するVBAマクロのテスト |
VBAマクロとして実運用する際には、Visual Basic Editorを閉じて、Microsoft Word上でショートカット・キー[Alt]+[F8]を押して[マクロ]ダイアログを表示し、そこで次の画面のように[マクロ名]一覧から適切なマクロ(この例では「GetPageHtml」)を選択して[実行]ボタンをクリックすればよい。
.NETクラス・ライブラリを利用するVBAマクロの通常実行 |
■
以上の手順で、.NET Framework開発技術を生かしたVBAマクロを作成できる。
なお、独自の.NETライブラリはCOMとしてレジストリに登録する必要があるので、このライブラリを開発時のPC以外で使う場合には、
regasm ClassLibraryForVBA.dll /tlb:ClassLibraryForVBA.tlb
というコマンドラインを実行しなければならない。この.tlbファイルは.dllファイルとともに生成されている。
カテゴリ:クラス・ライブラリ 処理対象:COMコンポーネント 使用ライブラリ:GuidAttribute属性(System.Runtime.InteropServices名前空間) |
|
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|