2013-09-23 12 views
6

Posiadam kod VBA to jest Auto_Open. Wykonuje pewne kontrole, a następnie wyświetla formularz użytkownika, który prosi o podanie nazwy użytkownika i hasła. Nazwałem to userform z userform_name.show.Wywołanie formularza użytkownika i zwrócenie wartości

Mój problem polega na tym, jak mogę zwrócić Boolean do mojego Auto_Open sub z kodu użytkownika.

Połączyłem kod weryfikujący, czy poświadczenia są poprawne z przyciskiem "Logowanie" w formularzu. jest to kod, który tworzy wartość logiczną. Muszę go zwrócić do Auto_Open.

Private Sub loginbutton() 
    Dim bool As Boolean 
    Dim lrup 
    Dim r As Long 
    Dim pass As String 

    loginbox.Hide 

    'are fields empty 
    Do While True 
     If unBox.Text = "" Or pwBox.Text = "" Then 
      MsgBox ("You must enter a Username and Password") 
     Else 
      Exit Do 
     End If 
     loginbox.Show 
     Exit Sub 
    Loop 

    'find pw reated to username (if existant) 
    lrup = UserPass.Range("A1").Offset(UserPass.Rows.Count - 1, 0).End(xlUp).Row 

    If unBox = "b0541476" And pwBox = "theone" Then 
     bool = True 
    Else 
     MsgBox ("Invalid username or password. Please try again.") 
     loginbox.Show 
     Exit Sub 
    End If 

    For r = 2 To lrup 
     If unBox = Cells(r, 1) Then 
      pass = Cells(r, 2).Value 
      Exit For 
     End If 
    Next 

    If pass = "" Then 
     MsgBox ("Invalid username or password. Please try again.") 
     loginbox.Show 
     Exit Sub 
    Else 
     bool = True 
    End If 
End Sub 
+1

"to jest kod, który produkuje boolian" - Gdzie to jest? –

+0

Przepraszam, że go dodałem. jak mogę przekazać "bool" z powrotem do Auto_Open po zakończeniu kodu? – user2385809

Odpowiedz

3

Usuń Dim bool As Boolean z obszaru kodu UserForm i zadeklarować w module, jak pokazano poniżej

ten sposób Twój kod w module będzie wyglądać

Public bool As Boolean 

Sub Auto_Open() 
    ' 
    '~~> Rest of the code 
    ' 
    UserForm1.Show 

    If bool = True Then 
     '~~> Do Something 
    Else 
     '~~> Do Something   
    End If 

    ' 
    '~~> Rest of the code 
    ' 
End Sub 
+0

Może być łatwo zmieniony przez kogoś, aby go zastąpić. –

+0

To zupełnie inne pytanie :) To w zasadzie odpowiada, jak zadeklarować zmienną boolean i użyć jej w userform, a następnie przekazać ją do 'Auto_Open' –

+0

Tak, masz rację. Twoja metoda zadziała tylko w odniesieniu do zadawanego pytania. –

2

Jak na temat korzystania z funkcji zamiast sub?

Function loginbutton() 
    ' your code 

    loginbutton = bool 
End Function 

Teraz w kodzie wywołującym można przetestować na true/false

if loginbutton() then 
    'true responce 
else 
    'false responce 
end if 
+0

Brak przycisku logowania na formularzu użytkownika. userform musi uruchomić najpierw, a następnie loginbutton() po naciśnięciu "LogIn" w formularzu. – user2385809

+0

Jeśli rozumiem poprawnie, działałoby to tak samo, jak długo wywoływana jest funkcja we właściwej lokalizacji. Tak czy inaczej kod logowania jest uruchamiany i kończący, po prostu sprawdzam, czy po uruchomieniu zwrócono wartość true lub false w oparciu o to, co zostało uruchomione w środku. Rozwiązanie @Siddharth działa również, ale pozostawia otwarte większe ryzyko bezpieczeństwa. –

0

można zarządzać to zrobić bez użycia zmiennych publicznych.

Wygląda na to, że występuje różnica między wyświetlaniem/ukrywaniem a ładowaniem/zwalnianiem.

Jeśli ukryjesz formularz, gdy jest on nadal załadowany, nie zostanie usunięty, więc możesz odwołać się do stanu formantów w formularzu.

Na przykład używałem wyboru daty (tzw DTPicker1) na formularzu, mój kod w module wygląda mniej więcej tak:

Dim NewDay As Date 

Load FrmDayPicker 
FrmDayPicker.Show 

NewDay = FrmDayPicker.DTPicker1.Value 

Unload FrmDayPicker 

Debug.Print NewDay 

na formularzu można po prostu użyć Me.Hide insteaded od Unload Me i tego powinien działać

Powiązane problemy