tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルエクセルの解放について
記事No11674
投稿日: 2016/05/23(Mon) 22:46
投稿者もとき
いつもお世話になっております。
申し訳ございませんが、教えて頂けないでしょうか?
VB2005 エクセル2013を使用しています。

エクセルのテキストボックス名を取得したいと思います。
取得自体は出来たのですが、エクセルが解放されません。
「プロセスが正常に終了しない理由」等参考に
させて頂きましたが、知識不足のため、解放できません。

申し訳ございませんが、
よろしくお願いいたします。


    '●エクセルからテキストボックス名を取得
    Public Function fncExcelTextBoxNameSyutoku(ByVal PathName As String) As List(Of String)
        Dim lstOutPut As New List(Of String)
        Dim xlApp As New Excel.Application
        Dim xlBooks As Excel.Workbooks
        Dim xlBook As Excel.Workbook
        Dim xlSheets As Excel.Sheets
        Dim xlSheet As Excel.Worksheet
        Dim xlShapes As Excel.Shapes
        Dim xlShape As Excel.Shape

        xlBooks = xlApp.Workbooks
        xlBook = xlBooks.Open(PathName)
        xlSheets = xlBook.Worksheets
        xlSheet = DirectCast(xlSheets.Item("Sheet1", Excel.Worksheet)  
        xlShapes = xlSheet.Shapes  

        For Each xlShape In xlSheet.Shapes
            lstOutPut.Add(xlShape.Name)
            MRComObject(xlShape)
        Next

        'Excelの警告メッセージを表示しない
        xlApp.DisplayAlerts = False

        '▼終了処理
        MRComObject(xlShapes)
        MRComObject(xlSheet)
        MRComObject(xlSheets)              'xlSheets の解放
        xlBook.Close(False)                'xlBook を閉じる
        MRComObject(xlBook)                'xlBook の解放
        MRComObject(xlBooks)               'xlBooks の解放
        xlApp.Quit()                       'Excelを閉じる
        MRComObject(xlApp)                 'xlApp を解放

        fncExcelTextBoxNameSyutoku = lstOutPut
    End Function

'●エクセルの開放
    Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False)
        If objCom Is Nothing Then
            Return
        End If
        Try
            If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
                If force Then
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
                Else
                    Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
                End If
            End If
        Finally
            objCom = Nothing
        End Try
    End Sub

[ツリー表示へ]
タイトルRe: エクセルの解放について(解決)
記事No11675
投稿日: 2016/05/23(Mon) 23:04
投稿者もとき
申し訳ございませんでした。


>         For Each xlShape In xlSheet.Shapes
>             lstOutPut.Add(xlShape.Name)
>             MRComObject(xlShape)
>         Next

でなく、

For Each xlShape In xlShapes
        lstOutPut.Add(xlShape.Name)
        MRComObject(xlShape)
Next

でした。
本当にすみませんでした。
これからは、
もっと注意して投稿いたします。



> いつもお世話になっております。
> 申し訳ございませんが、教えて頂けないでしょうか?
> VB2005 エクセル2013を使用しています。
> エクセルのテキストボックス名を取得したいと思います。
> 取得自体は出来たのですが、エクセルが解放されません。
> 「プロセスが正常に終了しない理由」等参考に
> させて頂きましたが、知識不足のため、解放できません。
>
> 申し訳ございませんが、
> よろしくお願いいたします。
>
>
>     '●エクセルからテキストボックス名を取得
>     Public Function fncExcelTextBoxNameSyutoku(ByVal PathName As String) As List(Of String)
>         Dim lstOutPut As New List(Of String)
>         Dim xlApp As New Excel.Application
>         Dim xlBooks As Excel.Workbooks
>         Dim xlBook As Excel.Workbook
>         Dim xlSheets As Excel.Sheets
>         Dim xlSheet As Excel.Worksheet
>         Dim xlShapes As Excel.Shapes
>         Dim xlShape As Excel.Shape
>
>         xlBooks = xlApp.Workbooks
>         xlBook = xlBooks.Open(PathName)
>         xlSheets = xlBook.Worksheets
>         xlSheet = DirectCast(xlSheets.Item("Sheet1", Excel.Worksheet)  
>         xlShapes = xlSheet.Shapes  
>
>         For Each xlShape In xlSheet.Shapes
>             lstOutPut.Add(xlShape.Name)
>             MRComObject(xlShape)
>         Next
>
>         'Excelの警告メッセージを表示しない
>         xlApp.DisplayAlerts = False
>
>         '▼終了処理
>         MRComObject(xlShapes)
>         MRComObject(xlSheet)
>         MRComObject(xlSheets)              'xlSheets の解放
>         xlBook.Close(False)                'xlBook を閉じる
>         MRComObject(xlBook)                'xlBook の解放
>         MRComObject(xlBooks)               'xlBooks の解放
>         xlApp.Quit()                       'Excelを閉じる
>         MRComObject(xlApp)                 'xlApp を解放
>
>         fncExcelTextBoxNameSyutoku = lstOutPut
>     End Function
>
>  '●エクセルの開放
>     Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False)
>         If objCom Is Nothing Then
>             Return
>         End If
>         Try
>             If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
>                 If force Then
>                     System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
>                 Else
>                     Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
>                 End If
>             End If
>         Finally
>             objCom = Nothing
>         End Try
>     End Sub

[ツリー表示へ]