シートの有無をチェックする2つの方法
あるシート名の存在チェックに関してはVBA標準の関数は用意されていませんので、自作する必要があります。
と言ってもそれほど難しくありません。 今回は2つの方法を紹介します。
ブック内のシートを全て調べる
ブック内のシートを調べて合致するかどうかでシートの有無を調べる方法です。
Functionプロシージャにして部品化してみました。
使い方は、testcode() にあるように調べたいシート名を引数に渡します。
該当するシートがあれば True を、無ければ False が返ります。
Function IsExistsSheet(sheetName) As Boolean
Dim b As Boolean
b = False
Dim sh
For Each sh In Worksheets '①
If sh.Name = sheetName Then '②
b = True
Exit For '③
End If
Next sh
IsExistsSheet = b
End Function
Sub testcode()
If IsExistsSheet("Sheet1") Then
MsgBox "あります"
Else
MsgBox "ありません"
End If
End Sub
①でブック内のワークシートを巡回し、各々、sh変数に入ります。
②If文で名前を照合し、合致すればフラグであれる b がTrueとなります。
③の Exit For で処理を抜けます。無くてもエラーにはなりませんが、見つかった段階で抜けた方が処理が早く終わります。
シートを代入できるか調べる
次はシート名があるものとして変数に代入し、シートが無ければオブジェクト変数が Nothing になるのを利用した方法です。
通常はエラーが発生しますが、エラーを出さない設定にして処理します。
Function IsExistsSheet2(sheetName) As Boolean
Dim b As Boolean
b = False
Dim sh
On Error Resume Next '①
Set sh = Worksheets(sheetName) '②
On Error GoTo 0 '③
If Not sh Is Nothing Then '④
b = True
End If
IsExistsSheet2 = b
End Function
Sub testcode2()
If IsExistsSheet2("Sheet1") Then
MsgBox "あります"
Else
MsgBox "ありません"
End If
End Sub
①でエラーメッセージが出ないようにしています。
②引数のシート名で変数への代入を試みます。
③エラーメッセージを表示させる設定を元に戻します。
④ If sh Is Nothing Then ですと存在しない時となりますので、If Not として否定にしています。
まとめ
1つ目は、全てのシートを巡回するという方法はわかりやすい方法だと思います。
2つ目の方法では、シート名で変数に代入できるか調べてエラーが出ないか確認する方法です。
2つ目の方が処理は早いと思いますが、実際には何百ものシートが無い限り、速度は殆ど変わらないと思います。
実質的にはどちらを使っても大差はないでしょう。
ただ、プログラミングの手法として覚えておくと、他への応用に役立つかもしれません。