セルに設定済みの日付によるソートをVBAで設定したいと思いました。
ネットの情報を見ながらコードを書いたのですが、ちょっと混乱したので、備忘録をまとめておきます。
今回の環境は、Excel 2010です。
経緯
Outlookからエクスポートしたスケジュール情報をマクロで集計しています。
先週末のOfficeのアップデートのせいなのか、エクスポートした内容の日付順がバラバラになってしまっていました。
以前はちゃんと日付順に出てきていたように思うのですが。。
マクロでソートすれば済む話だということで、改造をかけたところ、ちょっとハマりましたw
ソートの基本
VBAでソートを設定するときには、設定部分と実行部分に分けたほうがよいです。
そして、設定時には必ず以前の設定をクリアしたほうがよいです。
Range.Sortメソッドのリファレンスは以下。
あと、範囲指定にR1C1の記述が使えませんでした。。
書き方が間違えていたのか何なのか。時間がなかったので、リファレンスの例のとおりに書きました。
Sortオブジェクトのリファレンスは以下。
今回は、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でソート実行です。
オブジェクトとメソッドがごっちゃになって、混乱してしまいました。
最終的には、既述のとおりにまとまりました。
ご意見やご感想などお聞かせください! コメント機能です。
Excelでのデータ並び替えは、関数を組んでおくことでリアルタイムに分かります