「エクセル2010 マクロ 並べ替え」
「マクロ 並べ替え 構文 違う 2010 2003」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスが見られます。
並べ替えマクロを作ろうとして苦労している方による検索です。
2003までのExcelの並べ替えはRangeオブジェクトのSortメソッドで行っていましたが、Excel 2007からはSortオブジェクトが用意され、2003までよりも、いろいろなことができるようになっています。
Office TANAKAの田中亨さんも、Excel 2007で登場したSortオブジェクトについてガッツリした記事を書いてらっしゃいます。
マクロ記録を行うと、単純な昇順の並び替えを行っただけでも、結構な行数のコードが作られ、マクロ初心者の方は、読解に苦労するだろうなと感じます。
細かな説明は、田中さんの記事を是非読んでいただくとして、マクロ記録でできた並べ替えのコードを、どう手直ししていくかという一例をまとめてみます。
マクロ記録でできるマクロ
例えば、「1課」という名前のワークシートで、A1:B1セルが見出し、A2:B11セルに10件のデータが入っているときに、A1セルがアクティブな状態で、昇順の並べ替えを行うと、以下のようなコードができます。
ActiveWorkbook.Worksheets("1課").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("1課").Sort.SortFields.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("1課").Sort
.SetRange Range("A2:B11")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
たくさんの引数やプロパティ・メソッドが並んだコードができます。
改行や空白行の追加
このコードはマクロに慣れた人でも読みやすくはありません。
まずは、改行や空白行を追加しましょう。
ActiveWorkbook.Worksheets("1課").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("1課").Sort.SortFields.Add _
Key:=Range("A1"), _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("1課").Sort
.SetRange Range("A2:B11")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
これだけでも、最初のマクロ記録のままのコードより、随分読みやすくなっています。
マクロ記録機能を使うと、ある程度の長さのコードは、
ActiveWorkbook.Worksheets("1課").Sort.SortFields.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
のように、読みやすさとはまったく関係なく、ある程度の横幅になったところで「 _」(スペースとアンダーバー)による改行が行われたものになります。
これを、意味を理解しやすい位置で、
ActiveWorkbook.Worksheets("1課").Sort.SortFields.Add _
Key:=Range("A1"), _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
のように改行を整理するだけで、読みやすさは格段に上がります。
コメントの追加
次にコメントを追加しましょう。
コメントを入れるためには、勿論、ヘルプを調べたり、ネットで情報を探したりする必要があります。
' ▼並べ替えの条件をクリア
ActiveWorkbook.Worksheets("1課").Sort.SortFields.Clear
' ▼並べ替えの条件を指定
ActiveWorkbook.Worksheets("1課").Sort.SortFields.Add _
Key:=Range("A1"), _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
' Key 並べ替えのキー
' SortOn 並べ替えの種別(値・背景色・文字色・アイコン)
' Order 昇順・降順
' DataOption 文字列の数値が存在しているときにどうするか
' ▼並べ替えの実行
With ActiveWorkbook.Worksheets("1課").Sort
.SetRange Range("A2:B11") ' この範囲で、
.Header = xlNo ' 先頭行は見出しではなく、
.MatchCase = False ' 大文字小文字を区別せず、
.Orientation = xlTopToBottom ' 上下方向に、
.SortMethod = xlPinYin ' ふりがなを使って、
.Apply ' 並べ替えを実行
End With
ここまでコメントを入れれば、相当意味がわかってくるはずです。
自分が理解するためのコメントなので、形式を気にするよりも、自分が理解しやすいことを優先しましょう。
不要そうなコードの削除
コメントを入れてコードの意味がわかってくると、なくても良さそうな引数やプロパティが邪魔になってきますから、不要そうなコード削除してみます。
' ▼並べ替えの条件をクリア
ActiveWorkbook.Worksheets("1課").Sort.SortFields.Clear
' ▼並べ替えの条件を指定
ActiveWorkbook.Worksheets("1課").Sort.SortFields.Add _
Key:=Range("A1"), _
Order:=xlAscending
' Key 並べ替えのキー
' Order 昇順・降順
' ▼並べ替えの実行
With ActiveWorkbook.Worksheets("1課").Sort
.SetRange Range("A2:B11") ' この範囲で、
.Header = xlNo ' 先頭行は見出しではなく、
.MatchCase = False ' 大文字小文字を区別せず、
.SortMethod = xlPinYin ' ふりがなを使って、
.Apply ' 並べ替えを実行
End With
どこが不要そうかは、見解がわかれるところでしょうが、ここでは、
SortFields.Addメソッドの引数・SortOnとDataOption
SortオブジェクトのOrientationプロパティを削除しました。
勿論、不要だろうと思われる行をいきなり[Delete]するより、一旦不要そうな行の先頭に「'」(シングルクォート)をつけてコメントアウトして、いくつかのパターンでテストしてみて、本当に不要かどうかを確認することをおすすめします。
アクティブセルの列をキーに昇順で並べ替えるマクロ
ここまで整理すれば、汎用性のあるマクロにするのも、それほど難しくないはずです。
例えば、アクティブなシートの、アクティブセルの列をキーにして、昇順で並び替えをするマクロにしたいのなら以下のような感じのマクロにできます。
' ▼並べ替えの条件をクリア
ActiveSheet.Sort.SortFields.Clear
' ▼並べ替えの条件を指定
ActiveSheet.Sort.SortFields.Add _
Key:=ActiveCell, _
Order:=xlAscending
' ▼並べ替えの実行
With ActiveSheet.Sort
.SetRange ActiveCell.CurrentRegion
.Header = xlYes ' 先頭行を見出しに
.MatchCase = False ' 大文字小文字を区別しない
.SortMethod = xlPinYin ' 並べ替えにふりがなを使う
.Apply
End With End Sub
なお、今回のマクロで登場したSortオブジェクト関連のヘルプは、ちゃんと用意されているのですが、以上のような書き方をしている場合、コードウィンドウで[F1]キーを押しても、該当するヘルプが表示されません。オブジェクト式の文法上これはやむを得ないことです。。
ですが、オブジェクトブラウザからなら、ヘルプを引くことができます。
ある程度経験を積んで、もっとマクロを活用したいとお考えの方は、オブジェクトブラウザの使い方も学習することを、おすすめしておきます。
Home » エクセルマクロ・Excel VBAの使い方 » Sortオブジェクト » マクロ記録で出来た並べ替えマクロをどう修正するか