タイトル : エクセルを2度目に起動するとエラーになってしまいます。 投稿日 : 2007/04/24(Tue) 17:29 投稿者 : take
プログラムからエクセルを起動し、エクセルの終了はユーザーがエクセルの終了ボタンを クリックすることにより行っています。 この時にエクセルの”WorkbookDeactivate”イベントを取り、オブジェクトの解放を 行おうとしています。 下記のようにすると、”WorkbookDeactivate”でXlappを解放する際に、 ”呼び出しのターゲットが例外をスローしました。”というエラーが出ますが、 エクセルのプロセスは消えます。しかし、2度目にエクセルを起動しようとすると、 ”呼び出しのターゲットが例外をスローしました。”というエラーになってしまいます。 エラーになった場合、違う変数を用意して、”New Excel.Application”すると エクセルは起動します。 どうもXlappがうまく解放されていないようなのですが、ぜんぜんわかりません。 XlappにNothingを設定しようとしても、やはりエラーになります。 なにがいけないのでしょうか、どなたか御教示をお願いします。 Private WithEvents Xlapp As Excel.Application Private Book As Excel.Workbooks Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try Xlapp = New Excel.Application '1度目はOKなのですが、2度目がうまくいきません。 Catch ex As Exception MsgBox("Open : " & ex.Message) End Finally End Try Book = Xlapp.Workbooks Book.Add() Xlapp.Visible = True End Sub Private Sub Xlapp_WorkbookDeactivate(ByVal Wb As Excel.Workbook) Handles Xlapp.WorkbookDeactivate Try MRComObject(Book) Catch ex As Exception MsgBox("Book : " & ex.Message) End Try Try MRComObject(Xlapp) '終了時ここでエラーがでますが、プロセスは解放されます。 Catch ex As Exception MsgBox("xlapp : " & ex.Message) End Try End Sub '花ちゃんさんのプログラムを使わせて頂いています。 Private Sub MRComObject(ByRef objCom As Object) 'COM オブジェクトの使用後、明示的に COM オブジェクトへの参照を解放する Try '提供されたランタイム呼び出し可能ラッパーの参照カウントをデクリメントします If Not objCom Is Nothing AndAlso System.Runtime.InteropServices. _ Marshal.IsComObject(objCom) Then Dim I As Integer Do I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) Loop Until I <= 0 End If Catch Finally '参照を解除する objCom = Nothing End Try End Sub |