web-dev-qa-db-ja.com

VBAのGoTo <行番号>

VBAヘルプファイルから:

GoToステートメント

プロシージャ内の指定された行に無条件に分岐します。

構文

GoTo _line_

必要なline引数には、任意の行ラベルまたは行番号を指定できます。

備考

GoToは、それが出現するプロシージャ内の行にのみ分岐できます。

私の質問は、GoToを使用して行番号にジャンプするにはどうすればよいですか? (私はラベルにジャンプする方法を知っています。)

(注:好奇心のためにこれを求めています。実際にGoToをこのように使用するつもりはありません。)

7
TheIronKnuckle

「行番号で行を開始する」という答えが嫌いだとは思いますが、事実については議論できません。それがまさに彼らが意味することです。

VBA/VB6の構文は、QuickBasicの構文と下位互換性を保つように設計されており、その前にGW-Basic/MS-Basicの構文を使用しています。 60年代に作成されました。

MS-Basicでは、時代の他のすべてのBasic実装と同様に、プログラムに追加したすべての行はline numberで始まる必要がありました。行番号は、基本インタープリターに次の2つのことを伝えました。a)行を格納している(そうでない場合、インタープリターはすぐに実行する)、およびb)行が属するプログラムの位置。なぜそんなに難解なことをするのですか?なぜなら、Basicが発明されたとき、テレタイプスタイルprinting ターミナル。

そして、ラベルはありませんでした。

典型的な基本セッションは次のようになります。ここで、>はコマンドプロセッサプロンプトを表します(これは構成されていますが、動作には十分に近いものです)。注意:カーソルキーや画面はありません。あなたはタイプライターでタイプしている-スクリーンの代わりに紙のロールを使って-タイプライターは紙にも印刷することによってあなたに返答する!:

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の「最新の」構文(テキストラベル付き)について説明しているだけで、本当にしたい場合は- 1960年代半ばに発明された、行番号付きのレガシー構文とレガシーGOTO構文を引き続き使用します。

20
Euro Micelli
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

ただし、OnError GoTo ...を除いて、GoToの使用はプログラミングが不十分と見なされます

9
Tom Collins

古い方法の行番号の非常に便利な目的の1つは、エラー処理です。多くの人々は、Sortの標準エラーハンドラーを利用しています。

エラーgotoハンドラーコードのプロシージャ名(引数)。 。終了プロシージャ

ハンドラ:debug.print err.number& "("&err.description& ")in Module:"&ModuleName& "-Proc:"&ProcName at&now

次に再開
終了プロシージャ

ErrLineプロパティは問題のある実行可能行の行番号を返すため、コードでは行番号が付けられています。

debug.print err.number& "("&err.description& ")-on Line"&errLine& "in Module:"&ModuleName& "-Proc:"&ProcName at&now

3
user2953309

GOTOが貧弱なプログラミングであるというコメントをたくさん読んだ。

Hewlit Packard 25にすべての命令と変数を保存するための25のメモリがあった昔に戻ったBASICはまだ初心者多目的シンボリック命令コードであり、6502アセンブラで行うよりもはるかに優れていた専門家の一人が取り組んでいたコンピュータ会議に行ったブロックを使用し、GOTO GOSUB AND RETURNのどれも使用しない新しい言語について.. yea Pascal当時、そのような言語を使用することは不可能でしたが、MSがOfficeを支援してPascalで商用ソフトウェアの教育と設計に約20年費やしてきました。 Delphiがまだ初期の教育言語として使用されていたにもかかわらず、もちろんVBAを使用してPascalは珍しくなりました。

ITを短くする
IF用に作成されたマシンコードを検討する場合、VBAがAND OR NOT XOR in場合....... 1つを数百万回評価する必要がある場合、GOTOを使用すると数秒節約できます。

ただし、ON Error Resume Nextのトピックでは、多くの場合、これらを使用して、ブックが開いているか、閉じているブックにシートが存在するかどうかをテストします... ...などなど。エラーを表示する前にすべてをチェックしますが、それぞれについて....見つかりませんが見つかりません= a = b検出するまでチェックするだけです

私の最初の教育用コンピュータはPDP 8 ... 8Kbでした。印刷およびI/O用のパンチテープテレタイプ.. 7ブートするOctalスイッチ。その後、Comodore 64に移行しました。現在の16 GBコンピュータには、250,000個のメモリがあります。

fBI CIAなどとの話題のコメント.....国土安全保障はそれらすべてを切り捨てます。

0
Harry S

行番号の宣言とラベルの宣言は基本的に同じですが、行番号を使用することが大きな利点です。メモリを使用しません。

「私たちの記憶」の場合、ラベルを宣言することはできませんが、行番号を宣言して「goTo」として使用することができます。

sub mySub()
....
エラーgoto 100
...
exit sub
100: msgbox( "エラー")
サブを終了

0
user2904976