シートを並べ替える|Excel VBA

シート操作関連のテクニック

シートを並べ替える

(Excel 97/2000/2002/2003/2007/2010/2013/2016)

ブックに複数のシートが存在するとき、これらのシートをシート名の順に並べ替えるにはどうしたらいいでしょう。
2つの方法をご紹介します。

■配列を使用する方法

1つ目は、すべてのシート名を配列に格納し、配列内のシート名を並べ替える方法です。
配列内の要素を並べ替えるにはいくつかのアルゴリズムがありますが、ここでは最も簡単な方法で行ってみましょう。

Sub Sample1()
    Dim i As Long, j As Long, cnt As Long
    Dim buf() As String, swap As String
    
    cnt = Worksheets.Count
    ReDim buf(cnt)
    
    'ワークシート名を配列に入れる
    For i = 1 To cnt
        buf(i) = Worksheets(i).Name
    Next i
    
    '配列の要素をソートする
    For i = 1 To cnt
        For j = cnt To i Step -1
            If buf(i) > buf(j) Then
                swap = buf(i)
                buf(i) = buf(j)
                buf(j) = swap
            End If
        Next j
    Next i
    
    'ワークシートの位置を並べ替える
    Worksheets(buf(1)).Move Before:=Worksheets(1)
    For i = 2 To cnt
        Worksheets(buf(i)).Move After:=Worksheets(i - 1)
    Next i
End Sub

配列内のシート名がソートできれば、後は簡単です。その順番でシートの位置を移動します。
シートを移動するにはMoveメソッドを使います。

■Excelの並べ替え機能を使う方法
配列の要素を並べ替えるアルゴリズムは、古くからさまざまな手法が知られています。
しかし、考えてみれば、Excelにはデータを並べ替える標準機能があります。
シート名をセルに書き出せば、[データ]→[並べ替え]で並べ替えることが可能です。
問題は"どのシート"に書き出すかです。

すでに使用しているシートでは、既存のデータを上書きしてしまう可能性があります。
シートの空き領域を探してシート名を書き込むのは現実的ではありません。
こんなときは、作業用に新しいシートを挿入して、そこを利用するといいでしょう。
次のサンプルは、作業用のシートを使ってシート名を並べ替えます。

Sub Sample2()
    Dim i As Long
    
    'ダミーシートを挿入する
    With Worksheets.Add
        'ワークシート名をセルに書き出す
        For i = 1 To Worksheets.Count
            .Cells(i, 1).Value = Worksheets(i).Name
        Next i
        
        'ワークシート名をソートする
        .Range("A1").CurrentRegion.Sort .Range("A1")
        
        'ワークシートの位置を並べ替える
        Worksheets(.Cells(1, 1).Value).Move Before:=Worksheets(1)
        For i = 2 To Worksheets.Count
            Worksheets(.Cells(i, 1).Value).Move After:=Worksheets(i - 1)
        Next i
        
        'ダミーシートを削除する
        Application.DisplayAlerts = False
        .Delete
        Application.DisplayAlerts = True
    End With
End Sub

処理が終わった後で作業用シートを削除しますが、このとき「削除しますか?」
の確認メッセージが表示されないようDisplayAlertsプロパティを操作しています。

このように、セルを一時的に使用するようなケースでは、新しい作業用のシートを挿入すると便利です。
シートの挿入や削除には時間がかかる…と誤解している人もいますが、ScreenUpdatingプロパティにFalseを設定して画面の更新を抑止すれば、ほとんど気にならないでしょう。