マクロを使っていて、

あのシート名のシートがあったら処理させたい・・・
となることはないでしょうか?
今回はブック内に特定のシートがあるかどうかを判定する方法を紹介したいと思います。
ブック内のシートをFor文を使ってチェックする方法
ブック内に特定のシートがあるかどうかをチェックするには、For Each文を使用します。
普通のFor文と何が違うかというと、オブジェクトの要素の数だけ繰り返すことが出来る点です。
例えば要素が3つである配列があったとして、それFor Each文で指定すれば、3回繰り返し処理を実行しつつ配列の値も取得することが出来る、みたいな感じになります。
Sub test_ForEach()
    Dim ary(1 To 3)             As Variant
    Dim buf_str                 As Variant
    Dim msg_str                 As String
    
    ary(1) = "はりぼな たろう"
    ary(2) = "はりぼな じろう"
    ary(3) = "はりぼな さぶろう"
'aryの要素数分(3回)繰り返し、その都度buf_strに値を格納する。    
    For Each buf_str In ary
        msg_str = msg_str & buf_str & vbCrLf
    Next
    
    MsgBox msg_str
    
End Sub
このようにFor Each文を使用することで、ブック内の全てのシートを取得することが出来ます。
コード
それではFor Eachを使ったコードの紹介です。
例として、ブック内に「2023年」というシート名のシートがなければ「2023年」シートを追加し、ある場合は何もしない、というマクロを紹介します。
Sub haribona_CheckAllSheets()
    
    Dim MySht                   As Worksheet
    Dim MySht_2023              As Worksheet
    Dim blnIs2023               As Boolean
    
    blnIs2023 = False
    
    With ThisWorkbook
        For Each MySht In .Worksheets
            If MySht.Name = "2023年" Then
                blnIs2023 = True
            End If
        Next MySht
        
        If blnIs2023 = False Then
            Set MySht_2023 = .Worksheets.Add(after:=.Worksheets(.Worksheets.Count))
            MySht_2023.Name = "2023年"
            MsgBox "「2023年」シートを追加しました。"
        Else
            MsgBox "「2023年」シートは作成済です。"
        End If
    End With
    
    Set MySht = Nothing
    Set MySht_2023 = Nothing
    
End Sub実行すると最初に説明したとおり、「2023年」シートがない場合シートを作成し、ある場合はその旨のメッセージを表示します。
シートがない場合


シートがある場合

コードの説明
次にコードについてざっくり説明します。
初めに処理に必要な変数を定義しておきます。今回はMySht,MySht_2023,blnIs2023という変数名で定義します。
'各変数を定義
Dim MySht                   As Worksheet
Dim MySht_2023              As Worksheet
Dim blnIs2023               As Booleanなお、各変数の用途は以下の通りです。
| 変数名 | 用途 | 
|---|---|
| MySht | ブックから取り出したシートを一時的に格納する | 
| MySht_2023 | 2023年シートを格納する | 
| blnIs2023 | 2023年シートの存在チェック あればTrue,なければFalse | 
次にブック内の全てのシートをFor Eachを使って取得&判定します。
'ブック内の全てのシートをFor Eachを使って取得&判定
For Each MySht In .Worksheets
    If MySht.Name = "2023年" Then
        blnIs2023 = True
    End If
Next MySht冒頭では例として配列を指定しましたが、ブックのシート(Worksheets)も指定出来ます。Worksheetsを指定した場合は、そのブックのシートの枚数分繰り返しが行われます。

例えば上記のようにシートが3枚あるブックであれば、3回繰り返される感じです。実際にウォッチ式を追加してThisWorkbook.Worksheets.Countを見てみると分かると思います。

一応注意点として、非表示にしたシートも処理対象に含まれるのでそこは注意しておきましょう。

また、処理されるシートの順番は左→右になります。

画像の例で言うと、以下の順で処理されます。
- 「2020年」シートを取得&判定
- 「2021年」シートを取得&判定
- 「2022年」シートを取得&判定
For Each文で処理を繰り返し行い、ブック内に「2023年」シートがあればblnIs2023をTrueに変更します。
If MySht.Name = "2023年" Then
    blnIs2023 = True
End If最後にblnIs2023の値を判定し、Falseであれば一番後ろに「2023年」シートを追加し、追加した旨のメッセージを表示します。
If blnIs2023 = False Then
    Set MySht_2023 = .Worksheets.Add(after:=.Worksheets(.Worksheets.Count))
    MySht_2023.Name = "2023年"
    MsgBox "「2023年」シートを追加しました。"
Else
    MsgBox "「2023年」シートは作成済です。"
End Ifまとめ
今回はブック内に特定のシートがあるかどうかを判定する方法を紹介しました。
ブック内のシートを検索するにはFor Each文とIF文を組み合わせて指定のシートを判定させるのが手っ取り早いと思いますので、是非活用していただければと思います!
このブログではVBAに関する記事を不定期で投稿していますので、是非ご覧ください!

 
  
  
  
  


コメント