• ベストアンサー

《エクセル2000VBA》これで実行時エラー '1004'が出るのはなぜでしょう?

こんにちは。VBAの実行時エラーで困っています。 内容を抜粋したものが、下記のものになります。 If Worksheets(sname1).Range("M6") <> Empty Then MsgBox (sname1) MsgBox (Worksheets(sname1).Range("M6")) '該当入力シートの一番下の行を探す Worksheets(sname1).Range("M65536").End(xlUp).Offset(1).Select sname1はシート名の変数です。 2つのMsgBoxが間違いなく表示されますので、sname1に存在するシート名は入っていると思います。 今の状態で、該当入力シートの一番下の行を探す時点で実行時エラーが出てしまうのですが、なぜでしょうか?

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

Select が原因と思います。 Worksheets(sname1).Activate を Worksheets(sname1).Range("M65536").End(xlUp).Offset(1).Select の上に書いたらどうでしょう?

bari_saku
質問者

お礼

ありがとうございます、エラーが消えました!

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

>なぜ違いが出るのかを教えていただけませんでしょうか。 基本的には、マクロは、標準モジュールに書くようにしてくださいね。シート・モジュールに書くものは、シートのイベントやボタン・コントロールのイベントだけにしてください。 その違いですが、#1さんの回答がなぜダメだったかというのは、ちょっと難しいことですが、Rangeオブジェクトには、シートに直結しているものと、そうでないものがあるということです。シート・モジュールに書くとシートに直結してしまうのですね。 Range("M65536").End(xlUp).Offset(1).Select これは、シートモジュールに書くと、そのシートに属したM65536というアドレスですよ、という意味になってしまいます。別のシートにしてしまうと、そのシートがActiveでないのに、そのシートのセルをSelectしてください、といわれてもできませんという、エラーが出ます。 つまり、SelectやActivateでなければ、問題が出ません。 '<標準モジュール>で書くと Worksheets(sname1).Select '.Active でも可 'シートをアクティブにして、 Range("M65536").End(xlUp).Offset(1).Select '自由に選択(Select)することができるようになります。 ただ、これで間違いがないのですが、きちんと書くなら、 やっぱり、#4 のpapayukaさんがお書きになっているように、シートを明示するというのが、プログラムとしての正しい書き方だと思っています。 (以下は、With で省略しています) With Worksheets(sname1)  .Select  .Range("M65536").End(xlUp).Offset(1).Select End With でも、本当に、Selectする必要があるかどうかを見極める、というのが、次の課題になってきますね。

bari_saku
質問者

お礼

ご丁寧にありがとうございました。 (書く場所ですが、ゆくゆくはボタンコントロールで行う予定のものですので、このままにしておこうかと思っています)

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

#1 さんの答えで間違いないのですが、基本的なことですが、それは、「標準モジュール」に書かれていないのではありませんか? ともかく、その点を調べてみてください。

bari_saku
質問者

お礼

…まさにその通りです。集計するシートのオブジェクトに書いています。 標準モジュールにコピペしたら、問題なく動きました。 もしよろしければ、なぜ違いが出るのかを教えていただけませんでしょうか。

すると、全ての回答が全文表示されます。
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

一見して問題なさそうなので、コード全体を見てみないとわからないですね。コードの提示は可能ですか? それから、こういうときはステップイン(F8)で実行すると糸口がみつかるかもしれません。 試しに、 Worksheets(sname1).Range("M65536").End(xlUp).Select のように、Offset を除いてみたらどうなりますか?

bari_saku
質問者

お礼

ここに載せるため、コードの余計な部分を削除しているうちに、何とか解決できそうになってきました。 お手数をおかけしました、ありがとうございました。

すると、全ての回答が全文表示されます。
  • kmb01
  • ベストアンサー率45% (63/138)
回答No.1

Worksheets(sname1).Select Range("M65536").End(xlUp).Offset(1).Select とすればいいはず

bari_saku
質問者

お礼

ごめんなさい。 結果、変わりません… 私のやり方が悪いのでしょうか。

すると、全ての回答が全文表示されます。

関連するQ&A