Excel VBA 複数条件で並び替えする(Sortオブジェクト)

ExcelVBA-基礎編

今回は「Sort」オブジェクトを使用して、シート上のデータを複数条件で並び替えする方法をご紹介します。

並び替えは見た目の順番を変えるだけではなく、本領を発揮するのは膨大なデータの前処理など、処理時間が長くなってしまう処理なども、並び替えを組み込むことで高速化する事も可能なところではないかと思います。

また、プログラムで並び替えを行うには意外と面倒でデータ量が多いと処理時間が長くなってしまいます。

それをExcelの並び替え機能を使用することで、非常に高速に簡易に処理できますので、ぜひ覚えておきたい機能です。

Sort(ソート)の詳細については「Sort(ソート)でデータを並び替えする」をご覧ください。

1.Sortオブジェクトで並び替えをする方法

並び替えの手順

Sortオブジェクトで並び替えする方法は、Excel2007から「SortFieldオブジェクト」で条件を指定して、「Sortオブジェクト」で条件に合わせて並び替えをするという2段構造で行います。

もう少し細かい手順を見てみると、並び替えは次のような手順で行います。

4つの工程もあると難しそうに感じますが、一つ型を覚えてしまえば簡単です。

この方法は条件が複数条件であっても、単一の条件であっても同じです。

  • シートをアクティブにする
  • 並び替え条件をクリア
  • 「SortFieldオブジェクト」で複数の条件を指定
  • 「Sortオブジェクト」で条件に合わせて並び替え

複数条件で並び替えをする方法

複数条件で並び替える場合は、指定したい条件数分、「SortFieldオブジェクト」で条件を指定します。

指定する条件は指定した順番に優先順位が上になります。

以前は3つまでしか条件指定出来ませんでしたが、Excel2007以降は4つ以上(最大64個?)の条件であっても一度に指定する事が可能です。

では、一つずつ方法を見ていきます。

並び替え条件をクリア

前回の条件をクリアするためには、次のように記述します。

ActiveSheet.Sort.SortFields.Clear
複数の条件を指定

Sort.SortFields.Add」で条件を追加して、各引数で並び替えの詳細を設定します。

下記コードが条件指定の基本となりますので、こちらも覚えておいた方が良いです。

ActiveSheet.Sort.SortFields.Add _
            Key:=ActiveSheet.Cells(1, 1), _
            SortOn:=xlSortOnValues, _
            Order:=xlAscending, _
            DataOption:=xlSortNormal

引数一覧です。

引数名必須/省略説明
Key必須並べ替えの基準セルを指定します。
SortOn省略可能並べ替えのタイプを指定します。
Order省略可能並べ替えの順序を指定します。
CustomOrder省略可能ユーザー設定の並べ替え順序を指定します。
DataOption省略可能数値と文字列の並べ替え基準を指定します。
条件に合わせて並び替え

SetRange」で並び替えをするデータ範囲を指定します。

Apply」で指定した条件で並び替えを実行します。

With ActiveSheet.Sort
    .SetRange Range(Cells(1, 1), Cells(10, 3))
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

Sortオブジェクトの引数は次の通りです。

引数名必須/省略説明
Header省略可能先頭行をタイトルにするか指定します。
MatchCase省略可能大文字と小文字を区別するか指定します。
Orientation省略可能並び替えの方向を指定します。
SortMethod省略可能ふりがなを使うか指定します。

3.複数条件で並び替えるサンプルコード

並び替えをするためのサンプルデータです。

項目1~項目4のそれぞれバラバラに並んでいるデータを用意しています。

こちらのデータを複数の条件を指定して、並び替えしたいと思います。

サンプルコード

上記のデータを項目1~項目3の優先度で並び替えします。

複数の条件で並び替えるには、優先度の高い条件から順に条件を指定します。

下記コードをそのままひな形として覚えてしまって、選択範囲を変える程度でもよいかもしれません。

Sub Sample1()

With ActiveSheet '対象シートをアクティブにする
    
    .Sort.SortFields.Clear '並び替え条件をクリア
    
    '項目1
    .Sort.SortFields.Add _
        Key:=ActiveSheet.Cells(1, 1), _
        SortOn:=xlSortOnValues, _
        Order:=xlAscending, _
        DataOption:=xlSortNormal
        
    '項目2
    .Sort.SortFields.Add _
        Key:=ActiveSheet.Cells(1, 2), _
        SortOn:=xlSortOnValues, _
        Order:=xlAscending, _
        DataOption:=xlSortNormal
    
    '項目3
    .Sort.SortFields.Add _
        Key:=ActiveSheet.Cells(1, 3), _
        SortOn:=xlSortOnValues, _
        Order:=xlAscending, _
        DataOption:=xlSortNormal
        
    With .Sort '並び替えを実行する
        .SetRange Range(Cells(1, 1), Cells(13, 4))
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        
    End With
    
End With

End Sub
コードの説明

With ActiveSheet」でシートをアクティブにします。

並び替えをするシートをアクティブにしないとエラーになります。

.Sort.SortFields.Clear」で並び替え条件をクリアします。

並び替えの条件は記録されてしまうため、前回の条件が残っている可能性があるため、一度条件をクリアする事で前回の条件を引き継ぐ可能性を回避します。

続いて、優先順位の高い順に条件となる列を指定します。

.Sort.SortFields.Add」で並び替えの列の指定と設定を指定します。

条件となる設定の詳細は次の通りです。

「Key」並べ替えの基準セルを指定します。

「SortOn」並べ替えのタイプを指定します。

「Order」並べ替えの順序を指定します。

「DataOption」数値と文字列の並べ替え基準を指定します。

並び替えを実行する指定は次の通りです。

「SetRange」並び変えるデータ範囲を指定します 。

「Header」先頭行をタイトルにするか指定します。

「MatchCase」大文字と小文字を区別するか指定します。

「Orientation」並び替えの方向を指定します。

「SortMethod」ふりがなを使うか指定します。

これで複数の条件で並び替えができました。

記述するコードが長い分、難しく感じますが形が決まっていますのでそのまま覚えてしまえばOKです。

タイトルとURLをコピーしました