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との兼ね合いで決まり等があるのでしょうか。
色々なサイトを回ってはいるのですが、ちょっと解決
にいたることができません。
どなたか、ご教授いただけると幸いです。
お礼
度々のご回答まことにありがとうございました。 For Each i In Arrayや、with~end withの使い方が初めてだったのと、 自分で書いた不注意な記述を見逃していたりして手間取りましたが、教えていただいたことを基盤にして、やっと12列分全てを好きなように並べ替えることができました。(色々やっているうちに並べ替えの順序を大分変更しました。) 持っている本の整理をしたかったのですが、一段落つきました。 心より感謝いたします。 何か無駄なコードも含まれているような気もするのですが、取り合えず完成した式を補足欄にご報告させていただきます。 また質問させていただくこともあるかと思いますが、その折にはよろしくお願いいたします。
補足
Private Sub CommandButton1_Click() Dim r1 As Long Dim r2 As Long Dim r3 As Long Dim gx1 As Long Dim y As Variant Dim i As Variant Dim k As Variant Dim Incline As Integer Incline = xlDescending '降順 , 'xlAscending '昇順 r1 = ActiveSheet.Range("H65536").End(xlUp).Row Application.ScreenUpdating = False With ActiveSheet With .Range(.Cells(7, 1), .Cells(r1, 12)) .Sort _ Key1:=.Cells(2, 7), _ Order1:=Incline, _ Header:=xlYes, _ OrderCustom:=1, _ MatchCase:=False, _ Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin End With gx1 = 1 y = 8 Do Do If gx1 = 1 Then r2 = 7 Else r2 = y End If For k = y To r1 If y = r1 Then Application.ScreenUpdating = True Exit Sub End If If Cells(k, 7).Value = "" Then r3 = r1 Exit For End If If Cells(k, 7).Value <> Cells(k + 1, 7).Value Then Exit For End If Next k r3 = k Exit Do Loop For Each i In Array(10, 12, 10, 1, 5, 6, 4, 3, 2, 8, 9, 11) With .Range(.Cells(r2, 1), .Cells(r3, 12)) If i = 7 Or i = 11 Then Incline = xlDescending Else Incline = xlAscending End If .Sort _ Key1:=.Cells(2, i), _ Order1:=Incline, _ Header:=xlYes, _ OrderCustom:=1, _ MatchCase:=False, _ Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin End With Next i If r3 = r1 Then Exit Do End If gx1 = gx1 + 1 y = k + 1 Loop End With Application.ScreenUpdating = True End Sub