こんにちわ。
お世話になります。
環境
VC++.NET 2003 ,XP SP2 ,Office2000
VC++のプログラムからExcelを呼び出してマクロを実行させようとしていますが、
処理の途中で例外発生して落ちてしまい困っています。
こちらのページを参考にしました。
http://www.ujasiri.com/prglib/vc/excel/vc_excel.html
//Excelを操作するためのタイプライブラリを読みこむ(Excel2000用)
#import C:\Program Files\Microsoft Office\Office\Mso9.dll no_namespace rename
(DocumentProperties, DocumentPropertiesXL)
#import C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\Vbe6ext.olb
no_namespace
#import C:\Program Files\Microsoft Office\Office\excel9.olb rename
(DialogBox, DialogBoxXL) rename(RGB, RBGXL) rename
(DocumentProperties, DocumentPropertiesXL) no_dual_interfaces
void CXlsmacroDlg::OnButton1()
{
COleVariant data,data1;
using namespace Excel;
_ApplicationPtr pXL;
//Excelの起動
pXL.CreateInstance(LExcel.Application);
pXL->Visible = TRUE; /* ->を使っている所で例外発生 */
//WorkBookを追加する
WorkbooksPtr pBooks = pXL->Workbooks;
_WorkbookPtr pBook = pBooks->Open(C:\\Work\\BOOK2.XLS);
//マクロ名を格納
data.SetString(BOOK2.XLS!Test,VT_BSTR); //実行マクロ名
data1.SetString(テストだよ~ん。,VT_BSTR); //引数
//マクロの実行。
pXL->_Run2(data,data1);
pXL->DisplayAlerts = FALSE;
pXL->Quit();
}
このままビルドすると、
warning C4278: 'CopyFile': タイプ ライブラリ 'C:\Program Files\Microsoft
Office\Office\excel9.olb' の識別子は既にマクロです。 'rename' 修飾子を使用してく
ださい。
warning C4192: 'IPicture' を自動的に除外し、タイプ ライブラリ 'C:\Program
Files\Microsoft Office\Office\excel9.olb' をインポートします
こんな警告メッセージが出るので、rename修飾子やno_auto_exclude属性を指定してやっ
て警告を消しても結果は同じでした。
コメントの部分にも書きましたが、->を使おうとするとツールバーの下の方に
IntelliSense: '.または->の左側にある式は、解決できない型を持っています'
というメッセージが出ているようです。
まずはライブラリ云々の問題なのか、コーディングの問題なのか
原因をはっきりさせたいです。
よろしくお願いします。
C4278 :コーディングの問題
> pXL->Visible = TRUE; /* ->を使っている所で例外発生 */
pXL->Visible = VARIANT_TRUE;
> warning C4278: 'CopyFile': タイプ ライブラリ 'C:\Program Files\Microsoft
Office\Office\excel9.olb' の識別子は既にマクロです。 'rename' 修飾子を使用してく
ださい。
> warning C4192: 'IPicture' を自動的に除外し、タイプ ライブラリ 'C:\Program
Files\Microsoft Office\Office\excel9.olb' をインポートします
#import <C:\Program Files\Microsoft Office\Office\excel9.olb> \
rename(CopyFile, CopyFileXL) \
exclude(IPicture)
ん?さん
maruさん
回答ありがとうございます。
実はその警告に対する修正はして試したのですが、結果は同じでした。
で、どうやらプロジェクト新規作成時に高度な機能としてオートメーションにチェック
を入れるとうまく動くみたいです。
ですが、またプロジェクトを新規作成するのはとても面倒なのでプロジェクトの設定から
変えられないかと探しているところです。
チェックの有無で新しいプロジェクトを2つ作り、違いを探してはいかが?
>> pXL->Visible = TRUE; /* ->を使っている所で例外発生 */
>pXL->Visible = VARIANT_TRUE;
前に書いたコードを見て書いたんだけど、実験してみたら、TRUEでも動作するみたい。
> で、どうやらプロジェクト新規作成時に高度な機能としてオートメーションにチェック
> を入れるとうまく動くみたいです。
コンソールアプリではそんな設定無しに動作しました。
# 別に変わったコードもなかったし、コンパイルオプションにも変わった所は見当たらなかった
けどなぁ。
マクロの衝突は大変だよなー
ネームスペースとか効かないし
たいちうさん
チェックの有無で新規プロジェクトを比較したら、やはりチェックありの方では正しくマ
クロ起動しました。
EXEのあるフォルダ(Debugフォルダ)の差異を見てみたら、
チェック有りのプロジェクトでは~.tlbというタイプライブラリファイルがあることがわ
かりました。
そこが大きな違いなんですかねぇ。。
maruさん
# 失礼、ダイアログベースであることを書き忘れてました。
> コンソールアプリではそんな設定無しに動作しました。
そうですか…maruさんの環境では~.tlbができてたんでしょうか?
wclrp ( 'o')さん
大変ですよねぇ。
後からプロジェクトの設定で変えられればいいのに、どこを設定すればいいかわからず四
苦八苦です。
仕方がないので新規にプロジェクトを立ち上げ、
オートメーションにチェックを入れてやって作り直しました。
他の機能はおいといて、とりあえずマクロが動くことは確認できました。
まだ少し腑に落ちない部分はありますが、一応マクロ起動の確認まではできたので解決に
します。
ありがとうございました。
チェック入れ忘れました。