[HOWTO] MFC による Excel のオートメーションで新しいブックの作成や書式設定を行う方法

この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
概要
この資料では、Microsoft Foundation Class (MFC) ライブラリ 4.2 (Microsoft Visual C++ 5.0 および 6.0 と共にインストールされます) を使用して、Microsoft Excel のオートメーションを行う方法について説明します。

この資料では、OLE オートメーションを使用して Microsoft Excel ブックの作成や書式設定を行う方法について説明し、ワークシートでデータの追加や書式設定を行うための (Microsoft Excel タイプ ライブラリの) メソッドやプロパティをいくつか紹介します。

Microsoft Excel 2000 および Excel 2002 のオートメーションを行うための注意

この資料のサンプル コードでは、Microsoft Excel 97 オブジェクト ライブラリ (Excel 8.olb) で生成されたクラス ラッパーを使用しています。このコードは、わずかな修正を加えることにより、Microsoft Excel 2000 (Excel9.olb) または Microsoft Excel 2002 (Excel.olb) のクラス ラッパーを使用するオートメーション クライアントに適用することができます。Microsoft Excel 2000 または 2002 タイプ ライブラリでこの資料のサンプル コードを使用する方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
224925 INFO: Type Libraries for Office May Change with New Release
詳細
この資料のコードは、MFC の .cpp ファイルで定義されているイベントのメッセージ ハンドラ関数にコピーすることができます。ただし、このコードの目的は、Excel8.olb タイプ ライブラリで定義されている IDispatch インターフェイスとメンバ関数を使用した処理について説明することです。このコードを読んで理解したうえで、このコードの修正や独自のコードの作成によって、MFC による Microsoft Excel 97 のオートメーションを行うことができます。

