Excelで横方向のデータの並び替え(列単位×複数行)をするマクロのやり方
Excelを使っていて、行単位(縦方向)にデータを並び替えする事はよくあると思いますが、今日作業をしていると横方向(列単位)に並び替えをしたいシーンがありました。しかもその並び替えを1500行ほど。
やろうとしたら意外と手間だったので備忘録としてメモしておきます。
横方向(列単位)の並び替えって、どういう並び替え?
文字だけで説明するの難しいので、Excelで簡単な例を作ってみるとこんな感じ。
▼1~15の数が3列×5行(A1:C5)に入力されているとしますね。

これを、列単位(横方向)に複数行のデータを並び替えると…
▼こうなります!

どう変わったか分かりますか?
この並び替えをするときに1つの行に注目してみると、
▼赤枠で囲った行の13、8、10が

▼青枠で囲われているように左から8、10、13と小さい順に並び替わっています。
これを当記事では、横方向(列単位)のデータの並び替え と言っています。(正式には何て言うか知りませんが)

そして、注目した行だけではなく、その他の行についてもそれぞれの行毎に左から数字の小さい順に変わっていますね。
これを当記事では ×複数行 と表現しています。
数行程度なら1行ずつ手動でできる
1つの行を横方向(列単位)に並び替えたい!という場合はExcelのメニューをいじればできるんです。
行単位Excelのメニューの[データ]>[並び替え]>[現在選択されている範囲を並べ替える]>[オプション]>[列単位]とすればOKです。
このとき、[現在選択されている範囲を並び替える]ではなく[選択範囲を拡張する]を選ぶと、A1:C5の全てのセルが選択されますが、それぞれの行毎の並び替えではなく、どれか1つの行の横方向の並び替えに従い、その他のすべての行のデータがついてくる状態となってしまいます。
※言ってること分かりにくいと思うので、気になる人は実際に動かしてみてください。
要は、[現在選択されている範囲を並べ替える]を選んだら1行だけ横方向の並び替えはできるけど、それを複数行しようと思うと、行数分実行する必要があるというコト。
数行程度なら手動でやるのも現実味がありますが、僕が並び替えたい1500件はとてもじゃないけどムリ…
そこでマクロというかVB(Visual Basic)の登場です
調べているうちに出会ったこのマクロを使って実現することができました。
Sub test1()
Dim r As Range
Dim srng As RangeSet srng = Range(“B1:D500")
For Each r In srng
'列単位昇順並べ替え
r.Resize(, 6).Sort Key1:=r, _
Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlLeftToRight, _
SortMethod:=xlPinYin, DataOption1:=xlSortNormal
Next
End Sub
引用元の記事は2009年の投稿ですが、最新のExcelでも動くプログラムであることは確認済です。
ただ、「1行ピックアップして列単位に並び替え→次の行へ」という処理を地道に繰り返すため実行には時間がかかります。
1500行のデータに対して実行したときは、途中で本当に動いてるのか不安になって【Esc】ボタン押してマクロを停止させたりしちゃいましたが、時間がかかるだけでシッカリ動いてくれてましたよ。
まとめのヒトコト
Excelマクロは苦手です。なのでメモメモ。