シートを「名前」で取得する
初心者でも安心して使えるように、実際に動くコード例を交えながら「シートを名前で取得」する定番パターンを丁寧に解説します。迷いやすい「存在チェック」「ActiveWorkbookとThisWorkbookの違い」も、コピペで使えるテンプレート付きでまとめました。
基本:名前でシートを取得する
Worksheets/Sheetsで取得
- 最短コード:
Sub GetSheetByName_Basic()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("売上データ") 'または Worksheets("売上データ")
MsgBox "見つけたシート名: " & ws.Name
End Sub
VB- ポイント:
Sheets("名前")もWorksheets("名前")も使えます(一般的にはワークシートに限定するWorksheetsが安心)。ThisWorkbookは「このマクロを含むブック」、ActiveWorkbookは「今アクティブなブック」です。意図に合わせて使い分けましょう。
参考: 名前での取得は直感的で一番わかりやすい方法。対象が存在しないとエラーになるため、次の「存在チェック」テンプレートとセットで使うのがおすすめです。
テンプレート:存在チェック+安全に取得
関数化して使い回す
' 指定名のシートを安全に取得(見つからない場合はNothing)
Function TryGetSheetByName(targetName As String, Optional wb As Workbook) As Worksheet
Dim t As Worksheet
On Error Resume Next
If wb Is Nothing Then Set wb = ThisWorkbook
Set t = wb.Worksheets(targetName)
On Error GoTo 0
Set TryGetSheetByName = t
End Function
Sub Use_TryGetSheet()
Dim ws As Worksheet
Set ws = TryGetSheetByName("売上データ") 'ThisWorkbookから探す
If ws Is Nothing Then
MsgBox "シート『売上データ』は見つかりませんでした。"
Else
MsgBox "取得成功: " & ws.Name
End If
End Sub
VB- ポイント:
On Error Resume Nextで「存在しない」場合のランタイムエラーを回避し、Nothing判定で分岐。Optional wb As Workbookで、他ブックにも柔軟対応。- 実務で再利用しやすい雛形。
参考: シート取得は「存在しない場合のハンドリング」が要点。名前・インデックス・アクティブの使い分けを理解すると応用が広がります。
応用:見つからなければ作る/複数候補から探す
見つからなければ自動作成
Function GetOrCreateSheet(targetName As String, Optional wb As Workbook) As Worksheet
Dim ws As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
Set ws = TryGetSheetByName(targetName, wb)
If ws Is Nothing Then
Set ws = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
ws.Name = targetName
End If
Set GetOrCreateSheet = ws
End Function
Sub Example_GetOrCreate()
Dim ws As Worksheet
Set ws = GetOrCreateSheet("レポート")
MsgBox "準備できたシート: " & ws.Name
End Sub
VB- ポイント:
- 初回実行で自動作成、次回以降は既存を再利用。
- 報告書や出力用の「定型シート」生成に便利。
複数候補名から探す(名前ブレに強い)
Function FindSheetByCandidates(candidates As Variant, Optional wb As Workbook) As Worksheet
Dim i As Long, ws As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
For i = LBound(candidates) To UBound(candidates)
Set ws = TryGetSheetByName(CStr(candidates(i)), wb)
If Not ws Is Nothing Then
Set FindSheetByCandidates = ws
Exit Function
End If
Next
Set FindSheetByCandidates = Nothing
End Function
Sub Example_FindCandidates()
Dim names As Variant: names = Array("売上", "Sales", "売上データ")
Dim ws As Worksheet
Set ws = FindSheetByCandidates(names)
If ws Is Nothing Then
MsgBox "候補のどれも見つかりません。"
Else
MsgBox "見つかったシート: " & ws.Name
End If
End Sub
VB- ポイント:
- 多言語や命名揺れに対応。
- マージや外部ファイルを扱う処理で便利。
よく使う関連パターン
インデックスで取得(1始まり)
Sub GetSheetByIndex()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1) '左端(1番目)のシート
MsgBox ws.Name
End Sub
VB- ポイント:
- 並び順が変わると対象も変わるため、安定性は名前指定のほうが高いです。
アクティブなシート名を取得
Sub ShowActiveSheetName()
MsgBox ActiveSheet.Name
End Sub
VB- ポイント:
- その瞬間に選択されているシートの名前。簡単ですが、処理の安定性が欲しい場面では特定名の取得を使いましょう。
例題で練習:一覧を作る/部分一致で探す
例題1:全シート名を新しいシートに一覧化
Sub ListAllSheetNames()
Dim wb As Workbook, out As Worksheet, i As Long
Set wb = ThisWorkbook
Set out = GetOrCreateSheet("Sheet Names", wb)
out.Cells.Clear
out.Range("A1").Value = "シート名一覧"
For i = 1 To wb.Worksheets.Count
out.Cells(i + 1, 1).Value = wb.Worksheets(i).Name
Next i
MsgBox "一覧を『Sheet Names』に出力しました。"
End Sub
VB- ポイント:
- まず出力用シートを「存在しなければ作成」。
- その後、
Worksheets.Countで総数を回してNameを書き出し。 - すぐに業務で役立つ実用例。
例題2:部分一致で探して移動(例:「売上」を含むシート)
Sub ActivateSheetByPartialName(partial As String)
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If InStr(1, ws.Name, partial, vbTextCompare) > 0 Then
ws.Activate
MsgBox "移動先: " & ws.Name
Exit Sub
End If
Next
MsgBox "「" & partial & "」を含むシートは見つかりません。"
End Sub
Sub Example_Partial()
ActivateSheetByPartialName "売上"
End Sub
VB- ポイント:
InStr+vbTextCompareで大文字小文字を無視した検索。- 命名が厳密でないファイルでも柔軟に対応。
実務の落とし穴と対策
- 名前の重複:
- 同一ブック内ではシート名は重複不可。エラー時は別名に変更するか、重複チェックを入れる。
- 禁止文字/長さ制限:
: / \ ? * [ ]はシート名に使えません。31文字制限もあり。入力から生成する場合は置換や切り詰め処理を挟むと安全です。
- 日本語名の扱い:
- 日本語名でも問題なく取得可能。外部ブック・CSV取り込み時は文字化けに注意し、名前決めルールを運用で統一すると安定します。
- ThisWorkbookとActiveWorkbook:
- マクロ含むブックに対して確実に処理したいなら
ThisWorkbook。ユーザーが操作中のブック対象ならActiveWorkbook。混在はバグのもとです。
- マクロ含むブックに対して確実に処理したいなら
参考: よくある質問として、アクティブシートとインデックスの違い、エラー回避、複数ブックの扱いなどが取り上げられています。
次に進むための小さな課題
- 課題1: 「顧客」という語を含む最初のシートを探して、A1に「処理済み」と書き込むマクロを書いてみてください。
- 課題2: ユーザー入力の文字列(
InputBox)を安全なシート名に整形して(禁止文字を_へ置換、31文字に切り詰め)、GetOrCreateSheetで作成してみましょう。 - 課題3: 別ブック(
Workbooks("月次.xlsm"))を開いて、その中の「売上集計」シートを取得し、現在のブックに値貼り付けしてみましょう。

