Excel VBA Sortの罠
今日、この罠にハマって2時間を浪費しました。

こんなテーブルを用意して
こんなコードを動かします。
予想通り

こうなります。
さて、続けて
こんなコードを動かします。
さっきのとほぼ同じですが、order1:=xlDescendingが付いています。
降順にソートということですね。
当然

こうなります。
ここで、もう一度最初のコードを動かします。
order1は書いていませんが、xlAscendingが規定値なので昇順にソートされるはずです。
しかし、、

降順のままです。
どうやら、order1を明記しないと、前回のソートのオプションが引き継がれるようなのです。
ははーん、さてはリボンのソート機能と昇順、降順を共有しているな。
と思って

ここから昇順に一度ソートしてから、最初のコードを再び動かします。

予想は外れました。
かなりしつこく設定が残りますね。
流石に一度ファイルを閉じ、開き直して最初のコードを動かすと昇順にソートされます。
逆に言うと、ファイルを閉じるまで、Orderを設定していないSortは直前のOrderを設定しているSortに引っ張られてしまうということです。
昇順降順が入り混じっているコードの場合はもちろん、昇順だけなのでとOrderを省略していると、何かの都合で降順のソートを一つ入れたら途端に動きがおかしくなります。
なので、Order1:=xlAscendingは省略しないほうが良いというお話でした。

(サンプルファイル・無料電子版付)できる大事典 Excel VBA 2019/2016/2013&Microsoft 365 - 国本 温子, 緑川 吉行, できるシリーズ編集部

にほんブログ村

こんなテーブルを用意して
Sub sortTest()
Me.Range("A1").CurrentRegion.Sort key1:=Me.Columns(1)
End Sub
こんなコードを動かします。
予想通り

こうなります。
さて、続けて
Sub sortTestDes()
Me.Range("A1").CurrentRegion.Sort key1:=Me.Columns(1), _
order1:=xlDescending
End Sub
こんなコードを動かします。
さっきのとほぼ同じですが、order1:=xlDescendingが付いています。
降順にソートということですね。
当然

こうなります。
ここで、もう一度最初のコードを動かします。
order1は書いていませんが、xlAscendingが規定値なので昇順にソートされるはずです。
しかし、、

降順のままです。
どうやら、order1を明記しないと、前回のソートのオプションが引き継がれるようなのです。
ははーん、さてはリボンのソート機能と昇順、降順を共有しているな。
と思って

ここから昇順に一度ソートしてから、最初のコードを再び動かします。

予想は外れました。
かなりしつこく設定が残りますね。
流石に一度ファイルを閉じ、開き直して最初のコードを動かすと昇順にソートされます。
逆に言うと、ファイルを閉じるまで、Orderを設定していないSortは直前のOrderを設定しているSortに引っ張られてしまうということです。
昇順降順が入り混じっているコードの場合はもちろん、昇順だけなのでとOrderを省略していると、何かの都合で降順のソートを一つ入れたら途端に動きがおかしくなります。
なので、Order1:=xlAscendingは省略しないほうが良いというお話でした。

(サンプルファイル・無料電子版付)できる大事典 Excel VBA 2019/2016/2013&Microsoft 365 - 国本 温子, 緑川 吉行, できるシリーズ編集部

にほんブログ村
この記事へのコメント