実務でExcelファイルを扱っていると、ワークシートの数が増えていきます。
そうなると、
「ワークシート名の一覧を作成したいのですが...」
といった要望が出てきます。
For~Nextループでシート名一覧を作成するサンプルマクロ
以下のようなマクロで、アクティブなブックの先頭に「シート名一覧」というワークシートが挿入され、A列にシート名の一覧が作成されます。
Dim i As Long
Sheets.Add Before:=Sheets(1)
ActiveSheet.Name = "シート名一覧"
For i = 2 To Sheets.Count
Cells(i - 1, "A").Value = Sheets(i).Name
Next i
アクティブなブックの先頭(左端)にシートを挿入して、
Sheets.Add Before:=Sheets(1)
名前を「シート名一覧」に変更してから、
ActiveSheet.Name = "シート名一覧"
元々の1枚目のシートから最後のシートの枚数分For~Nextループを回して、
For i = 2 To Sheets.Count
A列の1行目からシート名を書き出しています。
Cells(i - 1, "A").Value = Sheets(i).Name
For Each~Nextループでシート名一覧を作成するサンプルマクロ
上記のマクロと同じことをFor Each~Nextループを使って行うとすると、以下のとおりです。
Dim sh As Object ' Worksheetオブジェクト または Chartオブジェクト
Dim n As Long ' シート名を書き出す行番号
Sheets.Add Before:=Sheets(1)
ActiveSheet.Name = "シート名一覧"
n = 1
For Each sh in Sheets
Cells(n, "A").Value = sh.Name
n = n + 1
Next sh
先にご紹介したFor~Nextループを使ったマクロの場合、カウンター変数・iを使ってそのままシートへの書き出しができましたが、For Each~Nextループの場合は、書き出す行番号を指定するための変数を別に用意する必要があること、
Dim n As Long
また、その変数を、For Each~Nextループの中で、
n = n + 1
とインクリメントしなければならないなところが、For~NextループとFor Each~Nextループの違いが明確になっていない段階の方の場合、注意が必要な箇所でしょう。
アクティブなブックの中にワークシート(Worksheetオブジェクト)もグラフシート(Chartオブジェクト)も存在することを想定して、
Dim sh As Object
と総称オブジェクト型で、オブジェクト変数・shを宣言していますが、ワークシートしか存在していないのであれば、
Dim sh As Worksheet
と宣言してしまうほうがいいでしょう。
全シートや全ブックに対する処理を行うような場合、For Each~Nextループは便利なのですが、今回ご紹介したマクロのような形でワークシートに書き出しを行うような場合、For~Nextループのほうがシンプルなコードになることが少なくありません。
- Newer:前と同じヘッダー/フッターとは
- Older:ハイパーリンク表示後の色
Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » シート名を取得して一覧を作成するExcelマクロ