エクセルで特定の名前のシートだけを削除したい場合があります。
これをマクロで実行できると、とても便利です。
そこで今回は、特定の名前のシートが存在するかを判定して、存在する場合はそのシートを削除するマクロを紹介します。
【マクロVBA】特定の名前のシートが存在するかを判定してそのシートを削除する
今回は「データ」という名前のシートが存在する場合、そのシートを削除するコードを書きました。
Sub DeleteDataSheet()
'「データ」という名前のシートが存在する場合、「データ」シートを削除する
Dim ws As Worksheet
Dim sheetFound As Boolean
sheetFound = False
'「データ」シートが存在するかどうかを調べる
For Each ws In Worksheets
If ws.Name = "データ" Then
sheetFound = True
Exit For
End If
Next ws
'「データ」シートが存在する場合、削除する
If sheetFound Then
Application.DisplayAlerts = False
ws.Delete
Application.DisplayAlerts = True
End If
End Sub
「データ」という名前のシートを調べる下準備
Dim ws As Worksheet
Dim sheetFound As Boolean
sheetFound = False
Dim ws As Worksheet
:ws
という名前のWorksheetオブジェクト型の変数を宣言します。この変数は、後のFor Eachループで各シートを参照するために使用されます。Dim sheetFound As Boolean
:sheetFound
という名前のBoolean型の変数を宣言します。この変数は、”データ”という名前のシートがワークブック内に存在するかどうかを示すフラグとして使用されます。初期値はFalse
で、”データ”シートが見つかった場合にTrue
に設定されます。sheetFound = False
:sheetFound
変数の初期値をFalse
に設定します。これにより、デフォルトで”データ”シートが存在しないものとして処理が進みます。”データ”シートが見つかった場合にのみ、この変数はTrue
に変更されます。
このコードは、”データ”という名前のシートがワークブック内に存在するかどうかを確認するための準備を行っています。
For Eachループで、各シートが”データ”シートであるかどうかを調べ、該当するシートが見つかった場合にsheetFound
変数をTrue
に設定します。
Boolean型の変数は、True
またはFalse
の2つの値を格納するために使用されます。
これらの値は、論理的な条件が満たされているかどうかを表すために使用されます。
例えば、特定のシートが存在するかどうか、ある値が他の値よりも大きいかどうかなど、条件に基づいて処理を切り替える際に、Boolean型の変数が役立ちます。
「データ」という名前のシートが存在するかどうかを調べる
For Each ws In Worksheets
If ws.Name = "データ" Then
sheetFound = True
Exit For
End If
Next ws
For Each ws In Worksheets
: これは、ワークブック内のすべてのワークシートに対して繰り返し処理を行うFor Eachループを開始します。ws
変数には、現在の反復で参照されているワークシートが割り当てられます。If ws.Name = "データ" Then
: この行は、現在のワークシート(ws
)の名前が”データ”であるかどうかをチェックする条件分岐を開始します。もしws.Name
が”データ”と等しい場合、次の行のコードが実行されます。sheetFound = True
: この行は、sheetFound
変数をTrue
に設定します。これにより、”データ”という名前のシートがワークブック内に存在することが示されます。Exit For
: この行は、Exit For
ステートメントを使用して、For Eachループを強制的に終了します。これにより、”データ”シートが見つかった時点で、それ以上のワークシートを調べることなくループを抜けることができます。End If
: この行は、If
ステートメントの終わりを示します。この行に到達した場合、次のワークシートに進みます(ループが終了していない場合)。Next ws
: この行は、For Eachループの終わりを示します。次のワークシートに進み、ループを続けます。すべてのワークシートが処理されると、この行の後のコードに進みます。
このコードブロックの目的は、ワークブック内に”データ”という名前のシートが存在するかどうかを調べ、その情報をsheetFound
変数に格納することです。
シートが見つかった場合、ループは早期終了し、以降のコードで適切な処理が行われます。
「データ」シートが存在する場合、削除する
If sheetFound Then
Application.DisplayAlerts = False
ws.Delete
Application.DisplayAlerts = True
End If
If sheetFound Then
: この行は、sheetFound
変数がTrue
であるかどうかをチェックする条件分岐を開始します。sheetFound
がTrue
である場合、つまり「データ」という名前のシートが存在する場合、次の行のコードが実行されます。Application.DisplayAlerts = False
: この行は、ExcelのアプリケーションオブジェクトのDisplayAlerts
プロパティをFalse
に設定します。これにより、ユーザーに表示される警告メッセージ(シートの削除時に表示される確認ダイアログなど)が一時的に無効化されます。ws.Delete
: この行は、「データ」という名前のシートを削除します。先のFor Eachループで見つかったシートはws
変数に格納されているため、ws.Delete
を呼び出すことでシートを削除できます。Application.DisplayAlerts = True
: この行は、ExcelのアプリケーションオブジェクトのDisplayAlerts
プロパティを元に戻し、True
に設定します。これにより、警告メッセージが再び表示されるようになります。End If
: この行は、If
ステートメントの終わりを示します。この行に到達した場合、条件分岐が終了し、以降のコードに進みます。
このコードブロックの目的は、「データ」という名前のシートが存在する場合にそれを削除することです。
sheetFound
変数がTrue
の場合にのみ削除処理が実行され、削除中に表示される警告メッセージは無効化されています。
ちなみにIf sheetFound Then
と If sheetFound = True Then
は、両方が同じ意味を持ちます。
sheetFound
は Boolean
型の変数であり、True
または False
の値しか持ちません。If
ステートメントは条件が True
である場合に実行されます。
If sheetFound Then
の形式を使用すると、コードが短くなり、読みやすくなります。
sheetFound
が True
の場合に実行することが自明であるため、= True
を省略しても問題ありません。実際、多くのプログラマーは、このような簡潔な表現を好みます。
ただし、If sheetFound = True Then
の形式を使用しても問題ありませんし、一部のプログラマーは、この形式の方が意図が明確であると感じるかもしれません。
どちらの形式を使用するかは、主に個人の好みやコーディングスタイルによります。
コメント