2011-02-25 8 views
5

私は、オフィスでのinteropを使用している問題が.netにあります。私はプログラムで使用するために作成したExcelブック、ワークブック、ワークシートを閉じるために多くのことを試みましたが、私はいつもexcel.exeがまだメモリに残っていることに気付きました。私はガベージコレクターを強制してみました。助けてください。 Excelアプリケーションが管理するメモリが動作しない場合があります再利用、アンマネージCOMオブジェクトであるとして問題を閉じるには、.netで適切にin​​teropアプリケーションを有効にしてください。

Private mExcelApp As Microsoft.Office.Interop.Excel.ApplicationClass 
Private mWorkBook As Microsoft.Office.Interop.Excel.Workbook 
Private mWorkSheet As Microsoft.Office.Interop.Excel.Worksheet 


    Public Sub Execute() 

    mExcelApp = New Microsoft.Office.Interop.Excel.ApplicationClass 
    If mFirstPass Then 
     mWorkBook = mExcelApp.Workbooks.Add() 
     mWorkSheet = CType(mWorkBook.ActiveSheet(), Microsoft.Office.Interop.Excel.Worksheet) 
    Else 
     mWorkBook = mExcelApp.Workbooks.Open(System.IO.Path.Combine(mFileLocation, mMTDefinition.Description & "_" & mMTDefinition.Version & ".xls")) 
     mWorkSheet = CType(mWorkBook.Sheets(1), Microsoft.Office.Interop.Excel.Worksheet) 
     Dim excelRange As Microsoft.Office.Interop.Excel.Range = mWorkSheet.UsedRange 
     excelRange.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell).Activate() 
     mCurrentRow = mExcelApp.ActiveCell.Row + 1 

    End If 

    Here is how i try to close everything 

    If mFirstPass Then 
     mWorkBook.SaveAs(System.IO.Path.Combine(mFileLocation, mMTDefinition.Description & "_" & mMTDefinition.Version & ".xls")) 
     mFirstPass = False 
     Else 
     mWorkBook.Save() 
    End If 
     a 
    mWorkBook.Close() 
    mExcelApp.Quit() 

    mWorkSheet = Nothing 
    mWorkBook = Nothing 
    mExcelApp = Nothing 
    System.GC.Collect() 
+0

mExcelApp.Workbooksの各書籍について:book.saved = true:next'を試しましたか? –

答えて

5

基本的な考え方は、作成されたすべてのCOMオブジェクトに対してMarshal.ReleaseComObjectを呼び出すことです。

Dim app As New Excel.Application() 
    Dim workBook As Excel.Workbook = app.Workbooks.Add() 
    Try 

     Dim t As Int32 = 0 
     ' This example is filling an excel spreadsheet using data stored in a Dictionary 
     For Each key In sampleData.Keys 
      t += 1 
      ' Add a worksheet and dump data. 
      Dim sheet As Excel.Worksheet = workBook.Worksheets.Add() 
      sheet.Name = key 

      ' Set columns 
      For i = 1 To sampleData(key).Columns.Count 
       sheet.Cells(1, i) = sampleData(key).Columns(i - 1).ColumnName 
      Next 

      ' Set data. 
      For r = 1 To sampleData(key).Rows.Count 
       For c = 1 To sampleData(key).Columns.Count 
        sheet.Cells(r + 1, c) = sampleData(key).Rows(r - 1).Item(c - 1).ToString() 
       Next c 
      Next r 
      Marshal.ReleaseComObject(sheet) 
     Next 

     workBook.SaveAs("fileName.xls", Excel.XlFileFormat.xlExcel8) 
     workBook.Close(SaveChanges:=False) 

    Finally 
     app.Quit() 
     Marshal.ReleaseComObject(workbook) 
     Marshal.ReleaseComObject(app) 
     app = Nothing 
    End Try 
+0

ありがとうたくさんのジャスティン、これは完全に私のために働いた。今私はアンマネージドcomオブジェクトを処理する方法を知っています。 –

+0

幸運を助けて幸せです! –

2

:ここ

は、私はすべてのインスタンスを生成するために使用するコードです。私は使用しました

Marshal.ReleaseComObject(mExcelApp); 

成功しました。

+0

私はそれを試してみます。ありがとうたくさん –

関連する問題