• ベストアンサー

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列以降にする必要があるのでしょうか。 ---------------------------------------------------------------------------- 分かりにくい箇所もあったかと思いますが、ご指摘いただければ補足させていただきます。 なお、「そんな簡単な表だったら、手で作業したら?」ということではなく、後学のために知っておきたいので質問させていただきました。 なにぶん勉強中なため見当外れの質問もあるかもしれませんが、なにとぞご教示よろしくお願いいたします。

noname#64582
noname#64582

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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

noname#64582
質問者

お礼

再々度のご回答本当に有難うございます。 また非常にたくさんお調べいただきまして申し訳ありません。 >どうやら、Helpの内容自体が間違っているようですね。 すっきりいたしました。ずっと悩んでいましたので。 6番でのご回答内容は、大変恐縮ながら、初心者の私には全て理解できたわけではないのですが、一連のご回答は大変勉強となりました。 まだまだ知らない事だらけではありますが勉強を続けて行きたいと思います。 大変お世話になり有難うございました!

その他の回答 (5)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.5

#3です。 ヘルプの説明はあっていませんね。 下記のようになるべきですね。 xlSortRows 列単位で並べ替えます。 xlSortColumns (既定値) 行単位で並べ替えます。 >xlSortRows は、xlLeftToRight に。 xlSortColumns は、xlTopToBottom に対応するようなのです。 xlSortColumns=1,xlTopToBottom=1 xlSortRows=2,xlLeftToRight=2 だから、ご指摘のとおりです。 すみませんでした。

noname#64582
質問者

お礼

再度のご回答まことに有難うございます。 >ヘルプの説明はあっていませんね。 安心しました。何度考えても、逆ではないか、と悶々としていましたので(笑)。 勉強になりました。そしてすっきりしました。 有難うございます!

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 #2の回答者です。 >【質問2】マクロの自動記録時に気づいたのですが、Orientation の設定に、>xlLeftToRight や、xlTopToBottom というのが使われていました。 >これらと xlSortRows, xlSortColumns の違いはありますか。 今、調べてみましたが、記録マクロに出てくるその組み込み定数は、定数の内部の数値は変わりませんが、たぶん、この食い違いは、開発途中か、違う言語範囲の中に、別の組み込み定数があるから、このように出るのだと思います。今の段階では、Sort メソッドではなく、SortSpecial メソッド側の組み込み定数のものようです。こういう入れ違いはいくつかあるようです。 なお、前言の # XL2000と共有しない部分のみです。 ということで調べると、以下が共有しない部分でした。  DataOption1:=xlSortNormal ただ、理屈はともかくとして、こういうものは、記録マクロを越えることはないと思いますね。単に、並べ替えの範囲を取る技術さえ押さえておけばよろしいかと思います。

noname#64582
質問者

お礼

再度のご回答まことに有難うございます。 XL2000と共有しない部分、について、調べても分からなかったので助かりました。 いずれにしても、省略はだめですね。 今回は範囲を指定しなおすことが分かり、役立ちました。 有難うございました。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

まず、行単位の並べ替えと列単位の並べ替えではいくらか操作が違います。Excelでは行単位の並べ替えが基準のようになっています。列単位の並べ替えで指定できるのは、手動で並べ替えるときと同じで、header行などは決めてくれませんから、データ範囲だけを指定することになります。 わたしは混乱したことがないのですが・・・。 【質問1】 ヘルプの説明です。 xlSortRows (既定値) 行単位で並べ替えます。 xlSortColumns 列単位で並べ替えます。 「行単位」ということは、行でまとまってということで、1つの行の中のセルはばらばらにならないということです。それで並べ替えるのだから、行単位で入れ替わって上から下に並び変わるのです。 「列単位」も同様です。 【質問2】 特にいうことはありませんが、違いはないと思います。 【質問3】 無意味のようです。列単位の並べ替えのとき、headerの指定はできません。データ範囲を選択します。 もし、行単位の並べ替えのようにしたいなら、1度行列を入れ替えて並べ替え、もう1度行列を入れ替えるしかないようです。 【質問4】 【質問3】が答えです。

noname#64582
質問者

お礼

ご回答有難うございます。 私も仰るとおりの理解でした。「行単位」というのは、上から下へ。 「列単位」は左から右へ。 でも、やはり、どうもあべこべのようなのです。 以下URLにも、その記述がありました。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_sort.html ----------------------------------------------------------- xlSortColumns 列単位で並び替え ←行方向の並び替えになります xlSortRows 行単位で並び替え ←列方向の並び替えになります 日本語では逆のような気がします(分かりづらい) --------------------------------------------------------- といった記述です。私が感じたのも上記のことでした。 したがって、 xlSortRows は、xlLeftToRight に。 xlSortColumns は、xlTopToBottom に対応するようなのです。 私も最初信じがたかったのですがどうもそのようです。 もしお手すきでしたら一度簡単な例でお試しになってみてください。 どうもありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 基本的なことですが、記録マクロで取ったにしろ、そういう自分流はダメなのです。もっとも入門者から初心者に入った段階で、省略したらよいとか書かれてあるので、そういうように書いて、うまく行かなくなるケースが多いのです。省略する意味を良く理解してください。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

