EXCEL VBAのソート方法とは?

このQ&Aのポイント
  • EXCEL VBAのソートについて詳しく教えてください。特に、4つ以上のキーでソートする方法について知りたいです。
  • また、order4を別のシートから指定することは可能なのでしょうか?
  • お願いします。
回答を見る
  • ベストアンサー

EXCEL VBAのソートについて

4つ以上のキーでソートしたい場合の書き方を教えていただけますでしょうか。 宜しくお願いします。 order3の次にorder4をキーとしてソートしたいのですが、 書き方が分かりません。 Worksheets("明細").Activate Worksheets("明細").Range("B3:CX" & Totalnum + 2) _ .Sort Key1:=Range("N3"), order1:=xlAscending, _  Key2:=Range("Q3"), order2:=xlAscending, _ Key3:=Range("G3"), order3:=xlAscending, _ Key4:=Range("AT3"), order4:=xlAscending 別の質問ですが、order4を別のシートから(?)ということはできるのでしょうか?

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

>ちなみにN3→Q3→G3→AT3の順番でソートしたいです。 Excelは1度に3つまでのキーしか並べ替えられません ですから、過去2度、説明しましたが優先順位の一番低い4番目のキーで ソートを行い、その後1番キー、2番キー、3番キーでソートを行います。 With ActiveWorkbook.Worksheets("明細").Sort   .SortFields.Clear   .SortFields.Add Key:=Range("AT3"), _     SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal   .SetRange Range("B3:CY" & Totalnum + 2)   .Header = xlYes   .MatchCase = False   .Orientation = xlTopToBottom   .SortMethod = xlPinYin   .Apply   .SortFields.Clear   .SortFields.Add Key:=Range("N3"), _     SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal   .SortFields.Add Key:=Range("Q3"), _     SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal   .SortFields.Add Key:=Range("G3"), _     SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal   .SetRange Range("B3:CY" & Totalnum + 2)   .Header = xlYes   .MatchCase = False   .Orientation = xlTopToBottom   .SortMethod = xlPinYin   .Apply End With 同じことを3度説明しましたので4度目は辞退させていただきます。

ymoshimoshi
質問者

お礼

すみません。ありがとうございました。

その他の回答 (2)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>試してみたのですが、4番目のキーがソートされませんでした。 一度、手作業で試されては如何ですか 1)まずは第1キーにRange("AT3")を指定してソートを行ってください。 2)次に第1キーにRange("N3")、第2キーにRange("Q3")、第3キーにRange("G3")を   指定してソートを行ってください。 以上でお望みの結果になったでしょうか? うまくいったのなら以上の作業をマクロの記録を取ればコードは得られると思います。 >order4を別のシートから(?)ということはできるのでしょうか 引数 orderは単に昇順、降順を指定するもので "別のシート" の意図が解りませんが? それと1つ気になるのですが >Worksheets("明細").Activate MsgBox Worksheets("明細").Range("B3:CX" & Totalnum + 2).Address(0, 0) >Worksheets("明細").Range("B3:CX" & Totalnum + 2) _ でソート範囲が正しく取得されているか確認してみてください。

ymoshimoshi
質問者

お礼

