2013-11-21 2 views
1

좋아, 사용자 폼을 숨기고 표시하는 데 질문이 있습니다.
This link 이미 저에게 답변 해주었습니다.
UserForm이 숨어서 여러 번 표시되는 이유는 무엇입니까?

문제가 발생했습니다.
Userform1으로 돌아 가면 얼어 버리고 전혀 아무것도 할 수 없습니다.
왜? 코드에 뭔가를 추가해야합니까? Heres는

내가 사용되는 코드의 summay : 나는 그래서 여기에 목록 상자를 사용
을 :
이 코드는 사용자 이름과 암호를 입력하라는 메시지를 표시이 코드는 로그 아웃입니다

Option Explicit 
Private Sub CBu_Login_Click() 
Dim ws As Worksheet, rng As Range, lrow As Long, find_value As String 
Dim cel As Range 

Set ws = ThisWorkbook.Sheets("UserName") 
lrow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row 
Set rng = ws.Range("A2:A" & lrow) 
find_value = Me.TB_Username.Value 
Set cel = rng.Find(What:=find_value, After:=ws.Range("A2"), LookIn:=xlFormulas, _ 
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
    MatchCase:=False, SearchFormat:=False) 
If Not cel Is Nothing Then 
    If Me.TB_Password.Value = cel.Offset(0, 1).Value Then 
     Me.Hide 
     UF_Encoding.L_User.Caption = "Welcome " & cel.Offset(0, 2).Value & "!" & " You are logged in." 
     UF_Encoding.TB_Operator.Text = cel.Offset(0, 2).Value 
     UF_Encoding.TB_ESN_IMEI.Value = "" 
     UF_Encoding.CB_PrimaryCode.Value = "" 
     UF_Encoding.CB_SecondaryCode.Value = "" 
     UF_Encoding.TB_Remarks.Value = "" 
     UF_Encoding.TB_ESN_IMEI.SetFocus 
     UF_Encoding.Show 
    Else 
     MsgBox "Invalid Username/Password" 
    End If 
Else 
    MsgBox "Invalid Username/Password" 
End If 

End Sub 

사용자는 취할 조치를 선택할 수 있습니다.

Private Sub LB_Options_AfterUpdate() 

If Me.LB_Options.Value = "Log out" Then 
    Me.Hide 
    Me.LB_Options.Visible = False 
    UF_Login.TB_Username.Value = "" 
    UF_Login.TB_Password.Value = "" 
    UF_Login.Show 

ElseIf Me.LB_Options.Value = "Change Password" Then 
    Me.Hide 
    Me.LB_Options.Visible = False 
    UF_Changepass.TB_User.Value = "" 
    UF_Changepass.TB_Newpass.Value = "" 
    UF_Changepass.TB_Oldpass.Value = "" 
    UF_Changepass.Show 

ElseIf Me.LB_Options.Value = "Exit" Then 
    Me.Hide 
    wbDbase.Save 
    wbDbase.Close 
    wbEncoding.Save 
    wbEncoding.Close 
    Unload UF_Login 
    Unload UF_Changepass 
    Unload Me 
End If 

글쎄요. 로그인하고, 로그 아웃하고, 패스를 변경하고 종료하십시오.
그러나 제가 말했듯이, 1 차 실행 후 양식은 정지합니다.

예 :
1. 내가 UF_Login를 초기화 한 후 UF_Encoding가 나타납니다.
2. 모든 명령 단추 및 텍스트 상자가 작동합니다.
3. 그런 다음 목록 상자를 사용하여 로그 아웃합니다.
4. 다시 로그인 할 때 UF_Encoding이 표시되지만 명령과 버튼을 사용하려고하면 작동하지 않습니다.
5. 이상한 점은 로그 아웃, 패스 및 종료 변경 목록 상자가 작동한다는 것입니다.

정말 이유를 알아 내려고합니다.
도움을 주시면 감사하겠습니다.

+0

