📊 Excel VBA Top100
📋

SortSheetsByName

シート管理

シートを名前順に並べ替える

ブック内のワークシートを名前順に自動並べ替えるVBAマクロです。バブルソートまたはその他のソートアルゴリズムを使ってシートのインデックス順序を変更します。日本語・英語・数値が混在するシート名にも対応でき、昇順・降順の切り替えも可能です。多数のシートを手動で並べ替える手間を省き、整理されたブック構造を維持するのに役立ちます。内部ではシートのIndexプロパティを比較しながらMoveメソッドで入れ替えるバブルソートのロジックが一般的で、StrComp関数の比較モードを切り替えることで大文字小文字や全角半角の違いも吸収できます。MoveSheetが1枚単位の移動であるのに対し、本マクロはブック全体を対象にした一括整列であり、定期メンテナンスの仕上げ処理として位置付けられます。手作業でのドラッグ並べ替えでは現実的でない枚数でも一瞬で整列できます。

SortSheetsByName デモ

📖 使い方

  1. VBAエディタを開く(Alt + F11)
  2. モジュールを挿入(挿入 > モジュール)
  3. 下記VBAコードをコピー&ペースト
  4. ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: 実行するとシートがアルファベット順に並べ替えられる

🎯 活用シーン

  • ✓バラバラに追加された月別シートをアルファベット順・日付順に整列
  • ✓複数担当者が追加したシートを定期的に自動ソートして管理
  • ✓案件コードを付けたシートを番号順に並べ替えて一覧性を向上
  • ✓複数人が無秩序にシートを追加していったブックを、定期的に整った順序へ自動整理したいとき
  • ✓案件番号順にシートを並べ替えて、一覧性の高い管理ブックを維持したいとき

💡 実装のヒント

  • ▸Worksheet.Moveでインデックスベースのソートができます
  • ▸StrComp関数のvbTextCompareで大文字小文字を無視した比較ができます
  • ▸数値を含むシート名は文字列ソートより数値ソートが自然な並びになります
  • ▸数値を含むシート名(「第1回」「第10回」など)は文字列ソートだと桁数の影響で意図しない順序になるため、数値部分を抽出した独自ソートロジックが必要です。
  • ▸ソート対象から特定のシート(表紙・目次など)を除外したい場合は、シート名のパターンマッチで除外リストを作成してください。

💻 VBAコード

' SortSheetsByName
' -----------------
' Macro Name: SortSheetsByName
' Description: シートを名前順に並べ替える
' Parameters: なし
' Returns: なし
' Usage: 実行するとシートがアルファベット順に並べ替えられる
' -----------------

Sub SortSheetsByName()
    Dim ws As Worksheet
    Dim sheetNames() As String
    Dim i As Long
    Dim j As Long
    Dim temp As String
    Dim sheetCount As Long

    On Error GoTo ErrorHandler

    sheetCount = Worksheets.Count

    If sheetCount <= 1 Then
        MsgBox "シートが1つしかないため並べ替えの必要はありません。", vbInformation
        Exit Sub
    End If

    ReDim sheetNames(1 To sheetCount)
    For i = 1 To sheetCount
        sheetNames(i) = Worksheets(i).Name
    Next i

    For i = 1 To sheetCount - 1
        For j = i + 1 To sheetCount
            If StrComp(sheetNames(i), sheetNames(j), vbTextCompare) > 0 Then
                temp = sheetNames(i)
                sheetNames(i) = sheetNames(j)
                sheetNames(j) = temp
            End If
        Next j
    Next i

    For i = 1 To sheetCount
        Worksheets(sheetNames(i)).Move Before:=Worksheets(i)
    Next i

    MsgBox sheetCount & "枚のシートを名前順に並べ替えました。", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub