Visual C++ .NET のオートメーションを使用して Office マクロを実行する方法

文書翻訳 文書翻訳
文書番号: 306686 - 対象製品
この記事は、以前は次の ID で公開されていました: JP306686
Microsoft Visual Basic .NET については、次の資料を参照してください。306682
Microsoft Visual C# については、次の資料を参照してください。306683
すべて展開する | すべて折りたたむ

概要

Microsoft Office のオートメーションを使用すると、Visual Basic for Application (VBA) マクロを含んだ新しいドキュメントを作成したり、開いたり、実行時にマクロを実行したりすることができます。この資料では、Visual C++ .NET オートメーション クライアントから Office マクロを呼び出す方法について説明しています。

詳細

次のオートメーション クライアントのサンプルでは、フォームでの選択内容に基づいて Office オートメーション サーバー (Access、Excel、PowerPoint、または Word) を操作します。クライアントからオートメーション サーバーが起動された後、ドキュメントが開かれ、2 つのマクロが実行されます。最初のマクロ DoKbTest はパラメータを受け取りません。2 番目のマクロ DoKbTestWithParameter は String 型のパラメータを 1 つ受け取ります。

マクロを含む Office ドキュメントの作成

  1. 以下の手順に従って、C:\Doc1.doc という名前の Word 文書を作成します。
    1. Word で新しい文書を作成します。
    2. Alt + F11 キーを押して Visual Basic Editor を開きます。
    3. [挿入] メニューの [標準モジュール] をクリックします。
    4. 新しいモジュールに次のマクロ コードを貼り付けます。
      'Display a message box that displays the application name.
      Public Sub DoKbTest()
         MsgBox "Hello from " & Application.Name
      End Sub
      
      'Display a message box with the string passed from the
      'Automation client.
      Public Sub DoKbTestWithParameter( sMsg As String )
         MsgBox sMsg
      End Sub
      						
    5. Visual Basic Editor を閉じ、Word 文書を保存して Word を終了します。
  2. Word 文書の作成と同様の手順を使用して、C:\Book1.xls という名前の Excel ブックを作成します。
  3. Word 文書の作成と同様の手順を使用して、C:\Pres1.ppt という名前の PowerPoint プレゼンテーションを作成します。
  4. 以下の手順に従って、C:\Db1.mdb という名前の新しい Access データベースを作成します。
    1. [挿入] メニューの [標準モジュール] をクリックします。
    2. 新しいモジュールにマクロ コードを貼り付けます。
    3. モジュールを保存し、Access を終了します。

