今回は市販の参考書によっては完全に無視されてしまうこともあるVBAのGotoメソッドについて解説します。Gotoメソッドは 指定したセル範囲を選択する という機能をもちます。んん? 誰ですか?
「だったら、Selectメソッドを使えばいいじゃん」
「こんなマイナーなメソッド、別にいらないじゃん」
とか言ってる人は? まあ実のところ、こばとも最初はそう思っちゃいました。でも、よくよく調べてみると、Selectメソッドとは少し違った機能があることがわかったのです。目的によっては、Goto を使ったほうが良い場合もあるのです。
【VBA】Gotoメソッド
Gotoメソッドは Applicationオブジェクトのメソッドです。このメソッドを使うときは
Application.Goto セル範囲 [,スクロール]
という形式で記述します。オプション引数 [スクロール] を指定するときは、True もしくは False です(省略すると False です)。さっそく簡単なマクロで試してみましう。
'[VBA] セルE10にジャンプ Sub Goto_Range_1() Application.Goto Range("E10") End Sub
Goto_Range_1() を実行すると、セル E10 が選択されます。
まあ、これだけなら Select メソッドと大差ないのですが、注目すべきは Gotoメソッドのオプション引数 [スクロール] です。この引数を True にしてみましょう。
'[VBA] セルE10にジャンプ&スクロール Sub Goto_Range_2() Application.Goto Range("E10"), True End Sub
Goto_Range_2() を実行すると …
セル E10 が左上隅に表示されました。このように、Gotoメソッドは移動先のセルが左上端に表示されるように自動的にスクロールされるのです。これは Selectメソッドにはなかった Goto ならではのスペシャルな機能なのです。しかし違いはこれだけではありません。別のシートのセルを選択するときの記述の仕方に、ちょっとした違いがあるのです。
今度は現在アクティブになっていないシートへ移動することを考えてみます。まず最初に Select メソッドを使ってみます。Select でよくやる間違いは次のようなコードです。
'[VBA] このマクロは機能しません! Sub Select_Range_Test() Worksheets("Sheet2").Range("E10").Select End Sub
まったく正しいコードに見えますが、このマクロは動きません。
Selectメソッドを使うなら、2行使って書く必要があります。
'[VBA] Sheet2セルE10にジャンプ Sub Select_Range() Worksheets("Sheet2").Select Range("E10").Select End Sub
ところが、Gotoメソッドを使うと、これが1行ですむのです:
'[VBA] Sheet2のセルE10にジャンプ Sub Goto_Range_3() Application.Goto Worksheets("Sheet2").Range("E10") End Sub
たかが1行、されど1行です。
1行を笑う者は、1行に泣くのです。
おおっと。良いこと言いましたね。
久しぶりにこばとの VBA 名言が出ましたね。
自分で言って、自分で感心しちゃった。
メモしておこうっと …
何ですか? その呆れかえった表情は?
今回はこれでおしまいです。
コメント
[ChatGPT] VBA(Visual Basic for Applications)におけるGotoステートメントは、指定された行番号やラベルにジャンプするために使用されるメソッドです。ただし、Gotoステートメントは一般的には非推奨とされており、コードの可読性や保守性に影響を与える可能性があるため、慎重に使用する必要があります。以下に、Gotoステートメントの使い方と注意点を説明します。
1.行番号を使用したGotoステートメントの使い方:
上記の例では、Gotoステートメントを使用して特定の行番号にジャンプしています。Gotoステートメントを実行すると、指定された行番号に対応する行から処理が再開されます。
2. ラベルを使用したGotoステートメントの使い方:
上記の例では、Gotoステートメントを使用してラベルにジャンプしています。ラベルはコード内の特定の行に任意の名前を付けることができ、Gotoステートメントの対象となります。Gotoステートメントを実行すると、指定されたラベルに対応する行から処理が再開されます。
Gotoステートメントは、コードの実行の流れを予測しにくくし、デバッグや保守が困難になる可能性があります。可読性や保守性を考慮し、必要な場合に限り使用するようにしましょう。代替手段として、条件分岐(IfステートメントやSelect Caseステートメント)やループ(DoループやForループ)を使用することを検討してください。これらの制御構造は、コードの論理を明確に表現しやすく、可読性が高くなります。以上がVBAのGotoメソッドについての説明です。注意点を踏まえながら、必要な場面で適切に使用するようにしましょう。