VBA とドキュメント レベルのカスタマイズの結合
Microsoft Office Word または Microsoft Office Excel 用のドキュメント レベルのカスタマイズに属するドキュメントで、Visual Basic for Applications (VBA) コードを使用できます。ドキュメント内の VBA コードをカスタマイズ アセンブリから呼び出すことができます。または、ドキュメント内の VBA コードによってカスタマイズ アセンブリ内のコードを呼び出すことができるようにプロジェクトを構成できます。
対象: このトピックの情報は、Excel 2013 と Excel 2010、および Word 2013 と Word 2010 のドキュメント レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
ドキュメント レベルのカスタマイズの VBA コードの動作
Visual Studio でプロジェクトを開くと、ドキュメントはデザイン モードで表示されます。ドキュメントをデザイン モードで表示すると VBA コードが実行されないので、VBA コードを実行せずにドキュメントやコードで作業を行うことができます。
ソリューションを実行すると、VBA とカスタマイズ アセンブリのイベント ハンドラーがドキュメント内で発生したイベントを受け取り、両方のコードが実行されます。2 つのコードの実行順序を事前に決めることはできません。事例ごとにテストによって判断する必要があります。予想外の結果が発生しないように、2 つのコードのセットを慎重に組み合わせ、テストしてください。
カスタマイズ アセンブリからの VBA コードの呼び出し
Word 文書ではマクロを呼び出すことができ、Excel ブックではマクロと関数を呼び出すことができます。これらを呼び出すには、次のいずれかのメソッドを使用します。
Word では、Microsoft.Office.Interop.Word.Application クラスの Run メソッドを呼び出します。
Excel では、Microsoft.Office.Interop.Excel.Application クラスの Run メソッドを呼び出します。
いずれのメソッドでも、1 つ目のパラメーターでは呼び出すマクロまたは関数の名前を指定し、残りの省略可能なパラメーターではマクロまたは関数に渡すパラメーターを指定します。1 つ目のパラメーターは、次のように Word と Excel で形式が異なります。
Word の場合、1 つ目のパラメーターは、テンプレート名、モジュール名、マクロ名を任意に組み合わせた文字列です。ドキュメント名を指定した場合、コードは、どのようなドキュメント内のマクロでも実行できるわけではなく、現在のコンテキストに関連するドキュメント内のマクロのみ実行できます。
Excel の場合、1 つ目のパラメーターは、マクロ名、関数が存在する場所を示す Range、または登録済み DLL (XLL) 関数のレジスタ ID を指定する文字列です。文字列を渡すと、その文字列はアクティブ シートのコンテキスト内で評価されます。
次のコード例は、MyMacro という名前のマクロを Excel のドキュメント レベルのプロジェクトから呼び出す方法を示しています。この例は、MyMacro が Sheet1 に定義されていることを前提としています。
Globals.Sheet1.Application.Run("MyMacro")
Globals.Sheet1.Application.Run("MyMacro", missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing);
[!メモ]
Visual C# で省略可能なパラメーターの代わりにグローバル missing 変数を使用する方法の詳細については、「Office ソリューションのコードの記述」を参照してください。
VBAからドキュメント レベルのカスタマイズのコードの呼び出し
Word または Excel 用のドキュメント レベルのプロジェクトを構成し、ドキュメント内の Visual Basic for Applications (VBA) コードからカスタマイズ アセンブリ内のコードを呼び出すことができます。この機能は、次のようなシナリオで役立ちます。
同じドキュメントに関連付けられているドキュメント レベルのカスタマイズの機能を使用して、ドキュメント内の既存の VBA コードを拡張します。
ドキュメント レベルのカスタマイズで、ドキュメント内で VBA コードを記述することによりサービスへのアクセスが可能なエンド ユーザーが利用できるサービスを開発します。
Visual Studio の Office 開発ツールには、アプリケーション レベルのアドインに同様の機能が用意されています。アドインを開発している場合は、他の Microsoft Office ソリューションから、アドイン内のコードを呼び出すことができます。詳細については、「他の Office ソリューションからのアプリケーション レベルのアドインのコードの呼び出し」を参照してください。
[!メモ]
この機能は、Word テンプレート プロジェクトでは使用できません。この機能は、Word 文書、Excel ブック、または Excel テンプレートのプロジェクトでのみ使用できます。
要件
VBA コードからカスタマイズ アセンブリ内のコードを呼び出すことができるようにするには、プロジェクトが以下の要件を満たしている必要があります。
ドキュメントには、以下のいずれかのファイル名拡張子が付けられています。
Word の場合 : .docm または .doc
Excel の場合 : .xlsm、.xltm、.xls、または .xlt
ドキュメントには、VBA コードが記述された既存の VBA プロジェクトがあります。
ドキュメント内の VBA コードは、マクロを有効にすることを確認するメッセージをユーザーに表示せずに実行できるようにしなければなりません。Word または Excel のセキュリティ センターの設定にある信頼できる場所の一覧に Office プロジェクトの場所を追加することで、VBA コードを信頼して実行できるようになります。
Office プロジェクトには、VBA に公開する 1 つ以上のパブリック メンバーを含むパブリック クラスが少なくとも 1 つは含まれていることが必要です。
VBA に対して公開できるのは、メソッド、プロパティ、およびイベントです。クラスについては、ホスト項目クラス (Word の場合は ThisDocument、Excel の場合は ThisWorkbook と Sheet1) またはプロジェクトで定義したその他のクラスを公開できます。ホスト項目の詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。
VBA コードからカスタマイズ アセンブリ内のコードへの呼び出しを有効にする
カスタマイズ アセンブリ内のメンバーを、ドキュメント内の VBA コードに公開するには、2 つの方法があります。
Visual Basic プロジェクト内のホスト項目クラスのメンバーを VBA に公開できます。これを行うには、デザイナーでホスト項目 (つまり、文書、ワークシート、またはブック) が開いているときに、[プロパティ] ウィンドウでホスト項目の EnableVbaCallers プロパティを True に設定します。Visual Studio によって、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 によって実行される特定のタスクの詳細については、「ホスト項目のプロパティによって実行されるタスク」を参照してください。
[!メモ]
ブックまたは文書に VBA コードが含まれていない場合、またはドキュメント内の VBA コード実行に対する信頼が付与されていない場合、EnableVbaCallers プロパティまたは ReferenceAssemblyFromVbaProject プロパティを True に設定するとエラー メッセージが表示されます。これは、このような場合、Visual Studio が文書内の VBA プロジェクトを変更できないからです。
VBA コード内のメンバーを使用してカスタマイズ アセンブリ内のコードを呼び出す
VBA コードからカスタマイズ アセンブリ内のコードへの呼び出しを有効にするようにプロジェクトを構成すると、Visual Studio によって、ドキュメント内の VBA プロジェクトに次のメンバーが追加されます。
Visual Studio は、すべてのプロジェクトに対して、GetManagedClass というグローバル メソッドを追加します。
EnableVbaCallers プロパティを使用してホスト項目クラスのメンバーを公開する Visual Basic プロジェクトに対しても、Visual Studio は、VBA プロジェクト内の ThisDocument、ThisWorkbook、Sheet1、Sheet2、または Sheet3 のモジュールに CallVSTOAssembly というプロパティを追加します。
CallVSTOAssembly プロパティまたは GetManagedClass メソッドを使用して、プロジェクト内の 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 コードを追加する場合のガイドライン
ドキュメントのさまざまなコピーに対して、ドキュメント レベルのカスタマイズ内のコードを呼び出す VBA コードを追加できます。
ソリューションの開発やテストを行うとき、Visual Studio 内のプロジェクトのデバッグ時または実行時に開くドキュメント (ビルド出力フォルダー内のドキュメント) に、VBA コードを記述できます。ただし、このドキュメントに追加する VBA コードは、次にプロジェクトをビルドするときに上書きされます。これは、Visual Studio によって、ビルド出力フォルダー内のドキュメントが、メイン プロジェクト フォルダーのドキュメントのコピーで置換されるためです。
ソリューションのデバッグ時または実行時にドキュメントに加えた VBA コードを保存するには、VBA コードをプロジェクト フォルダーのドキュメントにコピーします。ビルド処理の詳細については、「Office ソリューションのビルド」を参照してください。
ソリューション配置の準備が整うと、主要な 3 つの場所にあるドキュメントに VBA コードを追加できます。
開発用コンピューター上のプロジェクト フォルダー
ドキュメント内の VBA コードと、カスタマイズ コードの両方を完全に制御できる場合は、この場所を使用すると便利です。ドキュメントは開発用コンピューター上にあるため、カスタマイズ コードを変更するときに VBA コードに簡単に手を加えることができます。このドキュメントのコピーに追加した VBA コードは、ソリューションのビルド、デバッグ、発行を行ってもドキュメント内に残ります。
デザイナーで開いているドキュメントに、VBA コードを追加することはできません。デザイナーでドキュメントを閉じてから、Word または Excel でドキュメントを直接開く必要があります。
注意 |
---|
ドキュメントが開かれているときに、実行する VBA コードを追加すると、まれに、ドキュメントが破損したり、デザイナーで開くことができなくなったりすることがあります。 |
発行フォルダーまたはインストール フォルダー
発行フォルダーまたはインストール フォルダーにあるドキュメントに VBA コードを追加することが適切な場合があります。たとえば、Visual Studio がインストールされていないコンピューター上で、別の開発者によって記述されてテストされた VBA コードがある場合に、このオプションを選択できます。
ソリューションを発行フォルダーから直接インストールすると、ソリューションを発行するたびに VBA コードをドキュメントに追加する必要があります。ソリューションを発行すると、Visual Studio によって、発行場所にあるドキュメントが上書きされます。
ユーザーが発行フォルダーとは異なるインストール フォルダーからソリューションをインストールする場合は、ソリューションを発行するたびに VBA コードをドキュメントに追加する必要はありません。発行の更新プログラムで、発行フォルダーからインストール フォルダーに移動する準備を整えている場合は、対象ドキュメントを除くすべてのファイルを、インストール フォルダーにコピーします。
エンド ユーザーのコンピューター
エンド ユーザーである VBA 開発者によってドキュメント レベルのカスタマイズで提供されるサービスが呼び出される場合は、エンド ユーザーの文書の CallVSTOAssembly プロパティまたは GetManagedClass メソッドを使用して、コードを呼び出す方法を通知できます。ソリューションの更新を発行しても、発行の更新によって文書は変更されないため、エンド ユーザーのコンピューター上にある文書の VBA コードは上書きされません。
ホスト項目のプロパティによって実行されるタスク
EnableVbaCallers プロパティと ReferenceAssemblyFromVbaProject プロパティを使用すると、Visual Studio は一連の異なるタスクを実行します。
EnableVbaCallers
Visual Basic プロジェクトでホスト項目の EnableVbaCallers プロパティを True に設定すると、Visual Studio は次のタスクを実行します。
ホスト項目クラスに ComClassAttribute 属性と ComVisibleAttribute 属性を追加します。
ホスト項目クラスの GetAutomationObject メソッドをオーバーライドします。
ホスト項目の ReferenceAssemblyFromVbaProject プロパティを True に設定します。
EnableVbaCallers プロパティの設定が False に戻されると、Visual Studio は次のタスクを実行します。
ThisDocument クラスから ComClassAttribute 属性と ComVisibleAttribute 属性を削除します。
ホスト項目クラスから GetAutomationObject メソッドを削除します。
[!メモ]
Visual Studio で、ReferenceAssemblyFromVbaProject プロパティが自動的に False に戻されることはありません。[プロパティ] ウィンドウを使用して、このプロパティを手動で False に設定できます。
ReferenceAssemblyFromVbaProject
Visual Basic プロジェクトまたは Visual C# プロジェクトにある、いずれかのホスト項目の ReferenceAssemblyFromVbaProject プロパティが True に設定されていると、Visual Studio は次のタスクを実行します。
カスタマイズ アセンブリのタイプ ライブラリを作成し、アセンブリにタイプ ライブラリを埋め込みます。
ドキュメント内の VBA プロジェクトにある次のタイプ ライブラリへの参照を追加します。
カスタマイズ アセンブリのタイプ ライブラリ。
Microsoft Visual Studio Tools for Office Execution Engine 9.0 タイプ ライブラリ。このタイプ ライブラリは、Visual Studio Tools for Office Runtime に含まれます。
ReferenceAssemblyFromVbaProject プロパティの設定が False に戻されると、Visual Studio は次のタスクを実行します。
ドキュメント内の 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# プロジェクトのコードを呼び出す
概念
VBA ソリューションと Visual Studio の Office ソリューションの比較