10/17/2018

Excel。マクロ36。指定した順番でシートを並び替えるにはどうしたらいいの?【SORT】

Excel。マクロ36。指定した順番でシートを並び替えるにはどうしたらいいの?

<Excel VBA:シートの並び替え>

大量のシートを例えば店舗ごとに並び替えをしたい場合、
手動でシートを移動させて並び替えをするのは、
とても面倒ですし、時間もかかってしまします。

1月~12月のような連続性がある場合には、
For~Next構文を使うなどして、
並び替えをしたいシート名を別のシートに吸い出して、
並び替えをして、それを使ってシートを並び替えることができますが、
店舗名や社員名など、五十音順ではなく、
指定した順番で並び替えをするには、どうしたらいいのしょうか?

そこで、今回は、指定した順番でシートを並び替える方法をご紹介していきます。

確認ですが、次のようなブックになっています。

新宿から東京までのシートを指定した順番で並び替えをしていくわけですが、
指定した順番を作成しておかないといけませんので、
今回は、並び替えというシートを用意するところから始まります。

並び替えのシートには次のようなデータを用意しておきます。

大崎・品川・渋谷・新宿・東京。
そして代々木の順番にシートを並び替えするのが今回のゴールになります。

では、Excel VBAでプログラム文を作っていきましょう。

Sub シート並び替え指定()
    Dim i As Long
    With Worksheets("並び替え")
        Sheets(.Cells(1, 1).Value).Move before:=Sheets(4)
        For i = 6 To Sheets.Count
            Sheets(.Cells(i - 4, 1).Value).Move after:=Sheets(i - 2)
        Next i
    End With
End Sub

説明の前に、実行してみましょう。

どうでしょう。
大崎・品川・渋谷・新宿・東京。
そして代々木の順番にシートを並び替えることができましたね。

それでは、プログラム文を確認していきましょう。

Dim i As Long
お馴染みの変数の宣言ですね。今回は、Long型にしております。

With Worksheets("並び替え")~End With
今回は、With構文を使いました。
理由は、いちいち、
Worksheets("並び替え")を何度も入力するのが面倒だからです。

With構文を使えば省略することができますね。

続いて、
Sheets(.Cells(1, 1).Value).Move before:=Sheets(4)
最初の起点となるシートをまずは移動させる必要があります。

今回は、上期集計シートの右側に移動させて、
そこから並び替えた各シートを移動させたいわけですね。

Sheets(.Cells(1, 1).Value)は、Sheets(並び替えシートのa1の値)。

つまり、大崎という名前のシートという意味になります。
これを、Move before:=Sheets(4)
4枚目のシートのbefore。4枚目のシートの”前”に、Move。移動させる。

この一行は、
「大崎シートを、4枚目のシートの前に移動させる」という意味になります。

4枚目のシートの前に移動させれば、
起点となるシートは4枚目に移動させることができます。

For i = 6 To Sheets.Count
    Sheets(.Cells(i - 4, 1).Value).Move after:=Sheets(i - 2)
Next i

あとの残りのシートを並び替えしていきますので、
繰り返しの構文を使って移動させていきます。

i = 6 は、今回、6店舗なので6にしています。
Sheets.Countは、シートの枚数を数えることができます。
その数まで繰り返すようにしています。

Move afterで、シートの後に移動することができます。

このように、ビックリするぐらい行数は少なくて作ることができます。

プログラマーさんならば、きっと配列を使ったりと、
もっとカッコいい効率的な構文になるかと思いますが、
めちゃくちゃ詳しくなくても、やりたいことが表現できますので、
少しずつExcel VBAになれて、
日ごろの業務を少し時短できるようになるといいですね。