MFC および Visual C++ 2005 または Visual C++ .NET で Excel を自動化して、配列による範囲内へのデータ入力および範囲内からのデータ取得を行う方法

文書翻訳 文書翻訳
文書番号: 308407 - 対象製品
この記事は、以前は次の ID で公開されていました: JP308407
Microsoft C# .NET については、次の資料を参照してください。302096
Microsoft Visual Basic .NET については、次の資料を参照してください。302094
: Microsoft Visual C++ 2005、Microsoft Visual C++ .NET 2003 および Microsoft Visual C++ .NET 2002 では、.NET Framework によって提供されるマネージ コード モデルとアンマネージ ネイティブ Windows コード モデルの両方がサポートされますが、この資料の情報は、アンマネージ Visual C++ コードにのみ適用されます。
すべて展開する | すべて折りたたむ

目次

概要

この資料では、Visual C++ 2005 または Visual C++ .NET から Microsoft Excel を自動化して、配列を使用して複数のセルで構成される範囲に値を入力する方法、および複数のセルで構成される範囲を取得する方法について手順を追って説明します。

Excel 用オートメーション クライアントの作成

複数のセル範囲に一括で値を入力するには、Range オブジェクトの Value プロパティを二次元配列に設定します。同様に、Value プロパティを使用することにより、複数のセルに入力された二次元配列の値を一括で取得することができます。以下の手順では、二次元配列を使用したデータの入力方法と取得方法を説明します。
  1. 以下の「サポート技術情報」 (Microsoft Knowledge Base) の「オートメーション クライアントの作成」に記載されている手順に従って、基本的なオートメーション クライアントを作成します。
    307473 [OFF2003] Visual C++ .NET から Office オートメーション用のタイプ ライブラリを使用する方法
    手順 3. で、2 つ目のボタンとチェック ボックス 1 つをフォームに追加します。ボタンの ID を IDC_GETVALUES に、キャプションを Get Values に変更します。チェック ボックスの ID を IDC_CHECK に、キャプションを Fill with Strings に変更します。

    上記の資料の手順 4. で、Office XP の Excel 2002 を自動化している場合は、"Microsoft Excel 10.0 Object Library" を選択します。Excel 2002 のデフォルトの場所は C:\Program Files\Microsoft Office\Office10\Excel.exe です。Microsoft Office Excel 2003 を自動化している場合は、"Microsoft Excel 11.0 Object Library" を選択します。Excel 2003 のデフォルトの場所は C:\Program Files\Microsoft Office\Office11\Excel.exe です。以下の Microsoft Excel インターフェイスを選択します。
    • _Application
    • _Workbook
    • _Worksheet
    • Range
    • Workbooks
    • Worksheets
    手順 6. で、Autoprojectdlg.h の #pragma once ディレクティブの直後に、以下の #include ステートメントを追加します。
    #include "CApplication.h"
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    					
  2. CAutoProjectDlg クラスに、次の 2 つのパブリック メンバ変数を追加します。
    CApplication oExcel;
    CWorkbook oBook;
    					
  3. ダイアログ ボックス上で、[IDC_CHECK] を右クリックし、[変数の追加] をクリックします。変数に m_bFillWithStrings という名前を付け、[完了] をクリックします。
  4. ダイアログ ボックス上で、[Run] ボタンをダブルクリックします。次のコードが表示されます。
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	// TODO: Add your control notification handler code here
    }
    					
    これを次のコードで置き換えます。
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	CWorkbooks oBooks;
    	CWorksheets oSheets;
    	CWorksheet oSheet;
    	CRange oRange;
    	COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    	// If you have not created Excel, create a new instance.
    	if (oExcel.m_lpDispatch == NULL) {
    		oExcel.CreateDispatch("Excel.Application");
    	}
    	// Show Excel to the user.
    	oExcel.put_Visible(TRUE);
    	oExcel.put_UserControl(TRUE);
    
    	// Add a new workbook and get the first worksheet in that book.
    	oBooks = oExcel.get_Workbooks();
    	oBook = oBooks.Add(covOptional);
    	oSheets = oBook.get_Worksheets();
    	oSheet = oSheets.get_Item(COleVariant((short)1));
    
    	// Get a range of data.
    	oRange = oSheet.get_Range(COleVariant("A1"),covOptional);
    	oRange = oRange.get_Resize(COleVariant((short)5),COleVariant((short)5));
    
    	COleSafeArray saRet;
    	DWORD numElements[2];
    	numElements[0] = 5;
    	numElements[1] = 5;
    
    	long index[2];
    	// Create a BSTR or double safe array.
    	if (m_bFillWithStrings.GetCheck())
    		saRet.Create(VT_BSTR,2,numElements);
    	else
    		saRet.Create(VT_R8,2,numElements);
    
    	// Fill the array with data.
    	for (int iRow = 1; iRow <= 5; iRow++) {
    		for (int iCol = 1; iCol <= 5; iCol++) {
    			index[0]=iRow-1;
    			index[1]=iCol-1;
    			if (m_bFillWithStrings.GetCheck()) {
    				CString szTemp;
    				szTemp.Format("%d|%d",iRow,iCol);
    				BSTR bstr = szTemp.AllocSysString();
    				saRet.PutElement(index,bstr);
    				SysFreeString(bstr);
    			} else {
    				double d = iRow * iCol;
    				saRet.PutElement(index,&d);
    			}
    		}
    	}
    	// Send the array to Excel.
    	oRange.put_Value(covOptional,COleVariant(saRet));
    }
    					
    : Visual C++ 2005 で、上記のコードのコンパイルを正常終了するためには、共通言語ランタイム サポート コンパイラ オプション (/clr:oldSyntax) を追加する必要があります。 共通言語ランタイム サポート コンパイラ オプションを追加するには、次の手順を実行します。
    1. [プロジェクト] をクリックし、[ProjectName のプロパティ] をクリックします。

      : ProjectName の部分には、プロジェクトの名前が入ります。
    2. [構成プロパティ] を展開し、[全般] をクリックします。
    3. 右側のウィンドウで、[共通言語ランタイム サポート] プロジェクト設定の [共通言語ランタイム サポート、古い構文 (/clr:oldSyntax)] をクリックします。
    4. [適用] をクリックし、[OK] をクリックします。
    共通言語ランタイム サポートのコンパイラ オプションの詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。
    http://msdn2.microsoft.com/ja-jp/k8d11d4s.aspx
    ここに示す手順は資料全体に適用されます。
  5. ダイアログ ボックスに戻り、[Get Values] ボタンをダブルクリックします。次のコードが表示されます。
    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    	// TODO: Add your control notification handler code here
    }
    					
    これを次のコードで置き換えます。
    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    	CWorksheets oSheets;
    	CWorksheet oSheet;
    	CRange oRange;
    	COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    	// Make sure that Excel has been started.
    	if (oExcel.m_lpDispatch == NULL) {
    		AfxMessageBox("Excel has not been started.  Press button1 to start Excel.");
    		return;
    	}
    	// Get the first worksheet.
    	oSheets = oBook.get_Worksheets();
    	oSheet = oSheets.get_Item(COleVariant((short)1));
    	// Set the range of data to retrieve
       	oRange = oSheet.get_Range(COleVariant("A1"),COleVariant("E5"));
    
    	// Get the data.
    	COleSafeArray saRet(oRange.get_Value(covOptional));
    
            long iRows;
            long iCols;
            saRet.GetUBound(1, &iRows);
            saRet.GetUBound(2, &iCols);
    
    	CString valueString = "Array Data:\r\n";
    	long index[2];
    	// Loop through the data and report the contents.
    	for (int rowCounter = 1; rowCounter <= iRows; rowCounter++) {
    		for (int colCounter = 1; colCounter <= iCols; colCounter++) {
    			index[0]=rowCounter;
    			index[1]=colCounter;		   
    			COleVariant vData;
    			saRet.GetElement(index,vData);
    			CString szdata(vData);
                valueString += szdata;
    			valueString += "\t";		
    		}
    		valueString += "\r\n";
    	}
    	AfxMessageBox(valueString,MB_SETFOREGROUND,NULL);
    }
    					

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

  1. F5 キーを押してサンプル プログラムをビルドし、実行します。
  2. [Run] ボタンをクリックします。プログラムによって Excel が起動されて新しいブックが開き、最初のワークシートのセル A1:E5 に配列から数値データが入力されます。
  3. [Get Values] ボタンをクリックします。プログラムによってセル A1:E5 のデータが新しい配列に取得され、結果がメッセージ ボックスに表示されます。
  4. [Fill With Strings] チェック ボックスをオンにして [Run] ボタンをクリックすると、セル A1:E5 に文字列データが入力されます。
  5. [Get Values] ボタンをクリックすると、メッセージ ボックスに文字列値が表示されます。

