EXCEL VBA 並べ替え(SORT)。

2018年11月16日

EXCEL VBAでの並べ替え(SORT)の方法です。

一番簡単でかっこいい並べ替えは以下なのですが、弱点が3個までしか指示ができないので自分はあまり使いません。
4個以上に変更されたとき、後々面倒なので…。
といいつつも、やり方はあります。3個ずつ区切って逆から並べ替えればできます。ややこしいんで間違えそうですけどね。
例)並べ替えたい順番、A→B→C→D→E
D→Eやって
A→B→Cやる
で順番になります。

基本パターン

パラメーター
昇順 → order1:=xlAscending 
降順 → order1:=xlDescending

ヘダーあり → Header:=xlYes
ヘダーなし → Header:=xlNo

ググって頂ければ詳細はたくさんあります。

sortを1行でくくるやり方

    Sheets("DATA").Select
    Range("A1").Select
    With Range("A1").CurrentRegion
      .Sort key1:=.Columns(1), order1:=xlAscending, Header:=xlYes, _
            key2:=.Columns(2), order2:=xlAscending, Header:=xlYes, _
            key3:=.Columns(3), order3:=xlAscending, Header:=xlYes
    End With

か、sortを1個づつ(反対から)のやり方。結果は一緒です。

    Sheets("DATA").Select
    Range("A1").Select
    With Range("A1").CurrentRegion
      .Sort key1:=.Columns(3), order1:=xlAscending, Header:=xlYes
      .Sort key1:=.Columns(2), order2:=xlAscending, Header:=xlYes
      .Sort key1:=.Columns(1), order3:=xlAscending, Header:=xlYes
    End With

その他パターン

マクロを記録してSORTすると以下と同じようなものが、作成されます。
AパターンとBパターンは同じ動作をします。
EXCELの頭からデータがあればA、Bで良いのですが、途中から始まっている場合はBパターンをCパターンの形に変更させます。
【注意】最大数を指定しています。最近のパソコンはスペックが良いのでマックス行でよいと思いますが、事前に最大行数が判明していれば、その数で指定したほうが良いかと思います。
わかりづらいかな?えーと…
並べ替えをマクロで記録して、それを生成すると分かりやすいですね。

Aパターン

    Columns("A:W").Select
    ActiveWorkbook.Worksheets(mySheetName001).Sort.SortFields.Clear
    ActiveWorkbook.Worksheets(mySheetName001).Sort.SortFields.Add Key:=Range( _
        "P:P"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveWorkbook.Worksheets(mySheetName001).Sort.SortFields.Add Key:=Range( _
        "F:F"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveWorkbook.Worksheets(mySheetName001).Sort.SortFields.Add Key:=Range( _
        "G:G"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveWorkbook.Worksheets(mySheetName001).Sort.SortFields.Add Key:=Range( _
        "H:H"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets(mySheetName001).Sort
        .SetRange Range("A:W")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Bパターン


    Columns("A:W").Select
    ActiveWorkbook.Worksheets(mySheetName001).Sort.SortFields.Clear
    ActiveWorkbook.Worksheets(mySheetName001).Sort.SortFields.Add Key:=Range( _
        "P1:P500000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveWorkbook.Worksheets(mySheetName001).Sort.SortFields.Add Key:=Range( _
        "F1:F500000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveWorkbook.Worksheets(mySheetName001).Sort.SortFields.Add Key:=Range( _
        "G1:G500000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveWorkbook.Worksheets(mySheetName001).Sort.SortFields.Add Key:=Range( _
        "H1:H500000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets(mySheetName001).Sort
        .SetRange Range("A1:W500000")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("A1").Select

Cパターン


    Sheets("NEW_PICUP").Select
    Range("A2").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    ActiveWorkbook.Worksheets("NEW_PICUP").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("NEW_PICUP").AutoFilter.Sort.SortFields.Add Key:= _
        Range("G3:G1000000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
        :=xlSortNormal
    ActiveWorkbook.Worksheets("NEW_PICUP").AutoFilter.Sort.SortFields.Add Key:= _
        Range("E3:E1000000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
        :=xlSortNormal
    ActiveWorkbook.Worksheets("NEW_PICUP").AutoFilter.Sort.SortFields.Add Key:= _
        Range("B3:B1000000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
        :=xlSortNormal
    ActiveWorkbook.Worksheets("NEW_PICUP").AutoFilter.Sort.SortFields.Add Key:= _
        Range("C3:C1000000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
        :=xlSortNormal
    With ActiveWorkbook.Worksheets("NEW_PICUP").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("A2").Select

VBA(マクロ)

Posted by master