Excel : SaveAs について


Take  2013-08-30 20:44:32  No: 73805

環境:
  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 22:33:41  No: 73806

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-31 02:25:50  No: 73807

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

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

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

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


Blue  2013-08-31 02:46:21  No: 73808

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

wb->Invoke(・・・・

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


Blue  2013-08-31 02:52:09  No: 73809

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

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


Blue  2013-08-31 02:59:57  No: 73810

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


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加