Excel : SaveAs について


Take  2013-08-30 11:44:32  No: 73805  IP: [192.*.*.*]

環境:
  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 で保存できることは確認しています。



以上、ご存じの方いらっしゃいましたら、ご教授お願いします。

編集 削除
Blue  2013-08-30 13:33:41  No: 73806  IP: [192.*.*.*]

SaveAsって引数の数が2003以降で変わった気がする。
(2003では「Excel 97-2003」で保存という指定がなかったため)

はっきりとしたことは言えませんけど、
Excelの下位をするならOffece14(2010)を#importして使うの事態ができないかもしれません。

MFC または #import を使用せずに C++ から Excel を自動化する方法
http://support.microsoft.com/kb/216686/ja


もしかしたら、SaveAsのところだけピンポイントでInvokeを使えば回避できるかも?


古い記憶なんですが、タイプライブラリからMFCのクラスを作成をすれば、
そのクラスの定義に行って、バージョンによって分岐するように記述できたかもしれません。

編集 削除
Take  2013-08-30 17:25:50  No: 73807  IP: [192.*.*.*]

Blueさんありがとうございます。

> もしかしたら、SaveAsのところだけピンポイントでInvokeを使えば回避できるかも?
を、お試ししてみたいのですが、
どう書いていいのかわかりません。

Invoke を調べると、delegate と対に出てきて
大体が .NET の話になっています。


どこか参考になるようなページはあるでしょうか?

編集 削除
Blue  2013-08-30 17:46:21  No: 73808  IP: [192.*.*.*]

タイプライブラリで使っている場合、
>>wb = app->Workbooks->Add();
のwbはたぶん IDispatchPtrを継承したものになっているんじゃないかな?
それなら

wb->Invoke(・・・・

といけそうだけど。
先のリンク先のAutoWrap関数の中身を参考にできないかしら。

編集 削除
Blue  2013-08-30 17:52:09  No: 73809  IP: [192.*.*.*]

もしかしたら、下位バージョンのExcelのタイプライブラリを使えば(上位も)問題なく動くのかもしれない。

いっそのこと、Office2003以前用として、別EXEにしたほうがいいのかも。

編集 削除
Blue  2013-08-30 17:59:57  No: 73810  IP: [192.*.*.*]

一応過去ログ
タイプライブラリを使わずExcelを操作するには?
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200805/08050013.txt

編集 削除