VBA入門
第88回.並べ替え(Sort)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2019-07-09

第88回.並べ替え(Sort)


並べ替えは、データ処理の基本中の基本です、
乱雑なデータを並べ替えることは、データ処理の第一歩です。


マクロVBAで並べ替えを実行するには、シート操作の「並べ替え」の機能を使用することになります。

マクロ VBA Sort 並べ替え

そもそもデータを並べ替えるという事は、そのデータのキーが何かを考えるという事です。
キーとは、そのデータを見る上でのカギ・要・手がかりになります。
表データにおいて、どの列がキーであるのか、どのような順次で並べ替えるのかを考えることが重要になります。

並べ替えは、Excel2007から大きく変わってしまいましたので、
Excel2003までの並べ替えと、Excel2007以降の並べ替えの両方を紹介します。、

Range.Sortメソッド・・・Excel2003までのソート

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

引数の説明


Key1 最初の並べ替えフィールドを範囲名 (文字列) またはRangeオブジェクトで指定し、並べ替える値を特定します。
Order1 Key1で指定した値の並び替え順序を指定します。
Key2 2番目の並べ替えフィールド。
ピボットテーブルを並べ替える場合には使用できません。
Type 並べ替える要素を指定します。
ピボットテーブルの時に使用。
Order2 Key2で指定した値の並び替え順序を指定します。
Key3 3番目の並べ替えフィールド。
ピボットテーブルを並べ替える場合には使用できません。
Order3 Key3で指定した値の並び替え順序を指定します。
Header 最初の行にヘッダー情報が含まれているかどうかを指定します。
xlNoは既定値です。
Excelにヘッダーを判断させるには、xlGuessを指定します。
OrderCustom ユーザー設定の並べ替え順のリスト内の番号を示す、1から始まる整数を指定します。
MatchCase Trueの場合、大文字と小文字を区別して並べ替えを行います。
Falseの場合、大文字と小文字を区別しないで並べ替えを行います。
ピボットテーブルの並べ替えには使用できません。
Orientation 並べ替えを昇順で行うか、降順で行うかを指定します。
SortMethod 並べ替えの方法を指定します。
DataOption1 Key1で指定した範囲でテキストを並べ替える方法を指定します。
ピボットテーブルの並べ替えには適用されません。
DataOption2 Key2で指定した範囲でテキストを並べ替える方法を指定します。
ピボットテーブルの並べ替えには適用されません。
DataOption3 Key3で指定した範囲でテキストを並べ替える方法を指定します。
ピボットテーブルの並べ替えには適用されません。

Key1~3とOrder1~3
KeyとOrderは同じ数値(Key○とOrder○)をセットで指定します。

Order1~3
xlAscending : 既定値。昇順に並べ替えます
xlDescending : 降順に並べ替えます

Header
xlGuess : 見出しがあるかどうか、ある場合はその場所を Excel が特定します。
xlNo : 既定値。範囲全体が並べ替えの対象になります。
xlYes : 範囲全体が並べ替えられません。

各引数は省略可能です。
ただし、
前の設定(ワークシートで手作業でやった並べ替えのオプションも含む)が引き継がれるオプションがありますので、
MatchCase,Orientation,SortMethod等は必ず指定するようにしてください。

上記以外の引数は、滅多に使う事はないと思いますが、
設定値について知りたい場合は、マクロの記録で確認して下さい。

使用例.
Sub サンプル()
  Range("A1:J11").Sort _
    Key1:=Range("A1"), Order1:=xlAscending, _
    Key2:=Range("B1"), Order2:=xlAscending, _
    Header:=xlYes
End Sub

A1~J11の表で、1行目が見出しの場合になります。
見易いように、省略可能な引数は、省略しました。
ただし前記したとおり、実際に使う時には出来るだけ省略しないようにして下さい。

2007以降の並べ替え

Excel2007以降では、WorksheetのSortオブジェクトを使用して並べ替えを行います。

