当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

【VBA】Gotoメソッドで指定セルにジャンプ

今回は市販の参考書によっては完全に無視されてしまうこともある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 が選択されます。
 
VBA Gotoメソッドを使ったプログラム① 指定セルに移動
 
まあ、これだけなら Select メソッドと大差ないのですが、注目すべきは Gotoメソッドのオプション引数 [スクロール] です。この引数を True にしてみましょう。

'[VBA] セルE10にジャンプ&スクロール
Sub Goto_Range_2()
   Application.Goto Range("E10"), True
End Sub

Goto_Range_2() を実行すると …
 
VBA Gotoメソッドを使ったプログラム② 指定セルが左上端にスクロール
 
セル 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 名言が出ましたね。
自分で言って、自分で感心しちゃった。
メモしておこうっと …
何ですか? その呆れかえった表情は?
今回はこれでおしまいです。

コメント

  1. あとりえこばと より:

    [ChatGPT] VBA(Visual Basic for Applications)におけるGotoステートメントは、指定された行番号やラベルにジャンプするために使用されるメソッドです。ただし、Gotoステートメントは一般的には非推奨とされており、コードの可読性や保守性に影響を与える可能性があるため、慎重に使用する必要があります。以下に、Gotoステートメントの使い方と注意点を説明します。
     
    1.行番号を使用したGotoステートメントの使い方:

    Sub Example1()
        ' コードの実行
        Goto Line5
        
    Line1:
        ' Line1の処理
        Goto Line10
    
    Line5:
        ' Line5の処理
        Goto Line1
        
    Line10:
        ' Line10の処理
    End Sub

    上記の例では、Gotoステートメントを使用して特定の行番号にジャンプしています。Gotoステートメントを実行すると、指定された行番号に対応する行から処理が再開されます。
     
    2. ラベルを使用したGotoステートメントの使い方:

    Sub Example2()
        ' コードの実行
        Goto Label2
        
    Label1:
        ' Label1の処理
        Goto Label3
    
    Label2:
        ' Label2の処理
        Goto Label1
        
    Label3:
        ' Label3の処理
    End Sub

    上記の例では、Gotoステートメントを使用してラベルにジャンプしています。ラベルはコード内の特定の行に任意の名前を付けることができ、Gotoステートメントの対象となります。Gotoステートメントを実行すると、指定されたラベルに対応する行から処理が再開されます。

    Gotoステートメントは、コードの実行の流れを予測しにくくし、デバッグや保守が困難になる可能性があります。可読性や保守性を考慮し、必要な場合に限り使用するようにしましょう。代替手段として、条件分岐(IfステートメントやSelect Caseステートメント)やループ(DoループやForループ)を使用することを検討してください。これらの制御構造は、コードの論理を明確に表現しやすく、可読性が高くなります。以上がVBAのGotoメソッドについての説明です。注意点を踏まえながら、必要な場面で適切に使用するようにしましょう。

タイトルとURLをコピーしました