【VBA】たったの7行でシートの存在を確認|ループなしで簡単

2019年9月7日Excel, PC

Excel VBA

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する、しなければ追加するなどもできます。

シートの存在確認は、エラー処理のために必要なことが多いと思います。そんなときには、この関数の出番なので、ぜひとも使ってみて下さい。

Excel, PC

Posted by 管理人