ある特定の文字列(format)を含むシートを削除したいのですが、
下記処理では、シートは削除できますが
オブジェクトの解放がしきれず、エクセルのプロセスが残ってしまいます。。
For Each xldelSheet In xlSheets
If xldelSheet.Name Like "format*" Then
xldelSheet.Delete()
End If
Next
以下の様に削除対象のシートをxldelSheetに設定してから削除すべきなのかと思いますが
xlSheets("format*")をどのように設定してよいかわかりかねております。
xldelSheet = DirectCast(xlSheets("format*"), Excel.Worksheet)
まず、認識に問題があれば、ご指摘お願いいたします。
また、方法についてご提案が御座いましたらご回答の程よろしくお願いいたします。
For Each の代わりに For ループへと変更し、
かつ、ループ中で取得した個々のシートオブジェクトを
Marshal.ReleaseComObject してみては如何でしょう。
魔界の仮面弁士さま
いつもご提案有難う御座います。
以下の様にForループでまわし、
該当のシートがあれば、削除し、その都度対象シートを解放してますが
シートを削除すれば、シート数が変わってしまい、ループ途中でエラーになります。(当たり前なのですが。。)
何かよい方法は、ないものでしょうか。。
For shcnt = 1 To xlSheets.Count
xldelSheet = DirectCast(xlSheets(shcnt), Excel.Worksheet)
If xldelSheet.Name Like "format*" Then
xldelSheet.Delete()
If xldelSheet IsNot Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(xldelSheet)
xldelSheet = Nothing
End If
End If
Next
http://msdn.microsoft.com/ja-jp/library/5z06z1kb
removeAt しているとことか。
削除処理の場合は、ループカウンタを後ろから前に
Step -1 するのが常套手段ですね。
For c As Integer = xlSheets.Count To 1 Step -1