シートを任意の順に並べるには
ブックに複数のシートがあり並べ替えを行う場合、シートを一つずつ選択してドラッグしたり「シートの移動またはコピー」ダイアログを使って移動させることになります。ただ、シートの数が多い場合には面倒です。そこで自動で並べ替えを行う方法を紹介します。
ただ、シートの並べ替えを行うには事前にどの順序にするのかを決める必要があります。そのため、先に現状のシートの一覧を用意して、それからどのように並び替えを行うのかを決めていきます。シートの数が10個程度であればいいですが、50個も100個もあると現状のシートの一覧を作るだけでも一苦労です。
そこで、まず現状のシートの一覧を取得する方法と、それを任意の順に並べ替えたあとに、シートを並べなおす方法について説明します。
現状のシートの一覧の取得方法
以下のようにSheet1からSheet11まであるとします。そしてSheet12が隠しシートとして存在しています。
これらのシートの一覧を取得するコードは以下になります。シートの一覧は新しく追加シート(シート名は”AddSheet”)に出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub GetSheetList() Dim sht As Object '// シート Dim s As String '// 追加シート名 Dim i As Long '// ループカウンタ '// シートを追加 Call Sheets.Add(After:=Sheets(Sheets.Count)) s = "AddSheet" ActiveSheet.Name = s Range("A1").Select '// ワークシートをループ For Each sht In Sheets '// 追加したシートではない場合 If (sht.Name <> "AddSheet") Then '// シート名を追加シートのA列に貼り付け ActiveCell.Offset(i, 0).Value = sht.Name End If i = i + 1 Next End Sub |
実行すると”AddSheet”シートに以下のように出力されます。
この”AddSheet”シートは次の処理で使うのでそのまま残しておいてください。あとで削除します。
コード内でSheetsコレクションを利用していますが、ワークシートしか使っていなのであればWorksheetsコレクションでも構いません。マクロシート、グラフシート、ダイアログシートを使っていることはほとんど無いと思います。
SheetsとWorksheetsの違いの詳細は「VBAのSheetsとWorksheetsの違い」をご参照ください。
「Sheets」と書いてある部分を全て「Worksheets」と書く場合は2行目の「Dim sht As Object」を「Dim sht As Worksheet」としてもOKです。
シートの並べ替え
上のマクロで”AddSheet”シートのA列にシートの一覧を出力しています。それを任意の順番に手で並べ替えます。ここでは以下のように並べ替えます。
並べ替え前 | 並べ替え後 |
“AddSheet”でのシート名の並べ替えが終わったあとに、実際のシートの並べ替えを行うコードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
Sub ChangeOrder() Dim ar() As String '// シート名配列 Dim i As Integer '// ループカウンタ Dim s As String '// セル値 Sheets("AddSheet").Select Range("A1").Select i = 0 ReDim ar(i) '// A列をループ Do '// セルの値を取得 s = ActiveCell.Offset(i, 0).Value '// セルが未設定の場合 If (s = "") Then '// ループを抜ける Exit Do End If '// 配列を拡張しセル値(シート名)を格納する ReDim Preserve ar(i) ar(i) = s i = i + 1 Loop '// シートの順序を"AddSheet"の順に並べ替え i = 0 Do '// 配列要素がない場合 If (i > UBound(ar)) Then '// ループを抜ける Exit Do End If '// 配列の現ループ値のシート名を現ループカウンタ値の右に移動 Sheets(ar(i)).Move before:=Sheets(i + 1) i = i + 1 Loop '// シート削除の確認ダイアログを表示させてないように指定 Application.DisplayAlerts = False '// "AddSheet"シートを削除 Sheets("AddSheet").Delete Application.DisplayAlerts = True End Sub |
コードが長いですが、やっていることは大したことがなく、”AddSheet”のA1セルから下に向かってセルの値をシート名として取得し、それを配列に格納します。そしてその配列に格納されたシート名を先頭から順にSheets.Moveメソッドで一番左から順に移動して並べ替えを行っています。配列の設定とシートの並び替えは同時に行うことが出来てコードも短くできますが、あえて分かりやすいように分けて書いています。
最後に上のマクロで追加した”AddSheet”シートを削除しています。シートのDeleteメソッドはシート削除してよいかどうかを確認するダイアログが表示されるため、それを非表示にするためにDisplayAlertsプロパティでFalseにして、Deleteメソッド後に元のTrueに戻しています。
シートの削除(Deleteメソッド)の詳細は「VBAでシートの削除を行う」をご参照ください。
実行後
シートの並べ替えのChangeOrder関数を実行すると以下のようにシートの順番が”AddSheet”に書いた順番になり、”AddSheet”が削除されます。