Sortオブジェクトの概要
Sortオブジェクトは、指定した列の値による並べ替えを行います。
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」の間に記述された以下の条件でソートを行います。
- ソートを行う領域を、社員一覧シートのA1セルを含む表領域とします。
- ソート領域にソートが設定されている場合、ソートの設定を外します。
- 第1ソートキーを社員一覧シートのF列(役職コード)とし、降順でソートします。
- 第2ソートキーを社員一覧シートのA列(社員番号)とし、昇順でソートします。
- ヘッダーが存在するので、2行目以降でソートします。
- 上記の条件で、ソートを適用します。
[応用編] 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
上記のマクロを実行すると、以下の結果となります。
[応用編] ソースコードの解説
開始行数 | 終了行数 | 処理概要 |
---|---|---|
17 | 25 | マクロシートに記載された入力ファイルをOpenし、 入力ファイル用のワークブック変数、ワークシート変数を設定する。 |
27 | 34 | 一連のソート処理を実行している。 |
36 | 36 | 入力ファイルをCloseしている。 |
38 | 44 | 後処理を行っている。 |
[次の記事]