こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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との兼ね合いで決まり等があるのでしょうか。

色々なサイトを回ってはいるのですが、ちょっと解決
にいたることができません。
どなたか、ご教授いただけると幸いです。

投稿日時 - 2007-12-20 13:45:01

QNo.3613629

すぐに回答ほしいです

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

#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 でもよいのですがムダに選択しないようにしました。

投稿日時 - 2007-12-20 17:42:33

お礼

ありがとうございました。
思い通りの操作ができるようになりました。

With Worksheets(1)
.Cells(1, 1).CurrentRegion.Select
の)「CurrentRegion」が肝ですね。
 
.Cells(1, 1).CurrentRegion.AutoFilter
これも、便利ですね。

どこかのHPで、オートフィルタを掛けたい範囲を選択して、
並び替えるという記述があり、色々と試行錯誤していたのですが、

このような記述も発見し
Excel 2003のヘルプにはアクティブセル領域について、
「選択しているセルまたはセル範囲から、すべての方向の最初の空白行または空白列までの領域が、アクティブ セル領域になります。」
という記述があります。

オートフィルタの範囲指定を簡潔にできるようになりました。
ありがとうございました。

アクティブセル領域がこのような働きを持つことはとても勉強になりました。ありがとうございました。

投稿日時 - 2007-12-21 13:26:11

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

とりあえず2行目の
>worksheets(1).Select

Worksheets(1).Cells.Select
にしたらどうでしょう。

マクロ記録で作成したコードは無駄なSelectが多く含まれるので、それを見直す方がよいのですが、それは挑戦してみてください。

投稿日時 - 2007-12-20 13:55:41

お礼

ご返信ありがとうございます。

>とりあえず2行目の
>>worksheets(1).Select
>を
>Worksheets(1).Cells.Select
>にしたらどうでしょう。

やはりwatch式ではWorksheets(1).Cells.Select = TRUE
となっておりまして、画面でも全セル選択状態になっております。
ので、問題ないと思われますが、その後のソート指定がよくないのか
ソートが行われません。

>マクロ記録で作成したコードは無駄なSelectが多く含まれるので、それを?>見直す方がよいのですが、それは挑戦してみてください。

RANGEの指定や、selectの指定などで、マクロ記録と食い違う点や、
うまくいかない点の修正でだいぶ、詰まっています。

投稿日時 - 2007-12-20 14:10:45

あなたにオススメの質問