C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: C#でExcelファイルを開くときの例外処理


(過去ログ 122 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■73170 / inTopicNo.1)  C#でExcelファイルを開くときの例外処理
  
□投稿者/ Ex (5回)-(2014/08/25(Mon) 13:34:27)

分類:[C#] 

以前、この掲示板で質問をし、C#からExcelファイル操作することが可能になりました。

Excelを起動し、マクロを実行するといったプログラムを組むことができたのですが、
以下の2点の方法が調べてもわかりませんでした。


1. 指定したexcelファイルがない(開けない)場合にメッセージボックスで「ありません」と表示し、this.Close();で終了する
2. マクロが実行できなかった場合にメッセージボックスで「実行できません」と表示し、this.Close();で終了する

どなたかわかる方はいないでしょうか?
作成したコードを以下に示します。

------------------------------------
//Excelマクロファイルパス
string strMacroPath = @"C:\Users\macro1.xlsm";


//Excel操作用オブジェクト生成
Excel.Application oExcel = new Excel.Application();

//表示する
oExcel.Visible = true;
Workbooks oBooks = oExcel.Workbooks;

//Excelファイル開く
Workbook oBook = oBooks.Open(strMacroPath);


//マクロ実行(Testというサブプロシージャを動かす)
oExcel.Run("ThisWorkbook.CSVcombert");

//終了処理(リソース解放)
oBook.Close(false);

System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook);
oBook = null;

System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks);
oBooks = null;

oExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel);
oExcel = null;
引用返信 編集キー/
■73171 / inTopicNo.2)  Re[1]: C#でExcelファイルを開くときの例外処理
□投稿者/ 魔界の仮面弁士 (97回)-(2014/08/25(Mon) 14:18:58)
No73170 (Ex さん) に返信
> 1. 指定したexcelファイルがない(開けない)場合にメッセージボックスで「ありません」と表示し、this.Close();で終了する
> 2. マクロが実行できなかった場合にメッセージボックスで「実行できません」と表示し、this.Close();で終了する

2 は未検証なので分かりませんが、少なくとも 1 については
オープン処理が失敗した場合に Exception が投げられますので、
それを catch してやれば良いと思います。
引用返信 編集キー/
■73174 / inTopicNo.3)  Re[2]: C#でExcelファイルを開くときの例外処理
□投稿者/ Ex (6回)-(2014/08/26(Tue) 06:49:20)
回答のあったcatchをつかってコードを組んだのですが、
マクロ実行後にoBook2.Close(false);で、以下エラーが発生しました。

原因がわかりません。
----------------------
型 'System.NullReferenceException' のハンドルされていない例外が test.exe で発生しました

追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。
----------------------



Excel.Application oExcel2 = new Excel.Application();
//表示する
oExcel2.Visible = true;
Workbooks oBooks2 = oExcel2.Workbooks;


//例外処理
try
{
//Excelファイル開く
oBooks2.Open(strMacroPath2);
}
catch (Exception ex)
{
//Sheetがなかった場合のエラー処理
//Appを閉じる
oExcel2.Quit();

//Errorメッセージ
MessageBox.Show("excelありません");

//実行を終了
System.Environment.Exit(0);
}

//例外処理
try
{
//マクロ実行(Testというサブプロシージャを動かす)
oExcel2.Run("ThisWorkbook.Main");
}
catch (Exception ex)
{
//Sheetがなかった場合のエラー処理
//Appを閉じる
oExcel2.Quit();

//Errorメッセージ
MessageBox.Show("マクロ動きません");

//実行を終了
System.Environment.Exit(0);
}

//終了処理(リソース解放)
oBook2.Close(false);

System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook2);
oBook2 = null;

System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks2);
oBooks2 = null;


