|
2008/08/05(Tue) 16:04:51 編集(投稿者)
# 既に回答が付いていますが、補足の意味を込めて。
■No22887 (ぐっちょん さん) に返信 > xlSheet.Cells.NumberFormatLocal = "@" '全体を文字列に ここで、Range オブジェクトの解放処理が漏れています。
Dim xlRange As Excel.Range = xlSheet.Cells xlRange.NumberFormatLocal = "@" MRComObject(xlRange)
> xlSheet.Range("A1").Resize(1, 10).Value = dataArray '範囲指定貼付(これをループで行ってます) ここで、Range オブジェクトがさらに 2 つ解放漏れ。
xlRange = xlSheet.Range("A1") Dim xlResizedRange As Excel.Range = xlRange.Resize(1, 10) xlResizedRange.Value = dataArray MRComObject(xlResizedRange) MRComObject(xlRange)
> '================== 終了処理 ===================== 処理中にエラーが発生した場合に備えるために、これらは本来、 Finally ブロックなどに配置されるべきとされています。
> オブジェクトの解放 > Private Sub MRComObject(Of T As Class)(ByRef objCom As T) End Try がありませんが、実際にはどのような実装になっているのでしょうか?
> If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then > System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) > End If 多くのケースでは、FinalReleaseComObject を使う必要は無く、 ReleaseComObject をそれぞれ 1 回ずつ呼ぶだけで十分かと思います。
ReleaseComObject ではなく、FinalReleaseComObject を使った実装にしてしまうと、 下記のような場合に、★の行を実行できなくなってしまいますので、その点は注意してください。
Sub Main() : xlSheet1 = xlSheets(1) xlSheet1.Name = "Template" Call Copy(xlSheets) xlSheet1.Select() '★ Sub Copy 内で強制解放させてしまうと、この行の実行が失敗する : End Sub
Sub Copy(ByVal xlSheets As Excel.Sheets) : Dim xlSheet As Excel.Worksheet = DirectCast(xlSheets.Item(n), Excel.Worksheet) : MRComObject(xlSheet) : End Sub
|