Excel VBA Sortの罠

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

テーブル初期.jpg

こんなテーブルを用意して


Sub sortTest()
Me.Range("A1").CurrentRegion.Sort key1:=Me.Columns(1)
End Sub


こんなコードを動かします。

予想通り

テーブル2.jpg

こうなります。

さて、続けて


Sub sortTestDes()
Me.Range("A1").CurrentRegion.Sort key1:=Me.Columns(1), _
order1:=xlDescending
End Sub


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

当然

テーブル3.jpg

こうなります。

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

しかし、、

テーブル3.jpg

降順のままです。

どうやら、order1を明記しないと、前回のソートのオプションが引き継がれるようなのです。

ははーん、さてはリボンのソート機能と昇順、降順を共有しているな。
と思って

リボン.jpg

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

テーブル3.jpg

予想は外れました。
かなりしつこく設定が残りますね。

流石に一度ファイルを閉じ、開き直して最初のコードを動かすと昇順にソートされます。

逆に言うと、ファイルを閉じるまで、Orderを設定していないSortは直前のOrderを設定しているSortに引っ張られてしまうということです。

昇順降順が入り混じっているコードの場合はもちろん、昇順だけなのでとOrderを省略していると、何かの都合で降順のソートを一つ入れたら途端に動きがおかしくなります。

なので、Order1:=xlAscendingは省略しないほうが良いというお話でした。

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

にほんブログ村 IT技術ブログ VBAへ
にほんブログ村

この記事へのコメント

この記事へのトラックバック