【ExcelVBA】ソート(並び替え)する

セルの操作

ソート(並び替え)は、Range.Sortメソッド または Sortオブジェクト を使います。
個人的には「値」のソートだけであれば、Range.Sortメソッドだけで事足りると思っています。
「値」「セルの色」「フォントの色」など多様にソートしたい場合は、Sortオブジェクトを使います。

★ソート可能な種類★
Range.Sortメソッド:値
Sortオブジェクト:値、セルの色、フォントの色、セルのアイコン

Range.Sortメソッド

構文
.Range.Sort(Key1, Order1, Key2, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)

値でソート

A列を昇順に、B列を降順に並べる例
Sub Sample1()

  ThisWorkbook.ActiveSheet.Range("A1").Sort _
    Header:=xlYes, _
    Key1:=Range("A1"), Order1:=xlAscending, _
    Key2:=Range("B1"), Order2:=xlDescending

End Sub
※3行目:範囲の左上を指定することで、テーブルの範囲を自動判別します。
※ソートする範囲を限定させたいのであれば、.Range("A1:C1").Sort の様に指定します。

結果

※第1キーのA列は昇順
※第2キーのB列は降順

実行前のテーブル

オプション一覧

引数定数説明
Key1-最初の並べ替えフィールドを範囲名 (文字列) または Range オブジェクトで指定し、並べ替える値を特定します。
Order1xlAscending昇順に並べ替えます。既定値。
xlDescending降順で並び替えます。
Key22 番目の並べ替えフィールド。
Order2xlAscending昇順に並べ替えます。既定値。
xlDescending降順で並び替えます。
Key3-3 番目の並べ替えフィールド。
Order3xlAscending昇順に並べ替えます。既定値。
xlDescending降順で並び替えます。
HeaderxlGuess先頭がヘッダーかどうかを自動判断させる。
xlYes先頭をヘッダーとみなす。
xlNo先頭をヘッダーとみなさない。既定値。
MatchCaseTRUETrue の場合、大文字と小文字を区別して並べ替えを行います。
FALSEFalse の場合、大文字と小文字を区別しないで並べ替えを行います。
OrientationxlTopToBottom行方向(上から下へ向かって)並べ替えます。 これは既定値です。
xlLeftToRight列方向(左から右へ向かって)で並べ替えます。
SortMethodxlPinYin日本語をふりがなで並べ替えます。
xlStroke日本語を文字コードで並べ替えます 。
DataOption1xlSortNormalKey1 で指定した範囲で数値データとテキスト データを別々に並べ替えます。既定値。
xlSortTextAsNumbersKey1 で指定した範囲でテキストを数値データとして並べ替えます。
DataOption2xlSortNormalKey2で指定した範囲で数値データとテキスト データを別々に並べ替えます。既定値。
xlSortTextAsNumbersKey2で指定した範囲でテキストを数値データとして並べ替えます。
DataOption3xlSortNormalKey3で指定した範囲で数値データとテキスト データを別々に並べ替えます。既定値。
OrderCustom-ユーザー設定の並べ替え順のリスト内の番号を示す、1 から始まる整数を指定します。

Sortオブジェクト

構文
.Sheet.Sort.SortFields.Add (Key, SortOn, Order, CustomOrder, DataOption)

値でソート

A列を昇順に、B列を降順に並べる例
Sub Sample2()

    With ThisWorkbook.ActiveSheet.Sort
        .SortFields.Clear
    End With
		
    With ThisWorkbook.ActiveSheet.Sort
        .SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add Key:=Range("B1"), SortOn:=xlSortOnValues, Order:=xlDescending
    End With
    
    With ThisWorkbook.ActiveSheet.Sort
        .SetRange Range("A1").CurrentRegion
        .Header = xlYes
        .Apply 'ソート実行。必須。
    End With

End Sub
※13行目:表(テーブル)の左上を指定することで、表(テーブル)の範囲を自動判別します。
※この Sample2 は、Sample1 と同じ結果になります。

結果

※第1キーのA列は昇順
※第2キーのB列は降順

実行前のテーブル


Sortオブジェクトは、ソート設定をクリアしない限り、並び替えのダイアログボックスに残ります。
以下は実行後の並び替えダイアログボックスの状態です。

実行後の並び替えダイアログボックスの状態

※オートフィルタが設定されていると、ダイアログボックスの内容は正しく表示されません。並び替えは正しく行われます。

なので、Sortオブジェクトを使い回す時は、.SortFields.Clear を最初にしておくといいでしょう。
With ThisWorkbook.ActiveSheet.Sort
        .SortFields.Clear
End With


セルの色でソート

