【Excelマクロ】並べ替え

並び替えとは

Excelでデータを扱う場合には、複数の列があった場合に、特例の列で並べ替えを行うことがあります。

VBAでも並べ替えはいくつかの方法がありますが、一番シンプルなのはSortメソッドを利用することです。

VBAで Sort メソッドを使う場合、Range.Sort を直接使う方法と、SortFields を使う方法の2種類があります。

今回は 「Range(“A1:C100”).Sort」 のように簡単に書ける方法 について解説します。

RangeとSortを使った基本構文

Range.Sort を使うと、対象の範囲に対して簡単に並べ替えを行うことができます。

基本の書き方は次の通りです。

Range("並べ替え範囲").Sort Key1:=Range("並べ替え基準"), Order1:=xlAscending, Header:=xlYes

並べ替えに必要な内容が多いので、少し長くなっていますが、並べ替えを行うために必要な情報である引数(ひきすう)としては、次のようなものがあります。

主な引数の意味

引数説明
Key1並べ替えの基準とするセル範囲
(例:Range("A1")
Order1並べ替えの順番
xlAscending=昇順、xlDescending=降順)
Headerヘッダー行の有無
xlYes=ヘッダーあり、xlNo=なし)

基本的な並べ替えの例

Keyを増やすことで条件を増やすことができます。それぞれ1〜3つまでの例を挙げます。

1. 1つのキーで並べ替え

例えば、「A列を基準に昇順で並べ替える」場合は、次のように書きます。

Sub a_sort()
    Range("A1:C100").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes
End Sub

このコードの動作

  • 範囲 A1:C100 を対象に並べ替え
  • A列のデータ(A2:A100)を昇順(小さい順) に並べ替え
  • ヘッダー(見出し行)を考慮して並べ替え

降順に並べ替えたい場合

Sub SortByColumnADesc()
    Range("A1:C100").Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlYes
End Sub

このように並べ替えを「適用する範囲」にSortメソッドをくっつけ、「並べ替えたい列の1行目のセル」をKey1に設定し、並べ替えの方法をOrder1で指定し、タイトル行があるかどうかをHeaderで設定すると並べ替えを行うことができます。

2. 2つのキーで並べ替え

もちろん、1つの条件だけでなく、複数の条件で並べ替えをすることができます。

例えば、「A列を昇順、A列の値が同じ場合はB列を降順」に並べ替える場合は、次のように記述します。

Sub a_b_sort()
    Range("A1:C100").Sort _
        Key1:=Range("A1"), Order1:=xlAscending, _
        Key2:=Range("B1"), Order2:=xlDescending, _
        Header:=xlYes
End Sub

このコードの動作

  • A列を昇順 に並べ替える
  • A列が同じ値の場合は、B列を降順 に並べ替える(A列が先に並べ変わっているので、A列は関係する値が固まっている)

3. 3つのキーで並べ替え

さらにもう一つ条件を追加して、3つの条件で並べ替えを行うことができます。

例えば、「A列 → B列 → C列」の順番で並べ替える場合は、次のように書きます。

Sub a_b_c_sort()
    Range("A1:C100").Sort _
        Key1:=Range("A1"), Order1:=xlAscending, _
        Key2:=Range("B1"), Order2:=xlDescending, _
        Key3:=Range("C1"), Order3:=xlAscending, _
        Header:=xlYes
End Sub

このコードの動作

  • A列を昇順
  • A列が同じ場合はB列を降順
  • A列・B列が同じ場合はC列を昇順

並べ替え時の注意点

並び替えを行う上で、注意をしないといけないのは、ヘッダーがあるか、ないか、どこまでの範囲を並べ替えるのかを適切に指定することです。

① ヘッダー(見出し行)の指定

ヘッダーは見出し行、つまり、1行目に書いている項目やタイトルの部分で、これがあるのか、ないのかを指定する必要があります。

ヘッダーがあるのに、ヘッダーなしで指定をすると、1行目も並び替えの対象となってしまい、全てが並び変わってしまいます。

ヘッダーの設定方法としては、定数の「xlYes」(ヘッダーがある)もしくは「xlNo」(ヘッダーがない)で指定をします。

  • Header:=xlYes1行目をヘッダーとして扱う
  • Header:=xlNoヘッダーなし(全行をデータとして並べ替え)

もし、ヘッダーなしのデータを並べ替える場合は、次のように指定します。

Range("A1:C100").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo

② 並べ替え範囲を適切に指定する

並べ替え範囲を誤ると、意図しない並べ替えが行われることがあります。

例えば、 B列を基準に並べ替えるのに、範囲を「B列」だけにするとA列が並び替えられない ため、必ず 表全体を指定する ようにしましょう。

NG例(A列が並び替えられない)

Range("B1:B100").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes

OK例(A~C列全体を並べ替える)

Range("A1:C100").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes

まとめ

並び替えについて、一番シンプルな方法はSortメソッドを利用することです。

Sortメソッドは基本的に最大3つまで設定ができます。4つ以上は設定できないので注意が必要です。

ヘッダーの指定や、並び替え範囲の指定は適切に行いましょう。

Range.Sort を使えば、手軽に並べ替えができるので、ぜひ活用してみてください!

コメント