ありがとうございます。 マクロの記録でサンプルテストをしてみたものを以下のように少し変更し、実行してみたのですが、やはりAT3(優先順位4番目)がソートされませんでした。 EXCEL2007からはSortfieldが使えそうなのですが、何か間違っている箇所があれば 教えていただけないでしょうか? すみません。 ちなみにN3→Q3→G3→AT3の順番でソートしたいです。 With ActiveWorkbook.Worksheets("明細").Sort ActiveWorkbook.Worksheets("明細").Sort.SortFields.Clear   ActiveWorkbook.Worksheets("明細").Sort.SortFields.Add Key:=Range("N3"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("明細").Sort.SortFields.Add Key:=Range("Q3"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("明細").Sort.SortFields.Add Key:=Range("G3"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("明細").Sort.SortFields.Add Key:=Range("AT3") _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal    .SetRange Range("B3:CY" & Totalnum + 2) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

4番目のキーで先にソートしましょう With Worksheets("明細")   .Range("B3:CX" & Totalnum + 2).Sort _   Key1:=.Range("AT3"), order1:=xlAscending   .Range("B3:CX" & Totalnum + 2).Sort _   Key1:=.Range("N3"), order1:=xlAscending, _   Key2:=.Range("Q3"), order2:=xlAscending, _   Key3:=.Range("G3"), order3:=xlAscending End With

ymoshimoshi
質問者

お礼

ありがとうございます。 試してみたのですが、4番目のキーがソートされませんでした。 Key1:=.Range("AT3"), order1:=xlAscendingのKey番号を4に変更はしなくて良いでしょうか? あと1点別で教えていただきたいのですが、 その4番目のキーを別のシートからのものとするということは可能でしょうか?

関連するQ&A

  • EXCEL VBA ソートにおいて

    EXCEL 2003 のVBAのsortにおいて、解決できなくて困って おります。 名前,色,産地,品質,味,値段,重さ, りんご,赤,青森,10,10,500,100 みかん,黄,和歌山,10,10,300,50 すいか,緑,群馬,10,8,2000,1000 メロン,黄緑,青森,10,8,2500,500 いちじく,赤,鹿児島,8,8,200,100 名前、品質、値段の順に並びかえたいと思い、 excelのVBAの記録でオートフィルタ後に 並び替えを行ったところ下記のコードが記録されました。 Sub Macro28() Cells.Select Selection.AutoFilter Selection.Sort _ Key1:=Range("A2"), Order1:=xlAscending, _ Key2:=Range("D2"), Order2:=xlAscending, _ Key3:=Range("F2"), Order3:=xlAscending, _ Header:=xlYes, OrderCustom:=1, _ MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, _ DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal, _ DataOption3:=xlSortNormal end sub ところが、これをオブジェクトのマクロに使用して(2,3行目を自分の使い たいように訂正)みると作動しません。 Private Sub CommandButton1_Click() worksheets(1).Select Selection.AutoFilter Selection.Sort _ Key1:=Range("A2"), Order1:=xlAscending, _ Key2:=Range("D2"), Order2:=xlAscending, _ Key3:=Range("F2"), Order3:=xlAscending, _ Header:=xlYes, OrderCustom:=1, _ MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal, DataOption3:=xlSortNormal End Sub watch 式では 3行目までは worksheets(1).Select = TRUE ですし Selection.AutoFilter = TRUE となっているのですが、 sortの反応が分からない状況です。 Selection.Sort _ Key1:=Range("A2"), Order1:=xlAscending, _ Key2:=Range("D2"), Order2:=xlAscending, _ Key3:=Range("F2"), Order3:=xlAscending, _ Header:=xlYes, OrderCustom:=1, _ MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal, DataOption3:=xlSortNormal この部分が問題なのかと考えております。 ネットで調べて worksheets(1).RANGE("A1:G6").Select Selection.sort…… とか worksheets(1).RANGE("A1:G6").sort とかも試してみたのですが、だめでした。 sort を使用するときにselectionとの相性や、 rangeとの兼ね合いで決まり等があるのでしょうか。 色々なサイトを回ってはいるのですが、ちょっと解決 にいたることができません。 どなたか、ご教授いただけると幸いです。

  • エクセル2003と2007のソート機能違い?

    2007では下記の関数で実行することができるのですが 2003ではデバッグになってしまします。 エクセル初心者のため解読できずお手上げです。 2003でも2007と同じような動作をするためにどこをどのように変えればいいのでしょう? 知恵をお貸しください。 Worksheets("命令データ").Activate Worksheets("命令データ").Range("並べ替え") _ .Sort Key1:=Range("BY10"), Order1:=xlAscending

  • ワードVBAからエクセルのソートができない

    こんにちは MS Word 2007から条件に合う語を抜き出してエクセルに貼り付けた後、ソートをするマクロを書いているのですが、ソートの部分で「型が一致しない」というエラーが出てしまい困っています。エクセルのVBAでは問題なく動作しています。 次がエクセルVBAで作ったソートのVBAです。 ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A1:A6") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With これをWord VBAに貼り付けて、一部を変更しました。 myExcel.workbooks(BookName).sheets(1).Sort.SortFields.Clear myExcel.workbooks(BookName).sheets(1).Sort.SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With myExcel.workbooks(BookName).sheets(1).Sort .SetRange Range("A1:A6") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With myExcelは事前に作成したExcelオブジェクトです。BookNameは作成したブックのファイル名です。2行目「myExcel.workbooks(BookName).sheets(1).Sort.SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal」でエラーになります。 「型が一致しない」と表示されます。ちょこちょこ書き換えているのですがエラーは解消されません。 Windows 7/8 64bit Word 2007. Excel 2007 解決策をご存じでしたら教えてください。

  • 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ソートについて

    はじめましてm(__)m 昇順ソートで「0」を覗いてソートをかける方法をお教え頂けないでしょうか? 現在、下記方法でソートしております。 どうぞ宜しくお願い致します。 Sub J列目() Range("A9:L65536").Sort _ Key1:=Range("J9") _ , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub

  • 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を用いて、「行のデータ」基準にして「列を並べ替える」ことは可能なのでしょうか? どなたかご教授ください。 よろしくお願いいたします。

  • エクセルVBAでデータ並べ替え

    マクロ記録をとると次のようになりました。 これをA列をキーに並べるもっと簡単なコードを教えてください。 Range("A2:G501")となっていますが、これ以上でも対応できるようにしたいです。 どなたか教えていただけないでしょうか。 Sub Macro1() Range("A1").Select ActiveWorkbook.Worksheets("***").Sort.SortFields.Clear ActiveWorkbook.Worksheets("***").Sort.SortFields.Add Key:=Range("A1"), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("***").Sort .SetRange Range("A2:G501") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

  • VBA エラーと対策

    実行時エラー '1004' RangeクラスのSortメソッドが失敗しました。 と出ます。 With Worksheets("データ") .Range("A2:N" & .Cells(.Rows.Count, 1).End(xlUp).Row).sort _ Key1:=Range("E3"), Order1:=xlAscending, Key2:=Range("C3"), _ Order2:=xlAscending, Key3:=Range("A3"), Order3:=xlAscending End With E列、C列、A列で昇順で並び替えしようと思っております。 前まで使えていたのですが、ソートできなくなり、何が原因かわからないため、質問しました。 また、もう一つエラーがあります。 実行時エラー'-2147417848(80010108)' オートメーションエラーです。 起動されたオブジェクトはクライアントから切断されました。 と表示されます。 http://okwave.jp/qa/q8452163.html range("A1").resize(ubound(a),1) = application.transpose(a) 上記部分でエラーがでます。 上記内容で、どういった原因が考えられますか? どちらか片方でも分かる方いらっしゃいましたら、回答よろしくお願い致します。

  • オープン時にソートを掛けて読み込みでエラーします。

    シートに読み込んで、このブックを一度保存? または、何かしらの処置してからでないと、 ソートは駄目なのでしょうか? 毎回の作業のため、できれば一度にと思い。。 マクロ記録でそのままはりつけたのですが、 ★でデバック止まります TT 先生、アドバイス願います Application.DisplayAlerts = False Workbooks.Open Filename:="C:仕事\" & sName & ".xls" Sheets(sName).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) Windows(sName & ".xls").Close Sheets(sName).Name = "営業" & sName Application.DisplayAlerts = True 'ソート ★ Range("B5:AC20").Select Selection.Sort Key1:=Range("H5"), Order1:=xlAscending, Key2:=Range("D5") _ , Order2:=xlAscending, Key3:=Range("C5"), Order3:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:= _ xlSortNormal, DataOption3:=xlSortNormal MsgBox "営業" & sName & " をソートして読み込みました" Worksheets("main").Activate

  • エクセル VBA セルのソートの際に・・・

    いつも皆様には大変お世話になっております。 今回の質問は、BというファイルのデータをコピーしてAというファイルにい書き込むというマクロを組んでいるのですが(下の構文です)これ自体はうまく動いているのですが、Aのファイルでそのデータをソートかけたときにうまくソートされません。何でソートされないのかもさっぱりです。 セルH7に名前が入っているのですが、名前でソートかけたいのです。でもBファイル構文でコピーした名前はソートできずに終ってしまいます。 手入力で名前を入れた分はソートできます。 皆様よろしくお願いいたします。 Sub Bファイル構文() Dim e e = Range("C3") Windows("A.xls").Activate Cells(65535, 2).End(xlUp).Offset(0, 6) = e ActiveWorkbook.Close SaveChanges:=True End Sub Sub Aファイル構文() Range("A7:BE156").Select Selection.Sort Key1:=Range("H7"),Orer1:=xlDescending,:=Range("B7") _, Order2:=xlAscending, Key3:=Range("C7"), Order3:=xlAscending, Header:= _xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:= _xlSortNormal, DataOption3:=xlSortNormal End Sub