プログラムを作る時、ソート(並び替え)は「マクロの記録」を使います。
でもデータの件数が増えた場合、追加されたデータは対象外になってしまいます。
データの件数が増える度にマクロの記録をしていては自動化の意味がありません。
マクロの記録では、選択された範囲を固定して記録される為決まった範囲でしか
処理できません。
そこで、少しばかり修正を加える事によって、何件あっても大丈夫なマクロが
出来上がります。
例
図のように、商品毎に並べてあるデータを金額の昇順(小さい順)に並び替える処理を考えてみましょう。
手順1:並び替えの「マクロの記録」をとってみましょう。(商品順→金額順)
Sub ソート()
'
' ソート Macro
'
Range("A1:C23").Select
Application.CutCopyMode = False
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("C2:C23") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:C23")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A1").Select
End Sub
となりました。(バージョンは2007です)
セルの範囲している行が3つあります。
1行目の Range("A1:C23").Select
4行目の ・・・Key:=Range("C2:C23")
7行目の SetRange Range("A1:C23")
です。
だいたいの想像はつくと思いますが、
範囲指定の最後の位置、つまり"C23"と書かれた箇所を
何件データが追加されても大丈夫なように、
処理するデータの最後の位置(行)にすればいいわけです。
手順2:最終行を求めるコードを追加する。
Sheets("Sheet1").Select
Range("a1048576").Select
x = Selection.End(xlUp).Row
を、1行目に追加します。
次に、範囲指定されたコードに修正を加えます。"C23"の部分です。
手順3:マクロの修正・・変数”x”を入れる。
1行目のRange("A1:C23").Select は → Range
("A1", "C" & x).Select
4行目はRange("C2:C23") を → Range
("C2", "C" & x).Select
7行目は1行目と同じ様に替えます。
修正されたマクロは次のようになります。
Sub ソート()
'
' ソート Macro
'
'
Sheets("Sheet1").Select
Range("a1048576").Select
x = Selection.End(xlUp).Row
Range("A1", "C" & x).Select Application.CutCopyMode = False
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=
Range("C2", "C" & x) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange
Range("A1", "C" & x) .Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A1").Select
End Sub
りんごのデータを2件追加してテストしてみましょう。
図のような結果となったはずです。
こうすれば、データが1000件、10000件あってもボタン一つでソートの処理が
できるようになります。
最終行の取得、変数の使い方、プログラムを作る上で欠かせないものです。