bugfix> excel > 投稿

フォームを更新する関数「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

次に、このような関数を呼び出します。他の2つの引数が欠落しているため、テキストフィールドのみが更新されることを期待しています。

Call updateLoadingBar(tekst:="Test")

これは Label1 を更新するのにうまく機能します しかし、残念ながら他の2つの値も更新されます-関数呼び出しに値を含めないことで、2つの変数の値が0であるとVBAが想定しているようです。さらに、IsMissing関数は2つの値が関数が呼び出されたときに欠落しています。これはより大きな問題です。 F8を使用してコードをステップ実行すると、すべてのifステートメントが実際に入力されていることが確認されます。

パラメーター barOnePerc に値が指定されていない場合、コードで関数の最も下の2つのifステートメントをスキップする方法はありますかおよび barTwoPerc

回答 1 件
  • IsMissing  引数がVariantとして宣言されている場合にのみ機能します。

    0とLongの渡されたパラメーターを有効に区別できるとは思わない。その場合、署名でVariantとして宣言する必要があります。必要に応じて後でキャストできます。

    デフォルト(ありそうにない数)を入れてテストできると思います。注:私はしません これを助言します。これは「バグ」を叫ぶだけです。

    不足している

    IsMissing returns a Boolean value indicating whether an optional Variant argument has been passed to a procedure.

    Syntax: IsMissing(argname)

    The required argname argument contains the name of an optional Variant procedure argument.

    Remarks: Use the IsMissing function to detect whether or not optional Variant arguments have been provided in calling a procedure. IsMissing returns True if no value has been passed for the specified argument; otherwise, it returns 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
    
    

あなたの答え