【エクセルVBA】Sortを使って並べ替え

VBA

※本サイトはアフィリエイト広告を利用しています。

データの一覧を数字に大きい順に並べ替えたりなど、データ整理をしていると並べ替えをしたい場面が多々でてきます。
毎月同じ方法でデータ整理をしている場合などは、並べ替えをする列やデータの範囲などの設定を毎回するのは面倒なので、ぜひ自動化しましょう!

コードの紹介

早速コードの紹介です。

今回はこのような表を出荷数の順番に並べていきます。

Sub SortData1()
    
    '同じものが何度もでてくるのでWithでくくる
    With Worksheets(ActiveSheet.Name).sort
    
        With .SortFields
          '並び替え条件を一旦クリアする
            .Clear
            
            '並べ替え項目の設定     
            .Add _
                Key:=ActiveSheet.Range("C1"), _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending
        End With
        
        
        '並び替えの実行
        .SetRange Range("B2:D13")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        
    End With
End Sub

並べ替えをするために条件をいろいろ指定するので長く見えますが、どこをどう変えればいいか分かれば難しくないのでひとつずつ説明していきます!

コードの解説

コピペでそのまま使えますので、どこを変更すればいいかに絞って説明します。

『’並べ替え項目の設定』というところでどの行を並べ替えるかを指定してきます。Addを使って条件を追加していきます。
追加する条件は下記の3つ。
Key:=ActiveSheet.Range(“C1”):どの列を並べ替えるかの指定です。Range(“C1”)だとC列の値の順番で並べ替えができます。並べ替えたい列に合わせてCの部分を変更してください。
また、数字は変更しなくてOKです。列だけ指定できれば良いので、C列で並べ替えたい場合はC1ではなくC2セルやC3セルにしても動きは同じになります。
SortOn:=xlSortOnValues:数字の値で順番に並べます。値以外あるの?と思った方もいらっしゃるかもしれませんが(私もです^^;)、セルの色や文字フォントの色でも並べ替えできるようです。
数字で並べ替えが基本だと思うので、ここはほとんど変更しないと思います。
Order:=xlAscending:昇順か降順かを指定します。xlAscendingだと昇順、xlDescendingだと降順になります。
ここは必要に応じて変更してください。

『’並び替えの実行』のところで並べ替えに必要な条件をさらに指定していきます。

SetRange Range(“B2:D13”):並べ替えるデータの範囲。今回はB2からD13の範囲の表の並べ替えをするのでこのような指定になっています。

Header = xlYes:ヘッダーがあるかどうか。「商品名」とか「出荷数」が書いてある2行目がヘッダーにあたります。
今回の例だとヘッダーがあるのでYesにしています。SetRange Range(“B2:D13”)で指定した範囲にヘッダーが無い場合は.Header = xlNoとします。

MatchCase = False:大文字と小文字を区別しない場合はFalse、区別する場合はTrueに設定します。

Orientation = xlTopToBottom:縦に並べ替えをします。だいたい表の並べ替えというと、縦が多いと思います。ちなみに横方向に並べ替える場合はxlLeftToRightを使います。

SortMethod = xlPinYinふりがな順に並べ替えます。文字コード順の並べ替えxlStroke)もありますがふりがな順で使うことが多いと思います。

Apply:並べ替えを実行します。これは変更不要です。

使いまわしできるように改良

並べ替えはたびたび使う場面が出てくるので、使いまわしができるように部品化しておくことをオススメします。

次に紹介するコードは部品化したバージョンになります。

コードの紹介2

Sub SortData2()

    Dim LastRow As Long, LastCol As Long
    '表の最終行と最終列を取得
    LastRow = Cells(Rows.Count, 2).End(xlUp).Row
    LastCol = Cells(2, Columns.Count).End(xlToLeft).Column

    '並べ替えしたい表に応じて、
    'シート名、表の最終行、表の最終列、並べ替えしたい列番号、表の左上のセル
    'を指定する
    Call sort1(ActiveSheet.Name, LastRow, LastCol, 3, "B2")

