このサイト『インストラクターのネタ帳』のアクセスログを眺めていて、
「vba .sortfields.clear とは」
「マクロ 意味 sort.sortfields.clear」
という検索キーワードでのアクセスに気付きました。
Excel VBAで並べ替えを行うコードには必ずと言っていいほど、SortFieldsコレクションオブジェクトのClearメソッドを使ったコードが登場します。
このSortFields.Clearが、何のために必要なのかを調べていらしたのでしょう。
SortFields.Clearを確認するサンプルマクロ
以下のような簡単なデータで並べ替えを行ったときの様子を観察して、SortFields.Clearメソッドの働きを理解しましょう。
上記のようなシートがアクティブな状態で、まずは以下のSubプロシージャを実行しましょう。
Dim srt As Sort
Set srt = ActiveSheet.Sort
srt.SortFields.Clear
srt.SetRange Range("A1").CurrentRegion
srt.Header = xlYes
srt.SortFields.Add Key:=Range("B1")
End Sub
実行すると下図のように並べ替えが行われます。
コードが、
srt.SortFields.Add Key:=Range("B1")
となっているとおり、B列をキーに昇順で並べ替えられたことを確認できます。
SortFields.Clearのコメントアウト
つづいて、SortFields.Clearメソッドの働きを確認するために、先のSubプロシージャを以下のように変更してください。
Dim srt As Sort
Set srt = ActiveSheet.Sort
' srt.SortFields.Clear 'コメントアウト
srt.SetRange Range("A1").CurrentRegion
srt.Header = xlYes
srt.SortFields.Add Key:=Range("A1") 'B1をA1に変更
End Sub
SortFields.Clearメソッドのコメントアウトを無視して考えると、先ほどのSubプロシージャで、
srt.SortFields.Add Key:=Range("B1")
だった行を、
srt.SortFields.Add Key:=Range("A1")
にしたのですから、A列をキーに並べ替えが行われそうなものです。
しかし実行してみるとワークシートには、何の変化も起きません。
コードを、
srt.SortFields.Add Key:=Range("A1")
と変更したのにも関わらず、A列をキーに並べ替えが行われなかったのかは、もちろん
srt.SortFields.Clear
をコメントアウトしたからです。
ローカルウィンドウでオブジェクト変数を確認する
オブジェクト変数srtの様子を、ローカルウィンドウで確認すると、上述のような動きになる理由がわかり、SortFields.Clearがなぜ必要なのかも見えてきます。
メニュー[表示]-[ローカルウィンドウ]からローカルウィンドウを表示して、ショートカットキー[F8]でステップ実行を行い、Sortオブジェクトをオブジェクト変数srtにセットした直後の様子を確認しましょう。
この時点で、SortFieldsコレクションオブジェクトに、Item(SortFieldオブジェクト)が2つ含まれていることがわかります。
オブジェクト変数srtには、Sortオブジェクトをセットしたばかりであるにも関わらず、です。
何故このような状態になっているかというと、最初に、
srt.SortFields.Add Key:=Range("B1")
で実行したSortFieldオブジェクトと、SortFields.Clearをコメントアウトして、
srt.SortFields.Add Key:=Range("A1")
に変更してから実行したときのSortFieldオブジェクトが残っているためです。
SortFieldsコレクションオブジェクトは、Clearメソッドが実行されないと、前のSortFieldオブジェクトが残ったまま、追加が行われるのです。
更にステップ実行を継続し、
srt.SortFields.Add Key:=Range("A1")
を実行すると、Itemは更に1つ増えて3つになることも確認できます。
もちろんSortFieldsコレクションオブジェクトに、更にAddされたためです。
SortFields.Clearの働きを確認する
つづいて、先にコメントアウトした、
srt.SortFields.Clear
を、非コメント化して(実行されるコードに戻して)、もう一度ステップ実行しましょう。
オブジェクト変数srtにSortオブジェクトをセットする、
Set srt = ActiveSheet.Sort
が実行された時点では、先ほど見たとおりSortFieldsコレクションオブジェクトのItemは3つのままです。
しかし、SortFields.Clearメソッドが実行されると、下図のとおりItemがなくなります。
これがSortFields.Clearメソッドの働きです。
このままSubプロシージャの実行をつづけると、もちろん今度はA列のデータをキーに並べ替えが行われます。
- Newer:マクロのセキュリティ設定確認方法
- Older:AutoFilterの名前付き引数
Home » エクセルマクロ・Excel VBAの使い方 » Sortオブジェクト » SortFields.Clearとは