シートがあるか調べる方法

中級VBA

はじめに

 新たにシートを追加したい時、もし同じ名前のシートがある場合エラーとなってしまいます。このような時は予め同じシート名がないか確認する必要がありますが、ここでは2つの方法を紹介します。

 一つは今あるシートを巡回して既に同じシートがあるかを調べる方法。もう一つはワークシート変数にそのシート名を代入してエラーとなるかを見て見つける方法です。

シートを巡回して調べる方法

 For Each In でワークシートを巡回し名前を検索して既にあるかを調べます。

Sub searchSheet1()
    Dim shName As String
    shName = "Sheet1"
    
    Dim sh
    For Each sh In Worksheets
        If sh.Name = shName Then
            MsgBox shName & "は既にあります。"
            Exit Sub
        End If
    Next sh
    MsgBox shName & "はありません。"
End Sub

ワークシート変数してエラーになるかで調べる方法

 ワークシート変数に代入してみてエラーとなれば、そのシート名がは使われていない事になります。

Sub searchSheet2()
    Dim shName As String
    shName = "Sheet1"
    
    Dim sh As Worksheet
    
    On Error Resume Next
    Set sh = Worksheets(shName)
    On Error GoTo 0
    
    If sh Is Nothing Then
        MsgBox shName & "はありません。"
    Else
        MsgBox shName & "は既にあります。"
    End If
End Sub

シート名一覧のシートがあるか調査する

 シート名の一覧があり、一覧のシートが揃っているか調べるようなプログラムを想定します。

Sub addNewSheet()
    Dim i As Long
    Dim sh As Worksheet
    Dim sName As String
    
    For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
        
        Set sh = Nothing    'ここで初期化が必要です。
    
        On Error Resume Next
        sName = Cells(i, "A")
        Set sh = Worksheets(sName)
        On Error GoTo 0
        
        If sh Is Nothing Then
            Debug.Print sName & "シートはありません。"
        Else
            Debug.Print sName & "シートは既にあります。"
        End If
    
    Next i
End Sub

 上記のプログラムはアクティブシートのA列にシート名一覧があり、その通りシートが揃っているかを調査するプログラムです。
 On Error Resume Next ~ On Error GoTo 0 を使う場合は、巡回の際、シートオブジェクト変数を初期化するのを忘れないようにましょう。Set sh = Nothing がないとそれまでの値が居残るため上手く動作しません。

まとめ

 1つ目の方法はワークシート名を全て巡回して探す方法。2つ目はワークシート変数(オブジェクト変数)に値を代入してみてエラーになるか否かを調査する方法です。

 1つ目は、もしワークシートがたくさんあるのであれば、巡回して探す方法は時間がかかりそうですが、数百のワークシートがあるようなケースはまず無いと思われますので、不自由するほど遅くはならないかと思います。

 2つ目の方法では、ワークシート変数に代入していますので、Setを忘れないように気を付けましょう。尚、巡回して連続で調査する場合は、3つ目の方法のようにオブジェクト変数の初期化を必要になりますので注意してください。

 参考にしていただければ幸いです。


コメント

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