• 締切済み

ソートについて質問です

いつもご回答ありがとうございます。 今回はソートについて質問させて下さい。 非常に単純な並べ替えですが、 B1~B100に並べられているデータを、B100~B1の順に並べ変えようと思います。 単純に、上下反対に並べ変えると言う事です。 そこで、 Range("B1:B100").Sort Key1:=Columns("B"),Orientation:=xlSortRows と記述したのですが、エラーが出てしまいます。 どこがいけないのでしょうか?

みんなの回答

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.5

>(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 となります。 (これから質問するときの為に) 質問するときはなるべく実例を挙げるようにした方がベターだと思います。  

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

>今回はソートについて質問させて下さい。 >単純に上下を逆さまにするにはどうしたら良いのでしょうか? ソートとは昇順か降順に並べ直すことです。  単純に上下を逆さまにする 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 を使いました。 以上

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

>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には使えません。 

vader-23
質問者

お礼

ご回答ありがとうございます。 僕の書き方が悪かったのかも知れませんが、ご指摘頂いた様に記述して実行すると、小さい順(大きい順)にデータが並んでしまいます。 単純に上下を逆さまにするにはどうしたら良いのでしょうか? (B1をB100に、B2をB99にと言う具合です)。 あと、今まで見ていたヘルプはVBAではなくエクセルのヘルプだったのですね...。 勉強になりました(^^;

全文を見る
すると、全ての回答が全文表示されます。
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

再度の登場、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です。 ■■ヘルプの説明には時々ミスが見受けられるようです。 そのときはまた遠慮なく質問しましょう。。。。  

vader-23
質問者

お礼

ご回答ありがとうございました。 こんなに詳細まで教えて頂き、感謝しています。 KonnaMondeさんへのご返信にも書きましたが、コードを実行するとエラーは出なくなりましたが、値が小さい順に並んでしまいます。 並び順はそのままで上下逆さまにしたいのですが、この部分で躓いてしまいます。

全文を見る
すると、全ての回答が全文表示されます。
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.1

質問の件をマクロ記録してそのコードをみてください。 それが回答になります。 以下がマクロ記録(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   引数の説明はヘルプに詳しく書いてあります。 できれば質問する前にヘルプを参照することをお勧めします。 そうすれば自力で解決できる場合もありますので。  

vader-23
質問者

お礼

ご回答ありがとうございます。 VBAの厚さ5センチくらいの本を買ってきて調べてみたのですが、良くわからなくて質問させて頂きました。 もう一点お聞きしてもよろしいでしょうか? Range("B2")となっているのは、Header:=xlYes の部分と関係があるのでしょうか? それと、OrientationのところはxlSortRowsではなくxlTopToBottomとの事ですが、この部分がどの解説書にも載っていませんでした。 逆にすると言うのはこの部分で定義されていると言う事でよろしいでしょうか? お手数をおかけしますが、よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel2010 VBA sortについて

    現在Excel2010VBAを使って、化学のデータからスペクトルを出すようなプログラムを考えております。 データは以下のような形です。 温度 1500 1500 1500 1400 1400 1400 時間 5 10 20 5  10  20 電流 1 3 7 11  12 13 このようなデータをまず、1行のデータの順番に並べてから、2行のデータ順に並べ替えたいと思っています。 しかし、Sortを用いたところ、実行時エラー1004RangeクラスのSortエラーが検出されてしまいます。 そこで、SortSpecialにすると、このエラーは検出されず、マクロは回るものの思った通りに整列されません。 Sheets("Rawdata").Activate Columns("A:BE").Sort Key1 = Range("A7") Order1 = xlAscending Key2 = Range("A10") Order2 = xlAscending Header = xlGuess Orientation = xlLeftToRight Excelの整列を使えばできてしまうことなのですが、VBAを用いてはできないのでしょうか? ExcelVBAを用いて、「行のデータ」基準にして「列を並べ替える」ことは可能なのでしょうか? どなたかご教授ください。 よろしくお願いいたします。

  • EXCEL VBAでのソートについて

    Excel VBAでデータの並び替えをしようと思っています。 キーが3つまでならうまくいくのですが、4つ目のキーを同じように指定すると、「アプリケーション定義またはオブジェクト定義のエラーです」とメッセージが出てしまいます。 一度にできるソートのキーは3つまでしかだめなのでしょうか? 以下、ソースです。 Selection.Sort Key1:=Range("A2") _ , Key2:=Range("B2") _ , Key3:=Range("C2") _ , Key4:=Range("D2") _ , Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin Key4の記述をしなければうまくいきます。 どうぞご指導をよろしくお願いします。

  • Excel2000のSORTマクロの質問

    ワークシート内にSortキー指定セルを3つ設定し、これをマクロで読み取って、最大3個までの sortを実行しています。 Selection.Sort Key1:=Range(strKey1), Order1:=xlAscending, Key2:=Range(strKey2), _ Order2:=xlAscending, Key3:=Range(strKey3), Order3:=xlAscending, _ Header:=xlGuess, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin 注)strKey1,strKey2,strKey3にはSortキーを行うセル番号(E11など)が入ります。 これですと、strKey2 と strKey3 に値が入っていないと「1004 アプリケーション定義またはオブジェクト定義のエラーです」と出るので、IF文を使って Sort命令自体を3つに分けて処理しています。 そこで質問なのですが、Selection.Sort 命令以降を『文字列変数』で記述して、strKey1,strKey2,strKey3の入力内容によって命令文を操作して、1つのsort命令で処理したいのですが、可能なのでしょうか? つまり、strKey2 と strKey3 が未入力ならば、 Selection.Sort Key1:=Range(strKey1), Order1:=xlAscending, _ Header:=xlGuess, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin …のようになるように、文字列として書きたいのですが、strKey1だけ指定する場合、 strSortString = "Key1:=Range(""" & strKey1 & """), Order1:=xlAscending, " & _ "Header:=xlGuess, MatchCase:=False, Orientation:=xlTopToBottom, " & _ "SortMethod:=xlPinYin" Selection.Sort strSortString と書きたいのです。 実際に上のようにやってみますと 「1004 入力した文字列は参照名または定義名として正しくありません。」と出ます。 基本的にsort命令はこのような使い方はできないのでしょうか? 分かりにくい説明ですみませんが、よろしくお願いします。

  • Excelのマクロでソートがうまく動かない

    *** ソース *** Sheets("Sheet 1").Select Range("B2:H92").Select Selection.Sort Key1:=Range("C3"), Order1:=xlAscending, Key2:=Range("H3") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin Range("B2").Select Sheets("Sheet 2").Select Range("B2:K49").Select Selection.Sort Key1:=Range("C3"), Order1:=xlAscending, Key2:=Range("I3") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin Range("B2").Select ... 以下省略 ************* 上記のように複数のシートを一括してソートを行うようにマクロを組んでいます。 ですがマクロを実行するとタイトル行も含めてソートを行うなど、おかしな挙動になってしまいます。 ソートの条件としては「範囲の先頭行」を「タイトル行」で行わせたいのですが、「データ」でソートを行うシートが出てしまうのです。 太字にすると回避できるなど試したのですが、うまくいかなかったです。 Header:=xlYes にする事でも回避できるとあったのですが、変数を説明している一覧などが見つからなかった為、試していません。 よい方法をご存知の方がいましたら、ご教授下さい。

  • 【VBAでソートを実行したい】

    ExcelVBAでオブジェクトを設定し、ソートを実行したいのですが、エラーになってしまいます。 ロジックは下記のようにしていますが、問題の箇所はマクロの記録でコピーしたものです。 オブジェクトとして実行しているので、エラーになるのでしょうか? どなたか分かる方、回答をお願いいたします。 dim goBook As Object Set goBook = CreateObject("Excel.Application") 'セルをクリアする goBook.Cells.Clear goBook.Range("A1").Select 'ソート実行 goBook.Columns("A:A").Select ''//このロジックでエラーになります↓ goBook.Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin

  • VBA Sortメソッドについて

    VBA初心者です。 並べ替えをしたくてSortメソッドというのを使っているのですが、 Sortメソッドの後にプログラムを書くと 「実行時エラー'1004':アプリケーション定義またはオブジェクト定義エラーです」 と出てしまいます。 Worksheets(sheets).Range("A1:D30").sort _ Key1:=Range("B2"), _ Header:=xlGuess, _ MatchCase:=True, _ SortMethod:=xlPinYin ↑こんなプログラムを2個続けて(sheetsを変えて)実行させ、 その後にもいろいろ続けて書きたいのですがどうしたらいいのでしょう。 「:=」という書き方を初めて使ったのでよく理解できていません。 ご教授いただけると助かります。

  • エクセルマクロのソートについて

    こんにちわ! エクセルマクロのソートについて質問です。 プロシャージャを使ってソート使いまわそうと思うのですが、範囲、並び替えキーを変えたいと思うのですが可能でしょうか? Sub Sort()    Range("A1:c10000").Sort _ Key1:=Range("a1") , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub 一応、動作はしませんが下記のようなイメージで動かしたいです。 Sub Sort() Dim key As String Dim hanni As String key = Range("a1") hanni = Range("A1:c10000") 'セルhanniの範囲のデータをkey列をキーに昇順に並べ替えます hanni.Sort _ Key1:=key _ , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub 可能でしょうか? わかる方おりましたらアドバイスの程お願いします。

  • UsedRangeを使ってソートすることは可能?

    UsedRangeを使ってソートすることは可能ですか? エクセルですが 学年  組  出席番号 2    A    1 1    B    2 と言うデータがあり、 これにフィルタをかけつつ、A列で昇順に並び替えるVBAを作ってるのですが Sub さんぷる() オートフィルタをかける Range(Cells(1, 1), Cells(1, Cells(1, Columns.Count).End(xlToLeft).Column)).AutoFilter UsedRange.Sort Key1:=Cells(1, 1), order1:=xlAscending End Sub とすると、 UsedRangeでコンパイルエラーになるのですが どうすればよろしいでしょうか?

  • VBAでもsort

    今、FOM出版のVBAの実践編を勉強中です。宜しくお願いします。 その中の「sort」メソッドでどうしても納得できず、前に進めない事があります。 構文:rangeオブジェクト.sort(kye1,order1,key2,order2,key3,order3,header) これは理解できるし、どこも省略せずに記入すればその通りに動くのですが orderは省略でき、省略した場合は昇順に並べ替えられると本には載っているのですが 私の記述はうまくいきません。 なぜ、こうなるのか教えてください。 B3  C3   D3 No.  氏名  住所 という表があり、氏名を昇順に並べようとしています。 構文通りに Range("B3").Sort key1:=Range("C3"), order1:=xlAscending, header:=xlyes とすれば問題なく Range("B3").Sort key1:=Range("C3"), header:=xlyes と記述すると、最初はうまくいきますが もう一度試そうと氏名欄を降順に並べ替え、それから実行すると動きません。 また、No.欄を昇順に並べ替えて実行するとちゃんと動き No.を降順に並べ替えて、氏名欄を昇順で並べ替えを実行すると氏名欄も降順で 並べ替えられてしまいます。 なぜ、こんな安定しない動きをするのかがわかりません。 初歩的な質問で申し訳ないのですが、どうしても気になって先に進めないので どうぞ教えてください。 ちなみに、もう一度試そうとNo.欄を並べ替える時は、エクセルの昇順降順アイコンで 並べ替えています。これが問題なのでしょうか?

  • ExcelVBAで配列をSORT

    任意の範囲の内容を読み込んだ2次元配列に入っているデータをワークシートでのSORTのように任意のキー列(第3優先まで)で任意の順(昇降)でSORTするにはどのような命令を実行すればいいか教えてもらえませんか? なお、先頭行はデータ、もちろんキー以外の列のデータも同時に並べ替えをしたいのですが?

専門家に質問してみよう