Excel。マクロ35。連続した規則性のあるシートを並び替えてみよう
<Excel VBA:シートの並び替え>
シートが多くなってくると、あるカテゴリー別に並び替えたりすることがでてきますが、
大量のシートを並び替えようとすると、結構面倒なことに気が付きます。
その原因は、データの並び替えはあるけど、
シートの並び替えが無いことなんですね。
昇順や降順ボタンがあれば、ポチッで済むのですが、それができない。
このような面倒な処理となれば、
Excel VBAでマクロを作るというのが基本的な流れになるわけですね。
何か難しそうなイメージがするかもしれませんが、
それほど厄介なプログラム文ではありませんので、知っておくと便利ですよ。
では、次のような状態でシートが並んでいます。
今回は、規則性のある連続したシートの並び替えを紹介しますので、
単純に4月~9月を並び替えていきます。
それ以外のシートは並び替えの対象外とします。
プログラムに詳しい人は、
配列を使って…という方法が処理も早いしとかあるとは思いますが、
一般事務職というか、プログラムには詳しくないけど、
作業効率を改善したい人は山のようにいらっしゃいますので、
今回は、配列を使わない方法で挑戦していきます。
流れとしては、新しいシートを挿入して、各シート名を拾ってきて、
並び替えをして、その順番にシートを移動させたあと、
挿入したシートは作業用シートなので、削除するという流れがいいかと思います。
まず、完成したプログラム文です。
Sub シート並び替え連続()
Dim i As Long
With Sheets.Add
For i = 5 To Sheets.Count
.Cells(i - 4, 1) = Sheets(i).Name
Next i
.Range("a1").CurrentRegion.Sort .Range("a1")
Sheets(.Cells(1, 1).Value).Move before:=Sheets(5)
For i = 6 To Sheets.Count
Sheets(.Cells(i - 4, 1).Value).Move after:=Sheets(i - 1)
Next i
Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True
End With
End Sub
実際に動かしながら説明をしていきます。
Dim i As Long
これは、お馴染みの変数を宣言しているところです。
大外を、
With Sheets.Add~End With
でWith文で囲っています。
新しく追加したシートを省略しているわけですね。
【追加したシートにシート名を回収する】
For i = 5 To Sheets.Count.Cells(i - 4, 1) = Sheets(i).Name
Next i
ここまでを実行してみましょう。
新しいシートが挿入されて、A1からシート名を拾ってきて入力されています。
なお、新しいシートは、
アクティブにしてあるシートの左側に挿入されます。
For i = 5 To Sheets.Count
シートの5番目からシートの最後までという意味ですね。
シートが挿入されるので、”+1”するのがポイントですね。
Cells(i - 4, 1) = Sheets(i).Name
A1に、5番目のシート名をいれます。
この新しく挿入したシートに作ったシート名の一覧を使って次の作業をします。
【並び替える順番を準備する】
.Range("a1").CurrentRegion.Sort .Range("a1")シート名の一覧ができましたが、
今回は4月~9月と規則性のある並び替えをします。
.Range("a1").CurrentRegion.Sort .Range("a1")
A1の表を選択して並び替えをするという意味ですね。
【シートを並び替える】
Sheets(.Cells(1, 1).Value).Move before:=Sheets(5)For i = 6 To Sheets.Count
Sheets(.Cells(i - 4, 1).Value).Move after:=Sheets(i - 1)
Next i
ここで、実際にシートの並び替えをしています。
Sheets(.Cells(1, 1).Value).Move before:=Sheets(5)
新しく挿入したシートの右側(before:=Sheets(5))に、
最初のシートを移動します。
その移動したシートの右側にシートを移動させて、
シートの並び替えをしていきます。
これで完成しているのですが、作業用に追加したシートが不要になります。
【不要になった作業用シートを削除】
Application.DisplayAlerts = False.Delete
Application.DisplayAlerts = True
削除しますか?というメッセージを表示してから削除許可をするのは、
面倒なので、メッセージを表示させないでそのまま、
不要になった作業用シートを削除させているのが、この3行です。
Application.DisplayAlerts = False
でメッセージを表示させなくして、そのままだと、
通常のExcelの処理もメッセージが表示されなくなってしまうので、最後に、
Application.DisplayAlerts = True
で元に戻して終了ですね。
このようなExcel VBAで簡単にシートの並び替えをすることができます。