タイトル : ループ処理後にExcelのタスクが残る 投稿日 : 2020/02/29(Sat) 19:51 投稿者 : mogi
vb.netを触り始めて3ヶ月ほどのものです。 いつも参考にさせて頂いております。 Microsoft.Office.Interop.Excelによる、Excel操作での質問です。 以下のようなExcel操作を行った際、Excel終了後もタスクマネージャー上にExcelのタスクが 残ってしまっています。恐らくComObjectの解放関連だと思うのですが、自力では 解決できず質問するに至りました。よろしければお力添えお願いします。 以下のソースは、このような処理を行うプログラムです。 1.対象のExcelBookを開き、1シート目をコピー。 2.コピーしたシートをiシート目として作成 3.iシート目の名前を変更 4.シートに繰り返し回数を書き込み 5.1〜3をi回繰り返し、対象ExcelBookのシートを増やす ---------------------以下コード----------------------------------- Public xlApp As Microsoft.Office.Interop.Excel.Application Public xlBooks As Workbooks Public xlBook As Workbook Public xlwkSheet As Worksheet Public xlSheet As Sheets xlApp = CreateObject("Excel.Application") xlBooks = xlApp.Workbooks xlBook = xlBooks.Open("Excelファイルパス") xlSheet = xlBook.Worksheets xlwkSheet = DirectCast(xlSheet("Sheet1"),Worksheet) xlwkSheet.Visible = True For i = 0 To (指定回数) Err.Clear() Dim xlwkSheet2 As Worksheet = Nothing Dim xlCells As Range = Nothing Dim xlRange As Range = Nothing 'シートのコピー xlwkSheet2.Copy(After:=xlSheet(i+1)) 'コピーしたエクセルシートに対して名前の変更と書き込み xlwkSheet2 = DirectCast(xlSheet("Sheet1 (2)"),Worksheet) xlwkSheet2.Name = "A" + i xlCells = xlwkSheet2.Cells xlRange = DirectCast(xlCells.Item(1,1), Range) xlRange.Value = i 'xlRangeの解放 If Not xlRange Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange) xlRange = Nothing End If 'xlCellsの解放 If Not xlCells Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells) xlCells = Nothing End If 'xlwkSheet2の解放 If Not xlwkSheet2 Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlwkSheet2) xlwkSheet2 = Nothing End If Next i 'xlwkSheetの解放 If Not xlwkSheet Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlwkSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlwkSheet) xlwkSheet = Nothing End If 'xlSheetの解放 If Not xlSheet Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) xlSheet = Nothing End If 'xlBookの解放 If Not xlBook2 Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) xlBook = Nothing End If 'xlBooksの解放 If Not xlBooks Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) xlBooks = Nothing End If 'xlApp解放 If Not xlApp Is Nothing Then Try xlApp.Quit() Finally System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) xlApp = Nothing End Try End If ---------------------------------------------------------------------- 現状の課題点は以下の2点です。 @Copyメソッドの使用後にComのカウントが2になっています。 原因がわからず、現状付け焼刃の策としてxlwkSheet2の解放を2回行っていますが適切ではないと 考えています。(以下のURLを参考にさせて頂きました。) (https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32241&forum=7) Aループの回数を1にしたときは適切にExcelのプロセスが終了されますが、 ループの回数が2以上になったときにExcelのプロセスが残ってしまうことを確認しています。 ループ処理の際に解放すべきオブジェクトを解放出来ていないものと考えていますが原因がわかりません。 おそらく無駄や不適切な処理等あり、可読性や技術的に拙い部分が多々あると思いますが、よろしくお願いします。 |