VBA からドキュメント レベルのカスタマイズ内のコードを呼び出す
更新 : 2007 年 11 月
対象 |
---|
このトピックの情報は、指定された Visual Studio Tools for Office プロジェクトおよび Microsoft Office のバージョンにのみ適用されます。 プロジェクトの種類
Microsoft Office のバージョン
詳細については、「アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。 |
Word 2007 または Excel 2007 用のドキュメント レベルのプロジェクトを構成し、ドキュメント内の Visual Basic for Applications (VBA) コードからカスタマイズ アセンブリ内のコードを呼び出すことができます。この機能は、次のようなシナリオで役立ちます。
同じドキュメントに関連付けられている Visual Studio Tools for Office ソリューションの機能を使用して、ドキュメント内に既存の VBA コードを拡張します。
Visual Studio Tools for Office を使用して、ドキュメント内で VBA コードを記述することにより、サービスへのアクセスが可能なエンド ユーザーが利用できるサービスを開発します。
Visual Studio Tools for Office は、アプリケーション レベルのアドインに対しても同様の機能を提供します。アドインを開発している場合は、他の Microsoft Office ソリューションから、アドイン内のコードを呼び出すことができます。詳細については、「他の Office ソリューションからのアプリケーション レベルのアドインのコードの呼び出し」を参照してください。
メモ : |
---|
この機能は、Word テンプレート プロジェクトでは使用できません。この機能は、Word 文書、Excel ブック、または Excel テンプレートのプロジェクトでのみ使用できます。 |
必要条件
VBA コードからカスタマイズ アセンブリ内のコードを呼び出すことができるようにするには、プロジェクトが以下の要件を満たしている必要があります。
ドキュメントには、以下のいずれかのファイル名拡張子が付けられています。
Word の場合 : .docm または .doc
Excel の場合 : .xlsm、.xltm、.xls、または .xlt
ドキュメントには、VBA コードが記述された既存の VBA プロジェクトがあります。
ドキュメント内の VBA コードは、マクロを有効にすることを確認するメッセージをユーザーに表示せずに実行できるようにしなければなりません。VBA コードを信頼して実行するには、Word または Excel のセキュリティ センターの設定にある信頼できる場所の一覧に、Visual Studio Tools for Office プロジェクトの場所を追加します。
Visual Studio Tools for Office プロジェクトには、VBA に公開する 1 つ以上のパブリック メンバを含むパブリック クラスが少なくとも 1 つは含まれていることが必要です。
VBA に対して公開できるのは、メソッド、プロパティ、およびイベントです。クラスについては、ホスト項目クラス (Word の場合は ThisDocument、Excel の場合は ThisWorkbook と Sheet1) またはプロジェクトで定義したその他のクラスを公開できます。ホスト項目の詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。
VBA コードからカスタマイズ アセンブリ内のコードへの呼び出しを有効にする
カスタマイズ アセンブリ内のメンバを、ドキュメント内の VBA コードに公開するには、2 つの方法があります。
Visual Basic プロジェクト内のホスト項目クラスのメンバを VBA に公開できます。この操作を行うには、ホスト項目クラスの EnableVbaCallers プロパティを True に設定します。Visual Studio Tools for Office によって、VBA コードからクラスのメンバを呼び出すために必要なすべての処理が自動的に行われます。
Visual C# プロジェクト内のパブリック クラスのメンバ、または Visual Basic プロジェクト内にある、ホスト項目ではないクラスに所属するメンバを VBA に公開できます。この方法を使用すると、VBA に公開するクラス選択の自由度が高まりますが、手動で実行する手順も多くなります。
この操作を行うために必要となる、主要な手順は次のとおりです。
クラスを COM に公開します。
プロジェクト内のホスト項目クラスの GetAutomationObject メソッドをオーバーライドして、VBA に公開するクラスのインスタンスを返します。
プロジェクト内の任意のホスト項目クラスの ReferenceAssemblyFromVbaProject プロパティを、True に設定します。この操作により、カスタマイズ アセンブリのタイプ ライブラリがアセンブリに埋め込まれ、タイプ ライブラリへの参照が、ドキュメント内の VBA プロジェクトに追加されます。
詳細な手順については、「方法 : Visual Basic プロジェクトのコードを VBA に公開する」および「方法 : Visual C# プロジェクトのコードを VBA に公開する」を参照してください。
EnableVbaCallers プロパティと ReferenceAssemblyFromVbaProject プロパティは、デザイン時に [プロパティ] ウィンドウでのみ利用できます。実行時には使用できません。プロパティを表示するには、Visual Studio でホスト項目に対するデザイナを開きます。これらのプロパティを設定するときに Visual Studio Tools for Office によって実行される特定のタスクの詳細については、「ホスト項目のプロパティによって実行されるタスク」を参照してください。
メモ : |
---|
ブックまたは文書に VBA コードが含まれていない場合、またはドキュメント内の VBA コード実行に対する信頼が付与されていない場合、EnableVbaCallers プロパティまたは ReferenceAssemblyFromVbaProject プロパティを True に設定するとエラー メッセージが表示されます。このエラーは、この状況では、Visual Studio Tools for Office がドキュメント内の VBA プロジェクトを変更できないために発生します。 |
VBA コード内のメンバを使用してカスタマイズ アセンブリ内のコードを呼び出す
VBA コードからカスタマイズ アセンブリ内のコードへの呼び出しを有効にするようにプロジェクトを構成すると、Visual Studio Tools for Office によって、ドキュメント内の VBA プロジェクトに次のメンバが追加されます。
Visual Studio Tools for Office は、すべてのプロジェクトに対して、GetManagedClass というグローバル メソッドを追加します。
EnableVbaCallers プロパティを使用してホスト項目クラスのメンバを公開する Visual Basic プロジェクトに対しても、Visual Studio Tools for Office は、VBA プロジェクト内の ThisDocument、ThisWorkbook、Sheet1、Sheet2、または Sheet3 のモジュールに、CallVSTOAssembly というプロパティを追加します。
CallVSTOAssembly プロパティまたは GetManagedClass メソッドを使用して、Visual Studio Tools for Office プロジェクト内の VBA コードに公開したクラスのパブリック メンバにアクセスできます。
メモ : |
---|
ソリューションの開発や配置に際しては、ドキュメントのさまざまなコピーに VBA コードを追加できます。詳細については、「ドキュメントに VBA コードを追加する場合のガイドライン」を参照してください。 |
Visual Basic プロジェクトで CallVSTOAssembly プロパティを使用する
ホスト項目クラスに追加したパブリック メンバにアクセスするには、CallVSTOAssembly プロパティを使用します。たとえば、次に示す VBA マクロは、Excel ブック プロジェクト内の Sheet1 クラスに定義されている MyVSTOMethod というメソッドを呼び出します。
Sub MyMacro()
Sheet1.CallVSTOAssembly.MyVSTOMethod()
End Sub
このプロパティは、カスタマイズ アセンブリ内のコードを呼び出すときに、GetManagedClass メソッドを直接使用するよりも使いやすい方法として利用できます。CallVSTOAssembly により、VBA に公開したホスト項目クラスを表すオブジェクトが返されます。返されるオブジェクトのメンバとメソッド パラメータは、IntelliSense に表示されます。
CallVSTOAssembly プロパティには、次のコードのような宣言があります。このコードでは、ExcelWorkbook1 という Excel ブック プロジェクトにある Sheet1 ホスト項目クラスを VBA に公開していることを前提としています。
Property Get CallVSTOAssembly() As ExcelWorkbook1.Sheet1
Set CallVSTOAssembly = GetManagedClass(Me)
End Property
GetManagedClass メソッドを使用する
GetManagedClass グローバル メソッドを使用するには、GetAutomationObject メソッドのオーバーライドを含むホスト項目クラスに対応する VBA オブジェクトに対して、このメソッドを渡します。返されたオブジェクトを使用して、VBA に公開したクラスにアクセスします。
次に示す VBA マクロは、ExcelWorkbook1 という Excel ブック プロジェクト内の Sheet1 ホスト項目クラスに定義されている MyVSTOMethod というメソッドを呼び出します。
Sub CallVSTOMethod
Dim VSTOSheet1 As ExcelWorkbook1.Sheet1
Set VSTOSheet1 = GetManagedClass(Sheet1)
VSTOSheet1.MyVSTOMethod
End Sub
GetManagedClass メソッドには、次のような宣言があります。
GetManagedClass(pdispInteropObject Object) As Object
このメソッドにより、VBA に公開したクラスを表すオブジェクトが返されます。返されるオブジェクトのメンバとメソッド パラメータは、IntelliSense に表示されます。
ドキュメントに VBA コードを追加する場合のガイドライン
ドキュメントのさまざまなコピーに対して、Visual Studio Tools for Office カスタマイズ内のコードを呼び出す VBA コードを追加できます。
ソリューションの開発やテストを行うとき、Visual Studio 内のプロジェクトのデバッグ時または実行時に開くドキュメント (ビルド出力フォルダ内のドキュメント) に、VBA コードを記述できます。ただし、このドキュメントに追加する VBA コードは、次にプロジェクトをビルドするときに上書きされます。これは、Visual Studio によって、ビルド出力フォルダ内のドキュメントが、メイン プロジェクト フォルダのドキュメントのコピーで置換されるためです。
ソリューションのデバッグ時または実行時にドキュメントに加えた VBA コードを保存するには、VBA コードをプロジェクト フォルダのドキュメントにコピーします。ビルド処理の詳細については、「Office ソリューション ビルド処理の概要」を参照してください。
ソリューション配置の準備が整うと、主要な 3 つの場所にあるドキュメントに VBA コードを追加できます。
開発用コンピュータ上のプロジェクト フォルダ
ドキュメント内の VBA コードと、Visual Studio Tools for Office カスタマイズ コードの両方を完全に制御できる場合は、この場所を使用すると便利です。ドキュメントは開発用コンピュータ上にあるため、カスタマイズ コードを変更するときに VBA コードに簡単に手を加えることができます。このドキュメントのコピーに追加した VBA コードは、ソリューションのビルド、デバッグ、発行を行ってもドキュメント内に残ります。
デザイナで開いているドキュメントに、VBA コードを追加することはできません。デザイナでドキュメントを閉じてから、Word または Excel でドキュメントを直接開く必要があります。
注意 : |
---|
ドキュメントが開かれているときに、実行する VBA コードを追加すると、まれに、ドキュメントが破損したり、デザイナで開くことができなくなったりすることがあります。 |
発行フォルダまたはインストール フォルダ
発行フォルダまたはインストール フォルダにあるドキュメントに VBA コードを追加することが適切な場合があります。たとえば、Visual Studio Tools for Office がインストールされていないコンピュータ上で、別の開発者によって記述されてテストされた VBA コードがある場合に、このオプションを選択できます。
ソリューションを発行フォルダから直接インストールすると、ソリューションを発行するたびに VBA コードをドキュメントに追加する必要があります。ソリューションを発行すると、Visual Studio によって、発行場所にあるドキュメントが上書きされます。
ユーザーが発行フォルダとは異なるインストール フォルダからソリューションをインストールする場合は、ソリューションを発行するたびに VBA コードをドキュメントに追加する必要はありません。発行の更新プログラムで、発行フォルダからインストール フォルダに移動する準備を整えている場合は、対象ドキュメントを除くすべてのファイルを、インストール フォルダにコピーします。
エンド ユーザーのコンピュータ
エンド ユーザーが、Visual Studio Tools for Office カスタマイズで提供したサービスの呼び出しを行う VBA 開発者である場合は、ドキュメントのコピーから CallVSTOAssembly プロパティまたは GetManagedClass メソッドを使用してコードを呼び出す方法を伝えます。ソリューションの更新プログラムを発行しても、エンド ユーザーのコンピュータ上のドキュメントにある VBA コードは上書きされません。このドキュメントは、発行の更新プログラムによって変更されないためです。
ホスト項目のプロパティによって実行されるタスク
EnableVbaCallers プロパティと ReferenceAssemblyFromVbaProject プロパティを使用すると、Visual Studio Tools for Office は一連の異なるタスクを実行します。
EnableVbaCallers
Visual Basic プロジェクトでホスト項目の EnableVbaCallers プロパティを True に設定すると、Visual Studio Tools for Office は次のタスクを実行します。
ホスト項目クラスに ComClassAttribute 属性と ComVisibleAttribute 属性を追加します。
ホスト項目クラスの GetAutomationObject メソッドをオーバーライドします。
ホスト項目の ReferenceAssemblyFromVbaProject プロパティを True に設定します。
EnableVbaCallers プロパティの設定が False に戻されると、Visual Studio Tools for Office は次のタスクを実行します。
ThisDocument クラスから ComClassAttribute 属性と ComVisibleAttribute 属性を削除します。
ホスト項目クラスから GetAutomationObject メソッドを削除します。
メモ : Visual Studio Tools for Office で、ReferenceAssemblyFromVbaProject プロパティが自動的に False に戻されることはありません。[プロパティ] ウィンドウを使用して、このプロパティを手動で False に設定できます。
ReferenceAssemblyFromVbaProject
Visual Basic プロジェクトまたは Visual C# プロジェクトにある、いずれかのホスト項目の ReferenceAssemblyFromVbaProject プロパティが True に設定されていると、Visual Studio Tools for Office は次のタスクを実行します。
カスタマイズ アセンブリのタイプ ライブラリを作成し、アセンブリにタイプ ライブラリを埋め込みます。
ドキュメント内の VBA プロジェクトにある次のタイプ ライブラリへの参照を追加します。
カスタマイズ アセンブリのタイプ ライブラリ。
Microsoft Visual Studio Tools for Office Execution Engine 9.0 タイプ ライブラリ。このタイプ ライブラリは、Visual Studio Tools for Office ランタイムに含まれます。
ReferenceAssemblyFromVbaProject プロパティの設定が False に戻されると、Visual Studio Tools for Office は次のタスクを実行します。
ドキュメント内の VBA プロジェクトから、タイプ ライブラリへの参照を削除します。
アセンブリから、埋め込まれたタイプ ライブラリを削除します。
トラブルシューティング
一般的なエラーと、エラーを修正するための提案事項を次の表に示します。
エラー |
対処方法 |
---|---|
EnableVbaCallers プロパティまたは ReferenceAssemblyFromVbaProject プロパティを設定すると、ドキュメントに VBA プロジェクトが含まれていないか、ドキュメント内の VBA プロジェクトにアクセスするためのアクセス許可がないことを知らせるエラー メッセージが表示される。 |
プロジェクト内のドキュメントに少なくとも 1 つの VBA マクロが含まれていること、VBA プロジェクトを信頼して実行できること、および VBA プロジェクトがパスワードで保護されていないことを確認します。 |
EnableVbaCallers プロパティまたは ReferenceAssemblyFromVbaProject プロパティを設定すると、GuidAttribute 宣言が行われていないか、破損していることを知らせるエラー メッセージが表示される。 |
プロジェクト内の AssemblyInfo.cs ファイルまたは AssemblyInfo.vb ファイルに GuidAttribute 宣言があること、この属性が有効な GUID に設定されていることを確認します。 |
EnableVbaCallers プロパティまたは ReferenceAssemblyFromVbaProject プロパティを設定すると、AssemblyVersionAttribute に指定されたバージョン番号が有効でないことを知らせるエラー メッセージが表示される。 |
プロジェクト内の AssemblyInfo.cs ファイルまたは AssemblyInfo.vb ファイルにある AssemblyVersionAttribute 宣言が、有効なアセンブリのバージョン番号に設定されていることを確認します。有効なアセンブリのバージョン番号の詳細については、AssemblyVersionAttribute クラスの説明を参照してください。 |
カスタマイズ アセンブリの名前を変更した後、カスタマイズ アセンブリ内のコードを呼び出す VBA コードが動作しなくなる。 |
VBA コードへの公開を行った後にカスタマイズ アセンブリの名前を変更した場合は、ドキュメント内の VBA プロジェクトとカスタマイズ アセンブリ間のリンクが解除されています。この問題を修正するには、プロジェクト内の ReferenceFromVbaAssembly プロパティを False に変更して True に戻し、VBA コード内にある古いアセンブリ名への参照を新しいアセンブリ名への参照に置換します。 |
参照
処理手順
方法 : Visual Basic プロジェクトのコードを VBA に公開する
方法 : Visual C# プロジェクトのコードを VBA に公開する
チュートリアル : VBA から Visual Basic プロジェクトのコードを呼び出す
チュートリアル : VBA から Visual C# プロジェクトのコードを呼び出す