VBA セルの並び替え、ソートする (Range.Sort)

はじめに

Excel VBA マクロでセルの並び替え、ソートする方法を紹介します。

Range.Sort メソッドから、セルを並び替えできます。

セルを昇順や降順に並び替えできます。行や列の方向に並び替えできます。

セルを範囲指定するすべての方法は「セルを範囲指定して取得する」をご覧ください。
  • 目次
    • Sort メソッド
    • セルをソートする
    • 別シートのセルをソートする

Sort メソッド

Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)

引数「Key1 ~ 3」省略できます。並び替えのキーになる列のセルを指定します。
引数「Order1 ~ 3」 省略できます。キーの列を昇順か降順で並び替えるか指定します。
  • xlAscending:昇順
  • xlDescending:降順
引数「Type」省略できます。ピボットテーブルを並び替えるときに指定します。
引数「Header」 省略できます。先頭行をタイトル行とするかを指定します。
  • xlGuess:タイトル行か自動設定
  • xlNo:タイトル行ではない
  • xlYes:タイトル行
引数「OrderCustom」省略できます。並び替えの順序を指定します。
引数「MatchCase」 省略できます。大文字と小文字を区別するか指定します。
  • True:区別する
  • False:区別しない
引数「Orientation」 省略できます。並び替えの方向を指定します。
  • xlSortColumns:上から下へ
  • xlSortRows:左から右へ
引数「SortMethod」 省略できます。ふりがなを使うか指定します。
  • xlPinYin:ふりがなを使う
  • xlStroke:ふりがなを使わない
引数「DataOption1 ~ 3」 省略できます。数値と文字列を別にして並び替えるかを指定します。
  • xlSortNormal:数値と文字列を別に並び替える
  • xlSortTextAsNumbers:数値と文字列を同様に並び替える
戻り値の型なし

このメソッドは Excel のユーザー設定の並べ替えダイアログと連動しています。引数を指定するとユーザー設定の並べ替えダイアログの設定が変更されます。逆にユーザー設定の並べ替えダイアログを実行すると、引数の既定値がその値になります。引数を省略すると前回の値が引き継がれるため、すべての引数を指定するのをオススメします。

4

セルをソートする

Range の引数にセル名を指定すると、そのセルの範囲をソートできます。

セル「A1」~「B2」で A 列をキーにしてソートするには Range("A1:B2").Sort(Range("A1")) を入力します。

Call Range("A1:B2").Sort(Range("A1"))
Call Range("A1:B2").Sort(Range("A1"), xlAscending, Range("A1"), , xlAscending, Range("A1"), xlAscending, xlNo, , False, xlSortColumns, xlPinYin, xlSortNormal, xlSortNormal, xlSortNormal)

ソートの例

A 列をキーに降順

Call Range("A1:C5").Sort( _
    Key1:=Range("A1"), Order1:=xlDescending)
1

A 列を第 1 キー、B 列を第 2 キーに昇順

Call Range("A1:C5").Sort( _
    Key1:=Range("A1"), Order1:=xlAscending, _
    Key2:=Range("B1"), Order2:=xlAscending)
2

A 行をキーに左から右へ並び替え

Call Range("A1:D3").Sort( _
    Key1:=Range("A1"), Order1:=xlAscending, _
    Orientation:=xlSortRows)
3

引数「Key」に検索範囲のセルを指定する必要はありません。その列や行のセルであればどこでもキーにできます。

別シートのセルをソートする

シートを指定するには Worksheets の引数にシート名またはインデックスを指定します。

Sheet1 を指定するには Worksheets("Sheet1") または Worksheets(1) を入力します。

sheet1
' Sheet1 のセル「A1」~「B2」をソート
Call Worksheets("Sheet1").Range("A1:B2").Sort(Range("A1"))
Call Worksheets(1).Range("A1:B2").Sort(Range("A1"))

' Sheet2 のセル「A1」~「B2」をソート
Call Worksheets("Sheet2").Range("A1:B2").Sort(Range("A1"))
Call Worksheets(2).Range("A1:B2").Sort(Range("A1"))

Sheet1 に Range や Cells を入力すると、自身のシートのセルになります。自身を表す Me. が省略されています。

' どちらも同じコード
Range("A1").Value = "Sheet1"
Me.Range("A1").Value = "Sheet1"

標準モジュールに Range や Cells を入力すると、開いているシートのセルになります。アクティブシートを表す ActiveSheet. が省略されています。

' どちらも同じコード
Range("A1").Value = "アクティブ"
ActiveSheet.Range("A1").Value = "アクティブ"