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

解決済みの質問

EXCEL VBA 並び替えについて

こんばんは。

EXCEL VBAでデータの並び替えを作りましたが、実行すると実行時エラー(1004)となってしまいます。原因を探りましたが分からないため、問題点のご指導をお願いします。

・1行目はタイトル行で、2行目以降にデータが入っております(現在は200行までデータが入っています)。。
・A1~T1にタイトルのそれぞれの項目が入っています。
・D1セルに「商品名のカナ」が入っており、カナで並び替え(昇順)をしたいと思っています。

'データの最終行をEndrowに格納する
EndRow = Worksheets("基礎データ").Range("A1").End(xlDown).Row

Worksheets("基礎データ").Select
Worksheets("基礎データ").Range(Cells(1, 1), Cells(EndRow, 20)).Select
Selection.Sort Key1:=Range("D1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal

プロシージャの一部を抜粋しました。
Selection.Sort Key1~以降の記述は、「マクロの記録」で記録したものを貼り付けました。

よろしくお願いします。

投稿日時 - 2012-10-11 17:55:22

QNo.7743529

すぐに回答ほしいです

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

Windows XP SP3, Excel 2003で試してみました。
その結果、「実行時エラー '1004':」が出る2つのケースがありました。

1.プロシージャが「基礎データ」以外のシートモジュールにある
この場合は「アプリケーション定義またはオブジェクト定義のエラーです。」というメッセージになります。
原因は、シートモジュール内でワークシートオブジェクトを省略した場合に、アクティブなシートではなくそのモジュールのシートが採用されるというところにありました。
対策の1つとしては、シートモジュールには他のシートを扱うコードは置かない、というのがありますし、私もそうしています。
でも、根本的対策としてはオブジェクトをきちんと指定するのが一番です。
今回は以下のようにしたところエラーは出なくなりました。

EndRow = Worksheets("基礎データ").Range("A1").End(xlDown).Row

Worksheets("基礎データ").Select
Worksheets("基礎データ").Range(Worksheets("基礎データ").Cells(1, 1), Worksheets("基礎データ").Cells(EndRow, 20)).Select
Selection.Sort Key1:=Worksheets("基礎データ").Range("D1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal

メンテナンス性を考えるとWithステートメントあるいはワークシートオブジェクト型変数を使った方がよさそうです。
また、他のブックと併用する場合など、ブックも指定したほうがいいこともあります。。

2.並べ替えるセル範囲にセルの結合がある
この場合、プロシージャが標準モジュールにあるなら「この操作には、同じサイズの結合セルが必要です。」というわかりやすいメッセージが出ますので、おそらく質問者様はこの質問を立てるまでもなく解決されることと思います。
それ以外のモジュールの場合は「アプリケーション定義またはオブジェクト定義のエラーです。」という通常のメッセージでした。

投稿日時 - 2012-10-12 00:01:51

お礼

迅速なご回答ありがとうございました。

投稿日時 - 2012-10-13 20:06:53

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

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

回答(1)

あなたにオススメの質問