エクセルVBAで4つ以上並べ替えする方法

データの操作 データの操作

エクセル(Excel)を使っていて、成績表の順位などでよく使うのが表のデータを並べ替えですよね。

もちろんVBAを使わなくてもエクセルの標準機能で並べ替えはできるのですが、並べ替えるたびに優先順位を付けたり、数値の大きい順や小さい順などの設定をするのも面倒ですし、並べ替え優先項目がたくさんあると面倒ですね。

波乗りアヒル
波乗りアヒル

そこでVBAを使って一発で並べ替えができるととても便利なのですが、項目が4つ以上になるとVBAでは対応できなくて困ったことありませんか?

ちょっと工夫すればVBAで4つ以上の項目でも並べ替えできますよ

スポンサーリンク

スポンサーリンク

エクセル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

例えば下の図のような成績表があり、登録順で並んでいます。

列の割り当ては以下の通りです。

この表を使って並べ替えVBAコードを書いていきます。

  • A列(順位)
  • B列(登録順)
  • C列(チーム名)
  • D列(勝ち点)
  • E列(得失点差)
  • F列(総得点)
  • G列(総失点)

B列の登録順は元々の並べに戻すときに使うので必要ないかもしれませんが、用意しておくと便利です。

また、表の見栄えからVBAコード記述終了後は非表示にするとスッキリしますね。

波乗りアヒル
波乗りアヒル

順位・登録順は最初に番号を割り当ててもいいのですが、自動的に連番を割り振ることもできますが、詳細はここでは省略します。

1つだけの並べ替え

勝ち点の多いチーム順に並べ替えてみましょう。

表のA列(順位)は並べ替える必要が無いので、データの並べ替えの範囲は「B2:G23」となります。

Private Sub CommandButton1_Click()
Range(“B2:G23”).Sort Key1:=Range(“D3”), Order1:=xlDescending
End Sub
  1. コマンドボタン1を押したら
  2. 並び替え範囲(“B2:G23”)の表の中をセルD3の列を優先して、大きい順に並べ替えを実行する
  3. マクロ記述終了

これで、勝ち点の多い順に並べ替えができました。

ただ、勝ち点順しか並べ替えしていないので勝ち点同数の場合に思い通りに並べ変わっていませんので、1つの並べ替えでは目標達成されていません。

勝ち点が同点の場合に得失点差が大きい方が上位になるように2つ目の並べ替え項目を同時にできるようにVBAコードを付け足しましょう。

波乗りアヒル
波乗りアヒル

ユーザーフォームが開いているシートとは別のシートの表の範囲を並べ替える時は、上記のコードのままでは並べ替えはできません。

並べ替えたい表の範囲を指定する前にシートを指定するコードを書き足しておきましょう。

Private Sub CommandButton1_Click()
Worksheets(“sheet2”).Activate
Range(“A1”).Select
Range(“B2:G23”).Sort Key1:=Range(“D3”), Order1:=xlDescending
End Sub

この場合、ユーザーフォームが開いているシートが「sheet1」の時に並べ替えの表があるのが「sheet2」の時とします。

2つの並べ替え

先ほどの1つだけ(勝ち点)のみで並べ替えた場合、同点になる場合があるので下記のようにします。

  1. 勝ち点が多いチーム順(D列)
  2. 勝ち点が同点の場合に得失点差の多いチーム順(E列)
Private Sub CommandButton1_Click()
Range(“B2:G23”).Sort Key1:=Range(“D3”), Order1:=xlDescending, Key2:=Range(“E3”), Order2:=xlDescending
End Sub
  1. コマンドボタン1を押したら
  2. 並べ替える範囲(“B2:G23”)の表の中をセルD3の列を優先して、大きい順に並べ替えを実行する
  3. セルE3の列を2番目に優先して、大きい順に並べ替えを実行する
  4. マクロ記述終了

これで、勝ち点の多い順に並べ替えて、同点の場合は得失点差が大きい順に並べ替えができました。

ただ、これでも勝ち点も一緒で得失点差も一緒の場合があるので3つ目の項目を設定が必要ですね。

総得点が多い方を上位にするというルールを決めた場合で3つ目の項目を設定しましょう。

3つの並べ替え

ほとんどの場合、並べ替えは2つの項目を作っておけば困ることは無いのですが、たまに3つ必要になりますね。