Sortオブジェクトのメンバー


名前 説明
メソッド Apply 現在適用されている並べ替え状態に基づいて範囲を並べ替えます。
SetRange Sort オブジェクトの開始位置と終了位置を設定します。
プロパティ Application オブジェクト修飾子を指定せずに使用した場合、Microsoft Excel アプリケーションを表す Application オブジェクトを返します。オブジェクト修飾子を指定した場合、指定したオブジェクトを作成した Application オブジェクトを返します。
値の取得のみ可能です。
Creator 現在のオブジェクトが作成されたアプリケーションを示す 32 ビットの整数を取得します。
値の取得のみ可能です。長整数型 (Long) の値を使用します。
Header 最初の行にヘッダー情報が含まれるかどうかを指定します。値の取得および設定が可能です。
XlYesNoGuess クラスの定数を使用します。
MatchCase 大文字と小文字を区別して検索するには、True に設定します。
大文字と小文字を区別せずに検索するには False に設定します。値の取得および設定が可能です。
Orientation 並べ替えの方向を指定します。値の取得および設定が可能です。
XlSortOrientation クラスの定数を使用します。
Parent 指定されたオブジェクトの親オブジェクトを取得します。
値の取得のみ可能です。
Rng 並べ替えが行われる値の範囲を返します。
値の取得のみ可能です。
SortFields SortFieldオブジェクトのコレクションです。
これを使用して開発者はブック、一覧、およびオートフィルターに並べ替え状態を保存できます。
SortMethod 中国語の並べ替え方法を指定します。値の取得および設定が可能です。
XlSortMethod クラスの定数を使用します。

上記2003のサンプルコードと同じ処理をする場合です。

Sub サンプル1()
  With ActiveSheet
    .Sort.SortFields.Clear
    .Sort.SortFields.Add Key:=.Range("A1"), Order:=xlAscending
    .Sort.SortFields.Add Key:=.Range("B1"), Order:=xlAscending
    .Sort.SetRange .Range("A1:J11")
    .Sort.Header = xlYes
    .Sort.Apply
  End With
End Sub
'以下はWith記述を少し変更したサンプルとなります。
Sub サンプル2()
  Dim ws As Worksheet
  Set ws = ActiveSheet
  With ws.Sort
    With .SortFields
      .Clear
      .Add Key:=ws.Range("A1"), Order:=xlAscending
      .Add Key:=ws.Range("B1"), Order:=xlAscending
    End With
    .SetRange ws.Range("A1:J11")
    .Header = xlYes
    .Apply
  End With
End Sub


Sortオブジェクトとなった為、非常に分かりづらくなりました。
オブジェクトのメンバー(オブジェクトに含まれるプロパティ・メソッド)を理解して使う必要があります。

Sortオブジェクトのメンバーの中でも特に重要かつ複雑なSortFieldsは、
SortFieldオブジェクトのコレクションです。

SortFieldsコレクションのメンバー
名前 説明
メソッド Add 新しい並べ替えフィールドを作成し、SortFieldsオブジェクトを返します。
Clear SortFieldsオブジェクトをすべてクリアします。
プロパティ Application オブジェクト修飾子を指定せずに使用した場合、MicrosoftExcelアプリケーションを表すApplicationオブジェクトを返します。
オブジェクト修飾子を指定した場合、指定したオブジェクトを作成したApplicationオブジェクトを返します。値の取得のみ可能です。
Count コレクションに含まれるオブジェクトの数を返します。
値の取得のみ可能です。長整数型(Long)の値を使用します。
Creator 現在のオブジェクトが作成されたアプリケーションを示す32ビットの整数を取得します。
値の取得のみ可能です。長整数型(Long)の値を使用します。
Item ブックで並べ替えられるアイテムのコレクションを表すSortFieldオブジェクトを返します。
値の取得のみ可能です。
Parent 指定されたオブジェクトの親オブジェクトを取得します。
値の取得のみ可能です。

