見出し画像

エクセルのシートを並び替えるコード

数日前にノンプロ研にSlackに「Pythonを使って、エクセルのワークシートを並び替えるのはどうすればよいですか」という旨の投稿がありました。
これはPythonではできなかったのですが、VBAで挑戦していきたいと思います。
まず、今回の課題を見て、先日、VBA100本ノックの課題に類似してるのではないかと思いました。

今回は特定のワークシートに並び替えたい順番を記載しますので、100本ノックより優しいのかなと感じました。
さあ、それではコードを書いていきましょう

ダミーデータの作成

実務で使用するデータは当然、使用できませんので、このようなケースはまずダミーデータを作成します。
VBAやPowerQueryの練習ではダミーデータを以下にスマートに作成できるかが上達のコツだと私は思っています。
まずはシートモジュールに下記のコードを記載します。

Sub addSheet()

    Dim i As Long: i = 1
    Dim ws As Worksheet
    
    Do While Cells(i, 1) <> ""
        Set ws = Worksheets.Add
        ws.Move after:=Worksheets(Worksheets.Count)
        ws.Name = Cells(i, 1).Value
        i = i + 1
    Loop


End Sub

このシートのA列に北海道から沖縄までの47都道府県を記載しています。
このコードを実行すると下記のように都道府県名がついた47のシートが追加されます。

シートが追加された状態

シートを並び替える

次に上記で作成したシートをランダムに並び替えます。

Sub rndSheet()

    Dim ws As Worksheet
    Dim min As Long: min = 1
    Dim max As Long: max = Worksheets.Count
    Dim ret
    
    For Each ws In Worksheets
        Call Randomize
        ret = Int((max - min + 1) * Rnd + min)
        ws.Move after:=Worksheets(ret)
    Next

    Sheet1.Select
End Sub

ret = Int((max - min + 1) * Rnd + min)

これは指定の範囲内で乱数を発生されるための公式みたいなものです。
私はいつもこれが分からなくなるので、単語登録しています。

シートの並び替え

ワークシートのA列の1行目に入力されたシート名から順番に並び替えます。
つまり、A1の値と、for each文で取得したwsの名前が一致した場合、先頭に移動させます。
以下は同じロジックで行っていきます。

Sub main2()
    Dim ws As Worksheet
    Dim i As Long: i = 1
    
    Do While Cells(i, 1) <> ""
        For Each ws In Worksheets
            If Cells(i, 1).Value = ws.Name Then
                ws.Move before:=Worksheets(i) '前から整列
                Exit For
            End If
        Next
        i = i + 1
    Loop
    
    Sheet1.Activate
End Sub

ちなみに、

Exit for

を用いないと無駄な処理を続けることになるので、これは入れておきましょう。

というわけで、今回はワークシートを並び替えるコードを書いてみました。

この記事が気に入ったらサポートをしてみませんか?