伊田生活ブログのロゴ
HOME  >  勉強
カテゴリー : 勉強 - プログラミング
•VBA •Excel •マクロ •サンプルコード •シートを削除する •作業効率化


公開日:
最終更新日:

不要なシートを一括削除するVBAサンプルコード【Excel】


2023年12月

Excelを使って資料を作るとき、データ集計のために一時的に作成したが そのあとには一切使うことがないシート(不要なシート)が、しばしば作り出されます。そういうシートは、そのままにしておくとシートの数がどんどん増えていって、本当に必要なデータを圧迫してしまいます。したがって、不要なシートをこまめに削除することが、資料作成の作業効率向上において、有用です。

そこで、この記事では下図のような複数のシートを考えます。

image 1

[ 画像1. 5つのシート ]

 

ここにはシートが5つあります。シートの名前は以下のとおりです。

  • Sheet1
  • Sheet2
  • データ1
  • データ2
  • データ3

ここでは、「データ1」、「データ2」、「データ3」というシートを、不要なシートであるとします。したがって、やりたい事は、不要なシートである「データ1」~「データ3」だけを削除することです。

以下は、サンプルコードです。

Public Sub deleteDataSheets()

    Dim sheetNames() As String
    indexNum = -1 '配列の添え字
    '全てのシート名を配列に格納する。
    For i = 1 To ThisWorkbook.Sheets.Count
        indexNum = indexNum + 1
        ReDim Preserve sheetNames(indexNum)
        sheetNames(indexNum) = ThisWorkbook.Sheets(i).Name
    Next i

    '全てのシート名に対して処理を実行する。
    For i = 0 To UBound(sheetNames)
        sName = CStr(sheetNames(i))
        If (sName <> "Sheet1") And (sName <> "Sheet2") Then
            Application.DisplayAlerts = False '確認ダイアログ無効。
            ThisWorkbook.Sheets(sName).Delete
            Application.DisplayAlerts = True  '確認ダイアログ有効。
        End If
    Next i
End Sub

このコードを実行すると、「データ1」~「データ3」が削除されます。「Sheet1」と「Sheet2」は削除されず、残ります。

image 2

[ 画像2. コードを実行した結果 ]

 

今回の感想:
VBAで、不要なシートを削除するためのコードを書きました。
シート削除のような単純な作業は、人の手で行うことも可能です。また、シートが少ないときは人の手でおこなったほうが、コードで実行するよりも むしろ効率がいいと思われます。しかし、シートが多くなってきたとき、このような単純作業をVBAやマクロで自動化しておくと、便利です。すなわち、VBAで単純作業のプロシージャ(関数)を書けるようにしておくことは、仕事に役立つことだと思います。

追記:

上記のサンプルコードは、以下の記述によって、シート名を比較し、そのシートが必要なシートかどうか判定しています。

If (sName <> "Sheet1") And (sName <> "Sheet2") Then

この「必要なシートかどうか判定する」という処理を、関数にすることを考えます。以下に、関数を追加した、改良版サンプルコードを示します。

[関数を追加したコード]
Public Sub deleteDataSheets()

    Dim sheetNames() As String
    indexNum = -1 '配列の添え字
    '全てのシート名を配列に格納する。
    For i = 1 To ThisWorkbook.Sheets.Count
        indexNum = indexNum + 1
        ReDim Preserve sheetNames(indexNum)
        sheetNames(indexNum) = ThisWorkbook.Sheets(i).Name
    Next i

    '全てのシート名に対して処理を実行する。
    For i = 0 To UBound(sheetNames)
        sName = CStr(sheetNames(i))
        If isNecessarySheet(sName) = False Then
            Application.DisplayAlerts = False '確認ダイアログ無効。
            ThisWorkbook.Sheets(sName).Delete
            Application.DisplayAlerts = True  '確認ダイアログ有効。
        End If
    Next i
End Sub


Private Function isNecessarySheet(sName) As Boolean
    necessarySheet = Array("Sheet1", "Sheet2")
    
    result = False
    
    For i = 0 To UBound(necessarySheet)
        If sName = necessarySheet(i) Then
         result = True
         Exit For
        End If
    Next i
    
    isNecessarySheet = result
End Function

関数 isNecessarySheet() は、シート名を引数として受け取り、そのシート名が「必要なシート」に該当すれば True を、そうでなければ False を返す関数です。

#関数を追加したコードは、関数が追加されたぶん、コードが長くなってしまっています。それでも、今後「必要なシート」が増えたり減ったりすることを想定すれば、「必要なシートかどうか判定する」という処理は、関数にしたほうがよいと思われます。関数にすれば、「必要なシート」の定義を変えたいとき、呼び出し元の If isNecessarySheet(sName) = False Then という記述は変更しないで、関数の中に定義した「必要なシートのリスト」だけを変更すればよいので、コードの見通しが良くなります。