SortField コレクションと Add メソッド

 今回はマクロの冒頭部分を修正します:

 Worksheets("いつ").Sort.SortFields.Clear
 Worksheets("いつ").Sort.SortFields.Add Key:=Range("B2"), SortOn _
   :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

 

SortField コレクション

 まずは次のステートメントについて解説します。

 Worksheets("いつ").Sort.SortFields.Clear

 まず頭の Worksheets("いつ").Sort は Sort プロパティで Sort オブジェクトを得ています。初心者の方は、このプロパティとオブジェクトを混同してしまうケースがあるので、今のうちにしっかり構造を理解しておきましょう。
 Worksheets("いつ") というのはオブジェクトです。これは Worksheets という全てのワークシートの集まり(コレクション)から引数 "いつ" を指定して「いつシート」というオブジェクトを参照しています。

 このオブジェクトにはたらきかけるのが VBA の基本です。
 前回は Select というメソッドによる命令を説明しました。今回はもう1つの命令法であるプロパティです。 property とは「所有物・性質・特質」という意味の単語です。メソッドがワークブックやシートに直接はたらきかける命令であるのに対し、プロパティは対象の性質(セルの中にある文字の色や大きさなど)を変える類の命令が多いと考えてください。

 上のコードで Sort は Worksheets("いつ")のプロパティです。
 今の場合はワークシートの性質というよりは所有物を表していると考えたほうがわかりやすいです。エクセルでお仕事されている人は、ワークシートはたくさんの機能を有していることをご存じだと思います。そのたくさんの「ワークシートの所有物」から「並び替え機能をちょうだい」といってその部分を抜き出します。

 そして、Worksheets("いつ").Sort と記述した段階で、この部分は Sort オブジェクトとなります。少しややこしいかもしれませんが、Sort はワークシートから並び替え機能を抜き出すためのプロパティ、Worksheets("いつ").Sort は抜き出されたオブジェクトなのです。 Sort オブジェクト は並び替えの範囲を設定したり、並び替えそのものを実行したりするかなり 大きな権限 をもっています。

 しかしこれではまだ何もできません。「何をどのように並べるの?」ということが決まっていないからです。この新たなオブジェクトからさらに .SortFields というプロパティ記述を使って SortField コレクションを取得します。 SortField コレクションは Sort オブジェクトの部下のようなもの です。 Sort オブジェクトのように並び替えを実行するような大きな権限はもっていませんが、並び替えの範囲にあるセルの色や文字の色、並び方などを決めることができます。まずこの部下さんたちが細かい設定をして、それから上司の Sort オブジェクトさんに報告して「うむ、いいだろう」と判を押してもらいます。
 Worksheets("いつ").Sort.SortFields のひとかたまりが SortField コレクションです。次の .Clear という記述はメソッドです。「これまでの並び方をいったんリセットしましょう」という命令です。さあ次は SortField コレクションたちにもっと色々な仕事をしてもらいますよ。

Add メソッド

 取得した SortField コレクションに対して Clear メソッドで並び替えフィールドを一旦全て解除しました(今の段階では並び替えフィールドは一度も指定していないので、要するに何もしないとの同じですけどね)。そして改めて Add メソッドを用いて並び替えフィールドを指定し直すことになります:

 Worksheets("いつ").Sort.SortFields.Add Key:=Range("B2"), SortOn _
  :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

 途中の" _" は「ここで改行しますよ」という記述です。
 何だかずらずらと長いコードなので、小分けにして解説しますね。

 Worksheets("いつ").Sort.SortFields.Add Key:=Range("B2")

 Add に続く記述には「 := 」のような記号がついていますね。つまりこの部分は「 Add メソッドの引数き関する記述ですよ」ということです。Add に続く Key という引数が特に重要です。並び替えの起点となるセルを指定します。今の場合は「 :Range("B2") 」ですから、セル B2 を指定しています。これで乱数の1つが指定されたことになります。

 SortOn:=xlSortOnValues

 引数 SortOn は「何の順序で並べるか」を指定します。「いつどこソフト」は当然乱数の「値」で並び替えるんでしたよね。そういう場合は 「 :=xlSortOnValues 」と指定します。SortOn には他にも「 :=xlSortOnCellColor 」(セルの色で並べ替えます)や「 :=xlSortOnFontColor 」(フォントの色で並び替えます)などが指定できますよ。

 Order:=xlAscending

 マクロを記録したときに、乱数の1つを選択して「昇順」をクリックしたことを思い出してください。 ascend は「登る、上がる」という意味の単語です。「 :=xlAscending 」は「昇順に並べなさい」と指定したことになります。もしマクロ記録のときに「降順」を選んでいたのであれば、この部分は「 xlDescending 」となっているはずです。

 DataOption:=xlSortNormal

 DataOption はテキストを数値データとして並べ替えるか否かを指定する引数です。「 :=xlSortNormal 」は「いいえ、しませんよ」という指定です。省略した場合でも「 :=xlSortNormal 」を指定したと同じだとみなされます。なのでこの部分は要りません。削ってすっきりさせましょう。
 

With ステートメントで形を整えます

 以上のように整理整頓すると次のような記述になっているはずです。

 Worksheets("いつ").Sort.SortFields.Clear
 Worksheets("いつ").Sort.SortFields.Add Key:=Range("B2"), SortOn _
   :=xlSortOnValues, Order:=xlAscending

 だいぶすっきりしましたが、もう少し形を整えておきましょう。
 Worksheets("いつ").Sort という記述が2つあることに注目します。
 この記述を1つにするために With ステートメントを用います。これはあるオブジェクトに対するプロパティやメソッドをまとめて指定できるという、とっても便利なステートメントなのです:

 With Worksheets("いつ").Sort
  .SortFields.Clear
  .SortFields.Add Key:=Range("B2"), SortOn _
   :=xlSortOnValues, Order:=xlAscending
 End With

 こう書き直すことによって、 Worksheets("いつ").Sort という Sort オブジェクトに関する記述だということが明確になりますね。 Sort オブジェクトと SortField コレクションが「上司と部下」の関係にあることもわかりやすく示されています。実はまだ SortFields. という記述が重複していることに着目して、これも With と End With で囲んで With を入れ子にすることができます。でも、こばとの個人的な見解としては「入れ子はちょっとなー」と思ってしまいますねー。試しに入れ子で書いてみましょう:

 With Worksheets("いつ").Sort
  With .SortFields
     .Clear
     .Add Key:=Range("B2"), SortOn _
     :=xlSortOnValues, Order:=xlAscending
  End With
 End With

 確かに SortFields. の重複は解消されました。
 しかしその代わりに With と End With というステートメントが増えていますよ。
 1つ消して2つ加えたのですから、元より1つ増えてます!
 しかも入れ子にしたことで、何だかコードが読みにくくなっている気がします。
 もし SortFields. という記述が4つも5つもあるなら、入れ子もありだと思いますが、上のような場合では入れ子にすることはおすすめしません。もちろん、このあたりは好みの問題ですから、「絶対にこうなの!」とまでは主張しませんが ...... とりあえずこのサイトではあまり With の入れ子は使いません。

 ふう。たくさんの項目があって疲れてしまいましたね。これで SortField コレクションさんのお仕事は終わりですよ。次回は上司の Sort オブジェクトさんに権限を委ねて「うむ、いいだろう」と並び替えを実行してもらいます。

Google広告
スポンサーリンク
スポンサードリンク
末尾大型広告
末尾大型広告

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください