2016-12-09 21 views
0

質問:アプリケーションの実行中にExcelプロセスが閉じないのはなぜですか?銃を飛ばして重複しないようにしてください。コードに必要な変更を示すことができれば、本当に感謝しています。 のアプリを閉じるとExcelプロセスがうまく閉じます。私は最後の数日のためにこの問題を研究し、いくつかのSOの投稿を読んでいくつかのことを試しましたが、できるだけ避ける方がよいprocess.killを呼び出す以外は何も動作しません。アプリケーションの実行中にExcelプロセスが終了しない理由

Imports Microsoft.Office.Interop 
Imports System.Runtime.InteropServices 

Public Class Form1 

    Public Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim xlApp As Excel.Application 
     Dim xlWorkBook As Excel.Workbook 
     Dim misValue As Object 
     Dim xlWorkSheet As Excel.Worksheet 

     Try 
      ''EXCEL CREATION/INITAILIAZATION 
      misValue = System.Reflection.Missing.Value 
      xlApp = New Microsoft.Office.Interop.Excel.Application() 
      If xlApp Is Nothing Then 
       MessageBox.Show("Excel is not properly installed!!") 
       xlApp = Nothing 
      End If 
      xlWorkBook = xlApp.Workbooks.Add(misValue) 


      ''WRITE TO WORKSHEET 
      xlWorkSheet = TryCast(xlWorkBook.Sheets("sheet1"), Excel.Worksheet) 
      xlWorkSheet.Cells(1, 1) = "THIS" 
      xlWorkSheet.Cells(1, 2) = "IS" 
      xlWorkSheet.Cells(1, 3) = "A" 
      xlWorkSheet.Cells(1, 4) = "TEST" 

      ''FORCEFULLY CAUSING ERROR, NOW THE EXCEL PROCESS HANGING IN TASK MANAGER 
      ''xlWorkSheet.Cells(1, -1) = "ERROR LINE" 

      ''SAVE WORKSHEET 
      Dim Name = DateTime.Now.ToString("s").Replace(":", "_") 
      Dim Dir = AppDomain.CurrentDomain.BaseDirectory & "Output\" & Name & "Output.xls" 
      xlApp.DisplayAlerts = False 
      xlWorkBook.CheckCompatibility = False 
      xlWorkBook.DoNotPromptForConvert = True 
      xlWorkBook.SaveAs(Dir, Excel.XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, Type.Missing, Type.Missing, _ 
           Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing) 
      xlWorkBook.Close(False) 
      xlApp.Quit() 

      misValue = Nothing 

      If Not IsNothing(xlWorkSheet) And System.Runtime.InteropServices.Marshal.IsComObject(xlWorkSheet) Then 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet) 
       xlWorkSheet = Nothing 
      End If 

      If Not IsNothing(xlWorkBook) And System.Runtime.InteropServices.Marshal.IsComObject(xlWorkBook) Then 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook) 
       xlWorkBook = Nothing 
      End If 

      If Not IsNothing(xlApp) And System.Runtime.InteropServices.Marshal.IsComObject(xlApp) Then 
       System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp) 
       xlApp = Nothing 
      End If 

      GC.Collect() 
      GC.WaitForPendingFinalizers() 

     Catch ex As Exception 
      Dim exMsg = ex.Message 
     End Try 
    End Sub 

End Class 
+0

これは答えではありませんが、可能であれば、Excelファイルを保存するための良いAPIがあることをお勧めします。 interopを使用すると、このような問題が発生し、非常に遅いです。 –

+0

