Як перевірити, чи надаються необов’язкові аргументи чи ні?


77

Як перевірити, чи надаються необов’язкові аргументи чи ні? - у VB6 / VBA

Function func (Optional ByRef arg As Variant = Nothing)

    If arg Is Nothing Then   <----- run-time error 424 "object required"
        MsgBox "NOT SENT"
    End If

End Function 

Відповіді:


98

Використання IsMissing:

If IsMissing(arg) Then
    MsgBox "Parameter arg not passed"
End If

Однак, якщо я добре пам’ятаю, це не працює при введенні аргументу за замовчуванням, і в будь-якому випадку використання аргументу за замовчуванням стає досить зайвим.


29
Також я думаю, що IsMissing працює лише в тому випадку, якщо аргумент оголошений як варіант
Джон Фурньє

5
@Jon: true, оскільки IsMissingреалізовано з точки зору прапора в VARIANTструктурі (IIRC, VT_EMPTY). Я не згадував про це, оскільки питання OP вже використовувалося Variant.
Конрад Рудольф

22

Ви можете використовувати функцію IsMissing (). Але цей працює лише з типом даних Variant.

Sub func(Optional s As Variant)
   If IsMissing(s) Then
      ' ...
   End If
End Sub

10

Якщо ви використовуєте рядок або числову змінну, ви можете перевірити значення змінної. Наприклад:

Function func (Optional Str as String, Optional Num as Integer)

If Str = "" Then
    MsgBox "NOT SENT"
End If

If Num = 0 Then
    MsgBox "NOT SENT"
End If

End Function

Це дозволяє використовувати не варіантні змінні.


2
Однак він не може розрізнити абсолютно допустимого використання: func("", 0)неправильно позначить невстановлені параметри. Як правило, неможливо провести цю відмінність без використання Variants.
Конрад Рудольф

@KonradRudolph Це дуже хороший момент. Ви хотіли б переконатися, що ніколи не використовували його в ситуації, коли могли надіслати порожній рядок або нульове число.
OSUZorba


3

Ви можете використовувати щось на зразок:

function func(optional vNum as integer:=&HFFFF) '&HFFFF value that is NEVER set on vNum

If vNum = &HFFFF Then
    MsgBox "NOT SENT"
End If

End Function

1

З варіантом я б використовував функцію NZ :

Function func (Optional ByRef arg As Variant = Nothing)
    If nz ( arg, 0 ) = 0 Then
        MsgBox "NOT SENT"
    End If
End Function 

Його також можна використовувати з іншими типами даних, майте на увазі, що Zero не вважається ні Null, ні Zero-Length, тому nz(0,"")все одно повертає 0.


1

Більшість із них стосуються типу варіанту або перевіряють, чи не пусте значення.

Однак іноді потрібно перевірити, чи не передано діапазон, книгу, аркуш чи інший тип об’єкта, не перевіряючи такі речі, як імена аркушів.

В такому разі:

DesiredRange is Nothing

Повертає логічне значення. Наприклад:

    If DestinationRange Is Nothing Then
        MsgBox "Need a destination range when importing data"
    Else
        'We're happy
    End If

1
Хитра частина полягає в тому, що не кожен тип об’єкта можна перевірити за допомогою, is Nothingтоді як будь-який об’єкт може зберігатися в Variantтипі. Таким чином , щоб бути ясно, це є рішенням для об'єктів , наприклад , Rangeз або Worksheetз , але не для інших типів , таких якString
Marcucciboy2

-1

"IsMissing" ... Зрозумів, це повинен бути спосіб. Дякую всім!

SQL має функцію In (), де можна передавати кілька аргументів, щоб перевірити, чи є цільове значення у списку. Мені це завжди подобалося як рішення, тому ось мій погляд на це, сподіваюся, що це допоможе:

Public Function IsIn(ByVal TestVal, ByVal VersusVal1, _
            Optional ByVal VersusVal2, Optional ByVal VersusVal3, _
            Optional ByVal VersusVal4, Optional ByVal VersusVal5, _
            Optional ByVal VersusVal6, Optional ByVal VersusVal7, _
            Optional ByVal VersusVal8, Optional ByVal VersusVal9, _
            Optional ByVal VersusVal10, Optional ByVal VersusVal11, _
            Optional ByVal VersusVal12, Optional ByVal VersusVal13, _
            Optional ByVal VersusVal14, Optional ByVal VersusVal15, _
            Optional ByVal VersusVal16, Optional ByVal VersusVal17, _
            Optional ByVal VersusVal18, Optional ByVal VersusVal19, _
            Optional ByVal VersusVal20) As Boolean

Dim CheckVals(1 To 20) as Variant
VersusVals(1) = VersusVal1
VersusVals(2) = VersusVal2
VersusVals(3) = VersusVal3
VersusVals(4) = VersusVal4
VersusVals(5) = VersusVal5
VersusVals(6) = VersusVal6
VersusVals(7) = VersusVal7
VersusVals(8) = VersusVal8
VersusVals(9) = VersusVal9
VersusVals(10) = VersusVal10
VersusVals(11) = VersusVal11
VersusVals(12) = VersusVal12
VersusVals(13) = VersusVal13
VersusVals(14) = VersusVal14
VersusVals(15) = VersusVal15
VersusVals(16) = VersusVal16
VersusVals(17) = VersusVal17
VersusVals(18) = VersusVal18
VersusVals(19) = VersusVal19
VersusVals(20) = VersusVal20

On Error Goto 0

IsIn = False

For x = 1 To 20
   If Not IsMissing(VersusVals(x)) Then
      If TestVal = VersusVals(x) Then
         IsIn = True
         Exit For
      End If
   End If
Next x

End Function

Тож, очевидно, тому мені знадобився "IsMissing"; без цього не працює.


4
Насправді вам тут не потрібно і не слід користуватися IsMissing. Натомість це програма для ParamArray.
Конрад Рудольф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.