Excel VBAでのデータ並び替えの問題について

このQ&Aのポイント
  • Excel 2003のVBAのsort機能を使用して、名前、品質、値段の順にデータを並び替えたいがうまくいかない。
  • 最初に記録されたVBAコードではうまくいかないため、オブジェクトのマクロで修正したが、それでもうまくいかない。
  • いくつかの方法を試してみたが、どれもうまくいかなかった。他のサイトを調べても解決策が見つからない。
回答を見る
  • ベストアンサー

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との兼ね合いで決まり等があるのでしょうか。 色々なサイトを回ってはいるのですが、ちょっと解決 にいたることができません。 どなたか、ご教授いただけると幸いです。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

#01です。読み直したら別シートに配置したボタンから起動しているようですね。すると >Key1:=Range("A2"), は起動元のシートを指してしまっています。だからエラーになっているのではないかと思います。以下ではどうでしょう。 Private Sub CommandButton1_Click() With Worksheets(1)  .Cells(1, 1).CurrentRegion.AutoFilter  .Cells(1, 1).CurrentRegion.Sort _    Key1:=.Range("A2"), Order1:=xlAscending, _    Key2:=.Range("D2"), Order2:=xlAscending, _    Key3:=.Range("F2"), Order3:=xlAscending, _    Header:=xlYes End With End Sub .Cells(1, 1).CurrentRegion は .Cells でもよいのですがムダに選択しないようにしました。

niseite
質問者

お礼

ありがとうございました。 思い通りの操作ができるようになりました。 With Worksheets(1) .Cells(1, 1).CurrentRegion.Select の)「CurrentRegion」が肝ですね。   .Cells(1, 1).CurrentRegion.AutoFilter これも、便利ですね。 どこかのHPで、オートフィルタを掛けたい範囲を選択して、 並び替えるという記述があり、色々と試行錯誤していたのですが、 このような記述も発見し Excel 2003のヘルプにはアクティブセル領域について、 「選択しているセルまたはセル範囲から、すべての方向の最初の空白行または空白列までの領域が、アクティブ セル領域になります。」 という記述があります。 オートフィルタの範囲指定を簡潔にできるようになりました。 ありがとうございました。 アクティブセル領域がこのような働きを持つことはとても勉強になりました。ありがとうございました。

その他の回答 (1)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

とりあえず2行目の >worksheets(1).Select を Worksheets(1).Cells.Select にしたらどうでしょう。 マクロ記録で作成したコードは無駄なSelectが多く含まれるので、それを見直す方がよいのですが、それは挑戦してみてください。

niseite
質問者

お礼

ご返信ありがとうございます。 >とりあえず2行目の >>worksheets(1).Select >を >Worksheets(1).Cells.Select >にしたらどうでしょう。 やはりwatch式ではWorksheets(1).Cells.Select = TRUE となっておりまして、画面でも全セル選択状態になっております。 ので、問題ないと思われますが、その後のソート指定がよくないのか ソートが行われません。 >マクロ記録で作成したコードは無駄なSelectが多く含まれるので、それを?>見直す方がよいのですが、それは挑戦してみてください。 RANGEの指定や、selectの指定などで、マクロ記録と食い違う点や、 うまくいかない点の修正でだいぶ、詰まっています。

