指定したシート以外を削除

ラボ

指定したシート以外を削除

 VBAでプログラムを組んでいると、シートをコピーしてデータを貼り付けるような場面が出てきます。一度だけ実行するようなケースでは良いのですが、データを変えて何度も使い回したい時、前回実行した時にコピーしたシートが邪魔になることがあります。

 そのような時に、特定のシート以外のシートを削除する方法です。
 特定のシート名を配列に入れて管理したり、InStr関数を使ってシート名とキーワードを比較する方法を試してみました。

ワークシートの削除

 まずは単純にワークシートを削除する方法です。何番目のシートか?どんな名前のシートか?で特定して、あとはDeleteメソッドで削除できます。
 ただ、そのままですと「本当に削除しますか?」というアラートが出ますので、シートを何枚も削除する場合は回避したいところです。
 そこで、Application.DisplayAlerts で囲んでアラートを出ないようにします。

Sub worksheetDeleteTest()
    Application.DisplayAlerts = False ' メッセージを非表示
    
    'Worksheets(1).Delete        '何番目かで指定
    Worksheets("Sheet1").Delete  'シート名で指定
    
    Application.DisplayAlerts = True  ' メッセージを表示
End Sub

配列に定義した名前以外のシート名を削除

 あらかじめ残しておきたいシート名を配列に列挙しておき、それ以外のシート名であれば削除するようなプログラムです。

'配列に定義したシート名前以外のシートを削除
Sub noListName()

    Dim i As Long
    Dim arr, sh, shName
    
    arr = Array("Sheet1", "Sheet2", "data")
    
    Application.DisplayAlerts = False ' メッセージを非表示
    
    For Each sh In Worksheets
        For Each shName In arr
            If sh.Name = shName Then GoTo LABEL
        Next shName
        
        '// arrに名前が無ければここに来る
        'Debug.Print sh.Name
        sh.Delete
        
LABEL:
    Next sh
    
    Application.DisplayAlerts = True  ' メッセージを表示
    
End Sub

シート名にある文字列を含んでいる時は残す

 あらかじめ残したいシートに、あるキーワードを付けておいて区別するように設計しておけば、いちいち配列に列挙する手間も省けます。次のプログラムは、 ”Sheet” という文字がシート名に含まれている場合は残し、それ以外は削除するようなプログラムです。

 文字列が含まれているかどうかは、InStr関数を使って判断しています。

Sub inStrListName()

    Dim i As Long
    Dim sh
    Dim s As String
    
    s = "Sheet"
    
    Application.DisplayAlerts = False ' メッセージを非表示
    
    For Each sh In Worksheets
        If InStr(sh.Name, s) > 0 Then GoTo LABEL
        
        '// sの文字列がシート名前に含まれていなければここに来る
        'Debug.Print sh.Name
        sh.Delete
        
LABEL:
    Next sh
    
    Application.DisplayAlerts = True  ' メッセージを表示
    
End Sub

コメント

タイトルとURLをコピーしました