Home » エクセルマクロ・Excel VBAの使い方 » Sortオブジェクト » SortFields.Clearとは

対象:Excel 2010, Excel 2013, Windows版Excel 2016

このサイト『インストラクターのネタ帳』のアクセスログを眺めていて、
「vba .sortfields.clear とは」
「マクロ 意味 sort.sortfields.clear」
という検索キーワードでのアクセスに気付きました。

Excel VBAで並べ替えを行うコードには必ずと言っていいほど、SortFieldsコレクションオブジェクトのClearメソッドを使ったコードが登場します。

オブジェクトブラウザー:SortFields.Clear

このSortFields.Clearが、何のために必要なのかを調べていらしたのでしょう。

[スポンサードリンク]

SortFields.Clearを確認するサンプルマクロ

以下のような簡単なデータで並べ替えを行ったときの様子を観察して、SortFields.Clearメソッドの働きを理解しましょう。

SortFields.Clearを確認するワークシート

上記のようなシートがアクティブな状態で、まずは以下のSubプロシージャを実行しましょう。

Sub SortFieldsオブジェクトのClearメソッドの確認()
 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")

 srt.Apply
End Sub

実行すると下図のように並べ替えが行われます。

並べ替えの行われたワークシート

コードが、
  srt.SortFields.Add Key:=Range("B1")
となっているとおり、B列をキーに昇順で並べ替えられたことを確認できます。

SortFields.Clearのコメントアウト

つづいて、SortFields.Clearメソッドの働きを確認するために、先のSubプロシージャを以下のように変更してください。

Sub SortFieldsオブジェクトのClearメソッドの確認()
 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に変更

 srt.Apply
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コレクションオブジェクトの2つのItem

この時点で、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コレクションオブジェクトの3つのItem

もちろんSortFieldsコレクションオブジェクトに、更にAddされたためです。

SortFields.Clearの働きを確認する

つづいて、先にコメントアウトした、
  srt.SortFields.Clear
を、非コメント化して(実行されるコードに戻して)、もう一度ステップ実行しましょう。

オブジェクト変数srtにSortオブジェクトをセットする、
  Set srt = ActiveSheet.Sort
が実行された時点では、先ほど見たとおりSortFieldsコレクションオブジェクトのItemは3つのままです。

しかし、SortFields.Clearメソッドが実行されると、下図のとおりItemがなくなります。

ローカルウィンドウ:SortFields.Clearの実行直後

これがSortFields.Clearメソッドの働きです。

このままSubプロシージャの実行をつづけると、もちろん今度はA列のデータをキーに並べ替えが行われます。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » Sortオブジェクト » SortFields.Clearとは

「Sortオブジェクト」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.