문제

내 양식을 채우는 데 사용할 데이터가 포함 된 사용자 정의 유형을 만들었습니다. 해당 사용자 정의 유형의 배열을 사용하고 있으며 오프 사이트 서버에서 데이터를 가져올 때 해당 배열 크기를 조정합니다.

내 프로그램을 더 쉽게 소화하기 위해 서브 루틴으로 나누기 시작했습니다. 그러나 프로그램이 초기화되면 특정 배열이 초기화 된시기를 알 수 없으므로 크기 기능을 호출하여 배열이 비어 있는지 확인할 수 없습니다.

빈 사용자 유형을 초기화하거나 널 사용자 유형을 감지하는 방법이 있습니까? 현재, 나는 그것을 하드 코딩하고 있으며 더 우아한 솔루션을 선호합니다.

도움이 되었습니까?

해결책

AFAIK, 사용자 정의 유형이 프로 시저/기능에 대한 인수로 전송되기 전에 초기화되었는지 확인할 수 없습니다.

VBA 도움말 에서이 예를 인용하고 있습니다


Type StateData
    CityCode(1 To 100) As Integer     ' Declare a static array.
    County As String * 30
End Type

카운티 필드는 일부 값으로 초기화되어 기본 값을 사용할 수 있습니다. 사용자 가이 필드를 명시 적으로 설정하면 일부 값을 유지하고 비 초기화되지 않은 상태로 유지됩니다.

예를 들어

Sub main()
    Dim example As StateData
    MsgBox IsInitialized(example)

    Dim example2 As StateData
    example2.County = "LA"
    MsgBox IsInitialized(example2)
End Sub
Function IsInitialized(arg As StateData) As Boolean
    Dim initCounty As String * 30
    IsInitialized = (arg.County <> initCounty)
End Function

다른 팁

ISEMPTY (배열) 솔루션 외에도 -

If IsNull(array) then 

   msgbox "array is empty"

End If

노력하다:

dim v

if isempty(v) then
    msgbox "is empty"
end if
If myObjectVariable is Nothing

객체가 초기화되었는지 여부를 감지해야합니다.

편집 : "아무것도 없다"는 것이 작동합니다. 물체 변하기 쉬운:

Dim blah As Object
If blah Is Nothing Then
    MsgBox "blah is nothing!"
End If

Dim foo as variant
If IsEmpty(foo) Then
    MsgBox "foo is empty!"
End If

VBA에서 전체 동적 사용자 정의 유형 배열이 초기화되었는지 (특정 요소뿐만 아니라) 초기화되었는지 확인 해야하는 경우 직접 불가능할 수 있습니다 (ISEMPTY 등의 기능은 사용자 정의 유형에서 작동하지 않으므로). 그러나 프로그램을 쉽게 재구성하여 사용자 정의 유형의 크기를 반환하여 아무것도 읽지 않고 초기화되지 않았 음을 나타낼 수 있습니다.

Private Function doStuff() As customType()
    Dim result() As customType

    ' immediately size it to 0 and assing it as result
    ReDim result(0)
    doStuff = vysledek

    ' do real stuff, ... premature "Exit Function" will return an array of size 0
    ' possibly return initialized values
End Function

' then you can all
If (UBound(tabulky) = 0) Then
    MsgBox "Nope, it is not initialized."
End If
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top