2010-01-06 4 views
0

환경을 설정하겠습니다.사용자 양식을 닫을 수 없습니다.

이것은 Excel에서 실행되는 VBA 코드입니다.

msflexgrid가 포함 된 userform이 있습니다. 이 flexgrid는 고객 및 고객, 영업 사원, CSR, 제조사 및 지역, 할당의 목록을 보여줍니다. 열을 클릭하면 지역 열 아래에 다른 사용자 양식이 열리고 지역 목록이 표시된다고 가정 해 봅시다. 그런 다음 원하는 영토를 클릭하면 사용자 정의 양식이 사라지고 새 영토가 이전 영토로 바뀝니다.

'Territory'사용자 정의 폼이 사라지지 않고 (깜박임) 선택한 영토를 클릭 할 때까지이 모든 기능이 훌륭하게 작동합니다. 새로운 영토는 기본 userform을 전송하지 않습니다.

필자가 코드를 단계별로 실행할 때 훌륭하다는 점을 언급해야합니다.

나는 flexgrid를 사용하여 다른 모든 userform (flexgrid가없는 사용자)이 open userform이 잘 작동한다고 가정합니다. 다음

는 몇 가지 코드 예제입니다 :

** 영역의 정의 폼이 닫힐 때 지역의 정의 폼 및 새로운 영역의 할당을 보여줍니다 적 FlexGrid에서 이벤트를 클릭합니다.

Private Sub FlexGrid_Customers_Click() 

With FlexGrid_Customers 

    Select Case .Col 
     Case 0 
     Case 2 
     Case 4 
     Case 6 
      UserForm_Territories.Show 
     Case Else 
    End Select 

    If Len(Trim(Misc1)) > 0 Then 
     .TextMatrix(.Row, .Col) = Trim(Misc1) 
     .TextMatrix(.Row, .Col + 1) = Trim(Misc2) 
    End If 

End With 

End Sub 

** 다음 잠수정이 지역의 정의 폼

Private Sub UserForm_Activate() 

Misc1 = "" 
Misc2 = "" 

ListBox_Territory.Clear 
Module_Get.Territories 

End Sub 

Private Sub UserForm_Terminate() 

Set UserForm_Territories = Nothing 

End Sub 

Private Sub ListBox_Territory_Click() 

With ListBox_Territory 
    Misc1 = Trim(.List(.ListIndex, 0)) 
    Misc2 = Trim(.List(.ListIndex, 1)) 
End With 

Hide 
UserForm_Terminate 

End Sub 

나는이 긴 숨이 찬 설명을 알고 있지만 내가 꽤 괜찮은 VBA 프로그래머있어이 날 난처한 상황에 빠진이 사용됩니다.

도움을 주시면 감사하겠습니다.

답변

2

나는 당신이하고있는 일이 잘못되었다고 말하지 않을 것입니다. (그것이 작동하지 않을 것이라는 점에서) 그러나 그것은 내게 겁을 먹습니다. 이것은 양식을 다루는 방식이 아닙니다.

먼저, 양식의 암시 적으로 생성 된 인스턴스를 나타 내기 위해 UserForm_Territories (클래스/양식 이름)을 사용하고 있습니다. 이것은 내가 항상 피하고있는 일입니다. 난 항상 명시 적으로 폼의 인스턴스를 만들 것이다, 그래서 대신 :

UserForm_Territories.Show 

나는 할 것이다 :

Dim oTerritoriesForm As UserForm_Territories 
Set oTerritoriesForm = New UserForm_Territories 

oTerritoriesForm.Show vbModal 

' get the values from the form here 

Unload oTerritoriesForm 

다음을, 그리고 훨씬 더 걱정 스레, 당신은 그것을 호출하여 UserForm_Terminate 동작을 전복하고 명시 적으로. 당신이 명시한 문제를 해결할 수 있다고 생각하지 않는다면, 내가 왜 상상할 수 없는지 당신이 이것을하고있는 것입니다. 나의 충고 : 그렇게하지 마라.

최악의 경우 해당 Terminate 메서드 내에서 폼의 암시 적으로 만든 인스턴스에 할당하려고합니다. 당신도 그렇게해서는 안됩니다. 나는 심지어 컴파일하는 것이 놀랍다.

폼의 암시 적으로 만든 인스턴스가 명시 적으로 만든 인스턴스를 모방하려고하는 것처럼 보입니다. 위와 같이 명시 적으로 생성하십시오.

관련 문제