エクセルVBAで4つ以上並べ替えする方法
エクセル(Excel)を使っていて、成績表の順位などでよく使うのが表のデータを並べ替えですよね。
もちろんVBAを使わなくてもエクセルの標準機能で並べ替えはできるのですが、並べ替えるたびに優先順位を付けたり、数値の大きい順や小さい順などの設定をするのも面倒ですし、並べ替え優先項目がたくさんあると面倒ですね。
そこでVBAを使って一発で並べ替えができるととても便利なのですが、項目が4つ以上になるとVBAでは対応できなくて困ったことありませんか?
スポンサーリンク
エクセルVBAで並べ替え
エクセルの標準機能では4つ以上の項目でも並べ替えができるのですが、エクセルVBAでは3つまでしか項目設定できません。
そこでVBAコードの書き方をちょっと工夫するだけで4つ以上の項目があっても、並べ替えができるようになります。
まずは、基本的な3つまでの項目でのエクセルVBAの並べ替え方法からおさらいしましょう。
Sortメソッド
並べ替えをしたい表(セルの範囲)を指定する方法はSortメソッドを使用します。
主に使用する項目は下記の通りで、1度に3つの列の並べ替えが指定・実行できますが4つ以上はできないのでちょっとした工夫が必要です。
並べ替えるセルの範囲を指定する | Range |
最優先で並べ替える列を指定する | Key1 |
2番目に優先して並べ替える列を指定する | Key2 |
3番目に優先して並べ替える列を指定する | Key3 |
Key1で指定した列の並べ替えの降順・昇順を指定する | Order1 |
Key2で指定した列の並べ替えの降順・昇順を指定する | Order2 |
Key3で指定した列の並べ替えの降順・昇順を指定する | Order3 |
降順(大きい順)を指定 | xlDescending |
昇順(小さい順)を指定 | xlAscending |
例えば下の図のような成績表があり、登録順で並んでいます。
B列の登録順は元々の並べに戻すときに使うので必要ないかもしれませんが、用意しておくと便利です。
また、表の見栄えからVBAコード記述終了後は非表示にするとスッキリしますね。
順位・登録順は最初に番号を割り当ててもいいのですが、自動的に連番を割り振ることもできますが、詳細はここでは省略します。
1つだけの並べ替え
勝ち点の多いチーム順に並べ替えてみましょう。
表のA列(順位)は並べ替える必要が無いので、データの並べ替えの範囲は「B2:G23」となります。
Range(“B2:G23”).Sort Key1:=Range(“D3”), Order1:=xlDescending
End Sub
- コマンドボタン1を押したら
- 並び替え範囲(“B2:G23”)の表の中をセルD3の列を優先して、大きい順に並べ替えを実行する
- マクロ記述終了
これで、勝ち点の多い順に並べ替えができました。
ただ、勝ち点順しか並べ替えしていないので勝ち点同数の場合に思い通りに並べ変わっていませんので、1つの並べ替えでは目標達成されていません。
勝ち点が同点の場合に得失点差が大きい方が上位になるように2つ目の並べ替え項目を同時にできるようにVBAコードを付け足しましょう。
ユーザーフォームが開いているシートとは別のシートの表の範囲を並べ替える時は、上記のコードのままでは並べ替えはできません。
並べ替えたい表の範囲を指定する前にシートを指定するコードを書き足しておきましょう。
Worksheets(“sheet2”).Activate
Range(“A1”).Select
Range(“B2:G23”).Sort Key1:=Range(“D3”), Order1:=xlDescending
End Sub
この場合、ユーザーフォームが開いているシートが「sheet1」の時に並べ替えの表があるのが「sheet2」の時とします。
2つの並べ替え
先ほどの1つだけ(勝ち点)のみで並べ替えた場合、同点になる場合があるので下記のようにします。
- 勝ち点が多いチーム順(D列)
- 勝ち点が同点の場合に得失点差の多いチーム順(E列)
Range(“B2:G23”).Sort Key1:=Range(“D3”), Order1:=xlDescending, Key2:=Range(“E3”), Order2:=xlDescending
End Sub
- コマンドボタン1を押したら
- 並べ替える範囲(“B2:G23”)の表の中をセルD3の列を優先して、大きい順に並べ替えを実行する
- セルE3の列を2番目に優先して、大きい順に並べ替えを実行する
- マクロ記述終了
3つの並べ替え
ほとんどの場合、並べ替えは2つの項目を作っておけば困ることは無いのですが、たまに3つ必要になりますね。
最初にお話しした通り、エクセルVBAのSortメゾットには標準で3つ目までの項目を設定して並べ替えができます。
勝ち点も一緒、得失点差も一緒、3つ目に総得点の多いチーム(F列)を上位にするというルールにします。
- 勝ち点が多いチーム順(D列)
- 勝ち点が同点の場合に得失点差の多いチーム順(E列)
- 総得点の多いチーム(F列)
Range(“B2:G23”).Sort Key1:=Range(“D3”), Order1:=xlDescending, Key2:=Range(“E3”), Order2:=xlDescending, Key3:=Range(“F3”), Order3:=xlDescending
End Sub
- コマンドボタン1を押したら
- 並べ替える範囲(“B2:G23”)の表の中をセルD3の列を優先して、大きい順に並べ替えを実行する
- セルE3の列を2番目に優先して、大きい順に並べ替えを実行する
- セルF3の列を3番目に優先して、大きい順に並べ替えを実行する
- マクロ記述終了
スポンサーリンク
4つの並べ替え
マイクロソフトさんもレアケースとして4つ目以降のVBA並べ替えは設定していないのですかね。
確かに私自身も4つ目までの並べ替えは1回しか使ったことがありません。
簡単にkey4なんてコード書いたらエラーになってすごく困った記憶がありますね。
エクセルを学校などで習って勉強しているわけではないので、loopの時と一緒で複雑なコードを一括でまとめて書けないので、分けてコードを書いてみたらうまく4つ目もできるようになったので書いています。
その為に、一般的な正しいVBAの4つ以上の並び替えかどうかは分かりません。
できたから良しとしています。
勝ち点も一緒、得失点差も一緒、総得点も一緒、総失点の少ないチーム(F列)を上位にします。
- 勝ち点が多いチーム順(D列)
- 勝ち点が同点の場合に得失点差の多いチーム順(E列)
- 総得点の多いチーム順(F列)
- 総失点の少ないチーム順(G列)
並べ替えのsortメゾットは3つまでは一括でできるので、1つ足りない状況です。
それならば、足りない4つ目の項目【総失点】の少ない順だけを並べ替えます。
Range(“B2:G23”).Sort Key1:=Range(“G3”), Order1:=xlAscending
End Sub
- コマンドボタン1を押したら
- 並べ替える範囲(“B2:G23”)の表の中をセルG3の列を優先して、小さい順に並べ替えを実行する
- マクロ記述終了
それでは、4つの項目をコマンドボタン1回で済ませるコードにまとめてみましょう。
実際このコードで何の問題もなく実行できています。
Range(“B2:G23”).Sort Key1:=Range(“G3”), Order1:=xlAscending
Range(“B2:G23”).Sort Key1:=Range(“D3”), Order1:=xlDescending, Key2:=Range(“E3”), Order2:=xlDescending, Key3:=Range(“F3”), Order3:=xlDescending
End Sub
- コマンドボタン1を押したら
- 並べ替える範囲(“B2:G23”)の表の中をセルG3の列を優先して、小さい順に並べ替えを実行する
- 並べ替える範囲(“B2:G23”)の表の中をセルD3の列を優先して、大きい順に並べ替えを実行する
- セルE3の列を2番目に優先して、大きい順に並べ替えを実行する
- セルF3の列を3番目に優先して、大きい順に並べ替えを実行する
- マクロ記述終了
これで、4つの項目をボタン一つで1発で並び替えができるようになりました。
5つの並び替え項目があった場合を試してみましたが、その場合は優先項目が低い4番目と5番目をまず並び替えを行ってから、最優先・2番目・3番目を並び替えれば、5つもできますよ。