Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 自动检测使用参数调用与单独调用子例程?_Vba_Excel_Subroutine - Fatal编程技术网

Vba 自动检测使用参数调用与单独调用子例程?

Vba 自动检测使用参数调用与单独调用子例程?,vba,excel,subroutine,Vba,Excel,Subroutine,我有三个子例程,有时连续运行,有时单独运行,但将使用相同的参数(“TestNumber”)。我的原始代码如下所示: Sub Main1() Dim TestNumber As String TestNumber = InputBox("Please enter TestNumber") ' Some codes running on TestNumber ' Prompt users whether to continue to Main2 Dim

我有三个子例程,有时连续运行,有时单独运行,但将使用相同的参数(“TestNumber”)。我的原始代码如下所示:

Sub Main1()
    Dim TestNumber As String
        TestNumber = InputBox("Please enter TestNumber")
    ' Some codes running on TestNumber
    ' Prompt users whether to continue to Main2
    Dim Continue As String
        Continue = MsgBox("Continue to Main2?", vbYesNo)
        If Continue = vbYes Then
                Call Main2
            Else
        End If
End Sub

Sub Main2() ' Similar to Main1, just that it will prompt if user wants to continue to Main3
    Dim TestNumber As String
        TestNumber = InputBox("Please enter TestNumber")
    ' Some codes running on TestNumber
    Dim Continue As String
        Continue = MsgBox("Continue to Main3?"), vbYesNo)
        If Continue = vbYes Then
                Call Main3
            Else
        End If
End Sub

Sub Main3() ' The last call of the series
    Dim TestNumber As String
        TestNumber = InputBox("Please enter TestNumber")
    'Some codes running on TestNumber
End Sub

那么,我认为每次调用重新输入TestNoice都会有点麻烦和风险,所以我将代码更改为:

Sub Main1()
    Dim TestNumber As String
        TestNumber = InputBox("Please enter TestNumber")
    ' Some codes running on TestNumber
    ' Prompt users whether to continue to Main2
    Dim Continue As String
        Continue = MsgBox("Continue to Main2?", vbYesNo)
        If Continue = vbYes Then
                Call Main2(TestNumber)
            Else
        End If
End Sub

Sub Main2(TestNumber As String) ' Similar to Main1, just that it will prompt if user wants to continue to Main3
    If TestNumber = "" Then
            TestNumber = InputBox("Please enter TestNumber")
        Else
    End If
    ' Some codes running on TestNumber
    Dim Continue As String
        Continue = MsgBox("Continue to Main3?"), vbYesNo)
        If Continue = vbYes Then
                Call Main3(TestNumber)
            Else
        End If
End Sub

Sub Main3(TestNumber As String) ' The last call of the series
    If TestNumber = "" Then
            TestNumber = InputBox("Please enter TestNumber")
        Else
    End If
    ' Some codes running on TestNumber
End Sub
如果我从Main1开始一直工作到Main3,这就可以了。 但如果我从Main2或Main3开始,两个脚本都不会运行。相反,系统会提示运行哪个子例程


是否有一种方法可以让子例程自动检测它是用参数调用还是单独调用?

您可以将参数标记为可选,并提供如下默认值:

Sub Main2(Optional TestNumber As String = "")
Sub Main2(Optional TestNumber As Variant)

If IsMissing(TestNumber) Then
    ' do stuff
Else
    ' do other stuff
或者,您可以将参数更改为变量,将其标记为可选,然后测试是否使用以下方法提供了参数:

Sub Main2(Optional TestNumber As String = "")
Sub Main2(Optional TestNumber As Variant)

If IsMissing(TestNumber) Then
    ' do stuff
Else
    ' do other stuff

非常感谢=]第一种方法似乎不起作用。它不会运行,但会再次提示用户为哪个子例程运行。@Matthewui您是如何准确地运行它的?
如果TestNumber为0,则TestNumber=1
,用1替换所需的任何值,假设这两个分支的操作过程实际上并没有什么不同。这似乎是Visual Basic编辑器的一个限制-您不能直接运行所有参数都是可选的Sub,即使您可以从即时窗口或其他Sub/函数调用它