プロが教える店舗&オフィスのセキュリティ対策術

エクセルでとても困っています。日付による降順の並べ替えをするマクロを作ったのですが、うまく行きません。出来上がりが下のようになってしまうのです。

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日

色々といじってみたのですがどうしても解決できません。お力添えをお願いします!

A 回答 (5件)

>DataOption1:=xlSortNormal



これは、テキストモードで並べ替えを行うモードです。
そのために日付順に並ばなくなっています。

「, DataOption1:=xlSortNormal」を削除して見てください。

------------------
 DataOption1~DataOption3 は、1 番目~3 番目のキーのテキストを並べ替える方法を指定します。省略可能。
使用できる定数は、次に示す XlSortDataOption クラスの定数のいずれかです。 xlSortTextAsNumbers テキストを数値データとして並べ替えます。 xlSortNormal 既定値。数値データとテキスト データを別々に並べ替えます。

この回答への補足

無事解決いたしました。感謝いたします。

質問でも書きましたが、マクロではなくシート上で普通にソートすると出来るので、それをマクロの記録を使って記録したものが質問に書いたマクロです。よろしければ参考のためお教えいただきたいのですが、なぜ普通のシート上の操作を記録したマクロを実行すると違う処理になるのでしょうか。お時間があればよろしくお願い致します。

補足日時:2006/06/12 12:00
    • good
    • 3

>なぜ普通のシート上の操作を記録したマクロを実行すると違う処理になるのでしょうか。



MSに聞かないと解りません・・・
仕様(バグ?)と思って割り切ることかも知れません。

Excel2000 しか使える環境に無い(DataOptionは2002以降の機能)ので何とも言えませんが、記録時に並べ替えのオプションを設定すれば、きちんと反映されるのかも知れません。

2000 では、記録マクロで xl~ と設定された値をそのまま使うとエラーになるものがあります。
変わりに数値で設定するとOKとか・・・
VBA作成者がエラーの原因を追及できる能力も必要でしょうね。
    • good
    • 0
この回答へのお礼

ありがとうございました。本当に役立ちました。

お礼日時:2006/06/12 18:59

不思議ですね。


まったく自信無しですが、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
    • good
    • 0

#1です。


そうですか。判っておられる方だったですね。
補足に上げていただいた、日付シリアル値を、質問文のSortのマクロ記録らしいコードで実行すると、正しく並びました。
もう一度テストをやり直してみてください。
同じ結果になるか。
私は下記を疑います。
●範囲指定(Selection)を全データもれなく(手操作で)指定して実行のこと。
それを手操作でしないなら、Range(○○).Select
を(カッコ内の○○に当たる部分を特に)最初に正しくコードで入れること。
ーーー
これ以上の原因究明は難物ですね。
    • good
    • 0

質問にもならない問題と思います。


データが原因でしょう。
日付列が文字列で入っていませんか。
普通は日付列は、普通に入力すると、日付シリアル値という整数値に
なります。日付のソートは、何のこと無い整数での並べ替えに過ぎないです。
ところが何かの事情で文字列で入力されていると、文字列の最左桁文字から、右への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日

何か見落としている点があるのでしょうか?お助け下さい。

補足日時:2006/06/11 17:14
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A