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

わんくま同盟

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

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


(過去ログ 144 を表示中)
■84596 / )  Re[1]: Excelのsaveasメソッドでフリーズしてしまいます
□投稿者/ 魔界の仮面弁士 (1349回)-(2017/07/20(Thu) 11:59:33)
新規投稿時の注意事項に、
 『半角カナは使用しないでください。文字化けの原因になります。』
とのお願いが書かれていたかと思います。次回以降、ご留意ください。


No84590 (makoto さん) に返信
> ASPよりパラメータを設定し、Oracleのテーブルからデータを取得し

この部分について確認させてください。
現在の状況は、下記のどちらに近いでしょうか。


(想像1)
 ASP というのは、ASP.NET の書き間違い。その ASP.NET 上で、
 今回提示のコードが呼ばれており、SaveAs 時に問題が生じている。


(想像2)
 Classic ASP 製の Web アプリでユーザーからの指定を受け取っており、
 この Web アプリが、必要なパラメーターを Oracle に書き込むようになっている。
 そしてそれとは別に、Oracle を監視して、その中のデータを
 Excel に出力させるための VB.NET アプリが稼動していて、今回は
 その VB.NET アプリの側で SaveAs 時に問題が生じている。


> またsaveasメソッドの前にdoEventを入れてみたのですが、
doEvent というのは、
DoEvents メソッドのことですよね。

ということは(2)の方かな? (Windows フォームアプリケーション)


開発言語は、.NET 版の Visual Basic のようですが、Excel 操作時においては、
面倒でも「Option Strict On」付きでコンパイルされることをお奨めします。

暗黙の型変換に頼っていると、COM の参照カウントが不用意に増加してしまい、
オブジェクトを解放しにくくなってしまうケースを幾度か目にしているためです。


また、無人実行を目的とする場合は、Excel をオートメーション操作する代わりに
EPPlus や NPOI などを使うことを検討してみてください。
(非対話デスクトップでの Excel オートメーションはサポートされていません)
https://blogs.msdn.microsoft.com/office_client_development_support_blog/2012/04/11/office-2/


> gvObjExcel As Microsoft.Office.Interop.Excel.Application 'Excelオブジェクト
Dim や Private といったキーワードが抜けているようですが、わざと抜いているのでしょうか。


> gvObjBook = gvObjExcel.Workbooks.Open(該当Excelファイル)
> gvObjSheet = gvObjBook.Worksheets(該当シート)
ここは、
 gvObjBooks = gvObjExcel.Workbooks
 gvObjBook = gvObjBooks.Open(該当Excelファイル)
 gvObjSheets = gvObjBook.Worksheets
 gvObjSheet = DirectCast(gvObjSheets(該当シート), Microsoft.Office.Interop.Excel.Worksheet)
になるべきかと思います。


> gvObjExcel.Visible = False
> gvObjExcel.DisplayAlerts = True

.Visible = False かつ .DisplayAlerts = True な組み合わせは不自然です。

.Visible = True かつ .DisplayAlerts = True もしくは
.Visible = True かつ .DisplayAlerts = False もしくは
.Visible = False かつ .DisplayAlerts = False を試してみてください。

(動作検証段階では、Visible = True で試してみることをお奨めします)



> '▼Excelファイル書込処理
> gvObjSheet.Cells._Default(1, 1).Value = 任意の値
ここは、
 gvObjRange1 = gvObjSheet.Cells
 gvObjRange2 = DirectCast(gvObjRange1._Default(1, 1), Microsoft.Office.Interop.Excel.Range)
 gvObjRange2.Value = 任意の値
になるべきかと思います。


> .SaveAs(該当Excelファイル)
ピリオドの前が削られていますが、With 句をお使いということでしょうか。
SaveAs メソッドは Workbook にも Worksheet にもありますね。


> gvObjExcel = Nothing
> gvObjBook = Nothing
> gvObjSheet = Nothing
Nothing 代入の前に、Marshal.ReleaseComObject を呼んだ方が良いと思います。
(ReleaseComObject する代わりに、AppDomain ごと Unload する解放手法も無くは無いですが)

また解放する際には、取得した時の逆順(たとえば Range → Sheet → Workbook → Application など)で
処分していった方が良いでしょう。


[Office オートメーションで割り当てたオブジェクトを解放する - Part1]
https://blogs.msdn.microsoft.com/office_client_development_support_blog/2012/02/09/office-5/

[Office オートメーションで割り当てたオブジェクトを解放する – Part2]
https://blogs.msdn.microsoft.com/office_client_development_support_blog/2012/02/28/office-3/

返信 編集キー/


管理者用

- Child Tree -