.NET TIPS

VBAで独自の.NETライブラリを使うには?[VB]

デジタルアドバンテージ 一色 政彦
2011/08/04

 Microsoft Office製品(WordやExcelなど)に独自の処理を追加する方法としては、主に下記の3種類がある。

  1. VBA(Visual Basic for Applications)マクロ
  2. Office COM(Component Object Model)アドイン
  3. Visual Studio Tools for Office(VSTO)

 このうち、最も手軽に作成できるのが、VBAマクロであるが、このVBAマクロでも、.NET Frameworkで作成した独自のクラスを活用できる。本稿ではその方法を紹介する。

●VBA向けの.NETライブラリの作成

 最初に、VBA向けに.NETのクラス・ライブラリを作成しよう。

 管理者としてVisual StudioのIDEを立ち上げ、メニューバーから[ファイル]−[新規作成]−[プロジェクト]を実行すると表示される[新しいプロジェクト]ダイアログで、左側のツリーから[Visual Basic]−[Windows]を選択して、右側のテンプレート一覧で「クラス ライブラリ」を選択し、[名前]欄に適当な名前(例:「ClassLibraryForVBA」)を入力して、[OK]ボタンをクリックする。これにより、クラス・ライブラリのひな型が作成される。

 [ソリューション エクスプロラー]に「Class1.vb」ファイルが作成されているので、今回は、このファイルの「Class1」クラスを「WebPage」クラスに変更する。まずは、ファイル名を「WebPage.vb」に変更する。

 そして、それらのファイルの内容を下記のコードに書き換える。

Imports System.Net

' クラスをCOM経由でアクセス可能にする
<ComClass(WebPage.ClassId, WebPage.InterfaceId, WebPage.EventsId)>
Public Class WebPage

  ' COM用のGUID値
  Public Const ClassId As String = "<独自GUID>"
  Public Const InterfaceId As String = "<独自GUID>"
  Public Const EventsId As String = "<独自GUID>"

  ' VBAから利用できるメソッド
  Public Function GetText(ByVal url As String) As String
    Dim wc As New WebClient()
    Return wc.DownloadString(url)
  End Function

End Class
VBA向けの.NETライブラリに含まれるクラスのサンプル・コード(WebPage.vb)
このコードで使われているWebClient.DownloadStringメソッドは、.NET Framework 2.0以降でのみ利用できる。

 このコードに記述されたWebPageクラスは、GetTextメソッド(=引数としてURLアドレスを受け取り、戻り値としてWebページのHTMLコード・データを返すメソッド)を実装したシンプルなクラスである。

 上部にある3つのフィールド変数が重要である。これらは、VBAマクロのコードから、COM経由でWebPageクラスにアクセスしてもらうために必要となる。それぞれに一意で独自のGUIDが必要である。

 独自のGUIDは、メニューバーから[ツール]−[GUID の作成]を実行すると表示される[GUID の作成]ダイアログで生成できる(次の画面を参照)。

[GUID の作成]ダイアログを使った新しいGUIDの作成

 このダイアログで[新規 GUID]ボタンをクリックして、新しいGUIDを生成する。[GUID 形式]としては[4. レジストリ形式 {xxxxxxx-xxxx ... xxxx}]ラジオボタンを選択したうえで[コピー]ボタンをクリックする。そして、先ほどのコードの「<独自GUID>」の部分にペーストする。「{D12ADC7D-B8F8-441F-9C66-4542507FDB21}」のような文字列が貼り付けられるので、前後の「{」と「}」は削除する。これを3箇所の「<独自GUID>」部分に対して行う。その結果、例えば次のようなコードになる。

……省略……
Public Const ClassId As String = "6540FD28-57C6-477F-9D50-E6518016F33F"
Public Const InterfaceId As String = "AF281ED4-B613-4A91-8A06-C17A5AE1E2DD"
Public Const EventsId As String = "394C6ECE-663D-4DC2-9163-1318A00DFCB6"
……省略……
独自のGUIDを指定した3つのコード箇所(WebPage.vb)

 以上でVBA向けの.NETライブラリの実装は完了である。

 次に、このクラス・ライブラリ(=.dllファイル)がCOMとして使えるように設定する。具体的には、[ソリューション エクスプロラー]内のプロジェクト項目の右クリック・メニューから[プロパティ]を実行してプロジェクト・プロパティを開き、そこで[コンパイル]タブを開き(Visual Studio 2005以降の場合。Visual Studio 2003以前では[構成プロパティ]−[ビルド]を選択し)、[COM 相互運用機能の登録]チェックボックスにチェックを入れる。次の画面は、その例である。

[COM 相互運用機能の登録]の設定

 最後にソリューション全体をビルドして.dllファイルを作成しよう。ここでは、「ClassLibraryForVBA.dll」ファイル(ClassLibraryForVBAアセンブリ)が作成される。

●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」標準モジュール項目をダブルクリックして、コード・エディタを開き、下記のコードを記述する。

' 1つのVBAマクロとなる関数
Sub GetPageHtml()
 
  ' .NETライブラリのクラスをインスタンス化
  Dim wp As New ClassLibraryForVBA.WebPage
 
  ' .NETクラスのメソッドを呼び出す
  ' (WebページのHTMLコードをテキストとして取得)
  Dim html As String
  html = wp.GetText("http://www.google.co.jp")
 
  ' WordドキュメントにHTMLコードを挿入
  Selection.TypeText Text:=html
 
End Sub
.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ファイルとともに生成されている。 End of Article

カテゴリ:クラス・ライブラリ 処理対象:COMコンポーネント
使用ライブラリ:ComClass属性(Microsoft.VisualBasic名前空間)

この記事と関連性の高い別の.NET TIPS
C#でVBA向けの.NETライブラリ(COMコンポーネント)を作成するには?
Visual Studioで編集中のファイルを保存してから外部ツールで開くには?
定形のコーディング作業を効率化するには?
GUID値を生成するには?
[ASP.NET]ページから生成されたソース・コードを見るには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH