教えて下さい。
C#でEXCELシートにデータを出力していますが、その際に以下のような記述をした場合、
EXCELファイルは作成されるものの、そのファイルをダブルクリックで開こうとすると、
EXCELの枠だけ表示され、中身のシートが表示されない現象となってしまいます。
それらしきオブジェクトはすべて開放しているつもりですが、その事象を解決できません。
どこがおかしいか教えて頂きたいと思います。
記述に過不足あればご指摘下さい。
尚、環境は、WindowsXP Office2000-EXCEL です。
《記述内容》
//////////////////////////////////
//ここからエクセルシートへの転記//
//////////////////////////////////
Excel.Application objExcel = null;
Excel.Workbooks objBooks = null;
Excel.Workbook objBook = null;
Excel.Worksheet sheet = null;
Excel.Range range1 = null;
Excel.Range range2 = null;
Excel.Range range3 = null;
//ExcelのCOMオブジェクトの生成
objExcel = new Excel.Application();
//Excelを表示する設定
//objExcel.Visible = isVisible;
//ワークブックの集合体取得
objBooks = objExcel.Workbooks;
//ブックの新規作成
objBook = objBooks.Add(Missing.Value);
//シートを取得
sheet = (Excel.Worksheet)objBook.Sheets.get_Item(1);
//Rangeを取得
range1 = (Excel.Range)sheet.Cells[1, 1];
range2 = (Excel.Range)sheet.Cells[1, 2];
//文字列を設定
//ヘッダ書き込み
range1.Value = "仕入先名";
range2.Value = "図面番号";
//エクセルシート側の行数カウント変数
int rcount = 2;
//データテーブル側の行数カウント変数
int tcount = 0;
for (tcount = 0; tcount < mst_cnt;tcount++ )
{
range1 = (Excel.Range)sheet.Cells[rcount, 1];
range2 = (Excel.Range)sheet.Cells[rcount, 2];
range1.Value = 仕入先名[tcount];
range2.Value = 図面番号[tcount];
rcount++;
}
//エクセルシート削除
DeleteFile(@"c:\\" + h_no + ".xls");
//エクセルシート生成
objBook.SaveAs(
"c:\\" + h_no + ".xls",
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
0,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value
);
//COMオブジェクト解放
Marshal.ReleaseComObject(range1);
Marshal.ReleaseComObject(range2);
//COMオブジェクトの開放(必須)
Marshal.ReleaseComObject(objBook);
objBook = null;
Marshal.ReleaseComObject(sheet);
sheet = null;
Marshal.ReleaseComObject(objBooks);
objBooks = null;
//System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel);
objExcel.Quit();
Marshal.ReleaseComObject(objExcel);
objExcel = null;
//objExcel.Quit();
return;
}
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
>range1.Value = 仕入先名[tcount];
>range2.Value = 図面番号[tcount];
の部分がエラーになるので
range1.Value = tcount;
range2.Value = tcount;
に変更し、
>DeleteFile
を
System.IO.File.Delete
に変更して試してみましたが、こちらの環境 ( Windows XP、VS 2008、Excel 2000 ) では再現できませんでした。
どこか別の関数とかで Excel の開放ができていないとか?
タスクマネージャのプロセスタブを監視しながら動作させてみてはいかがでしょうか。
この回答への補足
ご回答ありがとうございます!
早速、教えて頂いた内容の通り記述してみましたが、結果は同じでした。
確かにタスクマネージャのプロセスは、EXCEL.EXEが残ったままです。
何か開放忘れでしょうか。。。
申し訳ありません。
もう少し教えて頂きたいと思います。
No.1
- 回答日時:
なんだか不可解な現象ですけど、出力したファイルを開こうとしたときに、ガベージコレクトされずにメモリ上に残っていた Excel がアクティブになると問題の現象が起きるようです。
xls に出力した後で、メモリ上に残っている Excel をタスクマネージャで強制的に終了させると、この現象は起きないと思います。
とりあえず、
>objExcel.Quit();
>Marshal.ReleaseComObject(objExcel);
>objExcel = null;
の後に
GC.Collect();
を入れてみてはいかがでしょうか。
この回答への補足
ご回答ありがとうございます!
ご指摘頂いたように記述したら正しく起動するようになりました。
但し、もう1点、上記の記述をした場合、プログラムが起動している
最中はどうしても正しく開きません。(今までと同じ現象)
起動している最中は、何か掴んでいるのでしょうか???
教えて頂ければ幸いです。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でのEXCEL出力に関して
-
空のカラムを挿入
-
双方向リストのバブルソートに...
-
InvokeMemberメソッドとは何を...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
#define _CRT_SECURE_NO_WARNIN...
-
Enterキーを押されたら次の処理...
-
2÷3などの余りについて
-
プログラムでの数字につく”f”の...
-
エクセルで可視セルにのみ値貼...
-
*をユーザーが入力した数字の数...
-
C言語での引数の省略方法
-
エクセルの問題です。絶対値の...
-
DWORDの実際の型は何でしょうか
-
20'(角度)の計算がわかりま...
-
変数とパラメータとは違うもの...
-
Excelで1つしかない値だけを抽...
-
「指定されたキャストは有効で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のリスト削除
-
InvokeMemberメソッドとは何を...
-
C# ref引数のnull判定
-
C言語 リスト
-
コールバック関数はnullになら...
-
C#でのEXCEL出力に関して
-
空のカラムを挿入
-
if文でゼロとNULLを除外するた...
-
ばばぬきプログラムについて
-
リスト構造
-
C言語 リスト
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
エクセルで可視セルにのみ値貼...
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
-
2÷3などの余りについて
-
C言語での引数の省略方法
-
Aの値からBの値を除するとは??
-
DWORDの実際の型は何でしょうか
おすすめ情報