.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」に変更する。

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

using System;
using System.Net;
using System.Runtime.InteropServices;

namespace ClassLibraryForVBA
{
  [Guid(WebPage.ClassId)]
  public class WebPage
  {
    //  COM用のGUID値
    public const string ClassId = "<独自GUID>";

      // VBAから利用できるメソッド
      public string GetText(string url)
      {
        WebClient wc = new WebClient();
        return wc.DownloadString(url);
      }
  }
}
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>」部分に対して行う。その結果、例えば次のようなコードになる。

……省略……
public const string ClassId = "D4A621C6-16E5-41A9-A285-698C658510C9";
……省略……
独自の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」標準モジュール項目をダブルクリックして、コード・エディタを開き、下記のコードを記述する。

' 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コンポーネント
使用ライブラリ:GuidAttribute属性(System.Runtime.InteropServices名前空間)

この記事と関連性の高い別の.NET TIPS
VBAで独自の.NETライブラリを使うには?
Visual Studioで編集中のファイルを保存してから外部ツールで開くには?
GUID値を生成するには?
定形のコーディング作業を効率化するには?
[参照の追加]ダイアログに独自のアセンブリを表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間