簡単な整列
Excel のソートは,多機能でありとても優秀です.
それをVBAで実現するには?・・・難しそうですねぇ.
まぁ,取り敢えずやってみましょう.
このデータを昇順にソートします
私,残念ながら,Excel に関する書籍も VBA に関する書籍も全く持っておりません.
そこで,マクロの記録を使うことします.
当然,簡単にできます.
Excel 様にこのようなソートをさせるのは気が引けますが・・・
肝心なことは,この操作によりどのようなマクロが生成されたかです.
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1:A1") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:J1")
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
End Sub
アラ~!どんでもない(と私には思える)コードが書かれています.
しかし,よ~く見ると何となく想像ができる部分がありますね.
例えば,Add に続く
Key:=Range("A1:A1")
これは,ソートのためのキーを指定しているようです.
この例では一行のデータを昇順に並べているだけですから,これ以外の指定はできませんが.
次に
Order:=xlAscending
明らかに,昇順でソートすることを示していると考えられます.
この部分を
Order:=xlDescending
と書き換えれば,降順に並べることができるはずです(実際,確認しました).
.SetRange Range("A1:J1")
ソートの範囲を示すものと考えられます.
.Orientation = xlLeftToRight
行方向にデータを並べることを示しているようです.
.Apply
これは,実行するでしょうね.
それ以外は,おまじないということにしておきましょう.
ところで,Excel と言えば,データベースのように行をレコードとし,列を項目としてテーブルを作成するのが通常の使い方です.
ということは,ソートも横方向ではなく,縦方向が圧倒的に多いと考えられます.
そこで,A1 : A10 にデータを並べて,それをソートするという使い方ができなければなりません.
これもマクロを記録してみました.
Sub Macro2()
'
' Macro2 Macro
'
'
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1:A1") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:A10")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
うん,予想通りのマクロが生成されています.
ここまで,ソートの基本の基本部分を確認したに過ぎませんが,ここまで分かれば多少複雑な表であっても,自動でソートするマクロを作成することができそうです.
もっとも,最初の部分を記憶しようという気にはなりませんが
よくあるおまじないということにして,VBA のソート,今日のところはここまでといたしましょう.
ところで,Excel 様のソートアルゴリズムは,バブルソートだそうです.