End Sub

Function sort1(SheetName As String, LastRow As Long, LastCol As Long, ColNum As Long, StartCell As String)

    '同じものが何度もでてくるのでWithでくくる
    With Worksheets(SheetName).sort
    
        With .SortFields
            '並び替え条件を一旦クリアする
            .Clear
            
            '並べ替え項目の設定
            .Add _
                Key:=ActiveSheet.Cells(1, ColNum), _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending
        End With
        
        
        '並び替えの実行
        .SetRange Range(Range(StartCell), Cells(LastRow, LastCol))
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        
    End With
    
End Function

部品化すると、Sort1というFunctionを呼び出すことで並べ替えができるようになるので使いまわしがしやすくなります。

Sort1を呼び出す時に、並べ替えをしたい列や表の範囲などを引数として指定することで、いろいろな条件での並べ替えができるようになります。

引数がわからないよ!っていう場合は、実行条件を指定するためのものと理解しておけば大丈夫だと思います。
並べ替えしたい表によって、表の範囲とか並べ替えたい列って変わりますよね?それを指定するのが引数です。

並べ替えの列が2列ある場合

今回の例のように、「出荷数」と「在庫数」と2つのデータがある場合、出荷数が小さい順に並べた後に在庫数の順に並べることもできます。
こうすることで、出荷数が同じだった場合は在庫数が小さい順に並べることができます。

やり方は簡単で、『’並べ替え項目の設定』のところを1つ増やすだけです。

コードの紹介3

ではコードの紹介です。

Sub SortData2()

    Dim LastRow As Long, LastCol As Long
    '表の最終行と最終列を取得
    LastRow = Cells(Rows.Count, 2).End(xlUp).Row
    LastCol = Cells(2, Columns.Count).End(xlToLeft).Column

    '並べ替えしたい表に応じて、
    'シート名、表の最終行、表の最終列、1番目に並べ替えしたい列番号、2番目に並べ替えしたい列番号、表の左上のセル
    'を指定する
    Call sort2(ActiveSheet.Name, LastRow, LastCol, 3, 4, "B2")

End Sub

Function sort2(SheetName As String, LastRow As Long, LastCol As Long, ColNum1 As Long, ColNum2 As Long, StartCell As String)

    '同じものが何度もでてくるのでWithでくくる
    With Worksheets(SheetName).sort
    
        With .SortFields
            '並び替え条件を一旦クリアする
            .Clear
            
            '並べ替え項目の設定
            .Add _
                Key:=ActiveSheet.Cells(1, ColNum1), _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending

            .Add _
                Key:=ActiveSheet.Cells(1, ColNum2), _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending

        End With
        
        
        '並び替えの実行
        .SetRange Range(Range(StartCell), Cells(LastRow, LastCol))
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        
    End With
    
End Function

CallでSort2を呼び出すときの引数が1つ増えているのと、並べ替え項目の設定が1つ増えているだけです。

動画

YouTubeでも解説をしております。

動画の方が理解がしやすいと思いますので是非こちらも参考にしてみてください。

まとめ

今回は並べ替えをする方法について解説しました。

並べ替えはちょくちょく使うので、今回紹介したコードのように部品化しておくと便利です。
他にも全角を半角に変換とか、スペースを全部削除とか、ちょっとした時に使うコードなんかも部品化しておくと使いまわせてオススメです。

お問い合わせ、お仕事のご依頼などがありましたら下記のお問い合わせフォームからご連絡ください。
お問い合わせフォーム
VBAの作成であれば50,000円ほどから、自分で使うVBAの書き方で詰まっている方のお手伝いであれば10,000円ほどから承ります。

VBA VBA_Tips
スポンサーリンク
スポンサーリンク
りこをフォローする
エクセルVBAの寺子屋

コメント

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