A列を昇順に、B列を降順に並べる例
Sub Sample3()
    
    With ThisWorkbook.ActiveSheet.Sort
      .SortFields.Clear
    End With
    
    With ThisWorkbook.ActiveSheet.Sort
      '並び替え:黄色
      .SortFields.Add(Key:=Range("A1"), SortOn:=xlSortOnCellColor, Order:=xlAscending) _
          .SortOnValue.Color = RGB(255, 255, 0)
      '並び替え:水色
      .SortFields.Add(Key:=Range("B1"), SortOn:=xlSortOnCellColor, Order:=xlDescending) _
          .SortOnValue.Color = RGB(0, 255, 255)
    End With
    
    With ThisWorkbook.ActiveSheet.Sort
        .SetRange Range("A1").CurrentRegion
        .Header = xlYes
        .Apply
    End With
    
End Sub
xlSortOnCellColor(定数)を指定することで、セルの色での並び替えになります。
xlSortOnCellColor(定数)は、.SortFields.Add(...) カッコが必要になります。

結果

※最優先のA列は昇順
※次優先のB列は降順

実行前のテーブル


実行後の並び替えダイアログボックスの状態

※オートフィルタが設定されていると、ダイアログボックスの内容は正しく表示されません。並び替えは正しく行われます。
※存在しないセルの色を指定した場合、ダイアログボックス内の順序は黒色で表示されます。

フォントの色でソート

A列を昇順に、B列を降順に並べる例
Sub Sample4()
    
    With ThisWorkbook.ActiveSheet.Sort
      .SortFields.Clear
    End With
     
    With ThisWorkbook.ActiveSheet.Sort
      '並び替え:赤色
      .SortFields.Add(Key:=Range("A1"), SortOn:=xlSortOnFontColor, Order:=xlAscending) _
          .SortOnValue.Color = RGB(255, 0, 0)
      '並び替え:青色
      .SortFields.Add(Key:=Range("B1"), SortOn:=xlSortOnFontColor, Order:=xlDescending) _
          .SortOnValue.Color = RGB(0, 0, 255)
    End With
     
    With ThisWorkbook.ActiveSheet.Sort
        .SetRange Range("A1").CurrentRegion
        .Header = xlYes
        .Apply
    End With
    
End Sub
xlSortOnFontColor(定数)を指定することで、フォントの色での並び替えになります。
xlSortOnFontColor(定数)は、.SortFields.Add(...) カッコが必要になります。

結果

※最優先のA列は昇順
※次優先のB列は降順

実行前のテーブル


実行後の並び替えダイアログボックスの状態

※オートフィルタが設定されていると、ダイアログボックスの内容は正しく表示されません。並び替えは正しく行われます。
※存在しないフォントの色を指定した場合、ダイアログボックス内の順序は黒色で表示されます。

セルのアイコンでソート

A列を昇順に、B列を降順に並べる例
Sub Sample5()
    
    With ThisWorkbook.ActiveSheet.Sort
      .SortFields.Clear
    End With
     
    With ThisWorkbook.ActiveSheet.Sort
				 '並び替え:携帯の電波アイコン
			.SortFields.Add(Key:=Range("A1"), SortOn:=xlSortOnIcon, Order:=xlAscending) _
					.SetIcon Icon:=ThisWorkbook.IconSets(12).Item(4)
				'並び替え:レ点
			.SortFields.Add(Key:=Range("B1"), SortOn:=xlSortOnIcon, Order:=xlDescending) _
					.SetIcon Icon:=ThisWorkbook.IconSets(8).Item(3)
    End With
     
    With ThisWorkbook.ActiveSheet.Sort
        .SetRange Range("A1").CurrentRegion
        .Header = xlYes
        .Apply
    End With
    
End Sub
xlSortOnIcon(定数)を指定することで、セルのアイコンでの並び替えになります。
xlSortOnIcon(定数)は、.SortFields.Add(...) カッコが必要になります。

結果

※最優先のA列は昇順
※次優先のB列は降順

実行前のテーブル


実行後の並び替えダイアログボックスの状態


オプション一覧

記述例1(値ソート)
.Sort.SortFields.Add Key:=Range("●"), SortOn:=●, Order:=●, DataOption:=●
※.Add()のカッコはありません。

記述例2(色ソート)
.Sort.SortFields.Add(Key:=Range("●"), SortOn:=●, Order:=●).SortOnValue.Color = RGB(255, 255, 255)
※RGBに指定する数値は 0~255 までです。

記述例3(アイコンソート)
.Sort.SortFields.Add(Key:=Range("●"), SortOn:=●, Order:=●).SetIcon Icon:=ThisWorkbook.IconSets(●).Item(●)

SortOn:= データを並べ替える基準となるパラメーターを指定します。
定数説明
xlSortOnValues値(既定値)
xlSortOnCellColorセルの色
xlSortOnFontColorフォントの色
xlSortOnIconアイコン

Order:= 指定したフィールドまたは範囲の並べ替え順序を指定します。
定数説明
xlAscending指定したフィールドを昇順で並べ替えます。 (既定値)
xlDescending指定したフィールドを降順で並べ替えます。

DataOption:= テキストを並べ替える方法を指定します。
定数説明
xlSortNormal値データとテキスト データを別々に並べ替えます。(既定値)
xlSortTextAsNumbersテキストを数値データとして並べ替えます。