Excel。VBA。並べ替えを4つ以上の列で実行したいけど、どうやったらいいの
<Excel VBA:SORT>
並べ替えを4つ以上の列で実行したい場合は、条件を優先順位の逆で実行すれば、並べ替えることができます。
ただ、列数が増えると、順番がわからなくなったりするので、処理が面倒といえば面倒です。
次の表を用意しました。
この表を使って、Excel VBA でプログラム文をつくって、「地域→フリガナ→売上高→販売日)」という優先順位で並べ替えを実行します。
また、売上高は降順で、それ以外は、昇順とします。
Sub 並べ替え4列()
Dim hani As Range
Dim sortorder As Variant
Dim i As Long
Dim lastrow As Long
lastrow = Cells(Rows.Count, "a").End(xlUp).Row
Range("d2", Cells(lastrow, "d")).SetPhonetic
Set hani = Range("a1").CurrentRegion
sortorder = Array("販売日", "売上高", "フリガナ", "地域")
For i = 2 To lastrow
Range("f" & i) = Range("d" & i).Phonetic.Text
Next
i = 0
With hani
For i = 0 To UBound(sortorder)
If i = 1 Then
.Sort key1:=sortorder(i), order1:=xlDescending, Header:=xlGuess
Else
.Sort key1:=sortorder(i), order1:=xlAscending, Header:=xlGuess
End If
Next
End With
End Sub
では、実行してみましょう。
希望通りに4列での並べ替えを実行することができました。
では、プログラム文を見ていきます。
変数宣言です。
Dim hani As Range
Dim sortorder As Variant
Dim i As Long
Dim lastrow As Long
データの最後の行番号を取得します。繰り返しで使用します。
lastrow = Cells(Rows.Count, "a").End(xlUp).Row
店舗名で並べ替えを実行したいのですが、データを別のアプリケーションからもってきたとか、フリガナデータがないかもしれません。
フリガナデータを設定します。
Range("d2", Cells(lastrow, "d")).SetPhonetic
SetPhoneticメソッドでフリガナデータを設定できます。
並べ替えを実行する範囲を、変数haniに代入します。
Set hani = Range("a1").CurrentRegion
sortorderに、優先順位と逆の順番で、配列に設定します。
sortorder = Array("販売日", "売上高", "フリガナ", "地域")
Arrayは配列という意味です。
For i = 2 To lastrow
Range("f" & i) = Range("d" & i).Phonetic.Text
Next
フリガナの列にフリガナが表示されていないので、表示させます。
店舗名にフリガナデータがありますので、それをF列に表示させるというのは、PHONETIC関数と同じ考え方です。
ここからが、並べ替えの本体です。
i = 0
念のため、変数iを0で初期化します。
なぜ、1ではないのかというと、次に配列を使うからです。
配列は0(ゼロ)から始まるからです。
With hani ~ End With
With文で、haniという変数を繰り返えして入力する手間を省いています。
For文です。配列の0番目から処理を始めます。
UBound(sortorder)は、sortorderの最大値を算出することができます。
UBoundは、配列の時に知っていると便利です。
すべて、昇順や降順ならば、If~Else~EndIf分は不要ですが、今回は、売上高を降順にしたいので、If文をつかって、条件分岐をしています。
sortorder = Array("販売日", "売上高", "フリガナ", "地域")なので、
販売日がsortorder(0)
売上高がsortorder (1)
フリガナがsortorder (2)
地域がsortorder (3)
と配列に代入されています。
iが1。
つまり、売上高フィールドならば、
.Sort key1:=sortorder(i), order1:=xlDescending, Header:=xlGuess
それ以外は、
.Sort key1:=sortorder(i), order1:=xlAscending, Header:=xlGuess
という処理をしています。
大きなデータになると、4列以上で並べ替えを行うことがありますので、処理が煩雑でわかりにくいと感じたら、Excel VBAでプログラムをつくってみてもいいかもしれませんね。