2017-06-29 18 views
1

私はブック全体をさまざまなサブシステムで作成しています。たとえば、ユーザーが誤ってシートのコードを消去しているサブミットを回避するために、代わりにすべてのサブプライベートをプライベートにします。VBA Excelコールと実行中のバックトラッキング

私のサブシステムは、ワークシート上のボタンをクリックすることによってのみアクティブ化することができ、すべてが意図したとおりに動作します。私の下位部署が、もちろん別のモジュールのプライベートサブを呼び出そうとするまで。この問題を回避するには

は、私が働いても、私は私が必要とするいくつかの柔軟性を与える前のサブから「NextSub」変数に呼び出すことができますApplication.RunではなくCallを使用し、明らかにカントはCallを取得します。

例:

Sub FirstSub() 
*Something going on 
Application.Run "SecondSub", SomeVariableSub 
End sub 

Sub SecondSub(Nextsub as String) 
If something Then 
    *Do something 
    Application.Run NextSub 
Else 
    Application.Run NextSub 

私はApplication.Runはすべて私の問題を解決したと思ったが、私は順番にサブと呼ばれるのErrorHandlerと呼ばれるラインを、持っていました。それは、私がCallを使用したときのようにエラーハンドラを含むサブプログラムにプログラムがもう戻って戻ってこないようです。

Applciation.Runはこの機能を中断しますか?はいの場合は、Callに変数NextSubを使用してもよろしいですか?そして、もし私がCallをそのように使うことができないのであれば、影響を受けたサブシステムにOn Error GoTo ErrorHandlerを追加することでこれはすべて修正されますか?

モジュール間でプライベートサブセットを呼び出すことはおそらく非常に悪いことではありますが、私が始めたときにはそれほど新しいことでしたが、プロジェクトは広範囲であり、コードをすべて書き直すことなく修正できませんでした。

+0

はあなたが試すことができ:

正しい方法は、(それがプライベート関数と同じモジュールである限り)すべての私的潜水艦を呼び出すことができますこのようなものを、使用することですModule1.SubName'? – Ian

+0

'あなたが誤ってサブを起動したということはどういう意味ですか?あなたは(ほぼ) 'Application.Run'を使うべきではありません。 – stenci

+0

@Stenciもし彼らがマクロに入り、そこからサブシステムの1つをアクティブにすると、それは壊滅的なものになる可能性があります –

答えて

2
代わりに、すべての潜水艦はプライベート作るの

、各モジュールの上に置くオプションプライベートモジュールのいずれか、または各ルーチンへの仮引数を追加:私はあなたがしようとしている理解していれば

Sub SomeHiddenRoutine(bDummy As Boolean = False) 
 
    'Routine can be called as usual using: 
 
    SomeHiddenRoutine 
 
End Sub

+0

そうですね、それは隠されていて素晴らしいですが、私は 'Call'を使用して戻ってきました。コール関数で変数のサブ名を渡す。 'Call'が関数の正確な名前を必要としているように見えますが、' Application.Run'は文字列を受け入れることができます。 –

+1

Hmm、OK私はその部分を逃しました。実際、Application.runは被呼び出しサブプログラムに既存のエラーハンドラを無視させるので、呼び出されるルーチンには独自のエラーハンドラがあることを確認する必要があります。 – jkpieterse

+0

私が必要とするエラーハンドラはちょうど2行しかありません。ちょうどサブを呼び出してメリーのやり方にする必要があります。それは行くとそれを無視して恥 –

2

を文字列で指定された関数を呼び出す。 `コールが

Sub CallFunction(FuncName As String) 
    Select Case FuncName 
    Case "Func1": Func1 
    Case "Func2": Func2 
    Case "Func3": Func3 
    End Select 
End Sub 
関連する問題