Visual C++ .NET オートメーション クライアントの作成

  1. Microsoft Visual Studio .NET を起動します。[ファイル] メニューの [新規作成] をクリックし、[プロジェクト] をクリックします。[プロジェクトの種類] ボックスの一覧の [Visual C++ プロジェクト] をクリックし、[テンプレート] ボックスの一覧で、Visual Studio .NET 2002 の場合は [Managed C++ アプリケーション] を、Visual Studio .NET 2003 の場合は [コンソール アプリケーション (.NET)] をそれぞれクリックします。OfficeMacros というプロジェクト名で C:\ にプロジェクトを作成します。
  2. Microsoft Office XP プライマリ相互運用機能アセンブリ (PIA) がまだインストールされていない場合は、PIA のダウンロード、インストール、および登録を実行します。 Office XP 用の PIA の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
    328912 Microsoft Office XP 用の PIA (Primary Interop Assemblies) のダウンロード
    PIA を C:\Program Files\Microsoft Visual Studio .NET\Enterprise Frameworks フォルダか同様にアクセスできる他のフォルダにインストールします。これらは、グローバル アセンブリ キャッシュにも登録されます。
  3. #using ディレクティブに渡す、ファイル参照を解決するための検索ディレクトリ一覧に、プライマリ相互運用機能アセンブリ DLL ファイルをインストールしたフォルダを追加します。これを行うには、以下の手順を実行します。
    1. Visual Studio .NET の [ソリューション エクスプローラ] ウィンドウで、プロジェクトを右クリックし、[プロパティ] をクリックします。
    2. [プロパティ ページ] ダイアログ ボックスの左側のウィンドウで、[C/C++] フォルダをクリックし、[全般] フォルダをクリックします。
    3. [#using 参照の解決] ボックスに、パス C:\Program Files\Microsoft Visual Studio .NET\Enterprise Frameworks を追加し、[OK] をクリックします。PIA を別のフォルダにインストールした場合は、そのフォルダへの完全なパスを代わりに使用します。
  4. ソース エディタで OfficeMacros.cpp を開き、内容を次のコードに置き換えます。
    // This is the main project file for VC++ application project 
    // generated using an Application Wizard.
    
    #include "stdafx.h"
    
       #using <mscorlib.dll>
    
       #using "Office.dll"
       #using "Microsoft.Office.Interop.word.dll"
       #using "Microsoft.Office.Interop.excel.dll"
       #using "Microsoft.Office.Interop.powerpoint.dll"
       #using "Microsoft.Office.Interop.Access.dll"
       #using "Microsoft.vbe.interop.dll"
    
       using namespace System;
       //using namespace System::Diagnostics;
       using namespace System::Reflection;
       using namespace Microsoft::Office::Core;
       using namespace Microsoft::Office::Interop;
    
       #include <tchar.h>
    
       void PrintMenu();
       void AutoCallAccess();
       void AutoCallExcel();
       void AutoCallPowerPoint();
       void AutoCallWord();
       void CallMacro(Object* oApp, Object* oArgs[]);
    
       int _tmain(void)
       {
       	PrintMenu();
       	String* s = Console::ReadLine();
       	while( !s->ToLower()->Equals(S"q") )
       	{
       		Int32 i;
       		try
       		{
       			i = Convert::ToInt32(s,10);
       		}
       		catch( Exception* e )
       		{
       			goto print;
       		}
    
       		// Select the Office application to automate based on user input.
    
       		switch( i )
       		{
       		case 1:
       			AutoCallAccess();
       			break;
       		case 2:
       			AutoCallExcel();
       			break;
       		case 3:
       			AutoCallPowerPoint();
       			break;
       		case 4:
       			AutoCallWord();
       			break;
       		default:
       			;
       		}
       print:
       		PrintMenu();
       		s = Console::ReadLine();
       	}
       	return 0;
       }
    
       void PrintMenu()
       {
       	Console::WriteLine(S"\n\nEnter the number of the application you'd like to automate.");
       	Console::WriteLine(S"Enter 'q' to quit the application.\n");
       	Console::WriteLine(S"\t\t1. Microsoft Access");
       	Console::WriteLine(S"\t\t2. Microsoft Excel");
       	Console::WriteLine(S"\t\t3. Microsoft PowerPoint");
       	Console::WriteLine(S"\t\t4. Microsoft Word\n");
       	Console::Write(S"\tSelection:");
       }
    
       void AutoCallAccess()
       {
       	try{
       		//Start Access, make it visible, and open C:\Db1.mdb.
       		Console::WriteLine("\nStarting Microsoft Access...");
       		Access::ApplicationClass* pAccess = new Access::ApplicationClass();
       		pAccess->Visible = true;
       		pAccess->OpenCurrentDatabase("c:\\db1.mdb", false, "");
       		//Run the macros.
       		System::Object* oParams[] = {new String("DoKbTest"), 
       			System::Reflection::Missing::Value};
       		CallMacro(pAccess, oParams);
       		oParams[0] = new String("DoKbTestWithParameter");
       		oParams[1] = new String("Hello From Visual C++ .NET (AutoCallAccess)");
       		CallMacro(pAccess, oParams);	
       		//Quit Access and clean up.
            pAccess->get_DoCmd()->Quit(Access::AcQuitOption::acQuitSaveNone);
       		System::Runtime::InteropServices::Marshal::ReleaseComObject(pAccess);
       		GC::Collect();
       	}
       	catch(Exception* e)
       	{
       		Console::WriteLine(S"Error automating Access...");
       		Console::WriteLine(e->get_Message());
       	}
       }
    
       void AutoCallExcel()
       {
       	try{
       		//Start Excel, make it visible, and open C:\Book1.xls.
       		System::Object* oMissing = System::Reflection::Missing::Value;
       		Console::WriteLine("\nStarting Microsoft Excel...");
            Excel::ApplicationClass* pExcel = new Excel::ApplicationClass();
       		pExcel->Visible = true;
            Excel::Workbooks* pBooks = pExcel->get_Workbooks();
       		Excel::_Workbook* pBook = pBooks->Open("c:\\book1.xls", oMissing, oMissing,
       			oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, 
       			oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
    
       		//Run the macros.
       		System::Object* oParams[] = {new String("DoKbTest"), oMissing};
       		CallMacro(pExcel, oParams);
       		oParams[0] = new String("DoKbTestWithParameter");
       		oParams[1] = new String("Hello From Visual C++ .NET (AutoCallExcel)");
       		CallMacro(pExcel, oParams);
       		//Quit Excel and clean up.
       		pBook->Close(false, oMissing, oMissing);
       		System::Runtime::InteropServices::Marshal::ReleaseComObject(pBook);
       		System::Runtime::InteropServices::Marshal::ReleaseComObject(pBooks);
       		pExcel->Quit();
       		System::Runtime::InteropServices::Marshal::ReleaseComObject(pExcel);
       		GC::Collect();
       	}
       	catch(Exception* e)
       	{
       		Console::WriteLine(S"Error automating Excel...");
       		Console::WriteLine(e->get_Message());
       	}
       }
    
       void AutoCallPowerPoint()
       {
       	try{
       		//Start PowerPoint, make it visible, and open C:\Pres1.ppt.
       		Console::WriteLine("\nStarting Microsoft PowerPoint...");
       		PowerPoint::ApplicationClass* pPPT = new PowerPoint::ApplicationClass();
            pPPT->Visible =  Microsoft::Office::Core::MsoTriState::msoTrue;
       		
       		PowerPoint::Presentations* pPresSet = pPPT->get_Presentations();
       		PowerPoint::_Presentation* pPres = pPresSet->Open("C:\\pres1.ppt", 
       			MsoTriState::msoFalse, 
       			MsoTriState::msoFalse,
       			MsoTriState::msoTrue);
       		
       		//Run the macros.
       		System::Object* oParams[] = {new String("'pres1.ppt'!DoKbTest"), 
       			System::Reflection::Missing::Value};
       		CallMacro(pPPT, oParams);
       		oParams[0] = new String("'pres1.ppt'!DoKbTestWithParameter");
       		oParams[1] = new String("Hello From Visual C++ .NET (AutoCallPowerPoint)");
       		CallMacro(pPPT, oParams);		
       		//Quit PowerPoint and clean up.
       		pPres->Close();
       		System::Runtime::InteropServices::Marshal::ReleaseComObject(pPres);
       		System::Runtime::InteropServices::Marshal::ReleaseComObject(pPresSet);
       		pPPT->Quit();
       		System::Runtime::InteropServices::Marshal::ReleaseComObject(pPPT);
       		GC::Collect();
       	}
       	catch(Exception* e)
       	{
       		Console::WriteLine(S"Error automating PowerPoint...");
       		Console::WriteLine(e->get_Message());
       	}
       }
    
       void AutoCallWord()
       {
       	try{
       		//Start Word, make it visible, and open C:\Doc1.doc.
       		System::Object* oMissing = System::Reflection::Missing::Value;
       		Console::WriteLine("\nStarting Microsoft Word...");
       		Word::ApplicationClass* pWord = new Word::ApplicationClass;
       		pWord->Visible = true;
       		Word::Documents* pDocs = pWord->Documents;
       		System::Object* oFile = new System::Object;
       		oFile = S"c:\\doc1.doc";
       		Word::_Document* pDoc = pDocs->Open(&oFile, &oMissing,
       			&oMissing, &oMissing, &oMissing, &oMissing, &oMissing,
       			&oMissing, &oMissing, &oMissing, &oMissing, &oMissing,
       			&oMissing, &oMissing, &oMissing);
    
       		//Run the macros.
       		System::Object* oParams[] = {new String("DoKbTest"), oMissing};
       		CallMacro(pWord, oParams);
       		oParams[0] = new String("DoKbTestWithParameter");
       		oParams[1] = new String("Hello From Visual C++ .NET (AutoCallWord)");
       		CallMacro(pWord, oParams);		
       		//Quit Word and clean up.
       		pDoc->Close(&oMissing, &oMissing, &oMissing);
       		System::Runtime::InteropServices::Marshal::ReleaseComObject(pDoc);
       		System::Runtime::InteropServices::Marshal::ReleaseComObject(pDocs);
       		pWord->Quit(&oMissing, &oMissing, &oMissing);
       		System::Runtime::InteropServices::Marshal::ReleaseComObject(pWord);
       		GC::Collect();
       	}
       	catch(Exception* e)
       	{
       		Console::WriteLine(S"Error automating Word...");
       		Console::WriteLine(e->get_Message());
       	}
       }
    
       void CallMacro(Object* oApp, Object* oArgs[])
       {
       	Console::WriteLine("Calling Macro...");
       	oApp->GetType()->InvokeMember("Run",
       		BindingFlags(BindingFlags::Default | BindingFlags::InvokeMethod),
       		NULL, oApp, oArgs);
    
       }
    					

オートメーション クライアントの実行とテスト

  1. F5 キーを押して、オートメーション クライアントをビルドし、実行します。
  2. クライアントを実行すると、以下の選択画面が表示されます。
    Enter the number of the application you'd like to automate.
    Enter 'q' to quit the application.
    
                    1. Microsoft Access
                    2. Microsoft Excel
                    3. Microsoft PowerPoint
                    4. Microsoft Word
    
            Selection:
    					
  3. プロンプトで 1 を入力し、Enter キーを押します。オートメーション クライアントが Access を起動し、作成したデータベースのマクロを実行して、Access を終了します。
  4. 上記の手順を Excel、PowerPoint、および Word について繰り返します。
  5. 終了後、q を入力して Enter キーを押し、オートメーション クライアントを終了します。

関連情報

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
303872 Visual C# .NET でオートメーションを使用して Excel マクロを作成する方法
177760 [VBA] マクロを他の Office プログラムで実行する方法
317157 [PRB] Visual Studio .NET で Access 10.0 のタイプ ライブラリを参照するとエラーが発生する
Office オートメーションに関する詳細およびリソースについては、以下のマイクロソフト Web サイトを参照してください。
Microsoft Office Development with Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx

Office 開発に関する FAQ およびハイライト
http://support.microsoft.com/ofd

プロパティ

文書番号: 306686 - 最終更新日: 2007年6月29日 - リビジョン: 4.2
この資料は以下の製品について記述したものです。
  • Microsoft Access 2002 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft Word 2002
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
キーワード:?
kbhowto kbautomation KB306686
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com