0

私のクラスには、Excelを開いて範囲が存在するかどうかを確認するこのサブがあります。私が直面している問題は、プロセスが閉じないことです。私は自分の尻尾をグーグルで調べてきましたが、解決策が見つかりません。私のコードを見て、私が見逃している単純な愚かなものかどうかを確認してください。ありがとう。

Private Function NamedRangeExists(ByVal ProductFileName As String, ByVal RangeName As String) As Boolean
    Dim ExcelApp As Excel.Application
    'Create an Excel Object
    ExcelApp = CType(CreateObject("Excel.Application"), Excel.Application)
    Dim TheRange As Microsoft.Office.Interop.Excel.Name
    Dim TheRangeName As String = ""
    Dim ObjWorkbook As Excel.Workbooks = ExcelApp.Workbooks

    'Open the Product
    Dim TheProduct As Excel.Workbook = ObjWorkbook.Open(ProductFileName)

    For Each TheRange In TheProduct.Names 'ExcelApp.ActiveWorkbook.Names
        TheRangeName = CStr(TheRange.Name)
        If (InStr(TheRangeName, RangeName) <> 0) Then
            TheProduct.Save()
            TheProduct.Close()
            ExcelApp.Quit()
            ExcelApp = Nothing
            Marshal.ReleaseComObject(ExcelApp)
            Return True
        End If
    Next
    TheProduct.Close()
    ObjWorkbook.Close()
    ExcelApp.Quit()

    Marshal.ReleaseComObject(ObjWorkbook)
    Marshal.ReleaseComObject(TheProduct)
    Marshal.ReleaseComObject(ExcelApp)
    TheProduct = Nothing
    ObjWorkbook = Nothing
    ExcelApp = Nothing
    GC.Collect()
    GC.WaitForPendingFinalizers()
    GC.Collect()

    Return False
End Function
4

2 に答える 2

1

将来の視聴者のために、これは私が使用する一般的な方法です。

    Dim xlApp As New Excel.Application
    Dim xlWB As Excel.Workbook = xlApp.Workbooks.Add
    Dim xlWS As Excel.Worksheet = xlWB.Worksheets(1)

    'do stuff

    GC.Collect()
    GC.WaitForPendingFinalizers()
    GC.Collect()
    GC.WaitForPendingFinalizers()

    FinalReleaseComObject(xlWS)
    xlWB.Close(False)
    FinalReleaseComObject(xlWB)
    xlApp.Quit()
    FinalReleaseComObject(xlApp)

が必要Imports System.Runtime.InteropServices.Marshalです。

他の宣言された Excel オブジェクト (OP の場合など) は、ガベージ コレクションの前TheRangeに設定する必要があります。Nothing

ここに示すコマンドの順序は重要です。詳細な説明については、こちらを参照してください。

于 2014-05-15T16:22:19.647 に答える
0

これは仕事をするでしょう!ドキュメンテーション

Marshal.FinalReleaseComObject(obj)
于 2013-03-17T17:28:37.807 に答える