2017年10月02日

SortメソッドのOrientationパラメータ(エクセルVBA)

デフォルトに頼っていて失敗しました。



エクセルでデータを並べ替える(ソート)事は良くありますね。
(これが出来るのがエクセルの良さとも言えます)

多くの場合は、行の並べ替えだと思いますが、
列の並べ替えをしたいこともあります。
エクセルでは、「並べ替え」のオプションで
「方向」を「列単位」に指定すると出来ます。

エクセルVBAのSortメソッドでは、Orientationと言うパラメータで指定します。
(エクセル2007以降、Sortオブジェクトが新設されていますが、
記述量が多い割に、動きはこれまでと大して変わらないので、
これまでとの互換性を考えればSortメソッドを使った方が
シンプルで良いと私は思います)

先に、エクセルVBAの古典的で今に続くバグのお話をしますと、
このOrientationパラメータ、
行の入替をしたいときは、
 Orientation:=xlSortColumns
と書きます。
列の入れ替えをしたい時は、
Orientation:=xlSortRows
です。
どう考えても逆ですよね。
このバグはVBAの大昔から存在し、いまだにそのままのようです。
ちなみに、このパラメータには、
行の入替をしたいときは、
Orientation:=xlTopToBottom
列の入れ替えをしたい時は、
Orientation:=xlLeftToRight
と言う書き方もあり、上で書いたパラメータと、
まったく同じ意味になりますので、
直感的には、こちらを覚えておいた方が良さそうですね。

ところで今回書きたかったのは、
Sortメソッドで、Orientationを省略した場合です。
マニュアルを見ますと、
行方向の並べ替え(つまりxlSortColumns、またはxlTopToBottom)が
既定値(デフォルト)となっています。

ところが問題は行単位の並べ替えと、列単位の並べ替えが混在している場合です。
例えば、先に列単位の並べ替えを行うため、
SortメソッドにOrientation:=xlSortRows(またはxlLeftToRight)をつけて実行します。
その次に行単位の並べ替えを行いたいのですが、
ここで既定値(デフォルト)が行単位であると信じて、Orientationパラメータを省略すると、
なんと、実は、直前に行った、列単位で並べ替えがされてしまいます。
Orientation:=xlSortRows(またはxlLeftToRight)をつけて列単位の並べ替えを行った後に、
行単位で並べ替えをしたい場合は、
明示的に Orientation:=xlSortColumns(またはxlTopToBottom)と書かなければいけないようです。

これでは、省略時の既定値(デフォルト)の意味をなさないように思いますが。

とにかく、こういう事であれば、Sortメソッドを使う際は、
Orientationは省略せず、行単位でも列単位でも必ず書いた方が無難のようです。

いや〜、永年やっていて、エクセルVBAは奥が深い(もちろん皮肉です)。




katsuyausami at 16:23│Comments(0)エクセルVBAメモ 

コメントする

名前
URL
 
  絵文字