tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルExcelのプロセスについて
記事No5695
投稿日: 2007/06/24(Sun) 23:23
投稿者ぷらぷら
VB2003とExcel2002で開発しています。
Excelのデータを取り込むために以下のコードを実行したところ、
Excelのプロセスが残ってしまいました。

Private Sub GetData()

   Dim xlsApp As New Excel.Application
   Dim xlsBooks As Excel.Workbooks
   Dim xlsBook As Excel.Workbook
   Dim xlsSheets As Excel.Sheets
   Dim xlsSheet As Excel.Worksheet
   Dim xlsCell As Excel.Range
   Dim intLastRow As Integer

   Try
        
    xlsBooks = xlsApp.Workbooks
    xlsBook = xlsBooks.Open("C:\TEST.xls", 0)
    xlsSheets = xlsBook.Worksheets
    xlsSheet = xlsSheets.Item(1)
    xlsCell = xlsSheet.Cells

    '使用するデータの最終行を決める
    intLastRow = CType(xlsCell(xlsCell.Rows.Count, 4) _
           , Excel.Range).End(Excel.XlDirection.xlUp).Row

    'データ取り込み処理予定

   Catch ex As Exception
    'エラー処理予定
   Finally
    CloseXls(xlsCell)
        
    CloseXls(xlsSheet)
    CloseXls(xlsSheets)
        
    xlsBook.Close()
    CloseXls(xlsBook)
        
    xlsBooks.Close()
    CloseXls(xlsBooks)
        
    xlsApp.Quit()
    CloseXls(xlsApp)
        
    GC.Collect()
   End Try

End Sub

'使わせてもらってます
Private Sub CloseXls(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

******************************************************************
'使用するデータの最終行を決める
intLastRow = CType(xlsCell(xlsCell.Rows.Count, 4) _
          , Excel.Range).End(Excel.XlDirection.xlUp).Row
******************************************************************
この部分をコメントアウトしたところプロセスは残らなかったので、原因箇所はわかるのですが
どのように記述すればいいのかが分かりません。
何度も出ている質問だとは思いますが、どなたかご教示お願いします。

[ツリー表示へ]
タイトルRe: Excelのプロセスについて
記事No5696
投稿日: 2007/06/25(Mon) 02:18
投稿者魔界の仮面弁士
> '使わせてもらってます
> Private Sub CloseXls(ByRef objCom As Object)
ByRef だと、Option Strict On の時に使いづらいのが難点…。
# 2005 なら、ジェネリックで対応できるのだけれども。


> intLastRow = CType(xlsCell(xlsCell.Rows.Count, 4) _
>           , Excel.Range).End(Excel.XlDirection.xlUp).Row

試してはいませんが、おそらく、下記程度までは分解しないとマズイかと。

rowsRange = xlsCell.Rows
cellsRange = xlsCell(rowsRange.Count, 4)
endRange = cellsRange.End(Excel.XlDirection.xlUp)
lastRow = endRange.Row
CloseXls(endRange)
CloseXls(cellsRange)
CloseXls(rowsRange)

[ツリー表示へ]
タイトルRe^2: Excelのプロセスについて
記事No5704
投稿日: 2007/06/25(Mon) 13:09
投稿者ぷらぷら
> > '使わせてもらってます
> > Private Sub CloseXls(ByRef objCom As Object)
> ByRef だと、Option Strict On の時に使いづらいのが難点…。
> # 2005 なら、ジェネリックで対応できるのだけれども。
>
>
> > intLastRow = CType(xlsCell(xlsCell.Rows.Count, 4) _
> >           , Excel.Range).End(Excel.XlDirection.xlUp).Row
>
> 試してはいませんが、おそらく、下記程度までは分解しないとマズイかと。
>
> rowsRange = xlsCell.Rows
> cellsRange = xlsCell(rowsRange.Count, 4)
> endRange = cellsRange.End(Excel.XlDirection.xlUp)
> lastRow = endRange.Row
> CloseXls(endRange)
> CloseXls(cellsRange)
> CloseXls(rowsRange)

上記のように修正したところプロセスが残らないようになりました。
ありがとうございました。

ココ↓を読んでおけば悩むことも無かったかもしれませんね。
http://hanatyan.sakura.ne.jp/bbs/wforum.cgi?no=1000&reno=997&oya=997&mode=msgview&page=30
魔界の仮面弁士さんが答えてるし…

[ツリー表示へ]
タイトルRe^3: Excelのプロセスについて
記事No5710
投稿日: 2007/06/25(Mon) 18:37
投稿者花ちゃん

> ココ↓を読んでおけば悩むことも無かったかもしれませんね。
> http://hanatyan.sakura.ne.jp/bbs/wforum.cgi?no=1000&reno=997&oya=997&mode=msgview&page=30
> 魔界の仮面弁士さんが答えてるし…

ここの、Excelのプロセスが正常に終了しない理由 の COMオブジェクトの解放忘れ の
1番目に書いてあったりして。
(掲示板で同様の質問が多いのでまとめています)
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm

[ツリー表示へ]