VBAにおけるソートは、データをある基準に従って並び替える処理です。
VBAでは、データ構造をソートすることができます。ここでは、データをソートする方法について説明します。
VBAにおけるデータの並び替え
VBAにおけるデータの並び替えには、ExcelオブジェクトモデルのRange
オブジェクトを使用する方法があります。Range
オブジェクトは、Excelのセル範囲を表し、Sort
メソッドを使用することで、セル範囲のデータをソートすることができます。
Range
オブジェクトを使用してデータをソートするには、以下の手順を実行します。
Range
オブジェクトを作成し、ソートする範囲を指定する。Sort
メソッドを使用して、ソート条件を指定する。- ソートされたデータを使用して、必要に応じて処理を行う。
以下は、例として、Excelのシート上のセル範囲を昇順でソートするサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub sortRange() Dim ws As Worksheet Set ws = ActiveSheet 'ソート対象のセル範囲を指定する Dim sortRange As Range Set sortRange = ws.Range("A1:B5") '昇順でソートする sortRange.Sort key1:=sortRange.Columns(1), _ order1:=xlAscending, _ header:=xlNo, _ Orientation:=xlSortColumns 'ソートされたデータを使用して、必要な処理を行う '例えば、ソートされたデータをメッセージボックスに表示する Dim cell As Range For Each cell In sortRange MsgBox cell.Value Next cell End Sub |
VBAにおけるデータの並び替えには、ExcelオブジェクトモデルのRange
オブジェクトを使用する方法があります。Range
オブジェクトは、Excelのセル範囲を表し、Sort
メソッドを使用することで、セル範囲のデータをソートすることができます。
Range
オブジェクトを使用してデータをソートするには、以下の手順を実行します。
Range
オブジェクトを作成し、ソートする範囲を指定する。Sort
メソッドを使用して、ソート条件を指定する。- ソートされたデータを使用して、必要に応じて処理を行う。
以下は、例として、Excelのシート上のセル範囲を昇順でソートするサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
vbCopy code<code>Sub sortRange() Dim ws As Worksheet Set ws = ActiveSheet 'ソート対象のセル範囲を指定する Dim sortRange As Range Set sortRange = ws.Range("A1:B5") '昇順でソートする sortRange.Sort key1:=sortRange.Columns(1), _ order1:=xlAscending, _ header:=xlNo, _ Orientation:=xlSortColumns 'ソートされたデータを使用して、必要な処理を行う '例えば、ソートされたデータをメッセージボックスに表示する Dim cell As Range For Each cell In sortRange MsgBox cell.Value Next cell End Sub |
このコードでは、Range("A1:B5")
で指定されたセル範囲を昇順でソートし、ソートされたデータをメッセージボックスに表示しています。
Sort
メソッドの引数には、key1
やorder1
など、複数のソート条件を指定することもできます。また、Sort
メソッドは、昇順・降順のほか、カスタムソートや複数列のソートなど、様々なソート条件を指定することができます。
複数条件
「VBA ソート」と調べると、複数条件という言葉が出てきます。
複数条件に関する疑問について解決してきましょう。
VBAにおいて、Excelシート上のセル範囲のデータを複数の条件でソートする場合、key1
やorder1
などの引数に複数の条件を指定することができます。
以下は、例として、Excelのシート上のセル範囲を、A列を昇順、B列を降順でソートするサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub sortRangeMultiple() Dim ws As Worksheet Set ws = ActiveSheet 'ソート対象のセル範囲を指定する Dim sortRange As Range Set sortRange = ws.Range("A1:B5") '複数条件でソートする sortRange.Sort key1:=sortRange.Columns(1), _ order1:=xlAscending, _ key2:=sortRange.Columns(2), _ order2:=xlDescending, _ header:=xlNo, _ Orientation:=xlSortColumns 'ソートされたデータを使用して、必要な処理を行う '例えば、ソートされたデータをメッセージボックスに表示する Dim cell As Range For Each cell In sortRange MsgBox cell.Value Next cell End Sub |
このコードでは、Range("A1:B5")
で指定されたセル範囲を、A列を昇順、B列を降順でソートし、ソートされたデータをメッセージボックスに表示しています。
Sort
メソッドの引数には、key1
やorder1
のように、複数の条件を指定することができます。key1
やorder1
は、1番目のソート条件を指定し、key2
やorder2
は、2番目のソート条件を指定します。同様に、key3
やorder3
を指定することで、3番目以降のソート条件を指定することもできます。
以上が、VBAにおけるExcelシート上のセル範囲の複数条件によるソート方法です。
4つ以上の複数条件
VBAにおいて、Excelシート上のセル範囲を4つ以上の条件でソートする場合、key1
、order1
、key2
、order2
、key3
、order3
、…のように、key
とorder
を交互に指定することで、任意の数の条件でソートすることができます。
以下は、例として、Excelのシート上のセル範囲を、A列を昇順、B列を降順、C列を昇順、D列を降順でソートするサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Sub sortRangeMultiple() Dim ws As Worksheet Set ws = ActiveSheet 'ソート対象のセル範囲を指定する Dim sortRange As Range Set sortRange = ws.Range("A1:D5") '複数条件でソートする sortRange.Sort key1:=sortRange.Columns(1), _ order1:=xlAscending, _ key2:=sortRange.Columns(2), _ order2:=xlDescending, _ key3:=sortRange.Columns(3), _ order3:=xlAscending, _ key4:=sortRange.Columns(4), _ order4:=xlDescending, _ header:=xlNo, _ Orientation:=xlSortColumns 'ソートされたデータを使用して、必要な処理を行う '例えば、ソートされたデータをメッセージボックスに表示する Dim cell As Range For Each cell In sortRange MsgBox cell.Value Next cell End Sub |
このコードでは、Range("A1:D5")
で指定されたセル範囲を、A列を昇順、B列を降順、C列を昇順、D列を降順でソートし、ソートされたデータをメッセージボックスに表示しています。
Sort
メソッドの引数には、key1
やorder1
のように、複数の条件を指定することができます。同様に、key2
やorder2
、key3
やorder3
、key4
やorder4
を指定することで、任意の数の条件でソートすることができます。
ユーザー定義での検索
VBAにおいて、Excelシート上のセル範囲をユーザー定義の複数条件でソートする場合は、SortFields
コレクションを使用することができます。
以下は、例として、Excelのシート上のセル範囲を、ユーザーが指定した2つの列を昇順でソートするサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
Sub sortRangeCustom() Dim ws As Worksheet Set ws = ActiveSheet 'ソート対象のセル範囲を指定する Dim sortRange As Range Set sortRange = ws.Range("A1:B5") 'ユーザーからの入力で、ソート対象の列と昇順/降順を指定する Dim sortColumns As Variant sortColumns = Application.InputBox("ソートする列を指定してください。例: A:D", Type:=2) Dim sortOrder As Variant sortOrder = Application.InputBox("昇順でソートする場合はTrue、降順でソートする場合はFalseを指定してください。", Type:=4) 'SortFieldsコレクションを使用して、複数条件でソートする Dim sortFields As SortFields Set sortFields = sortRange.Sort.SortFields Dim i As Integer For i = LBound(sortColumns) To UBound(sortColumns) Dim sortColumn As String sortColumn = sortColumns(i) Dim sortField As SortField Set sortField = sortFields.Add(sortRange.Columns(sortColumn), xlSortOnValues, xlAscending) sortField.SortOnValue.Color = RGB(255, 0, 0) sortField.SortOnValue.TintAndShade = 0 sortField.SortOnValue.PatternTintAndShade = 0 sortField.Header.SortKey = sortRange.Columns(sortColumn).Cells(1, 1).Value sortField.Header.SortOrder = sortOrder sortField.Header.SortOrientation = xlSortColumnThenRow sortField.IncludeHeader = True Next i 'ソートを実行する sortRange.Sort.Apply 'ソートされたデータを使用して、必要な処理を行う '例えば、ソートされたデータをメッセージボックスに表示する Dim cell As Range For Each cell In sortRange MsgBox cell.Value Next cell End Sub |
このコードでは、InputBox
関数を使用して、ユーザーから2つの列と昇順/降順を入力してもらい、SortFields
コレクションを使用して、ユーザーが入力した条件でソートを行っています。ソートされたデータをメッセージボックスに表示する部分は、前の例と同様です。
SortFields
コレクションは、ソート対象の範囲に対して、複数のソート条件を設定することができます。
テーブルのソート
VBAを使用して、Excelテーブルを複数条件でソートする方法について説明します。
以下のコードは、名前と年齢の2つの条件でExcelテーブルをソートする例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub sort_table() Dim tbl As ListObject Set tbl = ActiveSheet.ListObjects("Table1") ' "Table1"を自分のテーブル名に変更する With tbl.Sort .SortFields.Clear .SortFields.Add Key:=tbl.ListColumns("Name").Range, _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=tbl.ListColumns("Age").Range, _ SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal .Header = xlYes .Apply End With End Sub |
上記のコードでは、tbl.Sort
メソッドを使用してテーブルをソートしています。.SortFields.Add
メソッドを使用して、ソートするキーを指定し、xlAscending
またはxlDescending
で昇順または降順を指定します。複数の条件をソートする場合は、SortFields.Add
メソッドを複数回使用して条件を追加することができます。
上記の例では、名前で昇順にソートし、名前が同じ場合は年齢で降順にソートしています。
また、tbl.ListColumns
プロパティを使用して、ソートする列を指定することもできます。上記の例では、名前と年齢の列を指定しています。
上記のコードを実行すると、指定した複数の条件でExcelテーブルがソートされます。
優先順位
VBAで複数の条件でデータをソートする場合、優先順位は.SortFields.Add
メソッドで指定した順序に従います。
つまり、最初に.SortFields.Add
メソッドで指定した条件が最優先であり、それ以降に指定された条件は順に優先順位が下がっていきます。
例えば、以下のコードを考えてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub sort_table() Dim tbl As ListObject Set tbl = ActiveSheet.ListObjects("Table1") With tbl.Sort .SortFields.Clear .SortFields.Add Key:=tbl.ListColumns("Name").Range, _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=tbl.ListColumns("Age").Range, _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=tbl.ListColumns("Joining Year").Range, _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Header = xlYes .Apply End With End Sub |
例えば、以下のようなデータがある場合、
Name | Age | Joining Year |
---|---|---|
John | 30 | 2010 |
John | 25 | 2012 |
Kate | 28 | 2011 |
上記のコードを実行すると、以下のようにソートされます。
Name | Age | Joining Year |
---|---|---|
John | 25 | 2012 |
John | 30 | 2010 |
Kate | 28 | 2011 |
つまり、まずは名前がソートされ、名前が同じ場合は年齢でソートされ、年齢も同じ場合は入社年数でソートされるため、年齢の異なるJohnが、年齢の若い方が先に表示されることになります。
コメント