【Excel VBA】ブック内に特定のシートがあるか判定する方法【For Each】

Excel
スポンサーリンク

マクロを使っていて、

あのシート名のシートがあったら処理させたい・・・

となることはないでしょうか?

今回はブック内に特定のシートがあるかどうかを判定する方法を紹介したいと思います。

スポンサーリンク

ブック内のシートを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文を使ってチェックする方法_1
配列の中身を取得することが出来る

このように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年」シートがない場合シートを作成し、ある場合はその旨のメッセージを表示します。

シートがない場合

ブック内のシートをFor文を使ってチェックする方法_コード_1
ブック内のシートをFor文を使ってチェックする方法_コード_2

シートがある場合

ブック内のシートをFor文を使ってチェックする方法_コード_3

コードの説明

次にコードについてざっくり説明します。

初めに処理に必要な変数を定義しておきます。今回はMySht,MySht_2023,blnIs2023という変数名で定義します。

'各変数を定義
Dim MySht                   As Worksheet
Dim MySht_2023              As Worksheet
Dim blnIs2023               As Boolean

なお、各変数の用途は以下の通りです。

変数名用途
MyShtブックから取り出したシートを一時的に格納する
MySht_20232023年シートを格納する
blnIs20232023年シートの存在チェック
あればTrue,なければFalse

次にブック内の全てのシートをFor Eachを使って取得&判定します。

'ブック内の全てのシートをFor Eachを使って取得&判定
For Each MySht In .Worksheets
    If MySht.Name = "2023年" Then
        blnIs2023 = True
    End If
Next MySht

冒頭では例として配列を指定しましたが、ブックのシート(Worksheets)も指定出来ます。Worksheetsを指定した場合は、そのブックのシートの枚数分繰り返しが行われます。

ブック内のシートをFor文を使ってチェックする方法_コードの説明_1

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

ブック内のシートをFor文を使ってチェックする方法_コードの説明_2

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

ブック内のシートをFor文を使ってチェックする方法_コードの説明_3

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

ブック内のシートをFor文を使ってチェックする方法_コードの説明_4

画像の例で言うと、以下の順で処理されます。

  1. 2020年」シートを取得&判定
  2. 2021年」シートを取得&判定
  3. 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に関する記事を不定期で投稿していますので、是非ご覧ください!

コメント

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