マクロを使っていて、
![](https://masashi-blog418.com/wp-content/uploads/2022/09/b0261.png)
あのシート名のシートがあったら処理させたい・・・
となることはないでしょうか?
今回はブック内に特定のシートがあるかどうかを判定する方法を紹介したいと思います。
ブック内のシートを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](https://masashi-blog418.com/wp-content/uploads/2023/04/image-11.png)
このように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](https://masashi-blog418.com/wp-content/uploads/2023/04/image-8.png)
![ブック内のシートをFor文を使ってチェックする方法_コード_2](https://masashi-blog418.com/wp-content/uploads/2023/04/image-10.png)
シートがある場合
![ブック内のシートをFor文を使ってチェックする方法_コード_3](https://masashi-blog418.com/wp-content/uploads/2023/04/image-9.png)
コードの説明
次にコードについてざっくり説明します。
初めに処理に必要な変数を定義しておきます。今回は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を指定した場合は、そのブックのシートの枚数分繰り返しが行われます。
![ブック内のシートをFor文を使ってチェックする方法_コードの説明_1](https://masashi-blog418.com/wp-content/uploads/2023/04/image-12.png)
例えば上記のようにシートが3枚あるブックであれば、3回繰り返される感じです。実際にウォッチ式を追加してThisWorkbook.Worksheets.Countを見てみると分かると思います。
![ブック内のシートをFor文を使ってチェックする方法_コードの説明_2](https://masashi-blog418.com/wp-content/uploads/2023/04/image-13.png)
一応注意点として、非表示にしたシートも処理対象に含まれるのでそこは注意しておきましょう。
![ブック内のシートをFor文を使ってチェックする方法_コードの説明_3](https://masashi-blog418.com/wp-content/uploads/2023/04/image-14.png)
また、処理されるシートの順番は左→右になります。
![ブック内のシートをFor文を使ってチェックする方法_コードの説明_4](https://masashi-blog418.com/wp-content/uploads/2023/04/image-15.png)
画像の例で言うと、以下の順で処理されます。
- 「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に関する記事を不定期で投稿していますので、是非ご覧ください!
コメント