最初にお話しした通り、エクセルVBAのSortメゾットには標準で3つ目までの項目を設定して並べ替えができます。

勝ち点も一緒、得失点差も一緒、3つ目に総得点の多いチーム(F列)を上位にするというルールにします。

  1. 勝ち点が多いチーム順(D列)
  2. 勝ち点が同点の場合に得失点差の多いチーム順(E列)
  3. 総得点の多いチーム(F列)
Private Sub CommandButton1_Click()
Range(“B2:G23”).Sort Key1:=Range(“D3”), Order1:=xlDescending, Key2:=Range(“E3”), Order2:=xlDescending, Key3:=Range(“F3”), Order3:=xlDescending
End Sub
  1. コマンドボタン1を押したら
  2. 並べ替える範囲(“B2:G23”)の表の中をセルD3の列を優先して、大きい順に並べ替えを実行する
  3. セルE3の列を2番目に優先して、大きい順に並べ替えを実行する
  4. セルF3の列を3番目に優先して、大きい順に並べ替えを実行する
  5. マクロ記述終了

これで、勝ち点の多い順に並べ替えて、同点の場合は得失点差が大きい順に並べ替えができました。

ただ、これでも勝ち点も一緒で得失点差も一緒の場合があるので3つ目の項目を設定が必要ですね。

総得点が多い方を上位にするというルールを決めた場合で3つ目の項目を設定しましょう。

スポンサーリンク


4つの並べ替え

マイクロソフトさんもレアケースとして4つ目以降のVBA並べ替えは設定していないのですかね。

確かに私自身も4つ目までの並べ替えは1回しか使ったことがありません。

波乗りアヒル
波乗りアヒル

簡単にkey4なんてコード書いたらエラーになってすごく困った記憶がありますね。

エクセルを学校などで習って勉強しているわけではないので、loopの時と一緒で複雑なコードを一括でまとめて書けないので、分けてコードを書いてみたらうまく4つ目もできるようになったので書いています。

その為に、一般的な正しいVBAの4つ以上の並び替えかどうかは分かりません。

波乗りアヒル
波乗りアヒル

できたから良しとしています。

勝ち点も一緒、得失点差も一緒、総得点も一緒、総失点の少ないチーム(F列)を上位にします。

  1. 勝ち点が多いチーム順(D列)
  2. 勝ち点が同点の場合に得失点差の多いチーム順(E列)
  3. 総得点の多いチーム順(F列)
  4. 総失点の少ないチーム順(G列)

並べ替えのsortメゾットは3つまでは一括でできるので、1つ足りない状況です。

それならば、足りない4つ目の項目【総失点】の少ない順だけを並べ替えます。

Private Sub CommandButton1_Click()
Range(“B2:G23”).Sort Key1:=Range(“G3”), Order1:=xlAscending
End Sub
  1. コマンドボタン1を押したら
  2. 並べ替える範囲(“B2:G23”)の表の中をセルG3の列を優先して、小さい順に並べ替えを実行する
  3. マクロ記述終了

これで、総失点の少ない順に並べ替えができました。

この方法は最初にお話しした1つだけの項目を並べ替えるのと一緒です。

違いは小さい順(xlAscending)を使っていることですね。

次に残りの項目を優先順位key1,key2,key3で並べ替えれば、完成です。

先ほどの3つの並べ替えのコードを使えば大丈夫です。

それでは、4つの項目をコマンドボタン1回で済ませるコードにまとめてみましょう。

実際このコードで何の問題もなく実行できています。

Private Sub CommandButton1_Click()
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. コマンドボタン1を押したら
  2. 並べ替える範囲(“B2:G23”)の表の中をセルG3の列を優先して、小さい順に並べ替えを実行する
  3. 並べ替える範囲(“B2:G23”)の表の中をセルD3の列を優先して、大きい順に並べ替えを実行する
  4. セルE3の列を2番目に優先して、大きい順に並べ替えを実行する
  5. セルF3の列を3番目に優先して、大きい順に並べ替えを実行する
  6. マクロ記述終了


これで、4つの項目をボタン一つで1発で並び替えができるようになりました。

波乗りアヒル
波乗りアヒル

5つの並び替え項目があった場合を試してみましたが、その場合は優先項目が低い4番目と5番目をまず並び替えを行ってから、最優先・2番目・3番目を並び替えれば、5つもできますよ。