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

この記事の Microsoft C# .NET バージョンについては、「 302096」を参照してください。 この記事の Microsoft Visual Basic .NET バージョンについては、「 302094」を参照してください。

注:

Microsoft Visual C++ 2005、Microsoft Visual C++ .NET 2003、Microsoft Visual C++ .NET 2002 では、Microsoft .NET Frameworkとアンマネージ ネイティブ Microsoft Windows コード モデルによって提供されるマネージド コード モデルの両方がサポートされます。 この記事の情報は、アンマネージド Visual C++ コードにのみ適用されます。

概要

このステップバイステップの記事では、Visual C++ 2005 または Visual C++ .NET から Microsoft Excel を自動化して、配列を使用して複数セル範囲の値を入力および取得する方法について説明します。

Excel 用の Automation クライアントを作成する

セルを 1 つずつ入力せずに複数セル範囲を塗りつぶすには、Range オブジェクトの Value プロパティを 2 次元配列に設定できます。 同様に、Value プロパティを使用して、複数のセルの値の 2 次元配列を一度に取得できます。 次の手順は、2 次元配列を使用したデータの設定と取得の両方に関するこのプロセスを示しています。

  1. 次の Microsoft サポート技術情報の記事の「Automation クライアントの作成」セクションの手順に従って、基本的な Automation クライアントを作成します。

    307473 Visual C++ .NET から Office Automation のタイプ ライブラリを使用する方法

    手順 3 で、フォームに 2 つ目のボタンとチェック ボックスを追加します。 ボタンの ID をIDC_GETVALUESに変更し、キャプションを [値の取得] に変更します。 チェック ボックスの ID を IDC_CHECK に変更し、キャプションを [文字列で塗りつぶし] に変更します。

    記事の手順 4 で、Office XP から Excel 2002 を自動化する場合は、[Microsoft Excel 10.0 オブジェクト ライブラリ] を選択します。 Excel 2002 の既定の場所は C:\Program Files\Microsoft Office\Office10\Excel.exeです。 または、Microsoft Office Excel 2003 を自動化する場合は、[Microsoft Excel 11.0 オブジェクト ライブラリ] を選択します。 Excel 2003 の既定の場所は C:\Program Files\Microsoft Office\Office11\Excel.exeです。 次の Microsoft Excel インターフェイスを選択します。

    • _アプリケーション
    • _ブック
    • _ワークシート
    • Range
    • ブック
    • ワークシート

    手順 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. 次の 2 つのパブリック メンバー変数を CAutoProjectDlg クラスに追加します。

    CApplication oExcel;
    CWorkbook oBook;
    
    
  3. ダイアログ ボックスで、IDC_CHECKを右クリックし、[変数の追加] を選択します。 変数にm_bFillWithStrings名前を付け、[完了] をクリックします。

  4. ダイアログ ボックスで、[実行] をダブルクリックし、次のコードを置き換えます。

    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. [ダイヤル プラン (電話のコンテキスト)] ボックスで、[参照] をクリックして、ユーザーのダイヤル プランを見つけます。

    共通言語ランタイム サポート コンパイラ オプションの詳細については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。

    https://msdn.microsoft.com/en-us/library/k8d11d4s.aspxこれらの手順は、記事全体に適用されます。
    5. ダイアログ ボックスに戻り、[値の取得] をダブルクリックします。 次のコードを置き換えます

    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);
    }
    
    

Automation クライアントをテストする

  1. F5 キーを押してサンプル プログラムをビルドして実行します。
  2. [実行] をクリックします。 プログラムは Excel を新しいブックで起動し、最初のワークシートのセル A1:E5 に配列の数値データを設定します。
  3. [値の取得] をクリックします。 プログラムは、セル A1:E5 のデータを新しい配列に取得し、結果をメッセージ ボックスに表示します。
  4. [文字列で塗りつぶし] を選択し、[実行] をクリックしてセル A1:E5 に文字列データを入力します。
  5. [値の取得] をクリックして、メッセージ ボックスに文字列値を表示します。

トラブルシューティング

TypeLib からクラスを追加ウィザードの [ファイル] オプションを使用して Excel オブジェクト ライブラリのクラス ラッパーを追加すると、オブジェクト ライブラリを参照するときにエラー メッセージが表示されることがあります。 この問題を回避するには、ファイルを参照する代わりに、オブジェクト ライブラリの完全なパスとファイル名を入力します。

サンプル アプリケーションのビルド時に次のエラー メッセージが表示される場合は、CRange.h の "Variant DialogBox" を "Variant _DialogBox" に変更します。

警告 C4003: マクロ 'DialogBoxA' の実際のパラメーターが十分ではありません

関連情報

詳細については、次の Microsoft Developer Network (MSDN) Web サイト「Visual Studio を使用した Microsoft Office Development」を参照してください。 https://msdn.microsoft.com/en-us/library/aa188489(office.10).aspx

配列を使用して以前のバージョンの Visual Studio で Excel データを設定および取得する方法の詳細については、次のサポート技術情報記事を参照してください。

247412 INFO: Visual Basic から Excel にデータを転送するメソッド