VBAにおけるソートは、データをある基準に従って並び替える処理です。VBAでは、データ構造をソートすることができます。ここでは、データをソートする方法について説明します。
VBAにおけるデータの並び替え複数条件4つ以上の複数条件ユーザー定義での検索テーブルのソート優先順位 VBAにおけるデータの並び替えVBAにおけるデータの並び替えには、ExcelオブジェクトモデルのRangeオブジェクトを使用する方法があります。Rangeオブジェクトは、Excelのセル範囲を表し、Sortメソッドを使用することで、セル範囲のデータをソートすることができます。
Rangeオブジェクトを使用してデータをソートするには、以下の手順を実行します。
Rangeオブジェクトを作成し、ソートする範囲を指定する。Sortメソッドを使用して、ソート条件を指定する。ソートされたデータを使用して、必要に応じて処理を行う。以下は、例として、Excelのシート上のセル範囲を昇順でソートするサンプルコードです。
123456789101112131415161718192021Sub 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 cellEnd SubVBAにおけるデータの並び替えには、ExcelオブジェクトモデルのRangeオブジェクトを使用する方法があります。Rangeオブジェクトは、Excelのセル範囲を表し、Sortメソッドを使用することで、セル範囲のデータをソートすることができます。
Rangeオブジェクトを使用してデータをソートするには、以下の手順を実行します。
Rangeオブジェクトを作成し、ソートする範囲を指定する。Sortメソッドを使用して、ソート条件を指定する。ソートされたデータを使用して、必要に応じて処理を行う。以下は、例として、Excelのシート上のセル範囲を昇順でソートするサンプルコードです。
Visual Basic12345678910111213141516171819202122vbCopy codeSub 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 cellEnd Subこのコードでは、Range("A1:B5")で指定されたセル範囲を昇順でソートし、ソートされたデータをメッセージボックスに表示しています。
Sortメソッドの引数には、key1やorder1など、複数のソート条件を指定することもできます。また、Sortメソッドは、昇順・降順のほか、カスタムソートや複数列のソートなど、様々なソート条件を指定することができます。
複数条件「VBAソート」と調べると、複数条件という言葉が出てきます。複数条件に関する疑問について解決してきましょう。
VBAにおいて、Excelシート上のセル範囲のデータを複数の条件でソートする場合、key1やorder1などの引数に複数の条件を指定することができます。以下は、例として、Excelのシート上のセル範囲を、A列を昇順、B列を降順でソートするサンプルコードです。
1234567891011121314151617181920212223Sub 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 cellEnd 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列を降順でソートするサンプルコードです。
123456789101112131415161718192021222324252627Sub 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 cellEnd Subこのコードでは、Range("A1:D5")で指定されたセル範囲を、A列を昇順、B列を降順、C列を昇順、D列を降順でソートし、ソートされたデータをメッセージボックスに表示しています。
Sortメソッドの引数には、key1やorder1のように、複数の条件を指定することができます。同様に、key2やorder2、key3やorder3、key4やorder4を指定することで、任意の数の条件でソートすることができます。
ユーザー定義での検索VBAにおいて、Excelシート上のセル範囲をユーザー定義の複数条件でソートする場合は、SortFieldsコレクションを使用することができます。
以下は、例として、Excelのシート上のセル範囲を、ユーザーが指定した2つの列を昇順でソートするサンプルコードです。
1234567891011121314151617181920212223242526272829303132333435363738394041424344Sub 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 cellEnd Subこのコードでは、InputBox関数を使用して、ユーザーから2つの列と昇順/降順を入力してもらい、SortFieldsコレクションを使用して、ユーザーが入力した条件でソートを行っています。ソートされたデータをメッセージボックスに表示する部分は、前の例と同様です。
SortFieldsコレクションは、ソート対象の範囲に対して、複数のソート条件を設定することができます。
テーブルのソートVBAを使用して、Excelテーブルを複数条件でソートする方法について説明します。以下のコードは、名前と年齢の2つの条件でExcelテーブルをソートする例です。
1234567891011121314Sub 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 WithEnd Sub上記のコードでは、tbl.Sortメソッドを使用してテーブルをソートしています。.SortFields.Addメソッドを使用して、ソートするキーを指定し、xlAscendingまたはxlDescendingで昇順または降順を指定します。複数の条件をソートする場合は、SortFields.Addメソッドを複数回使用して条件を追加することができます。
上記の例では、名前で昇順にソートし、名前が同じ場合は年齢で降順にソートしています。
また、tbl.ListColumnsプロパティを使用して、ソートする列を指定することもできます。上記の例では、名前と年齢の列を指定しています。
上記のコードを実行すると、指定した複数の条件でExcelテーブルがソートされます。
優先順位VBAで複数の条件でデータをソートする場合、優先順位は.SortFields.Addメソッドで指定した順序に従います。
つまり、最初に.SortFields.Addメソッドで指定した条件が最優先であり、それ以降に指定された条件は順に優先順位が下がっていきます。
例えば、以下のコードを考えてみましょう。
12345678910111213141516Sub 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 WithEnd Sub例えば、以下のようなデータがある場合、
NameAgeJoining YearJohn302010John252012Kate282011上記のコードを実行すると、以下のようにソートされます。
NameAgeJoining YearJohn252012John302010Kate282011つまり、まずは名前がソートされ、名前が同じ場合は年齢でソートされ、年齢も同じ場合は入社年数でソートされるため、年齢の異なるJohnが、年齢の若い方が先に表示されることになります。