【VBA】14.2 並べ替え機能(Sortオブジェクト)を使ってみよう!

目次

Sortオブジェクトの概要

Sortオブジェクトは、指定した列の値による並べ替えを行います。
Sortオブジェクトは、Excel上の「ユーザー設定の並べ替え」と同等の機能を実現します。

Sortイメージ
Excel画面上の並べ替え機能

注意 この章で解説しているSortオブジェクトは、Sortメソッドとは異なります。2つの違いは以下の通りです。

Sort種別特徴
SortオブジェクトExcel2007で追加された、新しいソート機能です。
Sortメソッドに比べ、設定可能なソートキーの数が大幅に増えており(最大64個まで設定可能)、機能の増えています
上記の理由により、emalaboではこちらのご利用を強くお勧めします
SortメソッドExcelが発売された当初から存在する、古いソート機能です。
設定可能なソートキーが、最大3つまでとなっています。

なお以下の解説では、並べ替えのことを「ソート」と表現します。

[overdoserの経験則] Sortオブジェクトを実際の業務で使用するケース

実際の業務で使用されるExcelマクロでは、日付や日時でのソートや何らかのコード値や集計値でのソートなどで、Sortオブジェクトを使用する頻度が高いと思われます。

  • 複数サーバーで構成されている社内システムが出力しているCSV形式のアクセスログファイルを、Excelマクロでサーバー台数分読み込み、1つのワークシート上に展開後、1列目に出力されている日時でソートし、整形後、Excel形式の出力ファイルを作成する。

  • 会社の人事関連の部署が事業部名ー部署名のツリー構造を作成し、事業部毎の部署の数などを把握するため、Excelマクロで会社の組織マスタデータを第1ソートキーを事業部コード、第2ソートキーを部署コードでソートした後、ソート以外の機能で事業部コード、部署コードをそれぞれ名称に変換したり、事業部や部署の数をカウントすることにより、人事関連の部署の求める資料を作成する。

Sortオブジェクトの構文

Sortオブジェクトの構文は以下の通りで、With~End Withまでで1セットとなります。
(ソートを実行する表領域の1行目をヘッダー行とし、A列で並べ替えを行う場合とする。)

With ワークシート変数.Sort

 .SortFields.Clear

 .SortFields.Add Key:=ワークシート変数.Range(“A2″), SortOn:=”設定値”, Order:=”設定値”

 .SetRange ワークシート変数.Range(“A1”).CurrentRegion

 .Header = xlYes

 .Apply

End With

キーワード解説
SortFieldsワークシート変数で設定されているワークシート上のソートを行う表領域を指します。
SortFields.Clearソートを行う表領域にソートの設定がされている場合、ソートの設定を解除します。
SortFields.Addソートを行う表領域に対して、ソートの設定を行います。
ソートキーを複数設定する場合、ソートキーの数だけSortFields.Addの行を列挙します。
ソートキーを2つ設定した場合、まず1つ目のソートキーで並べ替えを行い、値が同じものについて2つ目のソートキーで並べ替えを行い、出力されます。
Keyソートキーを設定する列を指定します。
指定の方法は、ソートを行う列の実データの先頭セル(ヘッダーのセルではないを設定します
SortOnソートを行う基準をXlSortOnクラスの定数で設定します。
値でソートを行う場合は、省略可能です。
Orderソートの順番(昇順 or 降順)を設定します。
昇順の場合は「xlAscending」、降順の場合は「xlDescending」を設定します。
省略した場合は、「xlAscending」とみなされます。
SetRangeソートを行うワークシート上の表領域を指定します。
Headerヘッダー行の有無を設定します。
ヘッダー行がある場合は「xlYes」、ヘッダー行がない場合は「xlNo」を設定します。
Apply上記の条件でソートの適用を行います。

注意 SortFields.Addの引数には上記以外に、「CustomOrder」と「DataOption」もありますが、使用頻度が低いため、割愛しました。

Sortオブジェクトの使用例

Sortオブジェクトを実際に使用した例は、以下の通りです。

    With ws_employeelist.Sort
        .SortFields.Clear
        .SortFields.Add Key:=ws_employeelist.Range("F2"), Order:=xlDescending
        .SortFields.Add Key:=ws_employeelist.Range("A2")
        .SetRange ws_employeelist.Range("A1").CurrentRegion
        .Header = xlYes
        .Apply
    End With

上記のサンプルコードは、以下の処理を行っています。

  • 社員一覧シートに対して、「With ~ End With」の間に記述された以下の条件でソートを行います。
    1. ソートを行う領域を、社員一覧シートのA1セルを含む表領域とします。
    2. ソート領域にソートが設定されている場合、ソートの設定を外します。
    3. 第1ソートキーを社員一覧シートのF列(役職コード)とし、降順でソートします。
    4. 第2ソートキーを社員一覧シートのA列(社員番号)とし、昇順でソートします。
    5. ヘッダーが存在するので、2行目以降でソートします。
    6. 上記の条件で、ソートを適用します。

[応用編] Sortオブジェクトを用いたコーディング例

以下のソースコードは、上記の使用例をサンプルプログラムに組み込み、実際に動作するようにしたものです。

Option Explicit

Sub make_retireelist()

    Dim ws_macro As Worksheet
    Dim ws_work As Worksheet
    Dim wb_inputfile As Workbook
    Dim ws_employeelist As Worksheet
    Dim path_inputfile As String
    Dim num_row As Long
    
    Application.ScreenUpdating = False

    Set ws_macro = ThisWorkbook.Worksheets("退職者一覧作成マクロ")
    Set ws_work = ThisWorkbook.Worksheets("work")
    
    If Right(ws_macro.Range("D3"), 1) <> "\" Then
        path_inputfile = ws_macro.Range("D3") & "\" & ws_macro.Range("C3")
    Else
        path_inputfile = ws_macro.Range("D3") & ws_macro.Range("C3")
    End If
    
    Workbooks.Open Filename:=path_inputfile
    Set wb_inputfile = ActiveWorkbook
    Set ws_employeelist = ActiveWorkbook.Worksheets("社員一覧")
    
    With ws_employeelist.Sort
        .SortFields.Clear
        .SortFields.Add Key:=ws_employeelist.Range("F2"), Order:=xlDescending
        .SortFields.Add Key:=ws_employeelist.Range("A2")
        .SetRange ws_employeelist.Range("A1").CurrentRegion
        .Header = xlYes
        .Apply
    End With

    wb_inputfile.Close SaveChanges:=True
    
    MsgBox "社員一覧の並べ替えを行いました。"
    
    ThisWorkbook.Save
    
    ws_macro.Activate
    
    Application.ScreenUpdating = True
    
End Sub

上記のマクロを実行すると、以下の結果となります。

[応用編] ソースコードの解説

開始行数終了行数処理概要
1725マクロシートに記載された入力ファイルをOpenし、
入力ファイル用のワークブック変数、ワークシート変数を設定する。
2734一連のソート処理を実行している。
3636入力ファイルをCloseしている。
3844後処理を行っている。

[次の記事]

この記事を書いた人

某IT企業に勤務。

2年間の休職を経て、一から独学でExcel VBAを習得し、半年でExcel VBA エキスパート資格のスタンダードに一発合格。

社内の非効率的な作業を効率化するExcelマクロの開発を、全行程まるっと一人で請け負い、これまでに約100個のExcelマクロを開発し、現在も増産中。

目次