developer tip

선택적 인수가 제공되었는지 여부를 어떻게 테스트합니까?

copycodes 2020. 11. 11. 20:17
반응형

선택적 인수가 제공되었는지 여부를 어떻게 테스트합니까?


선택적 인수가 제공되었는지 여부를 어떻게 테스트합니까? -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 

사용 IsMissing:

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

그러나 올바르게 기억하면 인수에 기본값을 지정할 때 작동하지 않으며 어떤 경우에도 기본 인수를 사용하는 것이 다소 중복됩니다.


IsMissing () 함수를 사용할 수 있습니다. 그러나 이것은 Variant 데이터 유형에서만 작동합니다.

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

문자열 또는 숫자 변수를 사용하는 경우 변수 값을 확인할 수 있습니다. 예를 들면 :

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

이를 통해 비 변형 변수를 사용할 수 있습니다.


IsMissing (arg) 그렇다면 ...


다음과 같이 사용할 수 있습니다.

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

변형에서는 NZ 함수를 사용합니다 .

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

다른 데이터 유형에도 사용할 수 있습니다. 0은 Null도 0 길이도 아닌 것으로 간주되므로 nz(0,"")여전히 0을 반환합니다.


"IsMissing"...Figured there would have to be a way. Thanks all!

SQL has a function, In(), where you can pass multiple arguments to see if the target value is in the list. I've always liked that as a solution, so here's my take on that, hope it helps:

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

So, that's obviously why I needed "IsMissing"; doesn't work without it.


Most of these refer to the variant type, or test if a value is blank.

However, sometimes you want to check if a range, workbook, worksheet, or other type of object is not passed, without checking things like sheetnames.

In that case:

DesiredRange is Nothing

Returns a boolean. For example:

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

참고URL : https://stackoverflow.com/questions/1660772/how-do-i-test-if-optional-arguments-are-supplied-or-not

반응형