■84600 / ) |
Excelのsaveasメソッドでフリーズしてしまいます |
□投稿者/ makoto (19回)-(2017/07/20(Thu) 13:27:49)
|
2017/07/20(Thu) 13:29:17 編集(投稿者)
shu様、魔界の仮面弁士様、WebSurfer様 回答ありがとうございます。
●shu様 >あと片付けをしっかりとしましょう。花ちゃんのページが参考になります。 上記ページを参考にCOMオブジェクトの参照カウントのデクリメント処理を追加しました。
●WebSurfer様 回答ありがとうございます。 >"マイクロソフトは、Office のサーバーサイド オートメーションを推奨またはサポートしていません" というこだそうです。 細かくは業務に関することなので、書けないですがこのEXCEL出力は 既存システムの帳票出力機能の一部です。(pdf,JPG出力もあります。) 既存の帳票出力の仕組みがあるためあまり大幅に変えたくない所が本音です。 ですが、参考にはさせていただきます。
●魔界の仮面弁士様 > 『半角カナは使用しないでください。文字化けの原因になります。』 申し訳ございません。今後、注意します。 >この部分について確認させてください。現在の状況は、下記のどちらに近いでしょうか。 (想像2)の方になります。oracle側に書き込み(Insert,Uptedate)は行わずに selectでデータを抽出し、その結果をExcelに書き込みを行っています。
>doEvent というのは、 >DoEvents メソッドのことですよね。ということは(2)の方かな? (Windows フォームアプリケーション) クラスライブラリ形式(DLL)です。doEventに関しては今は削除しています。 (調べ尽くして藁にもすがる思いで試しに入れてみただけです。)
>開発言語は、.NET 版の Visual Basic のようですが、Excel 操作時においては、 >面倒でも「Option Strict On」付きでコンパイルされることをお奨めします。 ご指摘ありがとうございます。Option Strict On」は宣言はしています。
>Dim や Private といったキーワードが抜けているようですが、わざと抜いているのでしょうか。 不要と思い削除しました。(実際はpublicです。)
>ここは、 > gvObjBooks = gvObjExcel.Workbooks > gvObjBook = gvObjBooks.Open(該当Excelファイル) > gvObjSheets = gvObjBook.Worksheets > gvObjSheet = DirectCast(gvObjSheets(該当シート), Microsoft.Office.Interop.Excel.Worksheet) >になるべきかと思います。 >.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 = 任意の値 >になるべきかと思います。 ご指摘ありがとうございます。上記に関しては組み合わせを検証します。
>ピリオドの前が削られていますが、With 句をお使いということでしょうか。 >SaveAs メソッドは Workbook にも Worksheet にもありますね。 ここも不要と思い削除しました。(BOOKのsaveasメソッドです。) >Nothing 代入の前に、Marshal.ReleaseComObject を呼んだ方が良いと思います。 >(ReleaseComObject する代わりに、AppDomain ごと Unload する解放手法も無くは無いですが) shu様に教えていただいたページを参考にCOMオブジェクトの参照カウントのデクリメント処理 を追加して▼ExcelファイルClose処理のnothingの前にCOMオブジェクトの参照カウントのデクリメント を行ってみたのですが、Excelが終了しませんでした。 これに関してはどこのタイミングで開放を行うべきか現在、考え中です。
|
|