tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル エクセルを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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。