あなたの問題は何ですか?あなたは明らかに大胆です*あなたの質問に対抗する*アプリケーションを閉じると、Excelプロセスがうまく閉じます。また、VB.Netに慣れていなくても、 'Catch'にリソース(' xlApp = Nothing')をリリースしているか、 '' Finally''(https://msdn.microsoft.com/en)にあるべきです。 -us/library/fk6t46tz.aspx)節 – Parfait

+0

@Parfait問題は、最初の太字のステートメントです。オブジェクトがサブの中で宣言されている場合、サブの終わりにオブジェクトがスコープから外れるべきです。上記のコードを実行してボタンを数回クリックすると、サブプロセスの終了時に1つを除くすべてのExcelプロセスインスタンスが終了することがわかります。 – glant

答えて

0

問題は.netでダブルドット参照しています。ここで読む:あなたが

xlWorkBooks = xlApp.Workbooks 
xlWorkBook = xlWorkBooks.Add(misValue) 

として

xlWorkBook = xlApp.Workbooks.Add(misValue) 

を分解し、それを離すとhttps://msdn.microsoft.com/en-us/library/8bwh56xe(v=vs.110).aspx

はそう、あなたがすべて良いです。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Call doSomeWork() 
    GC.Collect() 
End Sub 

Private Sub doSomeWork() 
    Dim xlApp As Excel.Application 
    Dim xlWorkBook As Excel.Workbook 
    Dim xlWorkBooks As Excel.Workbooks '// Added new variable to avoid double dot. 
    Dim misValue As Object 
    Dim xlWorkSheet As Excel.Worksheet 

    Try 
     ''EXCEL CREATION/INITAILIAZATION 
     misValue = System.Reflection.Missing.Value 
     xlApp = New Microsoft.Office.Interop.Excel.Application() 
     If xlApp Is Nothing Then 
      MessageBox.Show("Excel is not properly installed!!") 
      xlApp = Nothing 
     End If 
     xlWorkBooks = xlApp.Workbooks 
     xlWorkBook = xlWorkBooks.Add(misValue) 


     ''WRITE TO WORKSHEET 
     xlWorkSheet = xlWorkBook.Sheets(1) 

     'xlWorkSheet = TryCast(sheets("sheet1"), Excel.Worksheet) 
     xlWorkSheet.Cells(1, 1) = "THIS" 
     xlWorkSheet.Cells(1, 2) = "IS" 
     xlWorkSheet.Cells(1, 3) = "A" 
     xlWorkSheet.Cells(1, 4) = "TEST" 

     ''FORCEFULLY CAUSING ERROR, NOW THE EXCEL PROCESS HANGING IN TASK MANAGER 
     ''xlWorkSheet.Cells(1, -1) = "ERROR LINE" 

     ''SAVE WORKSHEET 
     Dim Name = DateTime.Now.ToString("s").Replace(":", "_") 
     Dim Dir = AppDomain.CurrentDomain.BaseDirectory & "Output\" & Name & "Output.xls" 
     xlApp.DisplayAlerts = False 
     xlWorkBook.CheckCompatibility = False 
     xlWorkBook.DoNotPromptForConvert = True 
     xlWorkBook.SaveAs("C:\temp\a.xls", Excel.XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, Type.Missing, Type.Missing, _ 
          Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing) 
     xlWorkBook.Close(False) 
     xlApp.Quit() 

     misValue = Nothing 

    Catch ex As Exception 
    End Try 
End Sub 
+0

から入手できます。私は既にxlWorkbooksを別々の変数としてチェーン・ドットを避けるために試みていましたが、それはうまくいかなかったので、私はあなたの答えが働いているのを見て、それが以前は私にとってはうまくいかなかった理由を理解しなければなりませんでした。あなたとあなたのソリューション。 TRY/CATCHブロックが犯人になったことが分かります。上記のtry/catchブロックと私のオリジナルコードをコメントアウトしました。あなたの投稿が私に与えた動機付けに感謝します。 – glant

+0

このソリューションにtry/catchブロックを追加しようとすると、失敗するでしょう。それは私のために行い、同僚のボックスでもテストされています...なぜ起こったのか分かりません – glant

+0

hmm ....別のサブすべての作業を行うtry catch catchを使用することができます。サブを呼び出し、次にきれいにします。更新されたコードは私のために働く。 – cyboashu

関連する問題