oExcel2.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel2);
oExcel2 = null;
引用返信 編集キー/
■73175 / inTopicNo.4)  Re[3]: C#でExcelファイルを開くときの例外処理
□投稿者/ ぽぴ王子 (9回)-(2014/08/26(Tue) 09:16:00)
ぽぴ王子 さんの Web サイト
No73174 (Ex さん) に返信
> 回答のあったcatchをつかってコードを組んだのですが、
> マクロ実行後にoBook2.Close(false);で、以下エラーが発生しました。
>
> 原因がわかりません。
> ----------------------
> 型 'System.NullReferenceException' のハンドルされていない例外が test.exe で発生しました
>
> 追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。
> ----------------------

結論から言うと oBook2 をどこでもオープンしていないので oBook2 が null のままなのです。

また、今回のような要件に限らずですが Excel.Application を使うときは、オープンを必ず try
の中で行って、クローズは必ず finally の中で行うのがベストだと思います。
(このあたりじゃんぬさんが説明を書いてくれていたのだけど、サーバーとともにふっとんじゃったみたいで)
引用返信 編集キー/
■73176 / inTopicNo.5)  Re[4]: C#でExcelファイルを開くときの例外処理
□投稿者/ Ex (7回)-(2014/08/26(Tue) 09:19:18)
確認したところ oBook2 を使用していないのにoBook2.Close(false);
を行っていました。

//Excelファイル開く
oBook2 = oBooks2.Open(strMacroPath2);

と修正すると無事に解決しました。
ご回答ありがとうございました。

解決済み
引用返信 編集キー/
■73177 / inTopicNo.6)  Re[3]: C#でExcelファイルを開くときの例外処理
□投稿者/ 魔界の仮面弁士 (98回)-(2014/08/26(Tue) 09:26:11)
No73174 (Ex さん) に返信
> Workbooks oBooks2 = oExcel2.Workbooks;
「Excel.Workbooks oBooks2 = oExcel2.Workbooks;」では無く……?

もしかして、
 『using Workbooks = Microsoft.Office.Interop.Excel.Workbooks;』
などを用意されているのでしょうか。


> MessageBox.Show("excelありません");
メッセージが不自然かと思いますよ。『Excel』が無かったのであれば、
失敗するのは oBooks2.Open ではなく、new Excel.Application() のはずです。


> //マクロ実行(Testというサブプロシージャを動かす)
> oExcel2.Run("ThisWorkbook.Main");
では何故、引数に「Test」の語が含まれていないのでしょうか?


> //実行を終了
> System.Environment.Exit(0);
その前に、COM オブジェクトの解放を行った方が良いかと。


> //終了処理(リソース解放)
> oBook2.Close(false);
>
> マクロ実行後にoBook2.Close(false);で、以下エラーが発生しました。
> 型 'System.NullReferenceException' のハンドルされていない例外が test.exe で発生しました

提示されたコードには、『oBook2 = 何某;』のような代入処理が記載されていませんが、
oBook2 変数の宣言や代入式は、どのようなコードになっているのでしょうか?

(一切代入していなかったのであれば、そもそもコンパイルすら通らないはず…)
引用返信 編集キー/
■73178 / inTopicNo.7)  Re[4]: C#でExcelファイルを開くときの例外処理
□投稿者/ 魔界の仮面弁士 (99回)-(2014/08/26(Tue) 09:30:19)
おおぅ、既に解決済みになってた。

No73175 (ぽぴ王子 さん) に返信
> また、今回のような要件に限らずですが Excel.Application を使うときは、オープンを必ず try
> の中で行って、クローズは必ず finally の中で行うのがベストだと思います。
> (このあたりじゃんぬさんが説明を書いてくれていたのだけど、サーバーとともにふっとんじゃったみたいで)

このあたりとか。
http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html
解決済み
引用返信 編集キー/
■73180 / inTopicNo.8)  Re[5]: C#でExcelファイルを開くときの例外処理
□投稿者/ ぽぴ王子 (10回)-(2014/08/26(Tue) 10:31:03)
ぽぴ王子 さんの Web サイト
No73178 (魔界の仮面弁士 さん) に返信
> このあたりとか。
> http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html

ありがとうございます。検索して見つけた!と思ったんですが 404 Not Found だったので
サーバーが飛んだときに一緒になくなってしまったのかと思ってました。
以前リニューアルした時に URL が変わったのかもしれません。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -