Excelアプリケーションへアタッチ

CApplicationクラスを使ってExcelへアタッチする

Excelを操作するためにはまずExcelアプリケーションそのものにアタッチする必要があります。タイプライブラリで生成したCApplicationクラスを使用します。手順は以下の通り単純です。ただし、アタッチの際既にExcelが起動しているかどうかにより動作が異なりますのでその点には注意が必要です。

  1. クラスIDの取得
  2. アプリケーションへのアタッチ

クラスIDの取得

CLSID clsid;
if (CLSIDFromProgID(OLESTR("Excel.Application"), &clsid) != NOERROR){
  AfxMessageBox("Excel not installed or version not compatible");
  return;
}

このコンテンツではMFCアプリケーションを想定していますので、COMライブラリの初期化は明示していません。通常、MFCアプリケーションを作成する場合はウィザードによりInitInstance()にAfxOleInit()関数が組み込まれ、COMライブラリの初期化が行われます。非MFCアプリケーションの場合は、クラスIDの取得に先立ちCoInitialize()を実行し、適切なタイミングでCoUninitialize()を実行する必要があります。 $Date:: 2007-07-06 06:26:48 #$加筆

Excelが起動している場合

アプリケーションがアクティブかどうか調べ、起動している場合はCApplicatioクラスをアタッチする。

bool bCreate = false;
CApplication excel;
LPUNKNOWN lpUnk;
HRESULT hr;
LPDISPATCH lpDispatch;
if (GetActiveObject(clsid, NULL, &lpUnk)==NOERROR){
  hr=lpUnk->QueryInterface(IID_IDispatch,(LPVOID*)&lpDispatch);
  lpUnk->Release();
  if (hr==NOERROR){
    //すでにExcelが起動されている状態であればAttachDispatch
    excel.AttachDispatch(lpDispatch,TRUE);
    bCreate = false;
  }
}

Excelが起動していない場合

Excelアプリケーションが起動されていない場合はCreateDispatchする。

COleException e;
if (excel.m_lpDispatch == NULL){
  if (!excel.CreateDispatch(clsid, &e)){
    AfxMessageBox("can't AttachDispatch Excel Application!!");
    return 0;
  }
  bCreate = true;
}

上記の例では、bCreateフラグにAttachDispatch()/CreateDispatch()したかのフラグをセットし、処理の最後にExcelアプリケーションを終了させるか否かを判定しています。