プロが教えるわが家の防犯対策術!

こんにちは。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に存在するシート名は入っていると思います。

今の状態で、該当入力シートの一番下の行を探す時点で実行時エラーが出てしまうのですが、なぜでしょうか?

A 回答 (5件)

Worksheets(sname1).Select


Range("M65536").End(xlUp).Offset(1).Select
とすればいいはず
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/17 11:49

一見して問題なさそうなので、コード全体を見てみないとわからないですね。

コードの提示は可能ですか?

それから、こういうときはステップイン(F8)で実行すると糸口がみつかるかもしれません。

試しに、

Worksheets(sname1).Range("M65536").End(xlUp).Select

のように、Offset を除いてみたらどうなりますか?
    • good
    • 0
この回答へのお礼

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

お手数をおかけしました、ありがとうございました。

お礼日時:2005/06/17 13:01

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



ともかく、その点を調べてみてください。
    • good
    • 0
この回答へのお礼

…まさにその通りです。集計するシートのオブジェクトに書いています。

標準モジュールにコピペしたら、問題なく動きました。

もしよろしければ、なぜ違いが出るのかを教えていただけませんでしょうか。

お礼日時:2005/06/17 13:12

Select が原因と思います。



Worksheets(sname1).Activate



Worksheets(sname1).Range("M65536").End(xlUp).Offset(1).Select

の上に書いたらどうでしょう?
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/17 13:01

>なぜ違いが出るのかを教えていただけませんでしょうか。


基本的には、マクロは、標準モジュールに書くようにしてくださいね。シート・モジュールに書くものは、シートのイベントやボタン・コントロールのイベントだけにしてください。

その違いですが、#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する必要があるかどうかを見極める、というのが、次の課題になってきますね。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございました。

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

お礼日時:2005/06/17 15:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!