Excelオートメーションクライアントの作成方法(VC++2005, MFC)

[戻る]
甚平 2008/12/21(日) 13:09:29
環境:
VC++2005 Pro.
Excel2003
Windows Xp Pro.

MFCを使ったWindowsプログラムでExcelを自動化する方法についてお尋ねします。

http://support.microsoft.com/kb/307473/
このページに書かれている手順のとおり、Typelibクラス追加ウィザードによって、
_ApplicationインターフェースのMFCラッパクラスをプロジェクトに追加しました。
追加されたファイル名は"CApplicationl.h"です。

次に、ダイアログボックスクラスのファイルにこの"CApplication.h"をインクルードし
ました。

// AutoProjectDlg.cpp
#include "stdafx.h"
#include "CApplication.h"

この状態でビルドしたところ、エラーが大量に発生して失敗しました(エラーメッセー
ジの一部は末尾に添付)。
エラーの発生場所はすべて"excel.tlh"内です。

前記ウェブページのタイトルは「VisualC++.NETから〜」となっていますが、次のページ
でもこれを参照するように指示されていますので、VC2005でもこの手順で良いと理解し
ました。
「MFC および Visual C++ 2005 または Visual C++ .NET で Excel を自動化して〜」
http://support.microsoft.com/kb/308407/ja

これらのページに書かれていること以外で、MFCラッパクラスを作成、使用するうえで必
要な手順があるのでしょうか?

あるいは、Typelibクラス追加ウィザードによって追加したMFCクラスにはなにか修正す
べきところがあるのでしょうか?

以上、よろしくお願いいたします。

-----

# エラーの総数は200個以上あるので、最初の一部のみ添付します。

エラー    13    error C2371: 'FontPtr' : 再定義されています。異なる基本型で
す。    d:\cpp\081218excel\autoproject\debug\excel.tlh    1219
エラー    14    error C2786: 'BOOL (__stdcall *)(HDC,int,int,int,int)' : 
__uuidof の無効なオペランドです。
    d:\cpp\081218excel\autoproject\debug\excel.tlh    1297
エラー    15    error C2923: '_com_IIID' : 'Rectangle' は、有効な テンプレー
ト 型引数 (パラメータ '_Interface') ではありません。
    d:\cpp\081218excel\autoproject\debug\excel.tlh    1297
エラー    16    error C3203: '_com_IIID' : 非特殊クラス テンプレート は、テン
プレート 引数として テンプレート パラメータ '_IIID' に使用できません。実際の型
を指定してください    d:\cpp\081218excel\autoproject\debug\excel.tlh    1297
(以下略)

subaru 2008/12/22(月) 09:33:15
>あるいは、Typelibクラス追加ウィザードによって追加したMFCクラスにはなにか修正す
>べきところがあるのでしょうか?

ウィザードで作成されたMFCクラスに#importで始まる文があれば削除してみてください。
(生成されたtlh、tliも削除して構いません)

甚平 2008/12/23(火) 12:16:20
sakura様、ご回答ありがとうございました。

> ウィザードで作成されたMFCクラスに#importで始まる文があれば削除してみてくださ
い。
> (生成されたtlh、tliも削除して構いません)

ウィザードが作成したCApplication.hに#import文がありました。
#import文を削除後、ビルドに成功しました。
Excelを起動するサンプルコードも実行できました。

なぜ#import文が要らないのか、要らないものならばなぜWizardが書いてしまうのかとい
う疑問は残りますが、それについてはおいおい調べたいと思います。

----------

次に、

「MFC および Visual C++ 2005 または Visual C++ .NETでExcelを自動化して〜」
http://support.microsoft.com/kb/308407/ja

で説明されているサンプルを試すため、

_Workbook
_Worksheet
Workbooks
Worksheets
Range

インターフェースのMFCラッパクラスをTypelibクラス追加ウィザードで作成しました。
追加されたヘッダファイルは次の5つです。

CWorkbook.h
CWorksheet.h
CWorkbooks.h
CWorksheets.h
CRange.h

これらのファイルからも#import文を削除したうえで、ダイアログボックスクラスのヘッ
ダファイルの#pragma onceディレクトリ直後で#includeしてからビルドしたところ、ま
たエラーが大量発生しました。

これらのヘッダのうちどれが問題かを調べたところ、エラーが発生するのは

CWorkbooks.h
CWorksheets.h
CRange.h

のいずれかひとつ以上をインクルードしたときでした。
例えば、CWorkbooks.hをインクルードしたときのエラーメッセージを見ると、

Application
XLCreator
Parameter
RHS

といった識別子が定義されていないとおこられています。
確かにこれらを定義したヘッダなどはプロジェクト内にないので、当たり前ではありま
す。

インクルードすべきヘッダファイルがあるのではないかとアタリをつけてMSDN等も調べ
ているところですが、現時点で判明していません。
たびたび申し訳ありませんが、ご存じでしたらご教示ください。

甚平 2008/12/23(火) 12:18:39
誤記:sakura様
訂正:subaru様

失礼しました。

subaru 2008/12/24(水) 11:03:31
正しい対処方法は知りませんがとりあえず動かすなら
・定義されてない型をLPDISPATCHに変更する
・enumの定義をOLEViewerか生成されたtlhの中から定義を探して持ってくる
くらいしか思いつきません。

甚平 2008/12/24(水) 17:21:20
[[解決]]
subaru様、ご回答ありがとうございます。

エラーが発生していた

CWorkbooks.h
CWorksheets.h
CRange.h

の3ファイルについて、

Application --> LPDISPATCH
XLCreator   --> long  ※ CApplication.hファイルを参考にした。
Font        --> LPDISPATCH

と変更した後、ビルドに成功しました。

しかし、

「MFC および Visual C++ 2005 または Visual C++ .NETでExcelを自動化して〜」
http://support.microsoft.com/kb/308407/ja

にあるサンプルコードを記述してからコンパイルしたところまたエラーが...orz

エラーの原因は、サンプルコードではウィザードが作成したクラスにはないメンバ関数
を使っていたり、引数の個数が異なっていたりとさまざまです。
サンプルコードの間違いかとも思いましたが、例えばCWorkbookクラスには当然あるだろ
うと思ったget_WorkSheets関数(あるいはそれに相当する関数)が見あたらない、とい
った具合に、Wizardが作成したクラスにも怪しいところが多々あります。

MFCラッパクラスがWizardで簡単に作れるのなら開発効率が良いと思って試していたので
すが大いに期待がはずれてしまいました。
これ以上の調査をしている時間がなくなってしまったので、今回はMFCラッパクラスはあ
きらめて、#importしたインターフェースをナマで使うか、VBに流れるかします。

解決しませんでしたがこのスレッドは閉じます。

おつきあいくださりありがとうございました。
> subaru様、皆様

古いスレッドには追加発言できません。