2013-09-23 24 views
6

Ho un codice VBA che è Auto_apri. Fa alcuni controlli quindi richiede un userform che richiede nome utente e password. Ho chiamato questo userform con userform_name.show.Chiamare un userform e restituire un valore

Il mio problema è come è possibile restituire un Boolean al mio sub Auto_Open dal codice utente.

Ho collegato il codice che verifica se le credenziali sono corrette sul pulsante "Login" nel modulo. questo è il codice che produce il booleano. Devo restituirlo a Auto_apri.

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

"questo è il codice che produce il boolian" - Dove si trova? –

+0

scusa l'ho aggiunto. come posso passare "bool" a Auto_apri quando il codice è finito? – user2385809

risposta

3

Rimuovere Dim bool As Boolean dalla zona di codice di form e dichiararlo nel modulo come illustrato di seguito

Questo è come il tuo codice nel modulo sarà simile

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

Potrebbe essere facilmente modificato da qualcuno per ignorare. –

+0

Questa è una domanda completamente diversa :) Questo fondamentalmente risponde su come dichiarare una variabile booleana e usarla nel form utente e quindi passarla a 'Auto_apri' –

+0

Sì, sei corretto. Il tuo metodo funzionerà solo in riferimento alla domanda che ti viene posta. –

2

Come sull'utilizzo di una funzione invece di un sub?

Function loginbutton() 
    ' your code 

    loginbutton = bool 
End Function 

Ora nel tuo codice chiamante è possibile verificare vero/falso

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

Nessun pulsante di accesso è su un modulo utente. il form utente deve essere eseguito prima quindi poi loginbutton() dopo aver premuto "LogIn" nel modulo. – user2385809

+0

Se ho capito bene, funzionerebbe allo stesso modo se si chiama la funzione nella giusta posizione. In entrambi i casi il codice di accesso è in esecuzione e termina, sto solo controllando che quando è stato eseguito in esecuzione è tornato vero o falso in base a ciò che è stato eseguito all'interno. Anche la soluzione @Sharthth funziona ma lascia un rischio maggiore per la sicurezza. –

0

si riesce a fare questo senza l'uso di variabili pubbliche.

Sembra esserci una differenza tra mostrare/nascondere e caricare/scaricare.

Se si nasconde un modulo mentre è ancora caricato, non verrà eliminato, pertanto è possibile fare riferimento allo stato dei controlli nel modulo.

Per esempio stavo usando un selettore di data (chiamato DTPicker1) in un modulo, il mio codice nel modulo simile a questa:

Dim NewDay As Date 

Load FrmDayPicker 
FrmDayPicker.Show 

NewDay = FrmDayPicker.DTPicker1.Value 

Unload FrmDayPicker 

Debug.Print NewDay 

sul modulo si può semplicemente utilizzare Me.Hide insteaded di Unload Me e questo dovrebbe funzionare

Problemi correlati