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

タイトル Re^8:  Subroutineの引数が原因でExcelが開放できなくなります。
投稿日: 2009/09/03(Thu) 15:44
投稿者るしぇ
普通に Excel を使用したときと同じく、Excel は開いたファイルの排他制御とか
やってるので、プロセスが終了するまで時間が掛かる場合があります。
ファイルサイズが大きい場合、保存処理に時間が掛かる場合もあります。
あまりシビアにプロセスのチェックをすると、解放できているのにチェックに
引っ掛かるかもしれません。

>なぜかメッセージボックスを閉じるまでExcel.Exeが残るときもあります。
そのメッセージボックスが本サイトの
> MessageBox.Show("まだ Excel.EXE が起動しています。")
であれば、解放できていない可能性が高いです。
メッセージボックスが原因ではなく、メッセージボックスで止めていると
関数内で処理が止まっているということなので、メッセージボックスを
閉じることで関数を抜け、関数内で使用していたリソースが使われなく
なるタイミングで、たまたま解放されているのでは無いでしょうか?。

解放処理が正しく行なわれていなくとも、たまたまプロセスが消えてくれる
ことはあると書きましたが、逆はありません。解放処理を正しく実行できて
いれば、メッセージボックスとは関係なく、プロセスは必ず消えます。

> If myShape.Type = 6 Then
> のような行を
> Dim myShapeType As Integer = myShape.Type
> If myShapeType = 6 Then
> とすると開放されやすくなったりしました。
myShape の対象が変化していませんので、関係ありません。
こちらの環境では以下のコードでプロセスは100%消えます。
(xlSheet についてのコードは省いてあります)
        Dim myShapes As Excel.Shapes
        Dim myShape As Excel.Shape
        
        myShapes = xlSheet.Shapes
        myShape = myShapes.AddLabel(Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationDownward, 10, 10, 10, 10)
        If myShape.Type = 6 Then
        End If
        MRComObject(myShape)
        MRComObject(myShapes)

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

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