トラブルシューティング

Typelib クラス追加ウィザードの [ファイル] オプションを使用して、Excel オブジェクト ライブラリのクラス ラッパーを追加すると、オブジェクト ライブラリを参照したときにエラー メッセージが表示される場合があります。この問題を回避するには、ファイルを参照する代わりに、オブジェクト ライブラリの完全なパスとファイル名を入力してください。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
311408 [FIX] タイプ ライブラリから MFC クラスを追加すると、読み取り専用の警告が表示される
サンプル アプリケーションをビルドするときに次のエラー メッセージが表示される場合は、CRange.h の "Variant DialogBox" を "Variant _DialogBox" に変更してください。
warning C4003: マクロ 'DialogBoxA' に指定された実引数の数が少なすぎます。
このエラーの原因の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
311407 [BUG] MFC のウィザードで API マクロとの名前の競合が解決されない

関連情報

詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。
Microsoft Office Development with Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
以前のバージョンの Visual Studio で配列を使用して Excel データを設定および取得する方法の詳細については、以下の「サポート技術情報」 (Microsoft Knowledge Base) の資料を参照してください。
186120 MFC を使用して Excel を自動化し、配列のデータをセル範囲に入力する方法
186122 MFC を使用して Excel 2000 および Excel 2002 を自動化し、セル範囲のデータを配列に取得する方法
247412 [XL2003] [INFO] Visual Basic から Excel にデータを転送する方法

プロパティ

文書番号: 308407 - 最終更新日: 2007年1月17日 - リビジョン: 6.1
この資料は以下の製品について記述したものです。
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
キーワード:?
kbautomation kbhowtomaster KB308407
"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