Excel VBA 逆引き集 | シートを名前で取得

Excel VBA
スポンサーリンク

シートを「名前」で取得する

初心者でも安心して使えるように、実際に動くコード例を交えながら「シートを名前で取得」する定番パターンを丁寧に解説します。迷いやすい「存在チェック」「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
  • ポイント:
    • InStrvbTextCompareで大文字小文字を無視した検索。
    • 命名が厳密でないファイルでも柔軟に対応。

実務の落とし穴と対策

  • 名前の重複:
    • 同一ブック内ではシート名は重複不可。エラー時は別名に変更するか、重複チェックを入れる。
  • 禁止文字/長さ制限:
    • : / \ ? * [ ]はシート名に使えません。31文字制限もあり。入力から生成する場合は置換や切り詰め処理を挟むと安全です。
  • 日本語名の扱い:
    • 日本語名でも問題なく取得可能。外部ブック・CSV取り込み時は文字化けに注意し、名前決めルールを運用で統一すると安定します。
  • ThisWorkbookとActiveWorkbook:
    • マクロ含むブックに対して確実に処理したいならThisWorkbook。ユーザーが操作中のブック対象ならActiveWorkbook。混在はバグのもとです。

参考: よくある質問として、アクティブシートとインデックスの違い、エラー回避、複数ブックの扱いなどが取り上げられています。


次に進むための小さな課題

  • 課題1: 「顧客」という語を含む最初のシートを探して、A1に「処理済み」と書き込むマクロを書いてみてください。
  • 課題2: ユーザー入力の文字列(InputBox)を安全なシート名に整形して(禁止文字を_へ置換、31文字に切り詰め)、GetOrCreateSheetで作成してみましょう。
  • 課題3: 別ブック(Workbooks("月次.xlsm"))を開いて、その中の「売上集計」シートを取得し、現在のブックに値貼り付けしてみましょう。

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