VB.NET Excelプロセスが残り続ける

Excelのプロセスが残り続ける問題に悩まされた。
非っっ常に多くのサイトにお世話になりながらも、ドハマりした挙句何とかかんとか解決したので、必要事項を自分なりに整理してみた。
(全て世間的には当たり前のことのようだが・・・)

@暗黙参照は作らない
必ず、一度全て変数にして作る!

  Dim xlApp As Excel.Application = Nothing
  Dim xlBooks As Excel.Workbooks = Nothing
  Dim xlBook As Excel.Workbook = Nothing
  Dim xlSheets As Excel.Sheets = Nothing
  Dim xlSheet As Excel.Worksheet = Nothing
  Dim xlRange As Excel.Range = Nothing

  xlApp = CreateObject("Excel.Application")
  xlBooks = xlApp.Workbooks
  xlBook = xlBooks.Open(fileName)
  xlSheets = xlBook.Worksheets
  xlSheet = xlSheets(1) '1シート目を読む
  xlRange = xlSheet.Range("A1")
  :



A最後の参照開放は順序が重要!
親子関係は上から順に、
Application→Workbooks→Workbook→Sheets→Worksheet→Range
となっているので、開放はこのに行う。
その際、WorkbookはCloseし、ApplicationはQuitする。

  xlBook.Close(False)
  xlApp.Quit()
  If xlRange IsNot Nothing Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlRange)
  If xlSheet IsNot Nothing Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheet)
  If xlSheets IsNot Nothing Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheets)
  If xlBook IsNot Nothing Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBook)
  If xlBooks IsNot Nothing Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBooks)
  If xlApp IsNot Nothing Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp)



BFor文で参照している場合は毎回開放!
※これをやらなくても大丈夫としているサイトもあったが、自分の環境だとプロセスは残り続けたので(With句を使っていないから?)。

  Do
    xlRange = xlSheet.Range("A" & rowIndex + 1)
    Dim str = xlRange.Text.ToString
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlRange)

    :

    rowIndex += 1
  Next



お世話になった方々
http://d.hatena.ne.jp/chago/20130121/1358742211
http://homepage1.nifty.com/rucio/main/technique/teq_15.htm
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31076&forum=7
http://www.asahi-net.or.jp/~ef2o-inue/vbnet/sub13_03_040.html
posted by へっぽ at 16:40 | TrackBack(0) | VB.NET | このブログの読者になる | 更新情報をチェックする

この記事へのトラックバック