2009-04-06 6 views
1

양식을 채우는 데 사용할 일부 데이터가 포함되도록 사용자 정의 형식을 만들었습니다. 그 사용자 정의 형식의 배열을 활용하고 있으며 오프 사이트 서버에서 데이터를 가져올 때 해당 배열의 크기를 조정합니다.Excel VBA - 빈 사용자 형식 초기화 및 Null 검색

내 프로그램을 쉽게 소화 할 수 있도록 서브 루틴으로 분할하기 시작했습니다. 그러나 내 프로그램이 초기화 될 때 특정 배열이 초기화 된시기를 알 수 없으므로 크기 함수를 호출하여 배열이 비어 있는지 확인할 수 없습니다.

빈 사용자 유형을 초기화하거나 null 사용자 유형을 감지하는 방법이 있습니까? 현재, 나는 그것을 하드 코딩하고있다. 나는 더 우아한 해결책을 선호한다.

답변

2

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 
+0

예, 사용자 정의 형식 초기화를 확인하는 방법을 찾지 못했습니다. 도와 주셔서 감사합니다. – jrsconfitto

0
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 
+0

didnt work! 죄송합니다, 내가 struct/user-type이라는 것을 잊어 버렸습니다. – jrsconfitto

+0

은 "object required"의 런타임 오류를 발생시킵니다. – user53794

1

시도 : 또한

dim v 

if isempty(v) then 
    msgbox "is empty" 
end if 
+0

나는 그것이 비 연관 될 수 있다고 생각하지만, "공용 객체 모델에 정의 된 유일한 사용자 정의 유형은 변형을 통해 강제 변환되거나 늦게 바운드 함수에 전달 될 수 있습니다."이 코드를 시도하면 얻을 수 있습니다. – jrsconfitto

5

가 IsEmpty 함수하기 (배열) 솔루션 -

+0

안녕하세요. 내가 rbobby의 솔루션과 함께 위와 같은 당신의 제안에 대한 동일한 컴파일러 오류가 발생합니다. 어떤 아이디어? – jrsconfitto

0

사용자 정의 형식의 전체 동적 배열 초기화 여부 (단지 특정 요소) VBA에서, 다음이 직접합니다 (IsEmpty 함수 등의 기능 작품 없음으로 가능하지 않을 수도 있습니다 여부를 확인해야하는 경우 사용자 정의 유형). 그러나 프로그램을 쉽게 재구성하여 크기 0의 사용자 정의 유형 배열을 반환하여 아무것도 읽거나 초기화하지 않았 음을 나타낼 수 있습니다.

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