8/21/2021

Excel。VBA。並べ替えを4つ以上の列で実行したいけど、どうやったらいいの【SORT】

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でプログラムをつくってみてもいいかもしれませんね。