シートを並べ替える|Excel VBA |
ブックに複数のシートが存在するとき、これらのシートをシート名の順に並べ替えるにはどうしたらいいでしょう。
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を設定して画面の更新を抑止すれば、ほとんど気にならないでしょう。