2012-07-25 5 views
0

SolidWorks에서 VBA 매크로를 실행하고 있습니다. 양식은 두 가지 유형의 문서에 대한 입력을 겸합니다. UserForm.Initialize 서브 루틴에서 열려있는 문서 유형에 따라 UserForm의 Caption 이름을 변경합니다. 이 작업을 수행 할 때마다 프로그램은 UserForm.Initialize을 다시 실행하고 모든 작업이 끝나면 왼쪽에서부터 효과적으로 두 번 실행됩니다..Caption을 변경할 때 VBA UserForm을 두 번 실행합니다.

누구도이 기괴한 행동을 피할 방법을 알고 있습니까? 나는 FormName.Caption 명령을 자체 Sub에 넣으려고했으나 결과는 같습니다.

감사합니다.

+1

initialize 이벤트가 두 번 일어나서는 안됩니다. .caption 업데이트가 반복을 일으키고 있는지 확인하기 위해 코드를 밟았습니까? 캡션 변경을 항상 Activate 이벤트로 이동할 수 있습니다. 기술적으로는 잘못된 캡션으로 표시된다는 의미지만, 변경되기 전의 시간은 거의 구별 할 수 없습니다. –

+0

@DanielCook하지만 코드를 다시 * 다시 * 실행하지 않겠습니까? (즉, 양식을 활성화/클릭 할 때마다) – Gaffi

+0

예, 확실합니다. 그러나 캡션을 초기화 이벤트 중에 결정된 사용자 양식의 전용 문자열에 저장하면 오버 헤드가 거의 발생하지 않습니다. 그러나 실제로 나는 당신의 문제를 실제로 풀지 않고 일할 수있는 것을 언급하고있었습니다. 그래서 대답으로 표시하지 않았습니다. :-) –

답변

5

문제를 복제 할 수 없으며 SolidWorks가 무엇인지 알지 못하므로 문제가있을 수 있습니다. 아마도 Initialize가 두 번 호출되는 것을 보여주는 작성된 예제를 게시 할 수 있습니다.

내 생각에 변수를 자동으로 인스턴스화하는 것과 관련이 있습니다. UserForm1을 사용하면 UserForm1이라는 개체를 가리키는 UserForm1이라는 개체 변수를 인스턴스화합니다. Dim 문에서 New 키워드를 사용하는 것과 비슷합니다. UserForm1 (변수)은 정의하지 않았지만 VBA가 처음 사용하면 자동으로 인스턴스화됩니다.

userforms 클래스 모듈에서 작업 할 때 Me 키워드를 사용해야합니다 (userforms는 사용자 인터페이스 요소가있는 것을 제외하고 다른 개체와 마찬가지로 클래스입니다). 초기화 이벤트에서

Me.Caption = "blah" 

대신

UserForm1.Caption = "blah" 

이 설정됩니다 플래그가 난 "말할 것을 (내가 증명할 수 없음을 단지 이론)이 될 수 있다고 말한다 실제 인스턴스를 가리키는 "캡션 속성을 변경할 때까지 설정되어 있지 않으며 자동 인스턴스화 변수 인 UserForm1을 사용하면 다른 인스턴스가 강제로 생성됩니다.

자동 인스턴스화 변수를 사용하지 마십시오. Dim 문에도 New 키워드를 사용하지 않아도 편리합니다. 변수가 생성되고 소멸되는 시점을 제어 할 수 있으며 최선의 방법입니다. ShowModal 속성을 False로 설정되어있는 경우 코드가 계속 실행됩니다, 그래서 모덜리스를 실행하면 변수를 파괴하지 않는 것이 표준 모듈에서이 같은 뭔가

Sub uftst() 

    Dim uf As UserForm1 

    Set uf = New UserForm1 'you control instantiation here 

    'Now you can change properties before you show it 
    uf.Caption = "blech" 
    uf.Show 

    Set uf = Nothing 'overkill, but you control destruction here 

End Sub 

참고.

+0

+1은 완전히 옳다. 미니 마크 업 형식이 마음에 들지 않으므로 문제를 재현하는 방법을 보여주기 위해 새로운 답변을 게시하고 있습니다. –

+0

굉장한, 그 매력을 작동했습니다. 추가 정보에 대해 감사드립니다. –

1

Dick의 제안에 따라 Userform1.caption 대신 me.caption을 사용해야 동작을 멈출 수 있습니다.

다음은 호기심이 사람들을 위해 문제를 복제 할 수있는 방법 :

사용자 정의 폼 (UserForm1을) 만들기 false로 ShowModal를 설정해야합니다 또는 당신이 볼 수 없습니다. 모듈에서

다음과 같은 추가 : UserForm1을에서

Option Explicit 
Sub ShowUserForm() 
    Dim uf As UserForm1 
    Set uf = New UserForm1 
End Sub 

다음 코드를 나열 :

Option Explicit 
Private Sub UserForm_Initialize() 
    UserForm1.Caption = "I'm UserForm1!" 'This will call the Initialize method of Userform1 not Me. 
    Me.Caption = "I'm Me!" 
    Me.Show 
End Sub 

실행 ShowUserForm합니다.이제 캡션이 다른 두 개의 Userform이 생겼습니다.

덧붙여 말하자면, ShowUserForm에 Set uf = Nothing을 추가하는 것과 같이 Initialize 메서드를 사용하면 실제로 두 폼 중 하나를 닫지 못합니다.