我有一个更新表单的功能," 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语句。
如果没有为参数barOnePerc
和barTwoPerc
提供值,有没有办法让代码跳过我函数中最下面的两个if语句?
答案 0 :(得分:11)
IsMissing
仅在参数声明为变体时才有效。
我认为你不能有效地区分0和没有传递参数的Long。在这种情况下,您需要在签名中声明为Variant。如果需要,您可以稍后进行投射。
我猜你可以设置默认值(不太可能的数字)并测试一下。注意:我不会建议这个。这只是尖叫" Bug"。
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