VBAを操作していたらかなりハマったので、その内容と解決策を書きます。
困った内容
「管理画面」シートを変更した直後にセルA5を選択するという単純なVBAを作りました。
Worksheets(“管理画面”).Select
Range(“A5”).Select
そしたら、「Range(“A5”).Select」でエラーが出るんです。
全く同様の方法で記述した他のプロシージャは動いているので、ちょっとよくわからなくなったのが始まります。
試した内容
まず、シートを選択するのとアクティブにするのは違うということを知りました。(初めて意識しました)
選択はSelectで、選ぶということです。ということは1つのシート選ぶこともできますし、複数シートを選ぶことができますね。
アクティブはActiveで、このシートを使うんだ、アクションを起こすんだと意思表明をすることで、これは1つのシートにしか設定できません。
この選択とアクティブの違いがごっちゃになってました。
それが原因かなと思って、次のようにしてみました。
Worksheets(“管理画面”).Activate
Range(“A5”).Select
これでもエラー。
解決
どうやら、RangeのSelectはシート指定をしないと、あちこちのシートを見ているプロシージャだとエラーになるのかなという感じだったので、次のようにシートを指定することにしました。
Worksheets(“管理画面”).Activate
Worksheets(“管理画面”).Range(“A5”).Select
ちょっと前までは、「Worksheets(“管理画面”).Range(“A5”).Select」の1行だけで、他のシートからでも管理画面のセルA5を選ぶはずだと思っていて、実際にやってみたらエラーだったので、シートを選択、その後Rangeの選択の2行に分けるのがルールだと思い込んでいました。
でも、そうじゃなくて、Rangeの選択の前に、シートが選ばれていることが絶対条件で、セルを選択するには、シートから指定しないと安定しない、ということだったのですね。
まとめ
今回は、VBAのオブジェクトの選択について、あらかじめ選択できる状態にしておくことが必要だということ、RangeのSelectはRangeだけではなくWorksheetsも指定するほうがいい、ということを覚えました。
コメント
そもそもなんでセルをselectする必要があるんですか?ユーザーに処理中のセルを教えるため?ちょっと意味がわかりません。