2016-05-13 15 views
0

Excelファイルを開くことができるDataGridViewがあります。 Excelファイルを閉じると、インスタンスはWindowsタスクマネージャプロセスでまだ開いています。 DataGridViewから別のExcelファイルを開くと、もう1つのインスタンスが再び開かれます。 Excelファイルを閉じたときにインスタンスを閉じる方法はありますか? DataGridViewが入っているフォームを閉じると、すべてのExcelインスタンスが閉じられます。ここで DataGridViewからExcelファイルを閉じた後にExcelインスタンスが閉じられない?

は私のコードです:そして、作成したすべての単一の変数のために、呼び出してください

Public Sub openExcel() 
    'my code.... blah blah blah.... 

    'open excel 
    Dim xlsApp As Excel.Application 
    Dim xlsWB As Excel.Workbook 
    xlsApp = New Excel.Application 
    xlsApp.Visible = True 
    xlsWB = xlsApp.Workbooks.Open(c:\myExcelFile.xlsm") 
End Sub 
+1

これを確認してください - http://stackoverflow.com/questions/15697282/excel-application-not-quitting-after-calling-quit – codeMonger123

+0

こちらのページもご覧ください:http://stackoverflow.com/questions/22229116/close-excel-when-user-is-finished –

答えて

0

変更

xlsWB = xlsApp.Workbooks.Open(c:\myExcelFile.xlsm") 

Dim workbooks as Excel.Workbooks = xlsApp.Workbooks 
xlsWB = workbooks.Open(c:\myExcelFile.xlsm") 

System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks) 
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsWB) 

など、ロット、ロットなど

これらはすべてCOMオブジェクトであり、リリースされるまでメモリ内に存続します。

xlsApp.Workbooks.Openは、変数なしのWorkbooksオブジェクトへの参照を作成するため、明示的に解放する方法はありません。

Excelオブジェクトモデルで作成されたすべてのオブジェクトにはそれぞれ独自の変数が必要で、例外がスローされた場合でも明示的に解放する必要があります。

結論(as it did for me)は面倒なことではないと思うかもしれません。EPPlusのようなライブラリを使う方が良いでしょう。またはreading from it like it's a databaseを試してください。

私が代替案を検討することをお勧めする1つの理由は、これが唯一の問題ではない可能性が高いということです。 Excelのスプレッドシートを読み込むすべての方法のうち、Excelのインスタンスを開始し、それを自動化することが最も問題になります。私はアプリケーションが何か入力を促すケースを聞いたことがありますが、それはa)不可視であり、b)誰もプロンプトを見ることができないWebサーバーであるため、ハングアップして失敗します。また、WebサーバーにExcelをインストールするためのライセンスを支払うことも意味します。ファイルを読むために他の方法を使用する場合、そのすべてを避けることができます。

多くの人が(私を含めて)問題を解決する方法を教えてくれます。それは良いことです。しかし、問題を解決するためにすべての作業を行うという代償として、より多くの問題の可能性を秘めた、あまり理想的ではないソリューションが得られます。そういうわけで私は選択肢を強く勧めます。

+0

excelブックをユーザーが手動で閉じるときに、リリースcomオブジェクトをいつ呼び出すべきかをどのように知ることができますか? –

関連する問題