Excel VBAにおけるシートの存在により動的にシート作成・削除をする方法を説明しています。
また、VBAでシートを削除しようとすると、確認ダイアログが表示される場合がありますが、これを表示しない方法も紹介します。
シートを動的に作成
全シート分ループして、一致するシート名があるか探していきます。
シートが見つかったらフラグを更新してループを抜けます。
フラグの値は
- シートが存在しなければFalse
- シートが存在すればTrue
となります。
シートを作成する条件はフラグがFalseのときなので、シートが見つからない場合のみ新しくシートを作成することになります。
Dim isExist 'シートが存在する:True、存在しない:False isExist = False 'シートの存在確認 For i = 1 To WorkSheets.Count If WorkSheets(i).name = "シート名" Then isExist = True Exit For End If Next i 'シートが存在しなければシートの作成 If isExist = False Then Worksheets.Add ActiveSheet.Name = "シート名" End If
シートを動的に削除
全シート分ループして、一致するシート名があるか探していきます。
シートが見つかったらシートを削除してループを抜けます。
シートを削除するときに確認ダイアログが出る場合があります。
ダイアログを選択するまでマクロが止まってしまうため、ダイアログを出さないように設定しましょう。
Application.DisplayAlertsの値によってダイアログの表示を制御できます。
- True:ダイアログを表示する
- False:ダイアログを表示しない
シート削除前にFalseに設定して、シート削除後にTrueに設定し直しましょう。
'ダイアログを表示しないようにする Application.DisplayAlerts = False 'シートが存在したら削除 For i = 1 To WorkSheets.Count If WorkSheets(i).name = "シート名" Then WorkSheets("シート名").Delete Exit For End If Next i 'ダイアログを表示するようにする Application.DisplayAlerts = True
確認ダイアログを表示しないようにするには?
1つ前で説明した「Application」は現在開いているExcelアプリケーションのことを指しています。
以下のように「New Excel.Application」で開いているワークブック内のシートを削除する場合、新しく開いたオブジェクト(obj)を指定しなければいけません。
「Application」が「obj」に置き換わっています。
Dim obj As New Excel.Application Dim workbook As Workbook Set workbook = obj.Workbooks.Open(Filename:="C:\book.xlsx", ReadOnly:=False, IgnoreReadOnlyRecommended:=True) 'ダイアログを表示しないようにする obj.DisplayAlerts = False 'シートが存在したら削除 For i = 1 To workbook.WorkSheets.Count If workbook.WorkSheets(i).name = "シート名" Then workbook.WorkSheets("シート名").Delete Exit For End If Next i 'ダイアログを表示するようにする obj.DisplayAlerts = True 'ワークブックを保存して閉じる workbook.Save workbook.Close
まとめ
シートの存在確認を応用することで動的にシート作成・削除が可能となります。
シートの削除を行う場合、確認ダイアログを表示しないように設定することでマクロのみで完結するようにできます。
注意点として、別ワークブックの場合はオブジェクトの指定方法を変える必要があります。