セルデータの並べ替え (Sort オブジェクト)

中級VBA

はじめに

 Excelで並べ替えを行うにはSortメソッドと、Excel2007以降で使用できるSortオブジェクトがあります。
 ここではSortオブジェクトの使い方について解説します。

 Sortオブジェクトでのセルデータの並べ替えは、いくつかの手順を踏んで設定していきます。少々複雑ですが、基本を押さえれば特に難しくはありません。
 まずは基本の形を覚えて、必要に応じて応用していくと良いでしょう。
 注意点としては、セル範囲を指定する際、セルデータのある位置を指定する際、シート指定を間違えないようにする事です。
 関係ないシートがアクティブになっている場合、セル指定が関係ない場所になってエラーとなります。

以下のプログラムは、コピーして設定を変更すれば、簡単に使えますので活用してみてください。

基本形のプログラム

 以下のようなセルデータの並べ替えを行います。

 C列でソートを書ける場合は以下の様になります。

Sub SortSample1()
    Dim sh As Worksheet
    Set sh = Worksheets("売上")
    
    With sh.Sort
        With .SortFields
            .Clear  '全ての並べ替えのキー設定をクリア
            
            '【ソート対象を追加】
            .Add Key:=sh.Range("C1"), _
                 SortOn:=xlSortOnValues, _
                 Order:=xlAscending, _
                 DataOption:=xlSortNormal
             'Key;ソート対象列のセル指定
             'SortOn;ソート対象[xlSortOnValues(値),xlSortOnCellColor(セル色).
             '    xlSortOnFontColor(フォント色),xlSortOnValues(アイコン)]
             'Order;ソート順[xlAscending(昇順),xlDescending(降順)]
             'DataOption;数値とテキスト[xlSortNormal(同じに扱う)
             '             ,xlSortTextAsNumbers(別で扱う)]
        
        End With
        
       .SetRange sh.Range("A1").CurrentRegion '並べ替えの対象範囲を設定
       .Header = xlYes     '先頭行を見出しとして使用するか
       .MatchCase = False  '大文字小文字の区別をするか
       .Orientation = xlTopToBottom  '行単位で並べ替え(既定値)
       .SortMethod = xlPinYin  'ふりがなを使って並べ替える(既定値)
       .Apply      '実行
    
    End With

End Sub

 結果は以下の通りです。C列がソートされました。

プログラム解説

 上記のサンプルでは、コメントアウトを参考にして書き換えられるようになっていますので、そのままコピーして利用できます。
 利用する際は、下線部分を適宜、ご自身の環境に合わせて変更してください。

 まず、最初に下線部分に注目してください。
 冒頭で、ワークシート変数(sh)を定義しているのは、その後のRange指定で違うシートを指定しないための伏線となります。
 このようにワークシート変数を定義しておけば、エラーを防ぐ事ができます。

 全体を見ますと、以下のような手順でプロパティ値の設定とメソッドを使っています。

With sh.Sort
   with .SortFields
       .Clear
       .Add
    End With

   .SetRange
   .Header
   .MatchCase
   .Orientation
   .SortMethod
   .Apply
End With

 最初のWithステートメントで、Sortオブジェクトを指定しています。

 次の.SortFieldsはコレクション(オブジェクトの配列)です。
 先にClearメソッドSortFieldsを空にして、その後、Addメソッドでソート対象を追加していきます。
 ここでは1つしか追加していませんが、ソート対象は複数指定できます。
 
 SetRangeプロパティは、ソートするデータセルを指定します。
 Headerプロパティは、先頭をヘッダー扱いにするかどうかの指定。
 MatchCaseプロパティは、大文字小文字の区別をするかどうかの指定。
 Orientationプロパティは、行単位、列単位の指定。
 SortMethodプロパティは、昇順、降順の指定になります。

 最後の Apply は実行メソッドです。

 それぞれのプロパティやメソッドを詳しく見ていきましょう。

Sortオブジェクト

 Sortオブジェクトの主なプロパティとメソッドは以下の通りです。たくさんあって複雑な感じですが、数が多いだけで、それほど難しくはありません。

SortFieldsコレクション

SortFieldsは、並べ替えキー設定で、オブジェクト配列となります。配列なので並べ替えキー設定は複数持つ事ができ、クリアする事もできます。
 基本的な使い方としては、最初にクリアしておいて、Addで追加していきます。並べ替えキーを複数設定する場合は、最初のキーが優先順位が高くなります。

Clearメソッド

 SortFieldsコレクションを空にして、キー設定をクリアします。

Addメソッド

 並べ替えキー設定を行います。 key 以外の引数は省略可能です。
  SortFields.Add ( key [, sorton, order, customorder, dataoption ] )

