- ベストアンサー
エクセル 日付による並べ替えのマクロ
エクセルでとても困っています。日付による降順の並べ替えをするマクロを作ったのですが、うまく行きません。出来上がりが下のようになってしまうのです。 2006年4月7日 2006年4月6日 2006年4月5日 2006年4月4日 2006年4月3日 2006年4月28日 2006年4月27日 2006年4月26日 2006年4月25日 2006年4月24日 2006年4月21日 2006年4月20日 2006年4月19日 2006年4月18日 2006年4月17日 2006年4月14日 2006年4月13日 2006年4月12日 2006年4月11日 2006年4月10日 下記はそのマクロです。 Selection.Sort Key1:=Range("A2"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal ちなみにセルA1には”日付”と入っています。 マクロを使わずにシートの上でデータ→並べ替えで行うと下のようにうまく行きます。 2006年4月28日 2006年4月27日 2006年4月26日 2006年4月25日 2006年4月24日 2006年4月21日 2006年4月20日 2006年4月19日 2006年4月18日 2006年4月17日 2006年4月14日 2006年4月13日 2006年4月12日 2006年4月11日 2006年4月10日 2006年4月7日 2006年4月6日 2006年4月5日 2006年4月4日 2006年4月3日 色々といじってみたのですがどうしても解決できません。お力添えをお願いします!
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>DataOption1:=xlSortNormal これは、テキストモードで並べ替えを行うモードです。 そのために日付順に並ばなくなっています。 「, DataOption1:=xlSortNormal」を削除して見てください。 ------------------ DataOption1~DataOption3 は、1 番目~3 番目のキーのテキストを並べ替える方法を指定します。省略可能。 使用できる定数は、次に示す XlSortDataOption クラスの定数のいずれかです。 xlSortTextAsNumbers テキストを数値データとして並べ替えます。 xlSortNormal 既定値。数値データとテキスト データを別々に並べ替えます。
その他の回答 (4)
- hana-hana3
- ベストアンサー率31% (4940/15541)
>なぜ普通のシート上の操作を記録したマクロを実行すると違う処理になるのでしょうか。 MSに聞かないと解りません・・・ 仕様(バグ?)と思って割り切ることかも知れません。 Excel2000 しか使える環境に無い(DataOptionは2002以降の機能)ので何とも言えませんが、記録時に並べ替えのオプションを設定すれば、きちんと反映されるのかも知れません。 2000 では、記録マクロで xl~ と設定された値をそのまま使うとエラーになるものがあります。 変わりに数値で設定するとOKとか・・・ VBA作成者がエラーの原因を追及できる能力も必要でしょうね。
お礼
ありがとうございました。本当に役立ちました。
- papayuka
- ベストアンサー率45% (1388/3066)
不思議ですね。 まったく自信無しですが、DateValueで値を入れ直してから実行してみたらどうなるでしょう? Sub Test() Dim tr As Range, r As Range Set tr = Range(Range("A2"), Range("A65536").End(xlUp)) tr.NumberFormat = "yyyy年m月d日" For Each r In tr r.Value = DateValue(r.Value) Next r Range("A1").CurrentRegion.Sort Key1:=Range("A1"), _ Order1:=xlDescending, Header:=xlYes, _ OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod :=xlPinYin End Sub
- imogasi
- ベストアンサー率27% (4737/17070)
#1です。 そうですか。判っておられる方だったですね。 補足に上げていただいた、日付シリアル値を、質問文のSortのマクロ記録らしいコードで実行すると、正しく並びました。 もう一度テストをやり直してみてください。 同じ結果になるか。 私は下記を疑います。 ●範囲指定(Selection)を全データもれなく(手操作で)指定して実行のこと。 それを手操作でしないなら、Range(○○).Select を(カッコ内の○○に当たる部分を特に)最初に正しくコードで入れること。 ーーー これ以上の原因究明は難物ですね。
- imogasi
- ベストアンサー率27% (4737/17070)
質問にもならない問題と思います。 データが原因でしょう。 日付列が文字列で入っていませんか。 普通は日付列は、普通に入力すると、日付シリアル値という整数値に なります。日付のソートは、何のこと無い整数での並べ替えに過ぎないです。 ところが何かの事情で文字列で入力されていると、文字列の最左桁文字から、右への1文字ずつ比べるソートになります。 データのどの行かをポイントして、数式バー部分に2006/12/1のように表示されるか見てください。 表示されないでしょう。その場合は日付シリアル値に 関数 かまたは VB変換するのが良いでしょう。 A1の 2006年6月12日 を関数 =DATEVALUE(A1) でB1に 38880 に変えられます。B1の書式は日付書式で 例 yyyy年m月d日 で設定しておきましょう。 VBAならVBのDateValue関数があります。 実際データを見ずに独断してますが、万が一見当違いの場合はご容赦を。
補足
実はその点に関してはすでに調べてあり、すべて数式バー部分に2006/12/1のように表示され、またDATEVALUEもきちんと出ます。ですからシート上の操作で並べ替えを行うときちんとできるのだと理解しています。 ちなみに、マクロを使って並べ替えをした日付をyyyy年m月d日と日付シリアル値で表示しなおすと下のようになります。 38814 38813 38812 38811 38810 38835 38834 38833 38832 38831 38828 38827 38826 38825 38824 38821 38820 38819 38818 38817 2006年4月7日 2006年4月6日 2006年4月5日 2006年4月4日 2006年4月3日 2006年4月28日 2006年4月27日 2006年4月26日 2006年4月25日 2006年4月24日 2006年4月21日 2006年4月20日 2006年4月19日 2006年4月18日 2006年4月17日 2006年4月14日 2006年4月13日 2006年4月12日 2006年4月11日 2006年4月10日 何か見落としている点があるのでしょうか?お助け下さい。
補足
無事解決いたしました。感謝いたします。 質問でも書きましたが、マクロではなくシート上で普通にソートすると出来るので、それをマクロの記録を使って記録したものが質問に書いたマクロです。よろしければ参考のためお教えいただきたいのですが、なぜ普通のシート上の操作を記録したマクロを実行すると違う処理になるのでしょうか。お時間があればよろしくお願い致します。