タイトル : Excelのプロセスが正常に終了しない 投稿日 : 2006/09/28(Thu) 22:15 投稿者 : oka
初めて投稿させていただきます。 また、プロセスの正常終了についてですが、「Excelのプロセスが正常に終了しない理由」等を 参考させていただいたのですが、プロセスが残ってしまいます。 プロセスが残る原因となる部分については把握できたのですが、 その部分について「Marshal.ReleaseComObject() 」を実行して(いるつもり) なのですが、どうしてもプロセスが残ってしまいます。 申し訳ありませんが、ご教授いただけないでしょうか。 (Marshal.ReleaseComObject()の実行の仕方についてはこのサイトで紹介されている物を 使用させていただいております。) (原因となる部分については↓ソースの"%"で囲っている部分です。) 環境は OS XP VB.net です。 宜しくお願い致します。 #Region "*********" Public Sub ******() Dim xlFilePath As String = "C:\*******\*****.xls" '********************* 起動時の処理 ************************ 'Dim myWebPage As New System.Web.UI.Page 'Dim xlApp As New Object Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks '既存のファイルを開く Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath) Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item("***") Dim i As Integer Dim intxlShapseCount As Integer = xlSheet.Shapes.Count 'シート上に作成されるスタンプのグループ名の初期化 Call SetStampGroupName() 'シートの初期化 Call ExcelSheetInitialize(xlSheet) Dim intSheetShapeCount As Integer 'Dim i As Integer Dim j As Integer Dim k As Integer = 0 Dim strStampName() As String 'エクセルシート内から対象のシェイプを取得する。 '******************************************************* intSheetShapeCount = xlSheet.Shapes.Count For i = 1 To intSheetShapeCount For j = 1 To xlSheet.Shapes.Item(i).GroupItems.Count '↓このif文のところが原因と思われます。 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% If xlSheet.Shapes.Item(i).GroupItems.Item(j).Name = "テキスト Name1" Then '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'また、MRComObject(xlSheet.Shapes.Item(i).GroupItems.Item("テキスト Name1")) という文をこの場所に追加しても、プロセスが残ります。 GoTo NSyori End If Next Next '******************************************************** NSyori: xlSheet.Shapes.Item(i).Select() 'コピー&(ペースト) xlApp.Selection.Copy() xlSheet.Paste() xlSheet.Paste() xlSheet.Paste() '================== 終了処理 ===================== 'ShapesとShapesを構成しているグループの解放 intxlShapseCount = xlSheet.Shapes.Count For i = 1 To intxlShapseCount MRComObject(xlSheet.Shapes.Item(i)) Dim intShapesGroupsCount As Integer = xlSheet.Shapes.Item(i).GroupItems.Count For j = 1 To intShapesGroupsCount MRComObject(xlSheet.Shapes.Item(i).GroupItems.Item(j)) Next Next MRComObject(xlSheet.Shapes) 'xlShapesの開放 MRComObject(xlSheet) 'xlSheet の解放 MRComObject(xlSheets) 'xlSheets の解放 xlBook.Close(False) 'xlBook を閉じる MRComObject(xlBook) 'xlBook の解放 MRComObject(xlBooks) 'xlBooks の解放 xlApp.Quit() 'Excelを閉じる MRComObject(xlApp) 'xlApp を解放 '------------------------------------------------------------------------- '強制的にガベージ コレクションの実行。 'GC.Collect() System.Threading.Thread.Sleep(1000) Dim localByName As Process() = Process.GetProcessesByName("Excel") If localByName.Length > 0 Then MessageBox.Show("まだ Excel.EXE が " & localByName.Length & " 個 起動しています。") End If '-------------------------------------------------------------------------- End Sub #End Region #Region "COM オブジェクトへの参照を開放" 'COM オブジェクトへの参照を解放するプロシージャ(既存のファイルを開く場合も共用) 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 #End Region |