タイトル | : エクセルを2度目に起動するとエラーになってしまいます。 |
記事No | : 5410 |
投稿日 | : 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
|