@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

VC++2005でシートの追加が出来ない

1
投稿者投稿内容
Z80
会議室デビュー日: 2007/06/22
投稿数: 4
投稿日時: 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();をコメントアウトすると問題なく動作するようになります。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2007-06-22 23:52
プロジェクトは「Windows フォームアプリケーション」でしょうか?
Z80
会議室デビュー日: 2007/06/22
投稿数: 4
投稿日時: 2007-06-22 23:59
Blue様

プロジェクトは「Windowsフォームアプリケーション」になります。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 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 ]
Z80
会議室デビュー日: 2007/06/22
投稿数: 4
投稿日時: 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);

以上、宜しくお願い致します。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2007-06-23 19:36
同じ質問が最近違う掲示板でありました。
参考にしてください。
http://m--takahashi.com/bbs/default.aspx?c=14254
Z80
会議室デビュー日: 2007/06/22
投稿数: 4
投稿日時: 2007-06-24 12:08
Blue様

教えて頂いたURLを参考に挑戦してみます。
色々と教えて頂きありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)