- ベストアンサー
エクセル2010VBAで並べ替えの参照が正しくないエラーが発生する
- エクセル2010VBAで昇順に並べ替えをしようとした際に、実行時エラー1004が発生し、並べ替えの参照が正しくないことを示しています。
- マクロの記録を使って記録を取り、範囲がよく変わるためUsedRangeに書き換えたことが原因で、エラーが発生している可能性があります。
- 解決するには、[最優先されるキー]ボックスが空白でないことを確認し、正しい範囲を指定して並べ替えを行う必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2 です。 すみません、ちょっとボケてておかしかったです。 「フィルター設定されたセル範囲」 の2列め、なら、 .AutoFilter.Range.Columns(2) と書くのが直接的で解り易いですね。 No.2に書いた相対参照に関する説明は無用でした。 ごめんなさい。 ' ' // 「フィルター設定されたセル範囲」の2列めを基準にソートする例 Sub Macro() With ActiveWorkbook.Worksheets("ベース").AutoFilter.Sort .SortFields.Clear .SortFields.Add _ Key:=ActiveWorkbook.Worksheets("ベース").AutoFilter.Range.Columns(2), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub ' ' // それと、書き忘れていましたが、 「フィルターでの並べ替え」 という前提ですので、常にフィルターを設定してある、 という条件を外すと、当然エラーになりますので、 気を付けてください。 フィルターを外すこともあるのでしたら、 [ユーザー設定の並べ替え] の方を使ってマクロの記録を録り直して、再挑戦したほうが いいのかも、です。 以上です。失礼しました。
その他の回答 (2)
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。 「フィルターでの並べ替え」 ということでしたら、ActiveSheet.UsedRange、 とは本来無関係ですし、他の間違いの原因にもなりそうでやや危ういですね。 (基本的に.UsedRangeはデータのある範囲という意味ではないので、 データ範囲を捉える目的には使えません。) ActiveWorkbook.Worksheets("ベース").AutoFilter.Range.Columns("B") のような形で、 「フィルター設定されたセル範囲」 .AutoFilter.Range の 「範囲内の列位置(相対参照)」 例えば2列め .Columns("B") を .AutoFilter.SortSortFields の 「並べ替え」の「Key」列に指定します。 ご提示のエラーの直接の原因は、 「並べ替え」の「Key」=「何列めを基準にソートするか」 の指定範囲をActiveSheet.UsedRangeにしてしまっていることです。 Keyには、「フィルター設定されたセル範囲」内にある、 単列のセル範囲を指定します。 例えば[A1:C11]の範囲にフィルターが掛かっているのでしたら、 .. .AutoFilter.Sort.SortFields.Add _ Key:=Range("B1:B11"), _ という範囲を指定することになるのですが、 .. .Worksheets("ベース").AutoFilter.Range のようにして、[A1:C11]の範囲を捉えて、 その範囲内の2列め という意味で、.Columns("B")を加えて、 .. .AutoFilter.Sort.SortFields.Add _ Key:=ActiveWorkbook.Worksheets("ベース").AutoFilter.Range.Columns("B"), _ のように指定します。 相対参照ということで解り難いかも知れないので例を挙げておきます。 「フィルター設定されたセル範囲」が [B1:D11] だった場合には、 B列をKeyにするなら、.Columns("A") C列をKeyにするなら、.Columns("B") D列をKeyにするなら、.Columns("C") のように、ズラしてあげてください。 ' ' // 「フィルター設定されたセル範囲」の2列めを基準にソートする例 Sub Macro() With ActiveWorkbook.Worksheets("ベース").AutoFilter.Sort .SortFields.Clear .SortFields.Add _ Key:=ActiveWorkbook.Worksheets("ベース").AutoFilter.Range.Columns("B"), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub ' ' //
お礼
ありがとうございました。
- Nouble
- ベストアンサー率18% (330/1783)
未確認ながら 此って 多分、ですが With ActiveSheet .Range(Cells(1,1),Cells(2,1)) End With と 同じ事、かと 上記が 何故、エラーか と、いうと Withが .Range(には、 継承されて、いるが、 Cells(には、 継承されて、いず、 対象シートが 異なる、場合が 出る だからです 振り返って お示しの、物を 見ると ActiveWorkbook.Worksheets("ベース").AutoFilter.Sort.SortFields.Add Key:= と、ありますが 其の 次の、行では ActiveSheet.UsedRange ,と、あり 此の、行だけ Worksheet「ベース」を 参照してますよ との、断りが ありません ActiveSheetに、なっています 要するに 誤記 ActiveSheet.UsedRange, 正記 ActiveWorkbook.Worksheets("ベース").UsedRange, では、 無いでしょうか? 参照シート、不一致だ と、思いますよ 対象シートは 1動作内で、統一しましょう
お礼
ありがとうございました。
お礼
ありがとうございました。