特定の文字列を含むシートの削除


himizu  2012-04-24 06:26:18  No: 147569

ある特定の文字列(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)

まず、認識に問題があれば、ご指摘お願いいたします。
また、方法についてご提案が御座いましたらご回答の程よろしくお願いいたします。


魔界の仮面弁士  2012-04-25 00:06:44  No: 147570

For Each の代わりに For ループへと変更し、
かつ、ループ中で取得した個々のシートオブジェクトを
Marshal.ReleaseComObject してみては如何でしょう。


himizu  2012-04-25 04:12:55  No: 147571

魔界の仮面弁士さま

いつもご提案有難う御座います。

以下の様に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


GOD  2012-04-25 13:29:45  No: 147572

http://msdn.microsoft.com/ja-jp/library/5z06z1kb
removeAt しているとことか。


魔界の仮面弁士  2012-04-25 19:06:30  No: 147573

削除処理の場合は、ループカウンタを後ろから前に
Step -1 するのが常套手段ですね。

For c As Integer = xlSheets.Count To 1 Step -1


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

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






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