noname#64582
質問者

お礼

ご回答有難うございます。 大変勉強になりました。 Sortメソッドのヘルプにもきちんと書いてありました。 「省略も可能だが、省略した場合は前回の設定をそのまま引き継ぐ」と。 だから、間違いをなくす為にも明示しなければならないのですね。 ご指摘の通り、Findメソッドや、Replaceメソッドでもそのようですね。 また、Sampleも大変参考となりました。範囲を取り直すようにします。 有難うございました。

回答No.1

Orientation:=xlSortColumns を Orientation:=xlLeftToRight にしたらどうでしょうか? これはマクロの記録で、手動で列方向に並べ替えた場合の値です。 なぜxlSortColumnsとxlSortRowsでおかしくなるのか? 探したら、「バグだ」という話がありました。 http://www.keep-on.com/excelyou/2000lng4/200007/00070351.txt

noname#64582
質問者

お礼

ご回答有難うございます。 そうですね、混同の無いようにこれからは、xlLeftToRight と、xlTopToBottomを活用したいと思います。 それにしても、xlSortColumns と xlSortRows のヘルプはおかしいと思うんですよね・・・。 有難うございました。

関連するQ&A

  • エクセル 列の並び替え

    エクセル 列の並び替え A列に氏名、B~F列にa,b,cの評価、G列に総合判定(1~5段階評価)が入った100人分ほどの表があります。 まずG列の総合評価順にソートし、そのあとB~F列をABC順 (A君 abacb 5 → aabbc 5  B君 b a aba 4 → aa a bb 4という感じ) に全員を並び変えたいのですが、できずに困っています。やり方を教えてください。 最終的にやりたいのは、総合判定が間違っていないかのチェックで、5評価なのにbが3つあったり、cが入っていたりすると判定しなおしとなります。ただそのルールが細かいので、並び替えをした後に目視でチェックしようかと思っています。 本当はマクロなのかな・・とも思っていますが、エクセルに詳しくないので、どなたか教えていただけると嬉しいです。よろしくお願いいたします。

  • 並び替え 助けてください

    はじめまして 同じ質問をされてると思いますが皆さんのお力をお貸しください。 A列にコード番号(約150行)、B列に会社名、C列に月売上目標、D列に毎日の売上を記入する表があります。 C列の月売上目標は会社ごとに違います、毎日の売上で目標に近い順に並び替えがしたいのですが関数を使えば出来るかと考え色々探しましたが解かりません。どなたか良いアドバイスお願いします なお関数については素人です、office xp 使用 よろしくお願いします。

  • エクセルでマクロを使った同一処理を列方向に繰返す?

    VBAの初心者です。マクロを使った同一処理を各列ブロック(3列が1単位)毎に 繰り返して列方向に多数のブロックまで行うVBAはどのようなものになるのでしょうか。 具体的には添付図のような表で、B2店について品名・数量・金額を、4行目~10行目まで、金額の多い順に並べかえた後、金額の合計をセルD2 に記入するマクロ(この記述は下記のようになりましたが)、この処理をE5店、H8店……と3列ずつ例えば20ブロック処理するプログラムはどのようにしたらよいでしょうか(20ブロック目の列番号はBG,BH,BIです)。どなたか教えていただけないでしょうか。 Sub 多い順と合計() Range("B3:D10").Select Selection.Sort Key1:=Range("D4"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("D2").Select ActiveCell.FormulaR1C1 = "=SUM(R[2]C:R[18]C)" Range("B2").Select End Sub

  • エクセルのvba(最終行を取得する並び替え)

    初めまして、エクセルのvbaについて質問をさせてください。 マクロの記録を使って、以下の通りF列→M列→J列の順に優先して、A列からAL列を昇順に並び替えるvbaを作成したのですが、10000行までとう不恰好な書き方になっています。最終行までという書き方に変えたいのですが、色々試したもののうまくいきません…!この場合、最終行を取得するにはどのような書き方にすれば良いのでしょうか…??(T-T) '並び替え ActiveWorkbook.Worksheets("当月").Sort.SortFields.Clear ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("F2:F10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortTextAsNumbers ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("M2:M10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("当月").Sort.SortFields.Add Key:=Range("J2:J10000"_ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("当月").Sort .SetRange Range("A1:AL10000") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With

  • EXCEL 横方向の並び替えをマクロでしたいのですが

    EXCELでの列方向の並び替えについてご質問いたします。 イメージはこちらになります(※列Aは固定データです) 列A 列B 列C 列D・・・・列K 1   1     3     8 2      2  3       3               8 これを 列A 列B 列C 列D・・・・列K 1   1  3  8 2   2  3       3   8 というふうにデータを左詰めにしたいのですが、 手動でのやり方はわかりますが、件数が多いため マクロで行いたいと思い何度か試してみましたが うまくいかないためご質問いたしました。

  • マクロ 並び替え エラーがでる

    マクロの記録で以下のようなマクロを作りましたが、実行するとエラー91「オブジェクト変数またはブロック変数が設定されていません」とでます。どう直したらよいでしょうか? Sub Macro6() Columns("A:L").Select Selection.AutoFilter ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _ ("A1:A497"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _ xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("B2").Select End Sub

  • エクセルVBAでの並び替えについて

    エクセルでデータの並び替えの方法が分からなくて質問します。たとえばBの列の100~999、A100~A999、B100~B999のようなデータが縦に入っているものとします。この中には150-1、150-2のようなデータも混ざってます。これをそのままエクセルで並び替えをしても100~999までは上手にできるのですがその後に150-1とかきてA100~が始まります。例えばこのデータを100~始まり149、150-1,150-2、152,153、154のように上桁から基準に並び替えを行いたいのですがいい方法はありませんか?現在はマクロを使ってVBAでSORTの引数を触ったりしたのですが上手にいきません。基本的にVBAで行っているのでVBAでお願いします。初心者なのでよろしくお願いします。

  • エクセルの行列方向での並び替え

    エクセルのデータを下記のように並べ替えるのにはどうしたら宜しいのでしょうか?   1  2  3          1  2  3 A 1.23 2.85 1.11    A 2.85 1.23 1.11 B 12.34 15.72 15.57   B 15.72 15.57 12.34 C 16.07 16.99 15.93   C 16.99 16.07 15.93 ・   ・ ・       並び替え→      ・ ・   ・ E 16.94 14.87 13.87           E 16.94 14.87 13.87 上記のように行単位降順の並び替え方法を教えて下さい。 並び替えオプションで列単位として優先されるキー3行については並び替えができますが、データを一括に並び替えしたいのです。  

  • (再)エクセル データ並び替え

    前回、こちらで質問させて頂いた者です。 http://okwave.jp/qa/q7917475.html 一度は解決したのですが、 エクセルの表を作り変える必要が出てきて、セルの位置などが変わってしまい、 教えていただいたマクロではエラーが出てしまって並び替えができなくなってしまいました。 前回:1行目がタイトル行     データは2行目以降(A・B列は2行ずつ結合) ↓ 変更:4行目がタイトル行     データは5行目以降(A・B・C列は2行ずつ結合)     少し変わっただけなので、このへんかな~と勝手に見当をつけて自分でマクロをいじってみたのですが、検討違いのようでエラーばっかりで直りません(T0T) (マクロはとっても苦手です・・) 下のマクロが、以前の質問で回答してくださった方から教えていただいたマクロなんですが、 ここのどこを変えれば、変更後の表に対応できるようになりますでしょうか? どなたか教えてください~(>_<) ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Sub 並び替え() 'この行から Dim i As Long Application.ScreenUpdating = False 'セルの分割 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Step 2 With Cells(i, 1) .UnMerge .Offset(, 1).UnMerge .Offset(1) = Cells(i, 1) .Offset(1, 1) = Cells(i, 2) End With Next i Cells(1, 1).CurrentRegion.Sort key1:=Cells(1, 1), order1:=xlAscending, Header:=xlYes _ , key2:=Cells(1, 2), order2:=xlAscending, Header:=xlYes 'セルの再結合 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row - 1 Step 2 Application.DisplayAlerts = False With Cells(i, 1) .Resize(2, 1).Merge .Offset(, 1).Resize(2, 1).Merge End With Next i Application.ScreenUpdating = True End Sub 'この行まで ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ また、わがままで申し訳ないのですが、グループごとに並び変えるときに、さらに名簿順になるように並び替えられると助かるのですが、何か文を追加することで、そういう並び替えになりますか? もし可能なら、それも教えて頂きたいです。 なにとぞ、よろしくお願いしますm(_ _)m

  • VBA ファイルを読み込む際のSortメソッドの使い方

    tabで区切られたテキストファイルを読み込み、日時の列を昇順で並び替える処理をしようとしました。 sortメソッドを使って並び変えようとしましたが、上手くいきません。。 既に開いているエクセル上では簡単なsortメソッドを使って並び替えはできました。↓のようなマクロ記録を使って。 Range("A1:A11").Select Range("A1:C11").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:= xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin,DataOption1:=xlSortNormal ファイルを読み込んで、sortメソッドを使うには何か特別な方法があるのでしょうか?どなたか教えて下さい。よろしくお願いします。

専門家に質問してみよう