いつも大変お世話になります。初心者です。
長文で申し訳ありませんが、私の間違いについてご指導をお願いします。(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列以降にする必要があるのでしょうか。
----------------------------------------------------------------------------
分かりにくい箇所もあったかと思いますが、ご指摘いただければ補足させていただきます。
なお、「そんな簡単な表だったら、手で作業したら?」ということではなく、後学のために知っておきたいので質問させていただきました。
なにぶん勉強中なため見当外れの質問もあるかもしれませんが、なにとぞご教示よろしくお願いいたします。
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
再々度のご回答本当に有難うございます。
また非常にたくさんお調べいただきまして申し訳ありません。
>どうやら、Helpの内容自体が間違っているようですね。
すっきりいたしました。ずっと悩んでいましたので。
6番でのご回答内容は、大変恐縮ながら、初心者の私には全て理解できたわけではないのですが、一連のご回答は大変勉強となりました。
まだまだ知らない事だらけではありますが勉強を続けて行きたいと思います。
大変お世話になり有難うございました!
No.5
- 回答日時:
#3です。
ヘルプの説明はあっていませんね。
下記のようになるべきですね。
xlSortRows 列単位で並べ替えます。
xlSortColumns (既定値) 行単位で並べ替えます。
>xlSortRows は、xlLeftToRight に。 xlSortColumns は、xlTopToBottom に対応するようなのです。
xlSortColumns=1,xlTopToBottom=1
xlSortRows=2,xlLeftToRight=2
だから、ご指摘のとおりです。
すみませんでした。
再度のご回答まことに有難うございます。
>ヘルプの説明はあっていませんね。
安心しました。何度考えても、逆ではないか、と悶々としていましたので(笑)。
勉強になりました。そしてすっきりしました。
有難うございます!
No.4
- 回答日時:
こんにちは。
#2の回答者です。
>【質問2】マクロの自動記録時に気づいたのですが、Orientation の設定に、>xlLeftToRight や、xlTopToBottom というのが使われていました。
>これらと xlSortRows, xlSortColumns の違いはありますか。
今、調べてみましたが、記録マクロに出てくるその組み込み定数は、定数の内部の数値は変わりませんが、たぶん、この食い違いは、開発途中か、違う言語範囲の中に、別の組み込み定数があるから、このように出るのだと思います。今の段階では、Sort メソッドではなく、SortSpecial メソッド側の組み込み定数のものようです。こういう入れ違いはいくつかあるようです。
なお、前言の
# XL2000と共有しない部分のみです。
ということで調べると、以下が共有しない部分でした。
DataOption1:=xlSortNormal
ただ、理屈はともかくとして、こういうものは、記録マクロを越えることはないと思いますね。単に、並べ替えの範囲を取る技術さえ押さえておけばよろしいかと思います。
再度のご回答まことに有難うございます。
XL2000と共有しない部分、について、調べても分からなかったので助かりました。
いずれにしても、省略はだめですね。
今回は範囲を指定しなおすことが分かり、役立ちました。
有難うございました。
No.3
- 回答日時:
まず、行単位の並べ替えと列単位の並べ替えではいくらか操作が違います。
Excelでは行単位の並べ替えが基準のようになっています。列単位の並べ替えで指定できるのは、手動で並べ替えるときと同じで、header行などは決めてくれませんから、データ範囲だけを指定することになります。わたしは混乱したことがないのですが・・・。
【質問1】
ヘルプの説明です。
xlSortRows (既定値) 行単位で並べ替えます。
xlSortColumns 列単位で並べ替えます。
「行単位」ということは、行でまとまってということで、1つの行の中のセルはばらばらにならないということです。それで並べ替えるのだから、行単位で入れ替わって上から下に並び変わるのです。
「列単位」も同様です。
【質問2】
特にいうことはありませんが、違いはないと思います。
【質問3】
無意味のようです。列単位の並べ替えのとき、headerの指定はできません。データ範囲を選択します。
もし、行単位の並べ替えのようにしたいなら、1度行列を入れ替えて並べ替え、もう1度行列を入れ替えるしかないようです。
【質問4】
【質問3】が答えです。
ご回答有難うございます。
私も仰るとおりの理解でした。「行単位」というのは、上から下へ。
「列単位」は左から右へ。
でも、やはり、どうもあべこべのようなのです。
以下URLにも、その記述がありました。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …
-----------------------------------------------------------
xlSortColumns 列単位で並び替え ←行方向の並び替えになります
xlSortRows 行単位で並び替え ←列方向の並び替えになります
日本語では逆のような気がします(分かりづらい)
---------------------------------------------------------
といった記述です。私が感じたのも上記のことでした。
したがって、
xlSortRows は、xlLeftToRight に。 xlSortColumns は、xlTopToBottom に対応するようなのです。
私も最初信じがたかったのですがどうもそのようです。
もしお手すきでしたら一度簡単な例でお試しになってみてください。
どうもありがとうございました。
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
ご回答有難うございます。
大変勉強になりました。
Sortメソッドのヘルプにもきちんと書いてありました。
「省略も可能だが、省略した場合は前回の設定をそのまま引き継ぐ」と。
だから、間違いをなくす為にも明示しなければならないのですね。
ご指摘の通り、Findメソッドや、Replaceメソッドでもそのようですね。
また、Sampleも大変参考となりました。範囲を取り直すようにします。
有難うございました。
No.1
- 回答日時:
Orientation:=xlSortColumns
を
Orientation:=xlLeftToRight
にしたらどうでしょうか?
これはマクロの記録で、手動で列方向に並べ替えた場合の値です。
なぜxlSortColumnsとxlSortRowsでおかしくなるのか?
探したら、「バグだ」という話がありました。
http://www.keep-on.com/excelyou/2000lng4/200007/ …
ご回答有難うございます。
そうですね、混同の無いようにこれからは、xlLeftToRight と、xlTopToBottomを活用したいと思います。
それにしても、xlSortColumns と xlSortRows のヘルプはおかしいと思うんですよね・・・。
有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル 指定した文字列を含...
-
エクセル マクロで列を連続し...
-
EXCEL 指定した曜日に番号を振...
-
桁数が混在する並び替えの方法
-
EXCEL VBA 指定範囲内で特定の...
-
エクセルで同じ名前ごとの合計...
-
Excelで数値→文字列変換で指数...
-
Excelの関数について、特定の文...
-
テキストボックス内の文字のふ...
-
Excelで行ごとコピー、同じ行を...
-
エクセルにおける、グラフの指...
-
たくさん作った同じ設定のグラ...
-
エクセル 入力中に表示されな...
-
エクセルでグラフタイトルが折...
-
エクセル
-
日付が1年以内になると他のセル...
-
パワーポイントに貼り付けたエ...
-
エクセルで同じ値が連続してい...
-
数字がセルの左側に寄っていて...
-
excelの16進数表示方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセル 指定した文字列を含...
-
桁数が混在する並び替えの方法
-
エクセルVBA Unionはなぜ遅い?
-
エクセルで一部除外した数字を...
-
エクセルの関数SUBSTITUTEを、...
-
エクセルで同じ名前ごとの合計...
-
EXCEL VBA 指定範囲内で特定の...
-
ExcelVBA:列方向の並び替え O...
-
EXCELである列を上から順にチェ...
-
エクセルで2列を検索し2列とも...
-
Excelで自動的に並べ替えなんて...
-
VBAでFormula関数を使ってVlook...
-
FIND関数について教えてください
-
エクセル マクロで列を連続し...
-
エクセル VLOOKUPが反映されない
-
エクセルvba 一つ上の行を指定...
-
エクセルで列内の同じIDの商品...
-
EXCEL 指定した曜日に番号を振...
-
(続き)Excel2013で正しくソート...
-
エクセル【昇順・降順で並べ替...
おすすめ情報