不要なシートを一括削除するVBAサンプルコード【Excel】
Excelを使って資料を作るとき、データ集計のために一時的に作成したが そのあとには一切使うことがないシート(不要なシート)が、しばしば作り出されます。そういうシートは、そのままにしておくとシートの数がどんどん増えていって、本当に必要なデータを圧迫してしまいます。したがって、不要なシートをこまめに削除することが、資料作成の作業効率向上において、有用です。
そこで、この記事では下図のような複数のシートを考えます。
ここにはシートが5つあります。シートの名前は以下のとおりです。
- Sheet1
- Sheet2
- データ1
- データ2
- データ3
ここでは、「データ1」、「データ2」、「データ3」というシートを、不要なシートであるとします。したがって、やりたい事は、不要なシートである「データ1」~「データ3」だけを削除することです。
以下は、サンプルコードです。
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」は削除されず、残ります。
今回の感想:
VBAで、不要なシートを削除するためのコードを書きました。
シート削除のような単純な作業は、人の手で行うことも可能です。また、シートが少ないときは人の手でおこなったほうが、コードで実行するよりも むしろ効率がいいと思われます。しかし、シートが多くなってきたとき、このような単純作業をVBAやマクロで自動化しておくと、便利です。すなわち、VBAで単純作業のプロシージャ(関数)を書けるようにしておくことは、仕事に役立つことだと思います。
追記:
上記のサンプルコードは、以下の記述によって、シート名を比較し、そのシートが必要なシートかどうか判定しています。
If (sName <> "Sheet1") And (sName <> "Sheet2") Then
この「必要なシートかどうか判定する」という処理を、関数にすることを考えます。以下に、関数を追加した、改良版サンプルコードを示します。
[関数を追加したコード]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
という記述は変更しないで、関数の中に定義した「必要なシートのリスト」だけを変更すればよいので、コードの見通しが良くなります。
ad: