即効テクニック |
VBAでは、一見正しいようなコードがエラーになることもあります。 たとえば、アクティブシートがSheet1の状態で次のマクロを実行するとアクティブシートがSheet2に切り替わり、アクティブセルがセルB3になります。
Sub Sample1() Sheets("Sheet2").Select Range("B3").Select End Subとても基本的なコードです。解説するまでもないでしょう。 ところが、これと同じ動作をさせようと、次のように書いたらどうでしょう。Sub Sample2() Sheets("Sheet2").Range("B3").Select End Sub実行するとエラーになります。 エラーメッセージは「RangeクラスのSelectメソッドが失敗しました」です。 失敗しましたって言われても、何が原因で失敗したのかがわかりません。 Sheets("Sheet2").Range("B3") = 100 のようなコードは問題なく実行できますので、セルの指定方法は間違っていないはずです。 実はVBAでは、アクティブでないシートのセルを直接Selectできないんです。 これは、そういう仕様なのですから、素直に2行で書けば済む話です。 もっとも、方法がないわけではありません。 アクティブでないシートのセルを一発で選択するには、ApplicationオブジェクトのGotoメソッドを使います。Sub Sample3() Application.Goto Sheets("Sheet2").Range("B3") End SubこのGotoメソッドは、少し変わった使い方ができます。 引数に渡すジャンプ先には、セルを表すRangeオブジェクトだけでなく、VBEで作成したプロシージャ名も指定できます。Sub Sample4() Application.Goto "Sample5" End Subを実行すれば、同じモジュール内のプロシージャSample5にカーソルが移動します。 また、Sub Sample4() Application.Goto "Module2.Sample5" End Subのようにモジュール名を指定することも可能です。