【VBA】たったの7行でシートの存在を確認|ループなしで簡単
Excel VBAではシートが存在するかどうか確認する場面が多くあると思います。今回は、シンプルに関数にすることで使い勝手の良いコードを紹介します。
エラー処理を利用する
今回のコードのポイントはエラー処理を利用することです。
シートの存在確認をする場合、一般的にはFor Eachを使ったループ処理で調べることが多いかと思いますが、それだと全てのシートを調べているため、シートが多いと時間がかかります。
ところが、エラー処理を利用することでダイレクトにそのシートが存在するかどうかを調べられます。そして、それを使い勝手のいいように関数にしたのが下のコードです。
Function シート存在確認(sheetName As String)
Dim ws As Worksheet
On Error Resume Next
Set ws = ThisWorkbook.Worksheets(sheetName)
On Error GoTo 0
シート存在確認 = Not ws Is Nothing
End Function
見やすいように改行を入れていますが、End Functionまで入れても実質7行ですっきりとしていますよね?このままコピペですぐに関数として使えますよ。
コードの説明
この関数の内容を確認しましょう。
まずは、4行目の
On Error Resume Next
でエラーでも処理を進めさせるようにしておくことで、5行目にある
Set ws = ThisWorkbook.Worksheets(sheetName)
でシートが存在すればセットされ、シートがない場合はwsが空のまま(エラーのまま)処理が進みます。
そして8行目の
シート存在確認 = Not ws Is Nothing
の戻り値がTrueになるかFalseになるかで判断するというものです。
この関数を標準モジュールなどに書いておけば、シートの存在確認をするたびにコードを書かないですみますので、すっきりします。
実際に使う場合は、次のような感じになります。
「シート存在確認」関数の使い方
「シート存在確認」のコードを標準モジュールに書いてあるとした場合、下のような使い方が出来ます。
Sub サンプル()
Dim shName As String
Dim flg As Boolean
shName = "ここに調べたいシート名を書く"
flg = シート存在確認(shName)
If flg = True Then
MsgBox name & "はあります"
Else
MsgBox name & "はありません"
End If
End Sub
flgはブール型変数として戻り値にTrueかFalseを受け取りますので、それぞれの場合で操作を変えられます。調べたいシート名を6行目の「ここに調べたいシート名を書く」の部分へ入れれば、そのシートがあるかどうかわかります。
存在する場合はTrue、存在しない場合はFalseなので、あとはIfで場合分けしており今回はMsgBoxを出すだけですが、この部分をうまく使って、存在すればsetする、しなければ追加するなどもできます。
シートの存在確認は、エラー処理のために必要なことが多いと思います。そんなときには、この関数の出番なので、ぜひとも使ってみて下さい。