はじめまして。VC++2005CLR、windowsアプリケーションにて、EXCEL2003のファイルを開こうとしています。
http://www.ujasiri.com/prglib/vc/excel/import/xlsopen_exp.html
等を参考にしたのですが、どうしてもエラーが一つだけ残ります。
pXL->Visible = TRUE;
のところで、C2660 一個の引数を指定できません というエラーです。
これはどこをどう変えたらよいのでしょうか。まったくの初心者で、文頭の条件でつくらなければならない事情があり、ヘルプ等参照したのですが解決できず、今回書き込みさせていただきました。
なにとぞ宜しくお願いいたします。
TRUEではなく、VARIANT_TRUEではどうでしょうか?
それでだめなら、
pXL->PutVisible(VARIANT_TRUE);
とか。
>VC++2005CLR、windowsアプリケーション
と
タイプライブラリを#importして使うのはあまり相性がよくないらしいです。
(引数の省略が出来ないっぽい。->vtMissingが使えない)
http://blogs.wankuma.com/blue/archive/2007/01/16/56466.aspx
ですので、CLRプロジェクトからであれば、C#やVBと同じように
参照設定をしてCOMオブジェクトとして扱うのが一般的なのかもしれません。
ちなみに開くだけでその後操作しないのであれば、Excelオブジェクト使わないで、
System::Diagnostics::Process::Start
もしくはWindows APIのShellExecuteあたりで十分なんですけど。
Blueさん
VARIANT_TRUE
pXL->PutVisible(VARIANT_TRUE);
書き込みありがとうございます!上記両方だめでした…。一応操作もしなければならないので、
参照設定をしてCOMオブジェクトとして扱う
こちらを勉強してみようと思います。ありがとうございます!!
一応私の環境(WinXp Pro SP2/VS2005 Pro SP1 Windows フォームアプリケーション/Excel2003 SP2)では
>C2660 一個の引数を指定できません というエラーです。
は確認できません。
実際どのようなコードを書いているのでしょうか?
Form1.hに直接記述しないで、Excel用にファイルを分けるといいかもしれませんよ。
Blueさん
書き込みありがとうございます。ボタンを押すとエクセルが表示されるというものをつくっていて、ヘッダに
//Excelを操作するためのタイプライブラリを読みこむ(Excel2003用)
#import "C:\Program Files\Common Files\Microsoft Shared\Office11\MSO.DLL"
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
#import "C:\Program Files\Microsoft Office\Office11\EXCEL.EXE" \
rename("DialogBox", "ExcelDialogBox") \
rename("RGB", "ExcelRGB")
ボタンに
using namespace Excel;
_ApplicationPtr pXL;
//Excelの起動
pXL.CreateInstance(L"Excel.Application");
pXL->Visible = VARIANT_TRUE;
//WorkBookを追加する
WorkbooksPtr pBooks = pXL->Workbooks;
_WorkbookPtr pBook = pBooks->Open("ファイル名.xls");
pXL->Quit();
と書いています。
エラーは、正確には
C2660 'Excel::_Application::PutVisible':関数に一個の引数を指定できません
というものです。ヘルプを見たのですがいまいちわかりませんでした…
#importで自動生成された
excel.tlh
の中身を見るとわかると思いますが、
ApplicationクラスのVisibleプロパティは
__declspec(property(get=GetVisible,put=PutVisible))
VARIANT_BOOL Visible[];
となっています。
ここで、重要なのは Visible[] となっていることです。
Visbileと記述すると、設定時にはPutVisibleを使えという命令ですので
PutVisibleのほうを見ると、
void PutVisible (
long lcid,
VARIANT_BOOL RHS );
となっていて、引数が2つ必要なのではと気づきます。
よって、プロパティ Visible を使う場合
xXL->Visible[lcid] = RHS;
というように指定しないといけないようです。
GetVisibleではlcidはデフォルトで 0 を指定するようになっているので、
>pXL->Visible = VARIANT_TRUE;
は
pXL->Visible[0] = VARIANT_TRUE;
としてみてはどうでしょうか?
もっとも、なぜ私の環境でエラーがでなかったかというと、
EXCEL.EXEを#importするときのrenameやらの指定が違うからです。
#import "C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" \
rename("ReplaceText", "ReplaceTexXL") rename("CopyFile", "CopyFileXL") \
rename("DialogBox", "DialogBoxXL" ) rename("RGB", "RGBXL")\
rename("DocumentProperties", "DocumentPropertiesXL") \
exclude("IFont") exclude("IPicture") no_dual_interfaces
とすると、xXL->Visible = VARIANT_TRUE でコンパイルエラーは出ません。
余り詳しくないので解説はできませんが。
補足(蛇足意見)
Visual C++ 2005 等で #importによるCOMライブラリーの参照は、別にファイル名の他に、libidやprogid でも可能です(開発環境が excel のインストール先に影響されない)。
// MSO.DLL
#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52"
// EXCEL.EXE progidの一例
#import "progid:Excel.Backup"
Blueさん
散歩中のNeKo.さん
書き込みありがとうございます。
修正して実行したところ、
Debug Assertion Failed!
Program: ...
File: dbgheap.c
Line: 1473
Expression: _CrtIsValidHeapPointer(pUserData)
というダイアログボックスがでて動かず、ただいま勉強中です…御協力ありがとうございます。
そのエラーに関しては、いちばん最初に言ってありますが。
>>VC++2005CLR、windowsアプリケーション
>と
>タイプライブラリを#importして使うのはあまり相性がよくないらしいです。
>(引数の省略が出来ないっぽい。->vtMissingが使えない)
>http://blogs.wankuma.com/blue/archive/2007/01/16/56466.aspx
正直原因はわからない。