電子書籍の厳選無料作品が豊富!

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

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

A 回答 (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 でもよいのですがムダに選択しないようにしました。
    • good
    • 0
この回答へのお礼

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

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

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

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

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

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

お礼日時:2007/12/21 13:26

とりあえず2行目の


>worksheets(1).Select

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

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

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

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

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

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

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

お礼日時:2007/12/20 14:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!