タイトル | : Re^2: Excel ComObjectの解放 |
記事No | : 11343 |
投稿日 | : 2014/10/29(Wed) 12:06 |
投稿者 | : tera |
> > 何を解放し忘れているのでしょうか? > > 念のため、ReleaseComObject の戻り値を確認してみて下さい。 > それらすべてが 0 を返していますか? > > もしも 1 以上を返してくるケースがあった場合は、そのオブジェクトに対して > 複数の参照カウントが生成されていますので、0 になるまで ReleaseComObject を > 繰り返すか、もしくは、FinalReleaseObject で処理することになります。 > > (なお、0 未満の値を返してきている場合は 過解放です) > > > > xlSheet_g = DirectCast(xlSheets("グラフ"), Excel.Worksheet) > この xlSheets に関する解説が無いようですが、xlSheets が原因というわけではないのですね? > ReleaseComObject で戻り値を確認してみたところ xlSheetsの後ろで戻り値が1になっていました。
'確認用 Dim xlSheet_g As Excel.Worksheet xlSheet_g = DirectCast(xlSheets("グラフ"), Excel.Worksheet) cnt = System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet_g)
xlSheetsは下のxlSheetsを使用しています。 xlSheetsの解放はExcelCloseのところで行っているのでは足りないということだと思いますが 何を解放していないのかわからないです。
Private Sub ExcelOpen(ByVal FilePath As String, ByVal SheetName As String) 'Excel のオープン処理用プロシージャ xlClose = False '起動中は、ユーザが Excel を閉じれないように xlApp = New Excel.Application 'Excel の WorkbookBeforeClose イベントを取得 AddHandler xlApp.WorkbookBeforeClose, AddressOf xlApp_WorkbookBeforeClose
xlBooks = xlApp.Workbooks If FilePath.Length = 0 Then '新規のファイルを開く場合 xlBook = xlBooks.Add xlSheets = xlBook.Worksheets xlSheet = DirectCast(xlSheets.Item(1), Excel.Worksheet) Else '既存のファイルを開く場合 xlBook = xlBooks.Open(FilePath) xlSheets = xlBook.Worksheets xlSheet = DirectCast(xlSheets(SheetName), Excel.Worksheet) End If xlApp.Visible = True End Sub
> > > xlChart = DirectCast(xlCharts(0), Excel.ChartObject) > これは > xlChart = DirectCast(xlCharts.Item(1), Excel.ChartObject) > だとどうでしょう。 変更してみたところ COMException' のハンドルされていない例外が mscorlib.dll で発生しました HRESULT からの例外:0x800A03EC となりました。
> > 参照設定しているライブラリによっては、ChartObjects に既定のインデクサが無い場合があるためです。 > また、Excel のコレクションオブジェクトは、基本的には 1 からカウントするはず…。 解放忘れを除けばグラフの最大値も変更されてますし 動きにおかしなところはなさそうです。 参照設定しているライブラリは Excel 14.0 Object Library Office 14.0 Object Library です。
|