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との兼ね合いで決まり等があるのでしょうか。
色々なサイトを回ってはいるのですが、ちょっと解決
にいたることができません。
どなたか、ご教授いただけると幸いです。
お礼
ありがとうございます。 定数を数値にしましたがダメでした。 そもそもオプションはすべてデフォルトなので、オプション部分をすべて削除した状態で実行しましたが変わりません。 たとえば myExcel.workbooks(BookName).sheets(1).Range("A1:B2").Select と書けば、A1:B2がきちんと範囲選択されるので、オブジェクト自体にはちゃんとアクセスできています。Word VBAからだとSortオブジェクトにアクセスできないのでしょうか。 Sort オブジェクト? あ、ちょっと試したいことが見つかったので試してみます。
補足
できました! Range指定のたびに、オブジェクトから書き始めなければならないようです。 myExcel.workbooks(BookName).sheets(1).Sort.SortFields.Add Key:=Range("A1") ではなく、 myExcel.workbooks(BookName).sheets(1).Sort.SortFields.Add Key:=myExcel.workbooks(BookName).sheets(1).Range("A1") とするとできました。 参照設定で Microsoft Excel Object Library 12をオンにしていれば、定数が xl~でも大丈夫なようです。参照設定をオフにすると、一部の定数を数値で表さなければならないようです。 英語で調べたらこのサイトがヒットしました。 http://superuser.com/questions/569996/office-2007-how-to-sort-an-excel-table-from-within-a-word-macro ここではオブジェクトの定義を関数の外にするよう指示していますが、私の場合は関数内のままでもできました。