key 並べ替える場所指定

 Range型で指定します。複数セル指定するとエラーとなる場合があります。
 Cellsで指定してもOKです。

sorton 並べ替え値の指定

 xlSortOn 列挙型で指定します。

定 数内 容
xlSortOnValues0
xlSortOnCellColor1セル色
xlSortOnCellColor2フォント色
xlSortOnIcon3アイコン
order 並び替え順の指定

 XlSortOrder 列挙型で指定します。

定 数内 容
xlAscending0昇順 【既定値】
xlDescending1降順
customorder 並べ替え基準の指定

 並べ替えたい順序をユーザーが指定できます。値はカンマ区切りの文字列で指定します。
 (上記のサンプルプログラムでは省略しています。)

 例: CustomOrder:=”日,月,火,水,木,金,土”

dataoption 値による並べ替え指定

 XlSortDataOption 列挙型で指定します。

    定 数内 容
xlSortNormal0数値とテキストを別々に並べ替える 【既定値】
xlSortTextAsNumbers1数値とテキストを混同して並べ替える

SetRange ソートするデータセルを指定

 並べ替えを行うデータセル範囲を指定します。ここは例のように左上のセルを指定して CurrentRegion で指定する方法が良く使われます。

 例: Range(“A1”).CurrentRegion

Header 先頭をヘッダー扱いにするか指定

データセルの先頭をヘッダーとして扱うかを指定します。

定 数内 容
xlGuess0自動的に設定する
xlYes1見出しとして使用する
xlNo2見出しとして使用しない(範囲全体が対象となる)【既定値】

MatchCase 大文字小文字の区別をするか指定

 大文字小文字の区別をBoolean型で指定します。
大文字と小文字を区別するときは True。 区別しない場合は False を指定します。

Orientation 並べ替えの方向指定

 XlSortOrientation 列挙型で指定します。

     定 数内 容
xlTopToBottom (または、xlSortColumns)1行方向で並べ替え【既定値】
xlLeftToRight (または、xlSortRows)2列方向で並べ替え

SortMethod 昇順、降順の指定

 XlSortMethod 列挙型で指定します。

 定 数内 容
xlPinYin1ふりがなを使って並べ替え【既定値】
xlStroke2ふりがなを使わずに並べ替え

並べ替えキーを複数指定する方法

 複数の並べ替えキーを指定したい場合は、SortFieldsコレクションで、Addメソッドを追加するだけです。
 上記のプログラムでC列でソートした後に、D列をソートするには以下の様にします。

Sub SortSample2()
    Dim sh As Worksheet
    Set sh = Worksheets("売上")
    
    With sh.Sort
        With .SortFields
            .Clear  '全ての並べ替えのキー設定をクリア
            
            '【ソート対象を追加】
            .Add Key:=sh.Range("C1"), _
                 SortOn:=xlSortOnValues, _
                 Order:=xlAscending, _
                 DataOption:=xlSortNormal
             'Key;ソート対象列のセル指定
             'SortOn;ソート対象[xlSortOnValues(値),xlSortOnCellColor(セル色).
             '    xlSortOnFontColor(フォント色),xlSortOnValues(アイコン)]
             'Order;ソート順[xlAscending(昇順),xlDescending(降順)]
             'DataOption;数値とテキスト[xlSortNormal(同じに扱う)
             '             ,xlSortTextAsNumbers(別で扱う)]
        
            '【ソート対象を追加】
            .Add Key:=sh.Range("D1"), _
                 SortOn:=xlSortOnValues, _
                 Order:=xlAscending, _
                 DataOption:=xlSortNormal
        
        End With
        
    .SetRange sh.Range("A1").CurrentRegion '並べ替えの対象範囲を設定
    .Header = xlYes     '先頭行を見出しとして使用するか
    .MatchCase = False  '大文字小文字の区別をするか
    .Orientation = xlTopToBottom  '行単位で並べ替え(既定値)
    .SortMethod = xlPinYin  'ふりがなを使って並べ替える(既定値)
    .Apply      '実行
    
    End With
    
End Sub

 結果は以下の様になります。C列で並べ替えた後に、D列が昇順となっています。

まとめ

 今回はデータセル並べ替えを行う Sort オブジェクトを解説しました。使い方の注意点としては、起点となるRange指定が対象のシートになっているかに気を配るようにしましょう。
 エラーとなったり、動作がおかしい場合は、サンプルの下線で示した箇所が適正であるか確認してみてください。

 サンプルコードはコピーして変更すれば使えると思いますので活用してください。

タイトルとURLをコピーしました