【Excel VBA】日付順に並べ替える(マクロでソート)

セルに設定済みの日付によるソートをVBAで設定したいと思いました。
ネットの情報を見ながらコードを書いたのですが、ちょっと混乱したので、備忘録をまとめておきます。

今回の環境は、Excel 2010です。

経緯

Outlookからエクスポートしたスケジュール情報をマクロで集計しています。
先週末のOfficeのアップデートのせいなのか、エクスポートした内容の日付順がバラバラになってしまっていました。
以前はちゃんと日付順に出てきていたように思うのですが。。

マクロでソートすれば済む話だということで、改造をかけたところ、ちょっとハマりましたw

ソートの基本

VBAでソートを設定するときには、設定部分と実行部分に分けたほうがよいです。
そして、設定時には必ず以前の設定をクリアしたほうがよいです。

Range.Sortメソッドのリファレンスは以下。

Sort オブジェクト (Excel)
Office VBA リファレンス トピック

あと、範囲指定にR1C1の記述が使えませんでした。。
書き方が間違えていたのか何なのか。時間がなかったので、リファレンスの例のとおりに書きました。

Sortオブジェクトのリファレンスは以下。

Range.Sort メソッド (Excel)
Office VBA 言語リファレンス

今回は、Sortオブジェクトで設定関係を入れて、Sortメソッドで実行しました。
なんだか無駄にややこしくしてしまった感もあります。。

実際に書いたコード

実際に書いたコードのデフォルメは以下のとおりです。
一部、変数だったところを固定値にしています。

With ActiveSheet
    ' ソート順設定
    With .Sort.SortFields
        .Clear  ' 設定クリア
        .Add Key:=Range("A1"), _
            DataOption:=xlSortTextAsNumbers
        .Add Key:=Range("B1"), _
            DataOption:=xlSortTextAsNumbers
    End With
    ' ソート実行
    With .Sort
        .SetRange Range("A1:F50")
        .Header = xlYes
        .Orientation = xlTopToBottom
        .Apply
    End With
End With

コードのメモ(設定部分)

ソート準設定のところで、最初に既存のソート設定値をクリアして、ソートキーを2列分設定しています。
A列が日付でB列が時間だったので、日付と時間でソートしました。
キーは3つまで設定できます。Addで順番に設定するか、実行時のプロパティ値として「Key1:=~」みたいに設定するか、分かりやすいほうで設定できます。
事前にオブジェクトに設定する場合は、必ず設定のクリアを入れます。クリアしないとデバッグ時にややこしいことになります。

日付ソートの場合は、DataOptionの設定がキモです。「xlSortTextAsNumbers」にします。

日付としてソートするためには、文字列を数値として扱う必要があります。並べ替えをマニュアル実行する際にポップアップするやつです。
この指定が抜けていると、1日の後に10日が来て、2日の後に20日が来ます。
日付はシリアル値なのです。

コードのメモ(実行部分)

ソートを実行する範囲と、実行時に最初の行が見出しかどうかを指定します。
ソートの範囲指定も、例のとおりにしか指定できませんでした。Cellsで範囲指定したかったのですが。。動いたのでよしとします。。
実際のコードでは、最後の行番号は変数ですので、アンパサンドでLong型の変数を繋ぎました。

.Applyでソート実行です。

オブジェクトとメソッドがごっちゃになって、混乱してしまいました。
最終的には、既述のとおりにまとまりました。

この投稿を書いたのは・・・
Blog Admin

ガジェットが大好きで、ほぼ毎月何かしら調達しております。
無駄遣い扱いされたくないのと、何かの役に立つかと思い、記録を書くことにしたのでした。

お出かけのときには、スマホを複数台とタブレットとパソコンを持ち歩きます。
両手首にはスマートウォッチです。
こんなスタイルで生活している中での備忘録を書いています。

「Blog Admin」をフォローしてみる
Excel関連
「Blog Admin」をフォローしてみる

ご意見やご感想などお聞かせください! コメント機能です。

  1. Eternal Eternal より:
タイトルとURLをコピーしました