タイトル : 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) |