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

文書翻訳 文書翻訳
文書番号: 179706 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

この資料では、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) を基に作成したものです。

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

プロパティ

文書番号: 179706 - 最終更新日: 2011年9月18日 - リビジョン: 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
キーワード:?
kbautomation kbhowto kbinterop KB179706
"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