【EXCEL VBA | Sortメソッド ・ Sortオブジェクト】データを並べ替える

スポンサーリンク

データを並べ替える

表をいろいろな条件を指定して並べ変えることが出来ます。

並べ替えは、EXCEL2007から機能が強化されて、元々あったRangeオブジェクトのSortメソッドに加えて、Sortオブジェクトが追加されています。

次の表をサンプルに、それぞれ紹介していきます!

Sortメソッド

まずは簡単なSortメソッドから

構文

Rangeoオブジェクト.Sort Key1, Order1, Header

Key1・・・どの列を基準に並べ替えるか指定する。Rangeオブジェクトでセル範囲を指定する、Keyは3つまで指定出来る。

Order1・・・どのような順番で並べ替えるかを指定する。xlAsendingあるいは1(昇順)、xlDesendingあるいは2(降順)、省略するとxlAsendingになる。Keyを複数指定している場合は、Orderも複数設定出来る。

Header・・・1行目を見出しとみなすかどうかを指定します。xlGuessあるいは0(自動判別)、xlYesあるいは1(見出しとみなす)、xlNoあるいは2(見出しとしない)、省略すると手動操作も含め前回と同じ設定が適応される

※他にも引数はあるが、とりあえずよく使うものだけ。

使い方

サンプルの表を、B列を基準に昇順に並べ変えてみましょう。

Sub sample()

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

最初のRange(”A1”)は、表の中のどこかを指定します。普通は一番左上かと思いますのでA1セルを指定。

Key1には、今回B列基準で並べ替えたいのでRange("B1")を指定しました。これもB列ならどこでも良いです。Range("B3")とかでも。普通は一番上にしますねw

一番上が見出し行の表なので、HeaderにはxlYesを指定しています。

実行すると次のようになります。

B列(スコア)の少ない順(昇順)に並べ変わりましたね(^o^)

Sortオブジェクト

それでは、追加された方のオブジェクトも同じように見ていきましょう!

EXCEL2007からは、並べ替えの機能が強化され、一度の並べ替えで指定出来るキーが最大3つから64個になりました!

誰がそんなに設定すんねん!って感じですねw

また、色やアイコンでの並べ替えも出来るようになりました。Sortオブジェクトでそれが出来るようになってるんですね(^o^)

Sortオブジェクト

構文

ワークシートオブジェクト.Sort

これでソートオブジェクトが指定出来ます。

並べ替えを実行するには、まず並べ替えの条件を指定する必要があります。

SortオブジェクトはにはSortFieldsコレクションというものがあり、これが並べ替えの条件を設定するものになっています。

ややこしい話ですが、SortFieldオブジェクトの集合体がSortFieldsコレクション(sがついてるよ)になっていて、ワークシートで言うところの次の画像です。

右クリックメニューの””並べ替え”から”ユーザー設定の並べ替え”を選ぶと出てくるやつですね。

SortFieldsコレクションは、Sortオブジェクトから指定しますので、次のように書きます。

ワークシートオブジェクト.Sort.SortFields

ここでの注意点は、SortFieldコレクションは上の画像の設定に追加するような形になります。

つまり、一回設定すると、消す命令を出すまで残っています。(条件は64個まで指定出来る)

ですので、思わぬ挙動を引き起こさないように、VBAで記述する場合は最初にSortFieldsコレクションを全て消す命令を書いておくと良いでしょう。

SortFieldsコレクションを削除するには、Clearメソッドを使います。

ワークシートオブジェクト.Sort.SortFields.Clear

そして、SortFieldsコレクションに設定を追加するには、Add2メソッドを使います。

ワークシートオブジェクト.Sort.SortFields.Add2(Key, SortOn, Order, Customorder, DataOption)

引数の意味は次のようになっています。

Key・・・並べ替えの基準セルを指定する。ここで指定した列で並べ替えされる

SortOn ・・・ 並べ替えの対象を指定する。xlSortOnCellColorまたは1(セルの色)、xlSortOnFontColorまたは2(フォントの色)、xlSortOnIconまたは3(アイコン)、xlSortOnValuesまたは0(値)

Order・・・並び替えの順序の指定。xlAscendingまたは1(昇順)、xlDescendingまたは2(降順)

Customorder ・・・ ユーザー設定の並べ替え順序の指定、カンマ区切りのっ文字列(Variant)型で指定。

DataOption ・・・ テキストの並べ替え方法の指定。xlSortNormalまたは0(数値とテキストを別々に並べ替え)、xlSortTextAsNumbersまたは1(テキストを数値データとして並べ替え)

それでは、Sortメソッドの時と同じように、B列を基準に昇順に並べ変える設定を行います。

Sub sample()
    
    With ActiveSheet.Sort
        With .SortFields
            
            'SortFieldsコレクションの削除
            .Clear
        
            '1つめの条件
            .Add Key:=Range("B1"), _
                 SortOn:=xlSortOnValues, _
                 Order:=xlAscending
            
'            '2つ以上の条件がある場合は続けて(今はコメントアウト)
'            .Add Key:=Range("A1"), _
'                 SortOn:=xlSortOnValues, _
'                 Order:=xlDescending
            
        End With
        
        **************************
        'ここにSortオブジェクトのメソッドで挙動に対する設定
        **************************
        
    End With
     
End Sub

こんな感じですね。

そして、これではまだ並べ替えは実行出来ませんので、続けてSortオブジェクトのメソッドやプロパティを使って仕上げを行います。

使うのは以下の通りです。

SetRangeメソッド・・・並べ替えが行われる範囲の指定

ワークシートオブジェクト.Sort.SetRange(セル範囲)

Applyメソッド・・・並べ替えの実行

ワークシートオブジェクト.Sort.Apply

Headerプロパティ・・・SetRangeメソッドで指定した並べ替え範囲の先頭行を見出しとして使うかどうかを指定します。xlGuessあるいは0(自動判別)、xlYesあるいは1(見出しとする)、xlNoあるいは2(見出しとして扱わない)

MatchCaseプロパティ・・・大文字と小文字を区別する場合はTrue、区別しない場合はFalse

Orientationプロパティ・・・並べ替えの方向を指定。xlTopToBottomまたは1(行単位で並べ替え)、xlLeftToRightまたは2(列単位で並べ替え)

SortMethodプロパティ・・・並べ替えの方法を指定。xlPinYinまたは1(ふりがなを使って並べ替え)、xlStrokeまたは2(ふりがなを使わず並べ替え)

並べ替え条件で作ったコードに追加します。

Sub sample()
    
    With ActiveSheet.Sort
        With .SortFields
            
            'SortFieldsコレクションの削除
            .Clear
        
            '1つめの条件
            .Add Key:=Range("B1"), _
                 SortOn:=xlSortOnValues, _
                 Order:=xlAscending
            
'            '2つ以上の条件がある場合は続けて(今はコメントアウト)
'            .Add Key:=Range("A1"), _
'                 SortOn:=xlSortOnValues, _
'                 Order:=xlDescending
            
        End With
        
        '********************************
        'ここにSortオブジェクトのメソッドやプロパティで挙動に対する設定
        '********************************
        .SetRange Range("A1:B12")
        .Header = xlYes
        .MatchCase = True
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        
        .Apply '並べ替えの実行
        
    End With
     
End Sub

こんな感じになります。

これを、実行すると次のようにちゃんと並べ変わることが分かります。

まとめ

並べ替えについて紹介しました。Sortオブジェクトを使えば、複雑な並べ替えも出来るんですが、まぁそんなことほとんど無いですねw

実務ではSortメソッドだけ分かってれば十分かと思います(^o^)