プロジェクトの作成手順

  1. 以下の「サポート技術情報」 (Microsoft Knowledge Base) の手順 1. ~ 12. を行い、Excel8.olb タイプ ライブラリで定義されている IDispatch インターフェイスおよびメンバ関数を使用するサンプル プロジェクトを作成します。
    178749 HOWTO: Create an Automation Project Using MFC and a Type Library
    178749 [HOWTO] MFC およびタイプ ライブラリを使用してオートメーション プロジェクトを作成する方法
  2. AutoProjectDlg.cpp ファイルの先頭に、以下の行を追加します。
          #include "excel8.h"					
  3. AutoProjectDLG.cpp ファイルで、CAutoProjectDlg::OnRun() に以下のコードを追加します。

    サンプル コード

          // Commonly used OLE variants.      COleVariant                 covTrue((short)TRUE),                 covFalse((short)FALSE),                 covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);      _Application app;      Workbooks books;      _Workbook book;      Worksheets sheets;      _Worksheet sheet;      Range range;      Font font;      Range cols;      // Start Excel and get Application object.      if(!app.CreateDispatch("Excel.Application"))      {       AfxMessageBox("Couldn't start Excel and get Application object.");       return;      }      //Get a new workbook.      books = app.GetWorkbooks();      book = books.Add (covOptional);      //Get the first sheet.      sheets =book.GetSheets();      sheet = sheets.GetItem(COleVariant((short)1));      //Fill cells A1, B1, C1, and D1 one cell at a time with "headers".      range = sheet.GetRange(COleVariant("A1"),COleVariant("A1"));      range.SetValue(COleVariant("First Name"));      range = sheet.GetRange(COleVariant("B1"),COleVariant("B1"));      range.SetValue(COleVariant("Last Name"));      range = sheet.GetRange(COleVariant("C1"),COleVariant("C1"));      range.SetValue(COleVariant("Full Name"));      range = sheet.GetRange(COleVariant("D1"),COleVariant("D1"));      range.SetValue(COleVariant("Salary"));      //Format A1:D1 as bold, vertical alignment = center.      range = sheet.GetRange(COleVariant("A1"), COleVariant("D1"));      font = range.GetFont();      font.SetBold(covTrue);      range.SetVerticalAlignment(               COleVariant((short)-4108));   //xlVAlignCenter = -4108      //Fill A2:B6 with an array of values (First & Last Names).      {         COleSafeArray saRet;         DWORD numElements[]={5,2};   //5x2 element array         saRet.Create(VT_BSTR, 2, numElements);         //Fill the 5x2 SafeArray with the following data:         //   John      Smith         //   Tom       Brown         //   Sue       Thomas         //   Jane      Jones         //   Adam      Johnson         FillSafeArray(L"John", 0, 0, &saRet);         FillSafeArray(L"Smith", 0, 1, &saRet);         FillSafeArray(L"Tom", 1, 0, &saRet);         FillSafeArray(L"Brown", 1, 1, &saRet);         FillSafeArray(L"Sue", 2, 0, &saRet);         FillSafeArray(L"Thomas", 2, 1, &saRet);         FillSafeArray(L"Jane", 3, 0, &saRet);         FillSafeArray(L"Jones", 3, 1, &saRet);         FillSafeArray(L"Adam", 4, 0, &saRet);         FillSafeArray(L"Johnson", 4, 1, &saRet);         range = sheet.GetRange(COleVariant("A2"), COleVariant("B6"));         range.SetValue(COleVariant(saRet));         saRet.Detach();      }      //Fill C2:C6 with a relative formula (=A2 & " " & B2).      range = sheet.GetRange(COleVariant("C2"), COleVariant("C6"));      range.SetFormula(COleVariant("=A2 & \" \" & B2"));      //Fill D2:D6 with a formula(=RAND()*100000) and apply a number      //format.      range = sheet.GetRange(COleVariant("D2"), COleVariant("D6"));      range.SetFormula(COleVariant("=RAND()*100000"));      range.SetNumberFormat(COleVariant("$0.00"));      //AutoFit columns A:D.      range = sheet.GetRange(COleVariant("A1"), COleVariant("D1"));      cols = range.GetEntireColumn();      cols.AutoFit();      //Manipulate a variable number of columns for Quarterly Sales Data.      {         short NumQtrs;         CString msg;         Range resizedrange;         Interior interior;         Borders borders;         //Determine how many quarters to display data for.         for(NumQtrs=1;NumQtrs<=3;NumQtrs++)         {            msg.Format("Enter sales data for %d quarter(s)?", NumQtrs);            if(AfxMessageBox(msg,MB_YESNO)==IDYES)            {               break;            }         }         msg.Format("Displaying data for %d quarters.", NumQtrs);         AfxMessageBox(msg);         //Starting at E1, fill headers for the number of columns selected.         range = sheet.GetRange(COleVariant("E1"), COleVariant("E1"));         resizedrange = range.GetResize(covOptional, COleVariant(NumQtrs));         resizedrange.SetFormula(                COleVariant("=\"Q\" & COLUMN()-4 & CHAR(10) & \"Sales\""));         //Change the Orientation and WrapText properties for the headers.         resizedrange.SetOrientation(COleVariant((short)38));         resizedrange.SetWrapText(covTrue);         //Fill the interior color of the headers.         interior = resizedrange.GetInterior();         interior.SetColorIndex(COleVariant((short)36));         //Fill the columns with a formula and apply a number format.         range = sheet.GetRange(COleVariant("E2"), COleVariant("E6"));         resizedrange = range.GetResize(covOptional, COleVariant(NumQtrs));         resizedrange.SetFormula(COleVariant("=RAND()*100"));         resizedrange.SetNumberFormat(COleVariant("$0.00"));         //Apply borders to the Sales data and headers.         range = sheet.GetRange(COleVariant("E1"), COleVariant("E6"));         resizedrange= range.GetResize(covOptional, COleVariant(NumQtrs));         borders = resizedrange.GetBorders();         borders.SetWeight(COleVariant((short)2));   //xlThin = 2         //Add a Totals formula for the Quarterly sales data and apply a         //border.         range = sheet.GetRange(COleVariant("E8"), COleVariant("E8"));         resizedrange = range.GetResize(covOptional, COleVariant(NumQtrs));         resizedrange.SetFormula(COleVariant("=SUM(E2:E6)"));         borders = resizedrange.GetBorders();         {            Border bottomborder;            bottomborder = borders.GetItem((long)9);            bottomborder.SetLineStyle(                           COleVariant((short)-4119));   //xlDouble = -4119            bottomborder.SetWeight(                           COleVariant((short)4));       //xlThick = 4         }      }      //Make the application visible and give the user control of      //Microsoft Excel.      app.SetVisible(TRUE);      app.SetUserControl(TRUE);					
  4. AutoProjectDLG.cpp ファイルで、CAutoProjectDlg::OnRun() より前の任意の場所に以下の関数を追加します。

    サンプル コード

          void FillSafeArray(OLECHAR FAR* sz, int iRow, int iCol,                         COleSafeArray* sa)      {         VARIANT v;         long index[2];         index[0] = iRow;         index[1] = iCol;         VariantInit(&v);         v.vt = VT_BSTR;         v.bstrVal = SysAllocString(sz);         sa->PutElement(index, v.bstrVal);         SysFreeString(v.bstrVal);         VariantClear(&v);      }					
  5. Developer Studio でアプリケーションを実行します。ダイアログ ボックスが表示されたら (この例では、ダイアログ ボックス ベースのアプリケーションが作成されます)、[Run] をクリックします。
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 179706 (最終更新日 2003-12-12) を基に作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。
Excel 8 8.0 XL97 XL8
プロパティ

文書番号:179706 - 最終更新日: 12/05/2015 08:19:05 - リビジョン: 3.0

Microsoft Excel 2000 Standard Edition, Microsoft Visual C++ 5.0 Enterprise Edition, Microsoft Visual C++ 5.0 Professional Edition, Microsoft Foundation Class Library 4.2, Microsoft Office XP Developer Edition, Microsoft Office 2000 Developer, Microsoft Excel 2002 Standard Edition, Microsoft Excel 97 Standard Edition

  • kbnosurvey kbarchive kbautomation kbhowto kbinterop KB179706
フィードバック