Excelで多数のシートを扱っていると、タブの順番がバラバラになり、目的のシートを探すのが大変になることがあります。手作業でドラッグして並べ替えるのは、シート数が多いと非常に面倒な作業です。
VBAを使えば、すべてのワークシートを名前順(昇順)で自動的に並べ替えることが可能です。この記事では、基本的な並べ替えアルゴリズム(バブルソート)を使って、シートをきれいに整列させるコードを解説します。
並べ替えの処理フロー
今回のマクロは、以下の3つのステップで動作します。
- シート名の一覧を取得: まず、現在のブックに存在するすべてのシート名を、配列(VBAの変数の一種)に格納します。
- 配列を名前順にソート: 次に、配列に格納したシート名を、プログラム内部で名前順(昇順)に並べ替えます。
- シートを物理的に移動: 最後に、ソート済みの配列の順番通りに、実際のシートを
.Move
メソッドを使って一つずつ移動させていきます。
完成したVBAコード
以下が、シートを名前順に並べ替えるVBAコードです。
Sub SortAllWorksheetsByName()
' 変数を宣言します
Dim sheetNames() As String
Dim sheetCount As Integer
Dim i As Integer
Dim j As Integer
Dim tempName As String
'--- 1. すべてのシート名を取得して配列に格納 ---
sheetCount = ThisWorkbook.Worksheets.Count
ReDim sheetNames(1 To sheetCount)
For i = 1 To sheetCount
sheetNames(i) = ThisWorkbook.Worksheets(i).Name
Next i
'--- 2. 配列内のシート名をバブルソートで並べ替え ---
For i = 1 To sheetCount - 1
For j = i + 1 To sheetCount
' 前後の名前を比較し、i番目の方が大きければ入れ替え
If sheetNames(i) > sheetNames(j) Then
tempName = sheetNames(j)
sheetNames(j) = sheetNames(i)
sheetNames(i) = tempName
End If
Next j
Next i
'--- 3. ソートされた配列の順番通りにシートを移動 ---
Application.ScreenUpdating = False ' 画面のちらつきを抑制
For i = 1 To sheetCount
ThisWorkbook.Worksheets(sheetNames(i)).Move After:=ThisWorkbook.Worksheets(sheetCount)
Next i
Application.ScreenUpdating = True
MsgBox "すべてのシートを名前順に並べ替えました。"
End Sub
コードのポイント解説
① シート名の一覧を取得
最初のFor
ループで、ブックに存在するすべてのワークシートの名前を読み取り、sheetNames
という配列変数に順番に格納しています。
② 配列を名前順にソート(バブルソート)
For i = 1 To sheetCount - 1
For j = i + 1 To sheetCount
If sheetNames(i) > sheetNames(j) Then
' ... 入れ替え処理 ...
End If
Next j
Next i
ここは、バブルソートと呼ばれる古典的なアルゴリズムを使い、配列内の文字列を昇順に並べ替えている部分です。二重のループで配列の要素を総当たりで比較し、順番が逆であれば一時変数tempName
を使って値を入れ替えています。
③ ソートされた配列の順番通りにシートを移動
For i = 1 To sheetCount
ThisWorkbook.Worksheets(sheetNames(i)).Move After:=ThisWorkbook.Worksheets(sheetCount)
Next i
並べ替えロジックの肝となる部分です。ソート済みのsheetNames
配列を頭から順番に処理し、各シートを常にブックの一番右端(末尾)に移動させています。
例えば、ソート後の配列が("A", "B", "C")
だった場合、
- まず
"A"
シートが末尾に移動します。シートの並びは(B, C, A)
になります。 - 次に
"B"
シートが末尾に移動します。シートの並びは(C, A, B)
になります。 - 最後に
"C"
シートが末尾に移動します。シートの並びは(A, B, C)
となり、結果的にソートされた順番になります。
また、シート移動の際に画面がちらつくのを防ぐため、処理の前後をApplication.ScreenUpdating = False / True
で囲んでいます。
【応用】降順(逆順)に並べ替えるには?
もしシートを名前の降順(Z→Aの順)に並べ替えたい場合は、バブルソート部分の比較演算子を >
から <
に変更するだけです。 If sheetNames(i) < sheetNames(j) Then
まとめ
ワークシートの自動並べ替えは、少し複雑に見えますが、
- 配列に名前を読み込む
- ソートアルゴリズムで配列を並べ替える
- 並べ替えた配列の順に**
.Move
**でシートを移動させる という3つのステップに分解して考えることで、実現できます。ブック内のシートが増えてきた際に、このマクロを実行すれば一瞬で整理することができ、大変便利です。