- 締切済み
ソートについて質問です
いつもご回答ありがとうございます。 今回はソートについて質問させて下さい。 非常に単純な並べ替えですが、 B1~B100に並べられているデータを、B100~B1の順に並べ変えようと思います。 単純に、上下反対に並べ変えると言う事です。 そこで、 Range("B1:B100").Sort Key1:=Columns("B"),Orientation:=xlSortRows と記述したのですが、エラーが出てしまいます。 どこがいけないのでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- onlyrom
- ベストアンサー率59% (228/384)
>(B1をB100に、B2をB99にと言う具合です)。 おや、まあ、そういうことでしたか。 ソートについて質問とあり、Sortメソッドを提示してありましたので勘違いしました。 ただ、よーく考えてみれば、VBAのハンドブックをお持ちの方が降順ソードなど質問されるわけもなく。。。。。 何れにしろ、阿呆な勘違いをして申し訳ありませんぬ。 既に回答も出ていますが、方法はいくつかあります。 例えば、配列を使う、作業列を使う、など。 で、配列を使う場合のサンプルをひとつ。 '---------------------------------------------- Sub Test() Dim R As Long Dim myValue myValue = Range("B1:B100").Value For R = UBound(myValue) To 1 Step -1 Cells(UBound(myValue) - R + 1, "B").Value = myValue(R, 1) Next R End Sub '------------------------------------------------------- なお、最終行が不定の場合は、 myValue = Range("B1", Cells(Rows.Count, "B").End(xlUp)).Value となります。 (これから質問するときの為に) 質問するときはなるべく実例を挙げるようにした方がベターだと思います。
- KonnaMonde
- ベストアンサー率57% (97/170)
>今回はソートについて質問させて下さい。 >単純に上下を逆さまにするにはどうしたら良いのでしょうか? ソートとは昇順か降順に並べ直すことです。 単純に上下を逆さまにする Range メソッドはありません(と思う)ので、最初の行と最後の行とを何らかの方法で交換していけばよいことになります。 一応、以下の簡単なコードで処理してみました。 汎用性を持つコードです。 対象セルの内容は「文字列」とします。 Sub test() Dim r As Long ' 行番号 汎用 Dim rs As Long ' 開始行番号 Dim re As Long ' 最終行番号 Dim c As Integer ' 交換する列番号 Dim s s As String ' 文字列の値 rs = 1 c = 2 re = Cells(Rows.Count, c).End(xlUp).Row For r = rs To re / 2 s = Cells(r, c).Value Cells(r, c).Value = Cells(re - r + 1, c).Value Cells(re - r + 1, c).Value = s Next End Sub なお、エクセル2007とそれ以前のエクセルでは、シートの行数が違います。 以前のものは 256x256= 65536 行ですが、2007では 1024x1024= 1048576 行となっていますので、どちらでも使えるようにシートの最終行番号に 関数 Rows.Count を使いました。 以上
- KonnaMonde
- ベストアンサー率57% (97/170)
>Range("B1:B100").Sort Key1:=Columns("B"),Orientation:=xlSortRows Orientation:=xlSortRows の指定が間違っています。 ソートの昇順降順の決定は、Orientation:= でなく、Order:= を使います。 データを昇順ソートをする場合は、 Order:=xlAscending 、降順なら Order:=xlDescending を指定します。 Orientation:= は、ソートの方向を指定します。 Orientation:=xlTopToBottom なら 行の並べ替え、Orientation:=xlLeftToRight なら列の並べ替えです。 >厚さ5センチくらいの本 とは、VBAハンドブックですか。 もしそうであったら、Range の sort メソッドを参照してください。 そこに書いてあります。 また、VBAのヘルプは、コードを記述しているVBAエディターのヘルプを見ましょう。 エクセル本体のヘルプは、エクセルのヘルプなので、VBAには使えません。
- onlyrom
- ベストアンサー率59% (228/384)
再度の登場、onlyromです。 追加質問の件は、ヘルプに載っています。 なぜヘルプを参照しないのかがちょと分かりませんが。(^^;;; 以下、Sortメソッドのヘルプ抜粋です。 >Range("B2")となっているのは、Header:=xlYes の部分と関係があるのでしょうか? Header 省略可能です。バリアント型 (Variant) の値を使用します。最初の行がタイトル行であるかどうかを指定します。使用できる定数は、XlYesNoGuess クラスの xlGuess、xlNo、xlYes のいずれかです。先頭行をタイトル行と見なすには、xlYes を指定します。この指定では先頭行を並べ替えの対象にはなりません。タイトル行はないものと見なすには、xlNo を指定します。この指定では範囲全体が並べ替えの対象になります。範囲の先頭行がタイトル行であるかどうかを自動的に判断させるには、xlGuess を指定します。既定の定数は xlNo です。ピボットテーブル レポートの並べ替えに、この引数は指定できません。 >それと、OrientationのところはxlSortRowsではなくxlTopToBottomとの事ですが、この部分がどの解説書にも載っていませんでした。 逆にすると言うのはこの部分で定義されていると言う事でよろしいでしょうか? 昇順降順はそれではありません。Orderです。 Order1 省略可能です。バリアント型 (Variant) の値を使用します。使用できる定数は、XlSortOrder クラスの xlAscending または xlDescending です。引数 Key1 に指定したフィールドを昇順に並べ替えるには、xlAscending を指定します。引数 Key1 に指定したフィールドを降順に並べ替えるには、xlDescending を指定します。既定の定数は xlAscending です。この引数はピボットテーブルの並べ替えには指定できません。 Orientation 省略可能です。バリアント型 (Variant) の値を使用します。xlSortRows を指定すると、上から下に並べ替えます (行の並べ替え)。xlSortColumn を指定すると、左から右に並べ替えます (列の並べ替え)。 ●この引数の値xlSortRows,xlSortColumnは上記説明にミスがあり、説明とは逆になります。 またこれはマクロ記録では、xlTopToBottom,xlLeftToRightになりますが、どちらを使用してもOKです。 ■■ヘルプの説明には時々ミスが見受けられるようです。 そのときはまた遠慮なく質問しましょう。。。。
お礼
ご回答ありがとうございました。 こんなに詳細まで教えて頂き、感謝しています。 KonnaMondeさんへのご返信にも書きましたが、コードを実行するとエラーは出なくなりましたが、値が小さい順に並んでしまいます。 並び順はそのままで上下逆さまにしたいのですが、この部分で躓いてしまいます。
- onlyrom
- ベストアンサー率59% (228/384)
質問の件をマクロ記録してそのコードをみてください。 それが回答になります。 以下がマクロ記録(B1は見出しで、降順ソートの場合) Sub Macro1() Range("B1:B100").Select Selection.Sort _ Key1:=Range("B2"), Order1:=xlDescending, _ Header:=xlYes, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin End Sub 引数の説明はヘルプに詳しく書いてあります。 できれば質問する前にヘルプを参照することをお勧めします。 そうすれば自力で解決できる場合もありますので。
お礼
ご回答ありがとうございます。 VBAの厚さ5センチくらいの本を買ってきて調べてみたのですが、良くわからなくて質問させて頂きました。 もう一点お聞きしてもよろしいでしょうか? Range("B2")となっているのは、Header:=xlYes の部分と関係があるのでしょうか? それと、OrientationのところはxlSortRowsではなくxlTopToBottomとの事ですが、この部分がどの解説書にも載っていませんでした。 逆にすると言うのはこの部分で定義されていると言う事でよろしいでしょうか? お手数をおかけしますが、よろしくお願い致します。
お礼
ご回答ありがとうございます。 僕の書き方が悪かったのかも知れませんが、ご指摘頂いた様に記述して実行すると、小さい順(大きい順)にデータが並んでしまいます。 単純に上下を逆さまにするにはどうしたら良いのでしょうか? (B1をB100に、B2をB99にと言う具合です)。 あと、今まで見ていたヘルプはVBAではなくエクセルのヘルプだったのですね...。 勉強になりました(^^;