![見出し画像](https://assets.st-note.com/production/uploads/images/91117206/rectangle_large_type_2_6f45a201536f0764c7b1c7d8043ed368.png?width=1200)
エクセルのシートを並び替えるコード
数日前にノンプロ研にSlackに「Pythonを使って、エクセルのワークシートを並び替えるのはどうすればよいですか」という旨の投稿がありました。
これはPythonではできなかったのですが、VBAで挑戦していきたいと思います。
まず、今回の課題を見て、先日、VBA100本ノックの課題に類似してるのではないかと思いました。
#VBA100本ノック 15本目
— エクセルの神髄 (@yamaoka_ss) November 3, 2020
「2020年04月」から「2021年03月」のシートがあります。
しかし、シートの順番が狂ってしまっています。
「2020年04月」から昇順に並べ替えてください。
・上記以外のシートは存在しません。
・シート名は「yyyy年mm月」これで統一されています。 pic.twitter.com/R3jU5PX1yV
今回は特定のワークシートに並び替えたい順番を記載しますので、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のシートが追加されます。
![](https://assets.st-note.com/img/1668336524926-Au0kSEmIE0.png?width=1200)
シートを並び替える
次に上記で作成したシートをランダムに並び替えます。
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
を用いないと無駄な処理を続けることになるので、これは入れておきましょう。
というわけで、今回はワークシートを並び替えるコードを書いてみました。
この記事が気に入ったらサポートをしてみませんか?