ExcelVBA データソート

今回、再びExcelによるシステム開発を担当しました。
特に新しい機能を使ったわけでもなく、これまでに何度も使った機能により開発したのですが、意外と使いこなせていないことに気づきました。

特にバージョンアップによる機能の使い方の違いです。
今回はデータの並び替えについて記述したいと思います。

Excel2003まではRangeオブジェクトのSortメソッドを使っていました。

基本的には次のような記述になります。

 ◆合計値の降順に並べ替え
  Range("A1:R21").Sort Key1:=Range("Q2"), Order1:=xlDescending, _
            Header:=xlGuess, OrderCustom:=1, _
            MatchCase:=False, Orientation:=xlTopToBottom, _
            SortMethod:=xlPinYin, _
            DataOption1:=xlSortNormal

また、この機能はソートキーの設定が3項目までだったため、それ以上の項目のソートの場合はソートを複数回に分けて実行する必要がありました。

 ◆合計、5教科計、3教科計の降順、氏名(フリガナ)の昇順に並べ替え
  Range("A1:R21").Sort Key1:=Range("C2"), Order1:=xlAscending, _
            Header:=xlGuess, OrderCustom:=1, _
            MatchCase:=False, Orientation:=xlTopToBottom, _
            SortMethod:=xlPinYin, _
            DataOption1:=xlSortNormal
  Range("A1:R21").Sort Key1:=Range("Q2"), Order1:=xlDescending, _
            Key2:=Range("K2"), Order2:=xlDescending, _
            Key3:=Range("G2"), Order3:=xlDescending, _
            Header:=xlGuess, OrderCustom:=1, _
            MatchCase:=False, Orientation:=xlTopToBottom, _
            SortMethod:=xlPinYin, _
            DataOption1:=xlSortNormal, _
            DataOption2:=xlSortNormal, _
            DataOption3:=xlSortNormal

それが、Excel2007以降はSortオブジェクトにより、次のような記述で
ソートキーが4項目以上でも一度に実行することができるようになりました。

 ◆合計値の降順に並べ替え
  With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SortFields.Clear
    .SortFields.Add Key:=Range("Q2:Q21"), SortOn:=xlSortOnValues, _
            Order:=xlDescending, DataOption:=xlSortNormal
    .SetRange Range("A1:R21")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With

 ◆合計、5教科計、3教科計の降順、氏名(フリガナ)の昇順に並べ替え
  With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SortFields.Clear
    .SortFields.Add Key:=Range("Q2:Q21"), SortOn:=xlSortOnValues, _
            Order:=xlDescending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("K2:K21"), SortOn:=xlSortOnValues, _
            Order:=xlDescending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("G2:G21"), SortOn:=xlSortOnValues, _
            Order:=xlDescending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("C2:C21"), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
    .SetRange Range("A1:R21")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With

簡単ですが、以上です。

【株式会社 エム・システム】
本      社  :〒124-0023 東京都葛飾東新小岩8-5-5 5F
           TEL : 03-5671-2360 / FAX : 03-5671-2361
盛岡事業所  :〒020-0022 岩手県盛岡市大通3-2-8 3F
           TEL : 019-656-1530 / FAX : 019-656-1531
E-mail    : info@msystm.co.jp 
URL     : http://msystm.co.jp/
        : http://msystm.co.jp/excel_top.html
ブログ       : http://d.hatena.ne.jp/msystem/ 
Facebook   : http://www.facebook.com/msysteminc