VC++2005でEXCEL2003のファイルを開くには


しい  2007-06-06 14:21:42  No: 65338  IP: 192.*.*.*

はじめまして。VC++2005CLR、windowsアプリケーションにて、EXCEL2003のファイルを開こうとしています。
http://www.ujasiri.com/prglib/vc/excel/import/xlsopen_exp.html
等を参考にしたのですが、どうしてもエラーが一つだけ残ります。        
  pXL->Visible = TRUE;

のところで、C2660  一個の引数を指定できません  というエラーです。
これはどこをどう変えたらよいのでしょうか。まったくの初心者で、文頭の条件でつくらなければならない事情があり、ヘルプ等参照したのですが解決できず、今回書き込みさせていただきました。
なにとぞ宜しくお願いいたします。

編集 削除
Blue  2007-06-06 14:43:12  No: 65339  IP: 192.*.*.*

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オブジェクトとして扱うのが一般的なのかもしれません。

編集 削除
Blue  2007-06-06 14:50:02  No: 65340  IP: 192.*.*.*

ちなみに開くだけでその後操作しないのであれば、Excelオブジェクト使わないで、
System::Diagnostics::Process::Start
もしくはWindows APIのShellExecuteあたりで十分なんですけど。

編集 削除
しい  2007-06-08 00:22:35  No: 65341  IP: 192.*.*.*

Blueさん

VARIANT_TRUE
pXL->PutVisible(VARIANT_TRUE);

書き込みありがとうございます!上記両方だめでした…。一応操作もしなければならないので、

参照設定をしてCOMオブジェクトとして扱う

こちらを勉強してみようと思います。ありがとうございます!!

編集 削除
Blue  2007-06-08 01:13:39  No: 65342  IP: 192.*.*.*

一応私の環境(WinXp Pro SP2/VS2005 Pro SP1 Windows フォームアプリケーション/Excel2003 SP2)では
>C2660  一個の引数を指定できません  というエラーです。
は確認できません。

実際どのようなコードを書いているのでしょうか?
Form1.hに直接記述しないで、Excel用にファイルを分けるといいかもしれませんよ。

編集 削除
しい  2007-06-10 04:15:41  No: 65343  IP: 192.*.*.*

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':関数に一個の引数を指定できません

というものです。ヘルプを見たのですがいまいちわかりませんでした…

編集 削除
Blue  2007-06-10 09:42:24  No: 65344  IP: 192.*.*.*

#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 でコンパイルエラーは出ません。
余り詳しくないので解説はできませんが。

編集 削除
散歩中のNeKo.  2007-06-11 22:13:48  No: 65345  IP: 192.*.*.*

補足(蛇足意見)
Visual C++ 2005 等で #importによるCOMライブラリーの参照は、別にファイル名の他に、libidやprogid でも可能です(開発環境が excel のインストール先に影響されない)。

// MSO.DLL
#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52"

// EXCEL.EXE  progidの一例
#import "progid:Excel.Backup"

編集 削除
しい  2007-06-16 23:26:47  No: 65346  IP: 192.*.*.*

Blueさん
散歩中のNeKo.さん

書き込みありがとうございます。

修正して実行したところ、

Debug Assertion Failed!
Program: ...
File: dbgheap.c
Line: 1473

Expression: _CrtIsValidHeapPointer(pUserData)

というダイアログボックスがでて動かず、ただいま勉強中です…御協力ありがとうございます。

編集 削除
Blue  2007-06-17 10:44:04  No: 65347  IP: 192.*.*.*

そのエラーに関しては、いちばん最初に言ってありますが。

>>VC++2005CLR、windowsアプリケーション
>と
>タイプライブラリを#importして使うのはあまり相性がよくないらしいです。
>(引数の省略が出来ないっぽい。->vtMissingが使えない)
>http://blogs.wankuma.com/blue/archive/2007/01/16/56466.aspx
正直原因はわからない。

編集 削除