【VB.NET】Excel操作でメモリが解放されないときに試したいこと

vb-excel-memory-no-release-sumne
スポンサーリンク

どうも、あおです。

 

 

VB.NETでExcel操作をするとき、なぜかメモリが解放されずに

困ってしまうことがあります。

 

 

もちろん、Excel処理終了時には、

以下のようにReleaseComObjectは実施しています。

System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsRange, Object))
System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsSheet, Object))
System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsSheets, Object))
xlsBook.Close(False)
System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsBook, Object))
System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsBooks, Object))
xlsApplication.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsApplication, Object))

 

上記の「Quit」がない場合、プロセスが残ってしまうので注意

 

 

 

 

ループでExcelオブジェクトを使用している場合にも、

毎回解放する必要があります。

以下、サンプル

For Each row As DataRow In dt.Rows
    For Each column As DataColumn In dt.Columns
        xlsRange.NumberFormatLocal = "@"
        xlsRange.Value = row(column)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsRange, Object))
        End If
    Next
Next

 

 

 

それでも解放されずに、タスクマネージャーにExcel氏が

残ってしまう場合。なんでやねん!となります。

 

そこで、最終手段。

Excel処理を呼び出しているボタン押下処理の

「End Sub」手前行に「GC.Collect()」を記載します。

以下のように。

Public Class FormGc
    Private Sub BtnGc_Click(sender As Object, e As EventArgs) Handles BtnGc.Click

        'Excel処理・・・・

        'メモリ解放
        GC.Collect()

    End Sub
End Class

 

 

 

これでボタン押下後に

消えた!

無事解放されました。