シートの有無をチェックする2つの方法

シート

シートの有無をチェックする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文で名前を照合し、合致すればフラグであれる bTrueとなります。
 ③の 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つ目の方が処理は早いと思いますが、実際には何百ものシートが無い限り、速度は殆ど変わらないと思います。
実質的にはどちらを使っても大差はないでしょう。
 ただ、プログラミングの手法として覚えておくと、他への応用に役立つかもしれません。

タイトルとURLをコピーしました