エクセルブック内のシートをシート名順に並び替える

エクセルブック内のシートがたくさんあり、シートを探すのに手間がかかります。

少しでも探す手間を省くのにシートを名前順に並べるマクロを作ろうと考えました。

シートを追加する度に「シート整列」マクロを実行する様にしたいと思います。

シート一覧を配列に取り込む

配列を用意してシートの名前を配列に取り込みます。

    1	Dim i As Integer
    2	Dim sSht As Worksheet
    3	Dim sNAMEs() As String
    4	ReDim sNAMEs(ThisWorkbook.Worksheets.Count - 1)
    5	i = 0
    6	For Each sSht In ThisWorkbook.Worksheets
    7	    sNAMEs(i) = sSht.Name
    8	    i = i + 1
    9	Next

3行目がシート名を取り込む配列です。

4行目で配列の大きさをブック内のシート数に再定義しています。(配列はゼロから始まるので -1 しています)

7行目で取り込んだシート名を配列の最後にセットしています。

シート名順に配列内で並び替え

シート名取込と同時に並び変えます。前述のロジックに並び替えるロジックを追加しました。

    1	Dim i, j As Integer
    2	Dim sSht As Worksheet
    3	Dim sNAMEs() As String
    4	Dim wSTR As String
    5	ReDim sNAMEs(ThisWorkbook.Worksheets.Count - 1)
    6	i = 0
    7	For Each sSht In ThisWorkbook.Worksheets
    8	    sNAMEs(i) = sSht.Name
    9	    If i > 0 Then
    10	        For j = i To 1 Step -1
    11	            If sNAMEs(j - 1) > sNAMEs(j) Then
    12	                wSTR = sNAMEs(j - 1)
    13	                sNAMEs(j - 1) = sNAMEs(j)
    14	                sNAMEs(j) = wSTR
    15	            Else
    16	                Exit For
    17	            End If
    18	        Next j
    19	    End If
    20	    i = i + 1
    21	Next

4行目と9行目から19行目が追加した並び替えのロジックです。

8行目で取り込んだシート名は、配列の最後に追加されます。

最後に配列に追加されたシート名が直前のシート名より小さければ、12行目から14行目で配列内のシート名を入れ替えています。

入れ替えたシート名がその前のシート名より小さければ、さらに入れ替えます。

この操作をシート名が小さくないか、配列の先頭まで繰り返すことで、小さい順に並び替えることができます。

因みに、11行目の「>」を「<」にすることで大きい順に並び替えることができます。

これで、配列内ではシート名が小さい順に並び変えられています。

あとは、実際のシートを配列の順序に合わせればシートの整列が完了します。

シートを並び替え

配列の順序にシートを並び替えます。先ほどのロジックの後に追加します。

    22	For i = 1 To UBound(sNAMEs)
    23	    ThisWorkbook.Worksheets(sNAMEs(i)).Move
    24	             after:=ThisWorkbook.Worksheets(sNAMEs(i - 1))
    25	Next

23行目から24行目でシートを並びかえています。

配列の(i)番目の名前のシートを(i-1)番目…つまり、ひとつ前の名前のシートの後に移動しています。

この処理を全シートについて行うことで、シート名順にシートが整列します。

いかがでしたか

私的には、とても重宝しています。

目次のシートを用意して、そこから各シートにリンクする方法もありますが………

では、また

コメントの受付は終了しました。