문제의 일부는 양식 내에서 양식을 호출하는 것이므로 까다로워 질 수 있습니다. 종종 같은 양식의 여러 인스턴스로 연결됩니다. 일반적으로 예기치 않은 결과가 나타납니다. 일반 모듈의 매크로에서 양식을 호출하면보다 효과적으로 제어 할 수 있습니다. 일부 지침은 [This] (http://peltiertech.com/Excel/PropertyProcedures.html)를 참조하십시오. – DaveU

+0

그래, 그게 내가 생각했던거야. 하지만 나는 그걸 돌볼 수있는 방법이 있기를 바라고 있습니다. 나는 내가 수행하려고하는 것은 워크 시트가 아닌 사용자에게만 폼을 보여주기 때문에 reg 모듈에서 매크로를 수행하는 것을 피합니다. – L42

+0

그래도 정규 매크로에서 양식의 흐름을 제어하여이를 수행 할 수 있어야합니다. – DaveU

답변

0

UserForms 사이에 여러 스위치를 허용하려면 사용하지 않는 양식을 언로드 한 다음 다시 사용할 때 다시로드하는 것이 좋습니다. 같은 뭔가 다음 UF_Login에서

Me.Hide '/* hide the initiating form first */ 
Load UF_Login '/* loads the form, but not shown */ 
With UF_Login 
    .TB_Username.Value = "" 
    .TB_Password.Value = "" 
    .Show 
End With 
Unload Me '/* unload the initiating form */ 

, 코드는 UF_Encoding가 실제로에서 양식 로그 아웃하는 것처럼 보이게 추가됩니다 볼 수 있습니다.

Private Sub CB_Login_Click() 

    '/* code to check log-in credentials goes here */ 
    Me.Hide 
    Load UF_Encoding 
    UF_Encoding.Show 
    Unload Me 
End Sub 
0

시도해보십시오. 이것은 "거친"코드이며 확실히 정제가 필요하지만 작동하며 몇 가지 아이디어를 제공해야합니다.

이 UF_Encoding

이것은 UF_Login

이것은 UF_Changepass

Option Explicit 
'UF_Changepass form 
Private Sub CMDok_Click() 
    Dim ws As Worksheet, rng As Range 
    Set ws = ThisWorkbook.Sheets("UserName") 
    ws.Columns("B:B").Find(Me.TB_Oldpass, , xlValues, xlWhole, , , False).Value = Me.TB_Newpass 
    Me.Hide 
End Sub 

Private Sub UserForm_Click() 

이 코드는 정규 모듈 간다 간다

Option Explicit 
'UF_Login form 
Private msUser As String 
Public Property Get psUser() As String 
    psUser = msUser 
End Property 

Private Sub CBu_Login_Click() 
    Dim ws As Worksheet, rng As Range, lrow As Long, find_value As String 
    Dim cel As Range 

    Set ws = ThisWorkbook.Sheets("UserName") 
    lrow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row 
    Set rng = ws.Range("A2:A" & lrow) 
    find_value = Me.TB_Username.Value 
    Set cel = rng.Find(What:=find_value, After:=ws.Range("A2"), LookIn:=xlFormulas, _ 
     LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
     MatchCase:=False, SearchFormat:=False) 
    If Not cel Is Nothing Then 
     If Me.TB_Password.Value = cel.Offset(0, 1).Value Then 
      msUser = cel.Offset(0, 2).Value 'save user name 
      Me.Hide 
     Else 
      MsgBox "Invalid Username/Password" 
     End If 
    Else 
     MsgBox "Invalid Username/Password" 
    End If 

End Sub 

간다

Option Explicit 
'UF_Encoding form 
Private msLBox As String 
Private msUser As String 
Public Property Let psUser(s As String) 
    msUser = s 
End Property 
Public Property Get psLBox() As String 
    psLBox = msLBox 
End Property 

Private Sub LB_Options_AfterUpdate() 
msLBox = Me.LB_Options.Value 

If Me.LB_Options.Value = "Log out" Then 
    Me.Hide 
    Me.LB_Options.Visible = False 
    UF_Login.TB_Username.Value = "" 
    UF_Login.TB_Password.Value = "" 

ElseIf Me.LB_Options.Value = "Change Password" Then 
    Me.Hide 
    Me.LB_Options.Visible = False 
    UF_Changepass.TB_User.Value = "" 
    UF_Changepass.TB_Newpass.Value = "" 
    UF_Changepass.TB_Oldpass.Value = "" 

ElseIf Me.LB_Options.Value = "Exit" Then 
    Me.Hide 
    ' wbDbase.Save 
    ' wbDbase.Close 
    ' wbEncoding.Save 
    ' wbEncoding.Close 
    ' Unload UF_Login 
    ' Unload UF_Changepass 
    ' Unload Me 
    End If 
End Sub 

Private Sub UserForm_Activate() 
    Me.L_User.Caption = "Welcome " & msUser & "!" & " You are logged in." 
    Me.TB_Operator.Text = msUser 
    msLBox = "" 'reset each time form re-entered 
    Me.LB_Options.Visible = True 
End Sub 

Private Sub UserForm_Initialize() 
    Me.LB_Options.AddItem "Log out" 
    Me.LB_Options.AddItem "Change Password" 
    Me.LB_Options.AddItem "Exit" 

    Me.TB_ESN_IMEI.Value = "" 
    Me.CB_PrimaryCode.Value = "" 
    Me.CB_SecondaryCode.Value = "" 
    Me.TB_Remarks.Value = "" 
    Me.TB_ESN_IMEI.SetFocus 
End Sub 

간다

Option Explicit 
    Dim fLogin As UF_Login 
    Dim fEnc As UF_Encoding 
    Dim fChg As UF_Changepass 

Sub main() 
    Dim s As String 
' initialize all 3 forms 
    Set fLogin = New UF_Login 
    Set fEnc = New UF_Encoding 
    Set fChg = New UF_Changepass 

    fLogin.Show '1st time 

' re-display main form until done 
    Do 
     fEnc.psUser = fLogin.psUser 'pass user name to main form 
     fEnc.Show 
     s = fEnc.psLBox 'get listbox value 
     If s <> "Exit" Then showAuxForms s 
    Loop Until s = "Exit" 

' done with forms 
    Unload fLogin 
    Unload fEnc 
    Unload fChg 
    Set fLogin = Nothing 
    Set fEnc = Nothing 
    Set fChg = Nothing 
End Sub 

Sub showAuxForms(s As String) 
    If s = "Log out" Then 
     fLogin.Show 
    ElseIf s = "Change Password" Then 
     fChg.Show 
    End If 
End Sub 
+0

네, 제가 이것을 시도 할 것입니다. 여전히 코드를보고 코드를 파악할 수는 없습니다. 또한'Public Property'를 처음 시도했습니다. 이것은 내가 최소한의 이해를 가지고 있고 코드에 도달하기가 어렵다는 것을 발견 할 수있는 곳입니다. 어쨌든, 나는 추가 검색을하고 최대한 빨리 피드백을 줄 것이다. – L42

+0

속성 Let & Property Get은 양식과 매크로간에 데이터를 전달하는 방법입니다. 대신 Public 변수를 선언하여이 작업을 수행 할 수 있지만이 방법을 사용하면 더 많은 제어 권한을 얻을 수 있습니다. [이] (http://peltiertech.com/Excel/PropertyProcedures.html)이 도움이 될 수 있습니다. – DaveU

관련 문제