tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル ループ処理後に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のプロセスが残ってしまうことを確認しています。
ループ処理の際に解放すべきオブジェクトを解放出来ていないものと考えていますが原因がわかりません。

おそらく無駄や不適切な処理等あり、可読性や技術的に拙い部分が多々あると思いますが、よろしくお願いします。
 

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。