環境:
VC++6
MFC
Excelファイルを作成するソフトを作成しています。
コンパイル環境の Office は 2010 です。
ソフトで作成したExcelファイルは Office 2000以降で使用したいため、
ファイルの種別は「Excel 97-2003」で保存しようと思っています。
作成したソフトを Office 2000 の環境で使用すると
Runtime Error となってしまいます。
Error となっているのは SaveAs の部分なのですが、
どうしら保存出来る様になるでしょうか?
以下単純にしたプログラム
-------------------------------------------------
#import "C:\Program Files (x86)\Common Files\Microsoft Shared\Office14\MSO.DLL" no_namespace rename("DocumentProperties", "DocumentPropertiesXL")
#import "C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\Vbe6ext.olb" no_namespace
#import "C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces
CoInitialize(NULL);
app.CreateInstance(L"Excel.Application");
//WorkBookを追加する
wb = app->Workbooks->Add();
// 保存
wb->SaveAs(savePath,
vtMissing, vtMissing, vtMissing,
vtMissing, vtMissing, xlNoChange);
// 後始末
wb->Close();
app->Quit();
app.Release();
-------------------------------------------------
なお、SaveAsの第二引数の FileFormat は
xlWorkbookNormal
xlExcel9795
vtMissing
をためしましたが、Runtime Error となってしまいます。
※ Office 2007以降は xlExcel8 で保存できることは確認しています。
以上、ご存じの方いらっしゃいましたら、ご教授お願いします。
SaveAsって引数の数が2003以降で変わった気がする。
(2003では「Excel 97-2003」で保存という指定がなかったため)
はっきりとしたことは言えませんけど、
Excelの下位をするならOffece14(2010)を#importして使うの事態ができないかもしれません。
MFC または #import を使用せずに C++ から Excel を自動化する方法
http://support.microsoft.com/kb/216686/ja
もしかしたら、SaveAsのところだけピンポイントでInvokeを使えば回避できるかも?
古い記憶なんですが、タイプライブラリからMFCのクラスを作成をすれば、
そのクラスの定義に行って、バージョンによって分岐するように記述できたかもしれません。
Blueさんありがとうございます。
> もしかしたら、SaveAsのところだけピンポイントでInvokeを使えば回避できるかも?
を、お試ししてみたいのですが、
どう書いていいのかわかりません。
Invoke を調べると、delegate と対に出てきて
大体が .NET の話になっています。
どこか参考になるようなページはあるでしょうか?
タイプライブラリで使っている場合、
>>wb = app->Workbooks->Add();
のwbはたぶん IDispatchPtrを継承したものになっているんじゃないかな?
それなら
wb->Invoke(・・・・
といけそうだけど。
先のリンク先のAutoWrap関数の中身を参考にできないかしら。
もしかしたら、下位バージョンのExcelのタイプライブラリを使えば(上位も)問題なく動くのかもしれない。
いっそのこと、Office2003以前用として、別EXEにしたほうがいいのかも。
一応過去ログ
タイプライブラリを使わずExcelを操作するには?
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200805/08050013.txt
ツイート | ![]() |