基本敵な使い方
ワークシートオブジェクト.Sort
これで、Sortオブジェクトを取得します。
このSortオブジェクトに対して、
以下の順に、メソッドの実行、プロパティ値の設定を行います。

・.SortFields.Clearメソッドで、前回の情報を消去
・.SortFields.Addメソッドで、並べ替えのキーを追加
・.SetRangeで、並べ替えの範囲を設定
・.Headerで、行ヘッダーの有無を指定
・.Applyで、並べ替えを実行

定型文として覚えると良いでしょう。
並べ替えのキー、範囲、
この部分のみ変更すれば多くの場合はほぼそのまま使いまわせるはずです。

Excel2003までのSortとExcel2007以降のSortの使い分け

どちらを使っても構いません。
最も大きな違いは、
Excel2003までのSortは、並べ替えのキーが3つまでしか指定出来ない事です。
Excel2007以降のSortは、並べ替えのキーの数は無制限です。

ですが、そもそも並べ替えというものの本質をどうなっているかをかんがえてみましょう。
複数列で並べ替えるという事は、
下位のキーから順に並べ替えれば良いという事を理解してください。

A列 > B列 > C列 > D列
この順で並べ替える場合、一度に並べ替えなくても、
以下の順に、1列ずつ並べ替えても結果は同じです。
・D列で並べ替え
・C列で並べ替え
・B列で並べ替え
・A列で並べ替え


従って、Excel2003までのSortでも4つ以上のキーで並べ替えは可能だという事を理解してください。
これを理解することは、
データを整理するとはどういう事かを理解する事にもなります。


最初に書いた通り、並べ替えはデータ処理の基本中の基本です。
しっかりと使えるようになっておいてください。
以下も参考にして下さい。
「マクロの記録で覚えるVBA」の第17回.並べ替え

エクセルでは避けて通れない、「並べ替え」をやります。実は、あまりやりたくないのですが… いや、2003と2007以降で、全く変わってしまったのです。1行目がタイトル、2~11行にデータが入っているとします。
大量データで処理時間がかかる関数の対処方法(SumIf)
大量データ処理において、一般的な速度対策をやってさえ、時に何時間もかかってしまう事があります、そういう場合でも、多くの場合は何らかの対策があるものです、個別のロジックの記述でこれに対応する一つの有効なマクロVBAコ-ドについて解説します。以下の例で解説します。



同じテーマ「VBA入門」の記事

第85回.結合セルの扱い
第86回.総合練習問題10
第87回.WorksheetFunction(ワークシート関数を使う)
第88回.並べ替え(Sort)
第89回.オートフィルタ(AutoFilter)
第90回.フィルタオプションの設定(AdvancedFilter)
第91回.条件付き書式(FormatCondition)
第92回.名前定義(Names)
第93回.ピボットテーブル(PivotTable)
第94回.コメント(Comment)
第95回.ハイパーリンク(Hyperlink)


新着記事NEW ・・・新着記事一覧を見る

SQL関数と演算子|SQL入門(12月1日)
データの取得:集約集計、並べ替え(DISTINKT,GROUP BY,ORDER BY)|SQL入門(11月30日)
データの取得:条件指定(SELECT,WHERE)|SQL入門(11月29日)
データの挿入:バルクインサート|SQL入門(11月28日)
データの挿入(INSERT)と全削除|SQL入門(11月26日)
テーブル名変更と列追加(ALTER TABLE)とテーブル自動作成|SQL入門(11月25日)
テーブルの作成/削除(CREATE TABLE,DROP TABLE)|SQL入門(11月24日)
データベースに接続/切断|SQL入門(11月23日)
SQLiteのインストール|SQL入門(11月22日)
SQL入門:VBAでデータベースを使う|エクセルの神髄(11月22日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロって何?VBAって何?|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • 並べ替え(Sort)

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
    掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