2012-04-02 3 views
4

루프를 통해 배열에 추가하는 사용자 지정 개체가 있습니다. 문제는 다음과 같이 객체를 초기화했을 때입니다.VBA에서 개체를 초기화하는 올바른 방법은 무엇입니까?

Dim CallNum As New Lib_CallNum 

루프에 추가 된 마지막 객체는 루프 중에 추가 된 다른 모든 객체를 덮어 씁니다. 그래서 나는 같은 대상들을 채워 넣은 배열로 끝날 것입니다. 이 문제를 해결하기 위해 개체를 초기화하는 방식을 변경해야했습니다.

Dim CallNum As Lib_CallNum 
Set CallNum = New Lib_CallNum 

그러나 첫 번째 초기화가 작동하지 않는 이유는 확실하지 않습니다. 그렇다면 두 코드 세트의 차이점은 무엇입니까?

답변

8

루프 내의 Dim은 실제로 반복 할 때마다 실행되지 않습니다. 변수가 처음 만났을 때만 실행됩니다. 이를 설명하기 위해

, 당신의 Lib_CallNum 클래스의 초기화 정의에 섹션을 추가 :

Private Sub Class_Initialize() 
    Debug.Print "Initialise Lib_CallNum" 
    ' ... 
End Sub 

하고 원래의 코드를 실행합니다. 초기화는 한 번만보고됩니다. 그때부터 배열에 동일한 인스턴스를 여러 번 추가합니다.

새로운 인스턴스 객체를 초기화하는 올바른 방법은 @Doug이

+2

크리스, 설명 해줘서 고마워. 나는 결코 그것을 알지 못했다. –

+0

+1 좋은 후속 : :) –

+1

'Dim obj as new [object type]'구문을 사용하면 객체를 파괴하는 데 문제가 발생할 수 있으므로 수동으로 객체를 파괴하려는 경우 기본적으로 좋은 아이디어는 아닙니다. 순환 객체 참조를 사용하는 경우. [자세한 내용은이 답변을 참조하십시오] (https://stackoverflow.com/questions/8114684/what-is-the-reason-for-not-instantiating-an-object-at-the-time-of-declaration). 객체를 생성하는 데 항상 2 행 구문을 사용하는 습관을 갖춰서 객체가 언제 만들어지고 어떻게 파괴되는지 항상 알 수 있도록하는 것이 좋습니다. – nateAtwork

3

내 경험에 의하면 on your previous post에서 아직 완성 된 코드를 본 적이 없기 때문에 확실한 방법이 없다고 생각합니다. 당신이 좋아하는 무언가가 있어야합니다 - 루프에 있지 반복적으로 - 즉

Function Something 
Dim CallNum as Lib_CallNum 
... 
Do While SomeCondition 
    Set CallNum = New Lib_CallNum 
    'do some stuff 
    Set CallNum = Nothing 
Loop 
Return Whatever 
End Function 

을, 당신은 함수의 상단에있는 객체를 선언해야하고 인스턴스화 (그리고 아무것도로 설정) 루프한다.

Google에서 선언에 객체를 인스턴스화하지 않는 이유에 대한 설명을 찾을 수 있습니다. 전문 Excel 개발 has a good one. 하지만 당신의 문제는 결코 Nothing으로 설정하지 않았을 수도 있습니다. 확실하지.

+0

+1 Set ... = New ...이 멋지게 설명, 당신에게 것처럼입니다. –

관련 문제