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

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

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

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