エクセルへの参照を解放するには?


もにもに  2006-09-11 18:53:43  No: 133192

現在VB.NETで開発を行っており、エクセルの解放ができず困っているの
ですが、下記のソースではうまくできませんでした。
申し訳ございませんが、間違っている箇所等のご指摘をよろしくお願い
いたします。

開発環境
    VB.NET2003
    windowsXP Pro

ソース

---中略---
dim Mycells as Excel.Range
' エクセル出力時の処理

With ExcelModule.SysWorkSheet
                ' ヘッダー
For MyColCount = 0 To SprDataList.Sheets(0).Columns.Count - 1
    Mycells = .Cells(1, MyColCount + 1)
    Mycells(1, MyColCount + 1).Value = SprDataList.Sheets(0).Columns    (MyColCount).Label.ToString
    System.Runtime.InteropServices.Marshal.ReleaseComObject(Mycells)
    Mycells = Nothing
Next

 ' 明細
For MyRowCount = 0 To SprDataList.Sheets(0).Rows.Count - 2
   For MyColCount = 0 To SprDataList.Sheets(0).Columns.Count - 1
      If TypeOf SprDataList.Sheets(0).Columns(MyColCount).CellType         Is FarPoint.Win.Spread.CellType.TextCellType Then
         Mycells = .Cells(MyRowCount + 2, MyColCount + 1)
         Mycells(MyRowCount + 2, MyColCount + 1).NumberFormatLocal = "@"
         System.Runtime.InteropServices.Marshal.ReleaseComObject              (Mycells)
          Mycells = Nothing
      End If
    Mycells = .Cells(MyRowCount + 2, MyColCount + 1)
    Mycells(MyRowCount + 2, MyColCount + 1).Value =                     SprDataList.Sheets(0).Cells(MyRowCount, MyColCount).Text.ToString
    System.Runtime.InteropServices.Marshal.ReleaseComObject(Mycells)
    Mycells = Nothing
    Next
  Next
End With
  
'エクセル切断
Call ExcelModule.FncCloseExcel(MyErrNum, MyErrDesc)

以下はFncCloseExcelの定義
 '------------------------------
 ' Excel解放
 '------------------------------
  If Not (SysWorkSheet Is Nothing) Then
      System.Runtime.InteropServices.Marshal.ReleaseComObject              (SysWorkSheet)
      SysWorkSheet = Nothing
  End If

  If Not (SysWorkBook Is Nothing) Then
     System.Runtime.InteropServices.Marshal.ReleaseComObject            (SysWorkBook)
     SysWorkBook = Nothing
  End If

  If Not (SysExcel Is Nothing) Then
      System.Runtime.InteropServices.Marshal.ReleaseComObject              (SysExcel)
      SysExcel = Nothing
  End If

  '------------------------------
  ' メモリ解放
  '------------------------------
  System.GC.Collect()

以上です。不明な箇所がありましたら、それも含めてご指摘お願い
いたします。


VBレスキュー(花ちゃん)  URL  2006-09-12 06:07:44  No: 133193

この辺から解放ができていないのでは。
変数に受けて解放するようにして下さい。
基本的に . が2個以上続く場合は一度変数に受ける必要があります、でないと解放できません。
Excel の起動と終了以外は一度コメントにしてキチンと解放されている事を
確認してから、確認しながら順次コメントを解除していけば、どの処理で解放されていないのかが解るはず。(頑張って調べて下さい)
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm

>With ExcelModule.SysWorkSheet
>For MyColCount = 0 To SprDataList.Sheets(0).Columns.Count - 1


もにもに  2006-09-13 08:03:35  No: 133194

VBレスキュー(花ちゃん) さん
失礼な書き込みをしてしまいすいませんでした。
現在、原因箇所を調べておりますので、その上で解決できない
問題がありましたら、再度書き込みをさせていただきます。


ヤマ@文系  2006-09-13 16:43:54  No: 133195

花ちゃんさまへ、、HPのリンク間違っているかと。。

もにもにさんへ
一度解放したと思っていても、
実際2回くらいやらないとメモリから解放されないようです。
Windows Developer Magazineの何回か前にかいてありました。
気になるようなら
sendmessage で  WM_CLOSEでもおくってみてください。(w


もにもに  2006-09-14 23:56:48  No: 133196

花ちゃんさま、ヤマ@文系さま
いろいろ試してみた結果解決することができました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加