関連するQ&A

  • 記述を簡略化させたい

    お世話になります。 下記の記述をスマートにさせたいのですが、ご教示お願いします。         記 Sub 優先順位() Range("A16:Y25").Select Selection.Sort Key1:=Range("Y16"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A43:Y52").Select Selection.Sort Key1:=Range("Y43"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A70:Y79").Select Selection.Sort Key1:=Range("Y70"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A97:Y106").Select Selection.Sort Key1:=Range("Y97"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("A16").Select End Sub

  • エクセル VBA 集計方法

    各シート毎に下記の内容にて集計をしたいのですが、A2のセルにデータがない場合集計をしない方法がわからないのでご存じの方宜しくお願い致します。 Sheets("Sheet1").Select Range("A1:P62").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(16), _ Replace:=True, PageBreaks:=False, SummaryBelowData:=True Sheets("Sheet2").Select Range("A1:P62").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(16), _ Replace:=True, PageBreaks:=False, SummaryBelowData:=True Sheets("Sheet3").Select Range("A1:P62").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(16), _ Replace:=True, PageBreaks:=False, SummaryBelowData:=True End Sub

  • Excel 2000 のVBAにおけるソートについて教えて下さい。

    Excel2002のVBAで、並び替えをマクロ記録させると、Excel2000ではなかったものがあるのですが、これはどんな意味なのですか? 2002で記録されたマクロは、 Selection.Sort Key1:=Range("E2"), Order1:=xlDescending, Header:= xlGuess,OrderCustom:=1, MatchCase:=False,Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:=xlSortNormal です。このうち2000のマクロ記録では最後の DataOption1:=xlSortNormal がないのです。この2002以降(?)で記録されるこの部分はどのような働きをするのですか? また2000では同じような働きをさせるにはどのようにマクロを記述すればいいのですか? よろしくお願いします

  • VBAでのエラー(新しいマクロの記録)

    新しいマクロの記録で、work1にてソート等を行って、 新しいマクロ(ソート等)を作成しました。 このマクロは単体で正常に動作するのですが、 sheet1の別のマクロにカット&ペーストで追加し、 動作させたところエラーになってしまいました。 パス的な問題だと思いますが、いまいち理解できません。 以下、ソートの中身 Sheets("work1").Select Columns("A:H").Select Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Key2:=Range("C2") _ , Order2:=xlAscending, Key3:=Range("F2"), Order3:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:= _ xlSortNormal, DataOption3:=xlSortNormal

  • 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 にする事でも回避できるとあったのですが、変数を説明している一覧などが見つからなかった為、試していません。 よい方法をご存知の方がいましたら、ご教授下さい。

  • マクロを使用してソートしたいのです。

    どなたか教えてください。 マクロの自動記録ですと、 Range("A1:E942").Sort Key1:=Range("E1"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal このようになるのですが、データー件数が毎回異なるのです。上の件数だと942件ですが、次回行うときは、958件となったり致します。「E列」を昇順でソートするにはどのように行ったら良いのでしょうか?

  • マクロの解析してください。

    仕事で使うようになったファイルにマクロが登録してありました。 一体、何をしているのかわかる方お願いします。 Selection.Sort Key1:=Range("A4"), Order1:=xlAscending, Key2:=Range("B4") _ , Order2:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False _ , Orientation:=xlTopToBottom, SortMethod:=xlPinYin End Sub と、あるのですが宜しくお願いします。

  • 並べ替えのマクロで対象行の範囲を行を増やした分だけ可変にして増やしたい。

    マクロ超初心者です。エクセル2003においての質問です。 作成した〔日付順〕のボタンを押すことで並べ替えをしたいと思い,以下のマクロを「記録」から作成したのですが, 9行~153行の間に行を挿入した場合,並べ替えの対象となる行も同じように増えてほしいのですが,常に9行~153行のままで増えてくれません。 可能なら9行より前に行を挿入した場合も同じように可変して欲しいです。 全くのマクロ初心者でどう変えればいいのか分かりません。 また,「記録」から作成したマクロには操作内容が全て存在するようなのですが, 消してもいい不要な部分も分からないので教えて頂ければありがたいです。 よろしくお願いします。 (出来れば以下を書き直して全て貼り付けて頂けるとかなり助かります。) sub 日付順()    Rows("9:153").Select    Selection.Sort Key1:=Range("I9"),Order1:=xlAscending,Key2:=Range("J9") _       ,Order2:=xlDescending,Header:=xlGuess,OrderCustom:=1,MatchCase:= _       False,Orientation:=xlTopToBottom,SortMethod:=xlPinYin,DataOption1:= _       xlSortNormal,DataOption2:=lxSortNormal    Selection.Sort Key1:=Range("H9"),Order1:=xlAscending,Key2:=Range("B9") _       ,Order2:=xlDescending,Key3:=Range("M9"),Order3:=xlAscending,Header _       :=xlGuess,OrderCustom:=1,MatchCase:=False,Orientation:=xlTopToBottom _       ,SortMethod:=xlPinYin,DataOption1:=xlSortNormal,DataOption2:= _       xlSortNormal,DataOption3:=lxSortNormal End Sub

  • 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メソッドを使うには何か特別な方法があるのでしょうか?どなたか教えて下さい。よろしくお願いします。

  • エクセル 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

専門家に質問してみよう