1

これはおそらく私がここで尋ねた中で最もばかげた質問ですが、このようなことに対する答えを見つけるのは難しいです.

それぞれが異なる変数を計算する一連のモジュール/サブを含むプログラムがあります。それらはかなり複雑なので、分けておきたいと思います。ここで、ユーザー入力に基づいて、以前のモジュールを別のモジュールにスキップしたいと考えています。これにはメソッドを使用できると思ってcall (sub name)いましたが、プログラムは呼び出し行があった場所に戻り、中断したところからそのモジュールを続行します。

例:

モジュール 1:

Sub NewPracticeSub()

    Call otherpracticesub

    MsgBox ("We've gone back to this sub... :(")

End Sub

モジュール 2:

Sub otherpracticesub()

    MsgBox ("We're in the other practice sub!")

End Sub

モジュール 1 に戻りたくないのですが、モジュール 2 の完了時にモジュール 1 を完了するために戻らずに、制御をモジュール 2 に切り替えるにはどうすればよいですか?

このすべてを説明するために可能な限り最も紛らわしい言語を使用したように感じますが、とにかく助けてくれてありがとう!!

編集:モジュールとサブという言葉を同じ意味で使用したことは知っていますが、それらが異なることも知っています。各サブ (私のプログラムではそれぞれ非常に大きい) を独自のモジュールに保持するのが好きです。これは、それらを追跡しやすく、他の人にアプリケーション フローを説明/実演しやすいためです。

4

3 に答える 3

2

あなたが探しているのはExit Sub、プログラムをそれ以上続行せずにサブルーチンを終了させるコマンドだけだと思いますが、通常これを行う方法は、 a を呼び出すのSubではなくFunction、ブール値を返す a を呼び出すことです。

たとえば、次のようになります。

Public Function MyFunc() as Boolean
   ....
   If [good] MyFunc = True
   Else MyFunc = False
End Function

次に、次の行に沿って何かを行うことができます。

Sub MyCallingSub()
   ...
   If MyFunc = True then Exit Sub
   Else ...
End Sub

それは、サブでさらに継続するかどうかを選択するためのより多くの柔軟性と能力を追加するだけです.

それが理にかなっていることを願っています。

于 2013-06-10T16:08:50.360 に答える
1

以下で説明する(そして避けることを強くお勧めします)醜いステートメントを使用する以外Endに、コールスタックを回避する方法を知りません。John の応答でさえ、必ず呼び出し側のプロシージャーに戻り、別のステートメントを評価して続行するか終了するかを決定します。

これは望ましくない結果をもたらす可能性があるため、コール スタックに関してコードやループなどを適切に構造化することを優先して、推奨することをためらっています。

Endいずれにせよ、パブリック/グローバル変数をまったく必要とせずに、子サブルーチン内でステートメントを使用する方法を次に示します。これにより、いつどこでステートメントを呼び出すかを柔軟に決定できるEndため、常に呼び出す必要はありません。

Sub NewPracticeSub()

    Call otherpracticesub, True

    MsgBox ("We've gone back to this sub... :(")

End Sub

Sub otherpracticesub(Optional endAll as Boolean=False)

    MsgBox ("We're in the other practice sub!")

    If endAll then End '## Only invoke End when True is passed to this subroutine
End Sub

MSDN経由で、この方法を避けるべきだと私が言う理由

"注 End ステートメントは、Unload、QueryUnload、または Terminate イベント、またはその他の Visual Basic コードを呼び出すことなく、コードの実行を突然停止します。フォームおよびクラス モジュールの Unload、QueryUnload、および Terminate イベントに配置したコードは実行されません。クラス モジュールから作成されたオブジェクトは破棄され、Open ステートメントを使用して開かれたファイルは閉じられ、プログラムによって使用されたメモリは解放されます。他のプログラムによって保持されたオブジェクト参照は無効になります。

End ステートメントは、プログラムを強制的に停止する方法を提供します。Visual Basic プログラムを正常に終了するには、すべてのフォームをアンロードする必要があります。パブリック クラス モジュールから作成されたオブジェクトへの参照を保持している他のプログラムがなくなり、コードが実行されなくなると、プログラムはすぐに閉じます。」

于 2013-06-10T18:13:27.983 に答える
0

必ず戻ってきますが、それは問題ではありません。次のように Exit Sub を使用することをお勧めします。

サブ NewPracticeSub()

Call otherpracticesub

**Exit Sub**
'Nothing more can execute here so its no longer a worry

サブ終了

モジュール 2:

Sub otherpracticesub()

MsgBox ("We're in the other practice sub!")

サブ終了

于 2016-05-11T03:06:27.207 に答える