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


キーとは、そのデータを見る上でのカギ・要・手がかりになります。
表データにおいて、どの列がキーであるのか、どのような順序で並べ替えるのかを考えることが重要になります。
Excel2003までの並べ替えと、Excel2007以降の並べ替えの両方を紹介します。、
Range.Sortメソッド・・・Excel2003までのソート
Key1 | 最初の並べ替えフィールドを範囲名 (文字列) またはRangeオブジェクトで指定し、並べ替える値を特定します。 |
Order1 | Key1で指定した値の並び替え順序を指定します。 |
Key2 | 2番目の並べ替えフィールド。 ピボットテーブルを並べ替える場合には使用できません。 |
Type | 並べ替える要素を指定します。 ピボットテーブルの時に使用。 |
Order2 | Key2で指定した値の並び替え順序を指定します。 |
Key3 | 3番目の並べ替えフィールド。 ピボットテーブルを並べ替える場合には使用できません。 |
Order3 | Key3で指定した値の並び替え順序を指定します。 |
Header | 最初の行にヘッダー情報が含まれているかどうかを指定します。 xlNoは既定値です。 Excelにヘッダーを判断させるには、xlGuessを指定します。 |
OrderCustom | ユーザー設定の並べ替え順のリスト内の番号を示す、1から始まる整数を指定します。 |
MatchCase | Trueの場合、大文字と小文字を区別して並べ替えを行います。 Falseの場合、大文字と小文字を区別しないで並べ替えを行います。 ピボットテーブルの並べ替えには使用できません。 |
Orientation | 行で並べ替えるか (既定) または列で並べ替えるかを指定します。 列で並べ替えるには、xlSortColumns(値を1)に設定します。 行で並べ替えるには、xlSortRows(値を2)に設定します(これは既定値です)。 以上は公式に載っている説明ですが、誤った説明に読めます。 通常の縦方向の並べ替えがxlSortColumns、横方向の並べ替えがxlSortRowsです。 単語の意味と逆になっています。 また、既定は「並べ替えオプション」での指定が使われます。 これは分かりづらいので、xlTopToBottomとxlLeftToRightを使っても良いでしょう。 xlSortColumns = xlTopToBottom = 1 xlSortRows = xlLeftToRight = 2 |
SortMethod | 並べ替えの方法を XlSortMethodクラスの定数で指定します。 xlPinYin(値1):ふりがなを使う。(既定値です) xlStroke(値2):ふりがなを使わない。 |
DataOption1 | Key1で指定した範囲でテキストを並べ替える方法を指定します。 ピボットテーブルの並べ替えには適用されません。 |
DataOption2 | Key2で指定した範囲でテキストを並べ替える方法を指定します。 ピボットテーブルの並べ替えには適用されません。 |
DataOption3 | Key3で指定した範囲でテキストを並べ替える方法を指定します。 ピボットテーブルの並べ替えには適用されません。 |
Key1~3とOrder1~3
Order1~3
xlDescending : 降順に並べ替えます
Header
xlNo : 既定値。範囲全体が並べ替えの対象になります。
xlYes : 範囲全体が並べ替えられません。
各引数は省略可能です。
ただし、
前の設定(ワークシートで手作業でやった並べ替えのオプションも含む)が引き継がれるオプションがありますので、
MatchCase,Orientation,SortMethod等は必ず指定するようにしてください。
設定値について知りたい場合は、マクロの記録で確認して下さい。
使用例(Excel2003までのソート)
Sub サンプル()
Range("A1:J11").Sort _
Key1:=Range("A1"),
Order1:=xlAscending, _
Key2:=Range("B1"), Order2:=xlAscending,
_
Header:=xlYes
End Sub
A1~J11の表で、1行目が見出しの場合になります。
見易いように、省略可能な引数は省略しました。
ただし前記したとおり、実際に使う時には出来るだけ省略しないようにして下さい。
2007以降の並べ替え
名前 | 説明 | ||||||||||||
メソッド | 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のサンプルVBAと同じ処理
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
オブジェクトのメンバー(オブジェクトに含まれるプロパティ・メソッド)を理解して使う必要があります。
SortFieldオブジェクトのコレクションです。
SortFieldsコレクションのメンバー
名前 | 説明 | |
メソッド | Add | 新しい並べ替えフィールドを作成し、SortFieldsオブジェクトを返します。 Add(Key, SortOn, Order, CustomOrder, DataOption) |
Add2 | 新しい並べ替えフィールドを作成し、SortFieldsオブジェクトを返します。 2016以降に追加されました。 Add2(Key, SortOn, Order, CustomOrder, DataOption, SubField) |
|
Clear | SortFieldsオブジェクトをすべてクリアします。 | |
プロパティ | Application | オブジェクト修飾子を指定せずに使用した場合、MicrosoftExcelアプリケーションを表すApplicationオブジェクトを返します。 オブジェクト修飾子を指定した場合、指定したオブジェクトを作成したApplicationオブジェクトを返します。値の取得のみ可能です。 |
Count | コレクションに含まれるオブジェクトの数を返します。 値の取得のみ可能です。長整数型(Long)の値を使用します。 |
|
Creator | 現在のオブジェクトが作成されたアプリケーションを示す32ビットの整数を取得します。 値の取得のみ可能です。長整数型(Long)の値を使用します。 |
|
Item | ブックで並べ替えられるアイテムのコレクションを表すSortFieldオブジェクトを返します。 値の取得のみ可能です。 |
|
Parent | 指定されたオブジェクトの親オブジェクトを取得します。 値の取得のみ可能です。 |
Sortオブジェクトの基本的な使い方
これで、Sortオブジェクトを取得します。
このSortオブジェクトに対して、
以下の順に、メソッドの実行、プロパティ値の設定を行います。
・.SortFields.Addメソッドで、並べ替えのキーを追加
・.SetRangeで、並べ替えの範囲を設定
・.Headerで、行ヘッダーの有無を指定
・.Applyで、並べ替えを実行
並べ替えのキー、範囲、
この部分のみ変更すれば多くの場合はほぼそのまま使いまわせるはずです。
Excel2003までのSortとExcel2007以降のSortの使い分け
最も大きな違いは、
Excel2007以降のSortは、並べ替えのキーの数は(64個の制限はありますが実質)無制限です。
複数列で並べ替えるという事は、
下位のキーから順に並べ替えれば良いという事を理解してください。
この順で並べ替える場合、一度に並べ替えなくても、
以下の順に、1列ずつ並べ替えても結果は同じです。
・C列で並べ替え
・B列で並べ替え
・A列で並べ替え
これを理解することは、
データを整理するとはどういう事かを理解する事にもなります。
最初に書いた通り、並べ替えはデータ処理の基本中の基本です。
しっかりと使えるようになっておいてください。
「マクロの記録で覚えるVBA」の第17回.並べ替え
同じテーマ「マクロVBA入門」の記事
第84回.RangeのAddressプロパティ
第85回.結合セルの扱い
第86回.総合練習問題10
第88回.並べ替え(Sort)
第89回.オートフィルター(AutoFilter)
第90回.フィルターオプションの設定(AdvancedFilter)
第91回.条件付き書式(FormatCondition)
第126回.入力規則(Validation)
第92回.名前定義(Names)
第93回.ピボットテーブル(PivotTable)
第94回.コメント(Comment)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。