2011-08-09 3 views
0

私はVIsusalスタジオアプリケーションに取り組んでいます。私はExcelを開き、データを読み込み、別の場所にExcelを保存しようとしています。私は/ applcationを終了し、再実行破るときExcelが別のユーザーによって変更されています。読み取り専用として開く

は、それから、私は「タスクマネージャ」それが動作を使用して、それをprcoessし、殺すために行くとき

を「Excelは読み取り専用として別のuser.Openによって変更されている」と言います再び。だから私は、コードをやった

Private Sub releaseObject(ByVal obj As Object) 
    Try 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) 
     obj = Nothing 

     Dim proc As System.Diagnostics.Process 
     For Each proc In System.Diagnostics.Process.GetProcessesByName("EXCEL") 
      proc.Kill() 
     Next 
    Catch ex As Exception 
     obj = Nothing 
    Finally 
     GC.Collect() 
    End Try 
End Sub 

それでも同じメッセージを投げている

を「Excelは読み取り専用として、他のuser.Openによって変更されている」このために行われるために必要なものを助けてください。

+0

をあなたは自分のデバッグプロセスより合理権利を作るために何かをしたいですか? –

+0

あなたの問題はExcelの最初の部分から来て、正しく閉じられないことがあります(VBAでは、オブジェクトを 'Nothing'に設定します)。コードのこの部分を見せてください。 (私はネットのエキスパートではありませんが、助けになるかもしれません) – JMax

答えて

1

Excelの自動化の大きな問題は、(ReleaseComObjectを呼び出して)使用するたびに、すべての単一参照を確実に閉じる必要があることです。

たとえば、次のコードは、Excelが開いたままになります:範囲「A1」を取得するための呼び出しから残っ参照がまだあるので

var range; 
range = excelApplication.Range("A1"); 
range = excelApplication.Range("A2"); 
System.Runtime.InteropServices.Marshal.ReleaseComObject(range) 
range = Nothing 

です。

したがって、新しい範囲にアクセスする前にアクセスした以前の範囲を解放するように、Excelクラスにラッパーを作成することをおすすめします。参考のため

が、ここで私はクラスでCOMオブジェクトを解放するために使用されるコードである私が書いた:

Private Sub ReleaseComObject(ByVal o As Object) 
    Try 
     If Not IsNothing(o) Then 
      While System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0 
       'Wait for COM object to be released.' 
      End While 
     End If 
     o = Nothing 
    Catch exc As System.Runtime.InteropServices.COMException 
     LogError(exc) ' Suppress errors thrown here ' 
    End Try 
End Sub 
関連する問題