Excel および 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 のオートメーションクライアントを作成する

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

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

    307473 Visual C++ .net からの Office オートメーションのタイプライブラリの使用方法

    手順3で、2番目のボタンと、フォームにチェックボックスを追加します。 ボタンの ID を IDC_GETVALUES に、キャプションを値を取得するように変更します。 チェックボックスの ID を [IDC_CHECK] に変更し、キャプションを文字列で埋めるように設定します。

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

    • _Application
    • _Workbook
    • _Worksheet
    • 範囲
    • ブック
    • ワークシート

    手順6で、Autoprojectdlg の #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. ダイアログボックスで、[実行] をダブルクリックし、次のコードを置き換えます。

    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) を追加して、前のコードサンプルを正常にコンパイルする必要があります。 [Common language runtime support] コンパイラオプションを追加するには、次の手順を実行します。

    1. [プロジェクト] をクリックし、[ ProjectName のプロパティ] をクリックします。

      メモ ProjectNameはプロジェクトの名前のプレースホルダーです。

    2. [構成プロパティ] を展開し、[全般] をクリックします。

    3. 右側のウィンドウで、[common language runtime support]、[ Old 構文 (/clr: oldSyntax) ] の各チェックボックスをオンにして、共通言語ランタイムサポートのプロジェクト設定を表示します。

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

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

    https://msdn.microsoft.com/en-us/library/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. [実行] をクリックします。 プログラムは、新しいブックを使用して Excel を起動し、配列の数値データを含む最初のワークシートのセル範囲 A1: E5 を挿入します。
  3. [Get Values] をクリックします。 プログラムは、セル範囲 A1: E5 のデータを新しい配列に取得し、結果をメッセージボックスに表示します。
  4. [文字列で塗りつぶし] を選択し、[実行] をクリックしてセル A1: E5 に文字列データを入力します。
  5. [Get Values] をクリックして、メッセージボックスに文字列値を表示します。

トラブルシューティング

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

サンプルアプリケーションをビルドするときに、次のエラーメッセージが表示された場合は、CRange "variant _DialogBox" に "Variant のダイアログを変更" します。

警告 C4003: マクロ ' ' メッセージボックス a ' の実際のパラメーターが足りません。

References

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

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

247412 INFO: Visual Basic から Excel にデータを転送する方法