掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
複数Excelファイルオープンにおける、オブジェクト解放について (ID:146857)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
魔界の仮面弁士さん オブジェクトの使い方に慣れていなくて、単純な指摘までして頂き、ありがとうございます。 インラインにてコメントします。 >> exlExcelBook = exlExcelApp.Workbooks.Open(strDirPath & "\" & Me.lstTargetFile.Items(intFileList)) > exlExcelApp.Workbooks.Open ではなく、 > exlBooks.Open を使うべきかと。せっかく変数に取ってあるのですし。 おっしゃるとおりですね。修正しました。 >> exlExcelApp.Visible = True >> exlExcelApp.DisplayAlerts = False > For Each ループの内側で、これらを毎回実行する必要は無い気がします。 了解です。オブジェクト定義後に1度だけ設定するように修正しました。 >> For i = 1 To exlExcelBook.Sheets.Count > exlExcelBook.Sheets.Count ではなく、 > exlSheets.Count を使うべきかと。 了解です。修正しました。 >> exlExcelSheet = exlExcelBook.Sheets(i) > exlExcelBook.Sheets(i) ではなく、 > exlSheets(i) を使うべきかと。 了解です。修正しました。 >> Dim exlCells As Excel.Range = exlExcelSheet.Cells >> For iRows = intEmployeeDataFromRows To intEmployeeDataToRows >> '全シートのexlCellsに対する参照処理 >> Next > この中で、ReleaseComObject が行われていない場所はありませんか? exlCellsでセルのvalueを参照して値の抽出処理を行っているだけでReleaseComObjectは行っておりません。 >> MRComObject(exlCells) >> exlCells = Nothing >変数への Nothing 代入は、既に MRComObject 内で行われているようですが、 >それだけでは不足だったのでしょうか? 不足ではないですが、ウォッチリストで変数を見ると何やら残骸が残っている ように見えていたため、Nothingして綺麗にしていました。 不要ということで削除しました。 >> If Not exlExcelBook Is Nothing Then >この時点で、exlExcelBook が Nothing になる事は無いように思えます。 了解です。削除しました。 >> If Not exlExcelBook Is Nothing Then >> Try >> exlExcelBook.Close(False) >> Finally >> MRComObject(exlExcelBook) >> End Try >> End If >> exlExcelBook = Nothing >> MRComObject(exlSheets) >> exlSheets = Nothing >> MRComObject(exlBooks) >> exlBooks = Nothing >Range → Sheet → Workbook → Sheets → Workbooks の順に解放していますが、 >念のため、下位のオブジェクトから行っていった方が良いと思います。 >Range → Sheet → Sheets → Workbook → Workbooks の順に書き換えてみてください。 了解です。書き換えました。 >> exlExcelApp.Quit() >> intFileCnt = intFileCnt + 1 >> Next >> 'Excelの結果に応じて、画面のListViewの編集処理 >> If Not exlExcelApp Is Nothing Then >> Try >> exlExcelApp.Quit() >ループ内の exlExcelApp.Quit は問題があるように思えます。 >Quit するなら、ReleaseComObject もセットで行うべきですし、 >Quit した後で、2回目以降に exlExcelApp を使い続けるべきではありません。 なるほど。これはちょっと試してみたいと思います。 例えば、exlExcelAppをオブジェクト型で定義して、その変数をExcelファイル毎に ReleaseComObjectの解放とReleaseComObjectのセット(?)でやっていくということでしょうか? >> If Not exlExcelApp Is Nothing Then >> Try >> exlExcelApp.Quit() >> Finally >> MRComObject(exlExcelApp) >> End Try >> End If >> exlExcelApp = Nothing >最後の Nothing 代入は、何を意図しているのでしょうか? > >「If Not exlExcelApp Is Nothing Then」の内側では、 >MRComObject によって、既に Nothing になっているようですし、 >If ブロック内を処理していないなら、既に Nothing になっているハズですよね。 はい。前述したとおり、Nothingは削除するようにします。 >> Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False) >どこかで見たコード…。 VBレスキュー(花ちゃん)の方で参考にさせて頂きました・・・。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.