シート一覧を取得
「すべてのシート名を集める」「可視だけに絞る」「配列やCollectionで受け取る」「一覧シートに書き出す」など、初心者でも迷わず使える定番パターンをコードとテンプレートでまとめます。
基本:すべてのシート名をメッセージで確認
Sub ShowAllSheetNames()
Dim s As Object, msg As String
For Each s In ThisWorkbook.Sheets
msg = msg & s.Name & vbCrLf
Next
MsgBox msg, vbInformation, "シート一覧"
End Sub
VB- ポイント:
- Sheetsで包括: グラフシートを含めて一覧化。ワークシート限定なら
Worksheetsに置き換え。 - 最短確認: まずは「取れているか」を手早く確認。
- Sheetsで包括: グラフシートを含めて一覧化。ワークシート限定なら
受け取り方のテンプレート:Collection/配列に格納
Collectionに格納(柔軟で扱いやすい)
Function GetSheetNames(Optional wb As Workbook, Optional onlyVisible As Boolean = False) As Collection
Dim result As New Collection, i As Long
If wb Is Nothing Then Set wb = ThisWorkbook
For i = 1 To wb.Sheets.Count
If (Not onlyVisible) Or (wb.Sheets(i).Visible = xlSheetVisible) Then
result.Add wb.Sheets(i).Name
End If
Next
Set GetSheetNames = result
End Function
Sub Example_UseCollection()
Dim names As Collection, i As Long
Set names = GetSheetNames(, True) '可視のみ
For i = 1 To names.Count
Debug.Print names(i)
Next
End Sub
VB- ポイント:
- onlyVisibleで切替: 非表示を除外したいときに便利。
- Collection: 追加・走査が簡単で初心者向き。
配列に格納(インデックスアクセスが必要なとき)
Function GetSheetNamesArray(Optional wb As Workbook, Optional onlyVisible As Boolean = False) As Variant
Dim tmp As Collection, arr() As String, i As Long
Set tmp = GetSheetNames(wb, onlyVisible)
ReDim arr(1 To tmp.Count)
For i = 1 To tmp.Count
arr(i) = tmp(i)
Next
GetSheetNamesArray = arr
End Function
Sub Example_UseArray()
Dim arr As Variant, i As Long
arr = GetSheetNamesArray(, False)
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next
End Sub
VB- ポイント:
- 配列化: ワークシート関数や他APIと組み合わせる場面に向く。
一覧シートへ書き出す(よく使う定番)
Sub OutputSheetList(Optional targetName As String = "Sheet List")
Dim out As Worksheet, s As Object, r As Long
Set out = GetOrCreateSheet(targetName) '下のテンプレートを使用
out.Cells.Clear
out.Range("A1").Value = "シート名"
out.Range("B1").Value = "種類"
out.Range("C1").Value = "表示状態"
r = 2
For Each s In ThisWorkbook.Sheets
out.Cells(r, 1).Value = s.Name
out.Cells(r, 2).Value = IIf(TypeOf s Is Worksheet, "Worksheet", "Chart/Other")
out.Cells(r, 3).Value = IIf(s.Visible = xlSheetVisible, "Visible", IIf(s.Visible = xlSheetHidden, "Hidden", "VeryHidden"))
r = r + 1
Next
out.Columns("A:C").AutoFit
MsgBox "一覧を '" & targetName & "' に出力しました。"
End Sub
Function GetOrCreateSheet(sheetName As String, Optional wb As Workbook) As Worksheet
Dim ws As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
Set ws = wb.Worksheets(sheetName)
On Error GoTo 0
If ws Is Nothing Then
Set ws = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
ws.Name = SanitizeSheetName(sheetName, wb)
End If
Set GetOrCreateSheet = ws
End Function
Function SanitizeSheetName(rawName As String, wb As Workbook) As String
Dim s As String: s = Trim$(rawName)
s = Replace(s, ":", "_"): s = Replace(s, "/", "_")
s = Replace(s, "\", "_"): s = Replace(s, "?", "_")
s = Replace(s, "*", "_"): s = Replace(s, "[", "_")
s = Replace(s, "]", "_")
If Len(s) = 0 Then s = "Sheet"
If Len(s) > 31 Then s = Left$(s, 31)
'重複回避
Dim base As String: base = s, i As Long: i = 1
Do While SheetExists(s, wb)
i = i + 1
s = IIf(Len(base) > 28, Left$(base, 28), base) & "_" & CStr(i)
Loop
SanitizeSheetName = s
End Function
Function SheetExists(sheetName As String, Optional wb As Workbook) As Boolean
Dim t As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
Set t = wb.Worksheets(sheetName)
SheetExists = Not t Is Nothing
On Error GoTo 0
End Function
VB- ポイント:
- 種類と表示状態も記録: 実務で役立つ付加情報を一緒に出すと便利。
- 初期化と自動整形: 列幅自動調整で見やすく。
フィルタ付き取得:可視のみ・部分一致・除外指定
可視のみのシート名リスト
Function GetVisibleWorksheetNames(Optional wb As Workbook) As Collection
Dim result As New Collection, ws As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
For Each ws In wb.Worksheets
If ws.Visible = xlSheetVisible Then result.Add ws.Name
Next
Set GetVisibleWorksheetNames = result
End Function
VB部分一致で抽出(例:「売上」を含む)
Function GetSheetNamesByPartial(partial As String, Optional wb As Workbook) As Collection
Dim result As New Collection, s As Object
If wb Is Nothing Then Set wb = ThisWorkbook
For Each s In wb.Sheets
If InStr(1, s.Name, partial, vbTextCompare) > 0 Then
result.Add s.Name
End If
Next
Set GetSheetNamesByPartial = result
End Function
VB除外名を指定して取得
Function GetSheetNamesExcept(exceptNames As Variant, Optional wb As Workbook) As Collection
Dim keepOut As Object, s As Object
Dim result As New Collection, i As Long
If wb Is Nothing Then Set wb = ThisWorkbook
Set keepOut = CreateObject("Scripting.Dictionary")
For i = LBound(exceptNames) To UBound(exceptNames)
keepOut(CStr(exceptNames(i))) = True
Next
For Each s In wb.Sheets
If Not keepOut.Exists(s.Name) Then result.Add s.Name
Next
Set GetSheetNamesExcept = result
End Function
VB- ポイント:
- 実務向けフィルタ: 可視限定・部分一致・除外指定の3パターンがあれば大抵の要件に対応可能。
他ブックのシート一覧を取得する
Sub OutputOtherWorkbookSheetList()
Dim wb As Workbook, out As Worksheet, s As Object, r As Long
Set wb = Workbooks("月次集計.xlsm") '開いているブック名を指定
Set out = GetOrCreateSheet("Other Sheet List", ThisWorkbook)
out.Cells.Clear
out.Range("A1").Value = "シート名"
r = 2
For Each s In wb.Sheets
out.Cells(r, 1).Value = s.Name
r = r + 1
Next
out.Columns("A").AutoFit
MsgBox "他ブックの一覧を出力しました。"
End Sub
VB- ポイント:
- 対象明示: 誤操作を避けるため、どのブックの一覧かを常に明示。
例題で練習
例題1:リンク付き目次を作る(クリックでジャンプ)
Sub MakeSheetIndex()
Dim out As Worksheet, ws As Worksheet, r As Long
Set out = GetOrCreateSheet("Index")
out.Cells.Clear
out.Range("A1").Value = "目次(クリックで移動)"
r = 2
For Each ws In ThisWorkbook.Worksheets
out.Hyperlinks.Add Anchor:=out.Cells(r, 1), Address:="", SubAddress:= _
"'" & ws.Name & "'!A1", TextToDisplay:=ws.Name
r = r + 1
Next
out.Columns("A").AutoFit
End Sub
VB- ポイント:
- ハイパーリンク: 実務で使える目次の自動作成。
例題2:可視ワークシートだけをCSVに順次エクスポート
Sub ExportVisibleWorksheetsToCSV()
Dim ws As Worksheet, base As String
base = ThisWorkbook.Path & "\"
For Each ws In ThisWorkbook.Worksheets
If ws.Visible = xlSheetVisible Then
ws.Copy '新規ブックにコピー
With ActiveWorkbook
.SaveAs Filename:=base & ws.Name & ".csv", FileFormat:=xlCSV
.Close SaveChanges:=False
End With
End If
Next
MsgBox "可視シートのみCSV出力しました。"
End Sub
VB- ポイント:
- 一覧取得の応用: 可視フィルタと組み合わせた実務タスク。
実務の落とし穴と対策
- WorksheetsとSheetsの違い:
- 選び方: グラフシート等も対象なら
Sheets、ワークシート限定ならWorksheets。用途で統一。
- 選び方: グラフシート等も対象なら
- 非表示の扱い:
- 画面操作前: 非表示やVeryHiddenは選択不可。可視チェックかオブジェクト参照で処理する。
- ThisWorkbookとActiveWorkbook:
- 誤操作防止: マクロ格納ブックか操作中ブックか、対象を常に明確に。
- 日本語名・禁止文字・31文字上限:
- 命名時: 一覧をもとに新規作成やリネームする場合は、必ず安全化関数を挟む。
次の一歩(小課題)
- 課題1: 可視ワークシート名だけのCollectionを作り、ログシートに縦に書き出す。
- 課題2: 「売上」「在庫」を含むシート名だけを抽出して、新しい目次を作る。
- 課題3: 他ブックを指定して、そのシート一覧を現在のブックに出力し、リンクで相互参照できるようにする。
