- ベストアンサー
ExcelVBA:列方向の並び替え Orientation
いつも大変お世話になります。初心者です。 長文で申し訳ありませんが、私の間違いについてご指導をお願いします。(Excel2003) 並び替えについて訳が分からなくなってしまいました。現状は、 ・A2セル=1月、A3=2月、A4=3月、A5=合計 ・B1セル=札幌、C1=東京、D1=名古屋、E1=大阪 ・B2:E4 は売上金額です。 ・B5 は、SUM(B2:B4) です。C5~E5も同様です。 ※売上合計は多い順に、東京、大阪、名古屋、札幌です。 この表の合計金額を並び替えをしたいと思い、以下を書いてみました。 左から順に、売上合計の多い支社順に、並ばせようとしました。 Cells(1, 1).CurrentRegion.Sort _ key1:=Cells(5, 1), order1:=xlDescending, Orientation:=xlSortColumns, header:=xlYes 【甲】 すると全く意図した形ではない並び替えが実行されてしまいました。 (なぜか行が入れ替わり、列は変わらず。) 【乙】 しかし、上のOrientationを、xlSortRows に変えてやってみると、意図した通りに並び替えられました。 【丙】 また、Order1:=xlAscending, Orientation:=xlSortRows でやってみると、列の並び替えは実施されますが、 月の見出し列(A1~A5)が一番右に移動してしまいます。 -------------------------------------------------------------------------- その後いろいろ調べたり、試行したりしたのですが疑問が山積してしまいました。 基礎的な話かもしれませんが、上記の例で、「列方向に、合計金額を基準に、正しく降順・昇順並び替え」をしたいと思っています。 【質問1】Sortメソッドのヘルプで見ると、Orientation の説明に、xlSortRows,xlSortColumnsの説明がありますが、 行方向、列方向、どうしても実際の動きと逆な気がしてなりません。 私の勘違いでしょうか。 【質問2】マクロの自動記録時に気づいたのですが、Orientation の設定に、xlLeftToRight や、xlTopToBottom というのが使われていました。 これらと xlSortRows, xlSortColumns の違いはありますか。 【質問3】列方向への並び替えの際には、Headerの設定をするのは無意味ですか? 上記(丙)のパターンで、xlGuess でも、xlYes 、xlNo でも全く動きは変わらず、月の見出し列が最右に移動しました。 【質問4】上の(丙)のパターンで正しく動かす為には、Sort の対象となる範囲を、B列以降にする必要があるのでしょうか。 ---------------------------------------------------------------------------- 分かりにくい箇所もあったかと思いますが、ご指摘いただければ補足させていただきます。 なお、「そんな簡単な表だったら、手で作業したら?」ということではなく、後学のために知っておきたいので質問させていただきました。 なにぶん勉強中なため見当外れの質問もあるかもしれませんが、なにとぞご教示よろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 今、追って調べてみました。 英文も調べてみましたが、英文の元も同様になっているようで、列挙型で指定してみましたが、それでも違うようです。どうやら、Helpの内容自体が間違っているようですね。 #4で # 違う言語範囲の中に、別の組み込み定数があるから、このように出るのだと思います。 と、書いたように、データ型を列挙型で指定してみますと、 このように指定します。 Dim xlSortOrder1 As XlSortOrder Dim xlSortOrientation1 As XlSortOrientation xlSortOrder1 = xlAscending xlSortOrientation1 = xlSortRows これでマクロを実行してみると、違っています。 VS 2005のヘルプの英文側に、 名前空間: Microsoft.Office.Tools.Excel アセンブリ: Microsoft.Office.Tools.Excel (microsoft.office.tools.excel.dll 内) Member name Description xlSortColumns Sorts by column. xlSortRows default. Sorts by row. となっています。この列挙型の定数は C++,C#, J# とは、整合性は合うようですが、どうやら、Excel内部で縦横が入れ違うようです。 私は、Excel 2002 を持ちませんが、他は、以下のようになっていました。 オブジェクト・ブラウザ で見ると、xlSortRows, xlSortColumns は、単に Constant になっていましたから、Excel独自に存在しているようです。 Help の内容です。 Excel 2003 : Orientation 省略可能です。バリアント型 ( Variant ) の値を使用します。 : xlSortRows (既定値) 行単位で並べ替えます。 : xlSortColumns 列単位で並べ替えます。 Excel2000 : Orientation 省略可能です。バリアント型 ( Variant ) の値を使用します。 xlSortRows を指定すると、上から下に並べ替えます (行の並べ替え)。 xlSortColumn を指定すると、左から右に並べ替えます (列の並べ替え)。 ------------------------------- Excel 97 Orientation 省略可能です。バリアント型 (Variant) の値を指定します。 xlTopToBottom を指定すると、上から下へ並べ替えます (行の並べ替え)。 xlLeftToRight を指定すると、左から右へ並べ替えます (列の並べ替え)。 Excel 5 orientation 省略可能です。 xlTopToBottom を指定するか指定を省略すると、上から下に並べ替えます (行の並べ替え)。xlLeftToRight を指定すると、左から右へ並べ替えます (列の並べ替え)。 ただ、実際に、行と列を両方行うようなコードの場合は、以下のように、数値で行うか、定数を改めて作るかのほうが安全かもしれません。 可読性ではなく、誤読性になってしまいますからね。(^^; Dim flg As Integer flg = 2 '降順 =2 '昇順 =1
その他の回答 (5)
- okormazd
- ベストアンサー率50% (1224/2412)
#3です。 ヘルプの説明はあっていませんね。 下記のようになるべきですね。 xlSortRows 列単位で並べ替えます。 xlSortColumns (既定値) 行単位で並べ替えます。 >xlSortRows は、xlLeftToRight に。 xlSortColumns は、xlTopToBottom に対応するようなのです。 xlSortColumns=1,xlTopToBottom=1 xlSortRows=2,xlLeftToRight=2 だから、ご指摘のとおりです。 すみませんでした。
お礼
再度のご回答まことに有難うございます。 >ヘルプの説明はあっていませんね。 安心しました。何度考えても、逆ではないか、と悶々としていましたので(笑)。 勉強になりました。そしてすっきりしました。 有難うございます!
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #2の回答者です。 >【質問2】マクロの自動記録時に気づいたのですが、Orientation の設定に、>xlLeftToRight や、xlTopToBottom というのが使われていました。 >これらと xlSortRows, xlSortColumns の違いはありますか。 今、調べてみましたが、記録マクロに出てくるその組み込み定数は、定数の内部の数値は変わりませんが、たぶん、この食い違いは、開発途中か、違う言語範囲の中に、別の組み込み定数があるから、このように出るのだと思います。今の段階では、Sort メソッドではなく、SortSpecial メソッド側の組み込み定数のものようです。こういう入れ違いはいくつかあるようです。 なお、前言の # XL2000と共有しない部分のみです。 ということで調べると、以下が共有しない部分でした。 DataOption1:=xlSortNormal ただ、理屈はともかくとして、こういうものは、記録マクロを越えることはないと思いますね。単に、並べ替えの範囲を取る技術さえ押さえておけばよろしいかと思います。
お礼
再度のご回答まことに有難うございます。 XL2000と共有しない部分、について、調べても分からなかったので助かりました。 いずれにしても、省略はだめですね。 今回は範囲を指定しなおすことが分かり、役立ちました。 有難うございました。
- okormazd
- ベストアンサー率50% (1224/2412)
まず、行単位の並べ替えと列単位の並べ替えではいくらか操作が違います。Excelでは行単位の並べ替えが基準のようになっています。列単位の並べ替えで指定できるのは、手動で並べ替えるときと同じで、header行などは決めてくれませんから、データ範囲だけを指定することになります。 わたしは混乱したことがないのですが・・・。 【質問1】 ヘルプの説明です。 xlSortRows (既定値) 行単位で並べ替えます。 xlSortColumns 列単位で並べ替えます。 「行単位」ということは、行でまとまってということで、1つの行の中のセルはばらばらにならないということです。それで並べ替えるのだから、行単位で入れ替わって上から下に並び変わるのです。 「列単位」も同様です。 【質問2】 特にいうことはありませんが、違いはないと思います。 【質問3】 無意味のようです。列単位の並べ替えのとき、headerの指定はできません。データ範囲を選択します。 もし、行単位の並べ替えのようにしたいなら、1度行列を入れ替えて並べ替え、もう1度行列を入れ替えるしかないようです。 【質問4】 【質問3】が答えです。
お礼
ご回答有難うございます。 私も仰るとおりの理解でした。「行単位」というのは、上から下へ。 「列単位」は左から右へ。 でも、やはり、どうもあべこべのようなのです。 以下URLにも、その記述がありました。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_sort.html ----------------------------------------------------------- xlSortColumns 列単位で並び替え ←行方向の並び替えになります xlSortRows 行単位で並び替え ←列方向の並び替えになります 日本語では逆のような気がします(分かりづらい) --------------------------------------------------------- といった記述です。私が感じたのも上記のことでした。 したがって、 xlSortRows は、xlLeftToRight に。 xlSortColumns は、xlTopToBottom に対応するようなのです。 私も最初信じがたかったのですがどうもそのようです。 もしお手すきでしたら一度簡単な例でお試しになってみてください。 どうもありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 基本的なことですが、記録マクロで取ったにしろ、そういう自分流はダメなのです。もっとも入門者から初心者に入った段階で、省略したらよいとか書かれてあるので、そういうように書いて、うまく行かなくなるケースが多いのです。省略する意味を良く理解してください。Sort メソッドで省略してよいのは、XL2000と共有しない部分のみです。これは、Findメソッドも同様です。 質問1と質問2 の場合は、コードのオプションが抜けてしまっています。 質問3と質問4は、コードを参照してください。直接範囲を指定しますので、タイトル行は xlNo です。 Sample は、標準モジュールが良いです。 Sub TestMacro1() '列の合計欄で並べ替える Dim rng As Range Dim flg As Integer flg = 2 '降順 =2 '昇順 =1 '左端上のセルを指定する --A1 With Range("A1").CurrentRegion Set rng = .Offset(, 1).Resize(, .Columns.Count - 1) End With With rng .Sort Key1:=.Range("A5"), _ Order1:=flg, _ Header:=xlNo, _ OrderCustom:=1, _ MatchCase:=False, _ Orientation:=xlLeftToRight, _ SortMethod:=xlPinYin, _ DataOption1:=xlSortNormal End With Set rng = Nothing End Sub
お礼
ご回答有難うございます。 大変勉強になりました。 Sortメソッドのヘルプにもきちんと書いてありました。 「省略も可能だが、省略した場合は前回の設定をそのまま引き継ぐ」と。 だから、間違いをなくす為にも明示しなければならないのですね。 ご指摘の通り、Findメソッドや、Replaceメソッドでもそのようですね。 また、Sampleも大変参考となりました。範囲を取り直すようにします。 有難うございました。
- fumufumu_2006
- ベストアンサー率66% (163/245)
Orientation:=xlSortColumns を Orientation:=xlLeftToRight にしたらどうでしょうか? これはマクロの記録で、手動で列方向に並べ替えた場合の値です。 なぜxlSortColumnsとxlSortRowsでおかしくなるのか? 探したら、「バグだ」という話がありました。 http://www.keep-on.com/excelyou/2000lng4/200007/00070351.txt
お礼
ご回答有難うございます。 そうですね、混同の無いようにこれからは、xlLeftToRight と、xlTopToBottomを活用したいと思います。 それにしても、xlSortColumns と xlSortRows のヘルプはおかしいと思うんですよね・・・。 有難うございました。
お礼
再々度のご回答本当に有難うございます。 また非常にたくさんお調べいただきまして申し訳ありません。 >どうやら、Helpの内容自体が間違っているようですね。 すっきりいたしました。ずっと悩んでいましたので。 6番でのご回答内容は、大変恐縮ながら、初心者の私には全て理解できたわけではないのですが、一連のご回答は大変勉強となりました。 まだまだ知らない事だらけではありますが勉強を続けて行きたいと思います。 大変お世話になり有難うございました!