VBA ヘルプ ファイルから:
GoTo ステートメント
プロシージャ内の指定された行に無条件に分岐します。
構文
GoTo_line_ _ _ _
必須のline引数は、任意の行ラベルまたは行番号です。
備考
GoToは、それが現れるプロシージャ内の行にのみ分岐できます。
私の質問は、どうすれば行番号にジャンプできGoTo
ますか? (ラベルにジャンプする方法を知っています。)
(注:好奇心でこれを求めています。実際にこの方法を使用するつもりはありませんGoTo
。)
「行番号で行を開始する」という答えが嫌いなのは理解できますが、事実について議論することはできません。それがまさに彼らの意味です。
VBA/VB6 の構文は、QuickBasic の構文と後方互換性を持つように設計されており、その前は GW-Basic/MS-Basic の構文と互換性があるように設計されています。これは 1970 年代後半およびそれ以前にさかのぼります。元の Dartmouth BASIC 言語は60年代に作成されました。
MS-Basic では、その時代の他のすべての Basic 実装と同様に、プログラムに追加するすべての行は行番号で始まる必要がありました。行番号は、Basic インタプリタに次の 2 つのことを伝えました。a) 行を格納していること (そうしないと、インタプリタはすぐにそれを実行します)、および b) 行が属するプログラムの位置。なぜそんなに難解なことをするのですか?なぜなら、Basic が発明されたとき、テレタイプ スタイルの印刷端末でのコマンド ライン プロンプトしか対話型ではない世界で、対話型であることを意図していたからです。
そして、ラベルはありませんでした。
典型的な Basic セッションは次のようになります。ここで>
、 はコマンド プロセッサ プロンプトを表します (これはでっち上げですが、動作に十分近いものです)。覚えておいてください: カーソルキーや画面はありません。あなたはタイプライターでタイプしています - 画面の代わりに紙のロールを使って - タイプライターは紙にも印刷することであなたに応答します!:
Welcome to B.A.S.I.C.
Ok <--- Ok told you the interpreter was ready
>LIST <--- print the program
Ok <--- No program, so nothing to list.
>PRINT 2 + 7 <--- No line number, so execute immediately
9 <--- The command executes
Ok
>30 PRINT 2 + 7 <--- Line number, so store the command in position 30
Ok
>10 I = 42 <--- Line number, so store in line 10
Ok
>20 PRINT I + 12 <--- Store on line 20, so insert between 10 and 30
Ok
>LIST <--- Print the program so far
10 I = 42
20 PRINT I + 12
30 PRINT 2 + 7
Ok
>RUN <--- Execute the stored program now
54 <--- line 10 has no output. Line 20 outputs this
9 <--- line 30 outputs this
Ok <--- Done running the program
>20 <--- an empty line number: it means delete the line
Ok
>LIST
10 I = 42
30 PRINT 2 + 7 <--- line 20 is gone!
原生的?かもしれませんが、どこかから始めなければなりません。
当時は、コードをジャンプさせたい行番号を指定して、常にGOTO を使用していました。それはまさにそれがどのように機能したかでした。例えば:
10 PRINT "Testing, "
20 I = 1
30 PRINT I; ","
40 IF I >= 3 THEN 60
50 GOTO 30
60 END
QuickBasic は Microsoft によって公開された Basic の拡張バージョンであり、インタープリターで対話的に実行するのではなく、オプションでプログラムを実行可能ファイルにコンパイルすることをサポートしていました。その他の機能強化として、次の 2 つの機能も追加されました。
フル機能の GUI テキスト エディターでフルスクリーンで実行されたため、新しい行の行先を指定する行番号は必要ありませんでした。カーソルを移動して入力しただけです。従来の行番号はオプションになりました。実際、フル機能のエディターでは邪魔になるだけだったので、彼らはがっかりしました。しかし、それらは BASIC 互換性にとって非常に重要であったため、単純に削除することはできず、引き続きサポートされていました。そして、それらは VBA でも変わりません。
彼らは行番号を使用することを望んでいなかったので、ターゲットとして行番号を必要とするコマンド ( GOTO
. GOTO などのターゲットとして使用できる行テキスト ラベルを配置できるようになりました。
したがって、行番号は単なる「数字で作られた行ラベル」ではないことがわかります。これらは実際には、古いバージョンの言語との互換性のために維持されている代替構文です。
それでおしまい。ヘルプ ファイルは、GOTO の "最新の" 構文 (テキスト ラベル付き) について説明しているだけであり、必要に応じて、行番号を含む従来の構文と、2000 年半ばに考案された従来の GOTO 構文を引き続き使用できることを示しています。 -1960年代。
Sub Jump()
10 Dim A As Integer
20 A = 25
30 GoTo 50
40 A = 50
50 Debug.Print A
End Sub
これは、行番号が必要だった古い (本当に古い) BASIC の時代への逆戻りです。現在、ラベルが使用されています。
Sub Jump2()
Dim A As Integer
A = 25
GoTo JumpToHere
A = 50
JumpToHere:
Debug.Print A
End Sub
しかし、GoTo を使用することは、以下を除いて、貧弱なプログラミングと見なされます。OnError GoTo ...
昔ながらの行番号の非常に便利な目的の 1 つは、エラー処理です。多くの人は、Sort の標準エラー ハンドラを利用しています。
proc name (args) on error goto handler code . . プロシージャを終了
ハンドラ: モジュール内の debug.print err.number & "(" & err.description & "): " & ModuleName & "- Proc:" & ProcName at & now
次のExit Procを再開
ErrLine プロパティが問題のある実行可能行の行番号を返すため、コード内で行番号が付けられます。
debug.print err.number & "(" & err.description & ") - モジュール内の行 " & errLine & ": " & ModuleName & "- Proc:" & ProcName at & now
行番号の宣言とラベルの宣言は基本的に同じですが、大きな利点として行番号を使用します: メモリを使用しません!
あなたの「私たちの記憶」の場合、ラベルを宣言することはできませんが、行番号を宣言してそれを「goTo」として使用することはできます
sub mySub()
....
エラーの場合 goto 100
...
サブ
100 を終了: msgbox("Error")
end sub