为什么我的函数假定缺少参数?

时间:2018-05-25 06:36:06

标签: excel vba forms excel-vba excel-2016

我有一个更新表单的功能," LoadingInterface"。该函数如下所示:

Private Sub updateLoadingBar(Optional tekst As String, Optional barOnePerc As Long, Optional barTwoPerc As Long)
    If Not IsMissing(tekst) Then
        LoadingInterface.Label1.Caption = tekst
    End If
    If Not IsMissing(barOnePerc) Then
        LoadingInterface.Bar.Width = barOnePerc * 1.68
        LoadingInterface.prosent.Caption = barOnePerc & "%"
        LoadingInterface.prosent.Left = barOnePerc * 1.68 / 2 - 6
    End If
    If Not IsMissing(barTwoPerc) Then
        LoadingInterface.SubBar.Width = barTwoPerc * 1.68
    End If
    LoadingInterface.Repaint
End Sub

然后我调用这样的函数,期望它只更新文本字段,因为缺少其他两个参数。

Call updateLoadingBar(tekst:="Test")

这适用于更新Label1,但不幸的是其他两个值也被更新 - 似乎不包括函数调用中的任何值使得VBA假设两个变量值为0。'此外,似乎IsMissing函数在调用函数时没有检测到两个值丢失,这是一个更大的问题。使用F8逐步执行代码确认确实输入了所有if语句。

如果没有为参数barOnePercbarTwoPerc提供值,有没有办法让代码跳过我函数中最下面的两个if语句?

1 个答案:

答案 0 :(得分:11)

IsMissing仅在参数声明为变体时才有效。

我认为你不能有效地区分0和没有传递参数的Long。在这种情况下,您需要在签名中声明为Variant。如果需要,您可以稍后进行投射。

我猜你可以设置默认值(不太可能的数字)并测试一下。注意:我不会建议这个。这只是尖叫" Bug"。

IsMissing:

  

IsMissing返回一个布尔值,指示是否已将可选的Variant参数传递给过程。

     

语法:IsMissing(argname)

     

必需的argname参数包含可选Variant的名称   程序论证。

     

备注:使用IsMissing功能进行检测   是否提供了可选的Variant参数   调用程序。如果没有值,则IsMissing返回True   传递给指定的参数;否则,它返回False。

两种方法:

Option Explicit

Public Sub Test()
    RetVal
    RetVal2
End Sub

Public Function RetVal(Optional ByVal num As Long = 1000000) As Long

    If num = 1000000 Then

        MsgBox "No value passed"
        RetVal = num
    Else

        MsgBox "Value passed " & num
        RetVal = num
    End If

End Function


Public Function RetVal2(Optional ByVal num As Variant) As Long

    If IsMissing(num) Then

        MsgBox "No value passed"

    Else

        MsgBox "Value passed " & num
        RetVal2 = CLng(num)
    End If

End Function