Почему моя функция предполагает отсутствие аргумента? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть функция, которая обновляет форму «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 действительно введены.

Есть ли способ заставить код пропустить два самых нижних оператора if в моей функции, если для параметров не заданы значенияbarOnePerc и barTwoPerc?

1 Ответ

0 голосов
/ 25 мая 2018

IsMissing работает только в том случае, если аргумент объявлен как вариант.

Я не думаю, что вы можете правильно различать 0 и отсутствие переданного параметра для Long.В этом случае вам нужно будет указать Variant в подписи.Позже вы можете разыграть при необходимости.

Полагаю, вы могли бы поставить значение по умолчанию (маловероятное число) и проверить его.Примечание: я не посоветовал бы это.Это просто кричит «Ошибка».

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
...