- - PR -
VC++2005でシートの追加が出来ない
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-06-22 23:44
VC++2005で新規でExcelのWorkBookを作成し、シートを追加しようとすると以下のエラーが発生します。
Microsoft Visual C++ Debug Library Debug Assetion Failed! Program: ... File: dbgheap.c Line: 1473 Expression: _CrtIsValidHeapPointer(pUserData) どのように修整すれば問題解決するのでしょうか? 宜しくお願い致します。 以下が作成したソースになります。 #import "C:\\Program Files\\Common Files\\Microsoft Shared\\Office11\\MSO.DLL" no_namespace rename("DocumentProperties", "DocumentPropertiesXL") #import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\Vbe6ext.olb" no_namespace #import "C:\\Program Files\\Microsoft Office\\Office11\\EXCEL.EXE" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces using namespace Excel; Excel::_ApplicationPtr pXL; Excel::WorkbooksPtr pBooks; Excel::_WorkbookPtr pBook; Excel::_WorksheetPtr pSheet; Excel::WorksheetsPtr pSheets; pXL.CreateInstance(L"Excel.Application"); _variant_t v; pBooks = pXL->GetWorkbooks(); pBooks->Add((long)xlWorksheet); pSheet = pBook->GetActiveSheet(); <---ここでセルに値を書き込んでいます---> pSheet->Copy(); pBook->Close(true, L"C:\\\\test.xls", v); pXL->Quit(); なお、pSheet->Copy();をpSheet->Copy(v, v);に変更すると「ハンドルされていない例外」がcomip.hの「Interface* operator->() const」で発生します。 また、pSheet->Copy();をコメントアウトすると問題なく動作するようになります。 |
|
投稿日時: 2007-06-22 23:52
プロジェクトは「Windows フォームアプリケーション」でしょうか?
|
|
投稿日時: 2007-06-22 23:59
Blue様
プロジェクトは「Windowsフォームアプリケーション」になります。 |
|
投稿日時: 2007-06-23 00:10
原因がわかりました。
てっきり_variant_tの初期状態=vtMissingと思っていましたが、 ぜんぜん違うようです。 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpado260/htm/mdhowhowvcusersshouldreadadodocumentation.asp で書かれていますが、 _variant_t v(DISP_E_PARAMNOTFOUND, VT_ERROR); とすることで、vtMissingと同じになるようです。 変更してみたら例外なく実行できました。 ちなみに、もうご覧になっていると思いますが、Windows フォームアプリケーション でExcelを使うとvtMissingが省略引数として使えるメソッドで省略すると、エラー で実行できないらしいというのをちょろっとネタにしたことがあります。 http://blogs.wankuma.com/blue/archive/2007/01/16/56466.aspx [ メッセージ編集済み 編集者: Blue 編集日時 2007-06-23 00:21 ] |
|
投稿日時: 2007-06-23 10:19
Blue様
ご指摘されたとおり _variant_t v ↓ _variant_t v(DISP_E_PARAMNOTFOUND, VT_ERROR); と変更し pSheet->Copy(v, v); にて実行したところ問題なくシートが追加されました。 あと、この場を借りてもう一点教えて頂きたいのですが、Excelの画面下にあります、ワークシートのタブを現在開いているワークシートの後ろに追加したいのですが、Afterの部分にどのような値を設定すればよいのか、教えて頂きたいと思います。 beforには_variant_t v(DISP_E_PARAMNOTFOUND, VT_ERROR);を設定しております。 pBook->GetWorksheets()->Add(befor,after,v,v); 以上、宜しくお願い致します。 |
|
投稿日時: 2007-06-23 19:36
同じ質問が最近違う掲示板でありました。
参考にしてください。 http://m--takahashi.com/bbs/default.aspx?c=14254 |
|
投稿日時: 2007-06-24 12:08
Blue様
教えて頂いたURLを参考に挑戦してみます。 色々と教えて頂きありがとうございました。 |
1