2012-10-10 10 views
6

Ho un modulo VBA con una varietà di opzioni di selezione tra cui menu a discesa, campi di testo, caselle di controllo e radio.Ripristino modulo in VBA

Volevo solo sapere il modo migliore per cancellare tutti questi campi con un pulsante. Un mio amico ha cercato di aiutarmi inviandomi il codice qui sotto, ma sfortunatamente non funziona, ho controllato i nomi delle variabili.

Qualche consiglio su come posso migliorarlo?

Grazie in anticipo.

Private Sub btnReset_Click() 

Unload Me 
UserForm.Show 

End Sub 

Ecco l'altro codice per il modulo utente.

Dim DeptCode 'Holds department code 

Private Sub UserForm_Initialize() 

    Dim c_deptCode As Range 
    Dim c_deptName As Range 
    Dim deptCodes As Variant 
    Dim deptNames As Variant 

    Dim ws_dept As Worksheet 
    Set ws_dept = Worksheets("lookupDept") 

    ' Assign each range to an array containing the values 
    deptCodes = Choose(1, ws_dept.Range("deptCode")) 
    deptNames = Choose(1, ws_dept.Range("deptName")) 

    For i = 1 To ws_dept.Range("deptCode").Rows.Count 
     ' Create the combined name (code + space + name) 
     CombinedName = deptCodes(i, 1) & " - " & deptNames(i, 1) 
     cbo_deptCode.AddItem CombinedName 
    Next i 

End Sub 

risposta

14

Penso che quando raggiunge la riga Unload Me, l'esecuzione del codice si interrompe ed è per questo che non funziona per voi. Ecco una procedura di evento generica per ripristinare tutti (la maggior parte) dei controlli nel modulo.

Private Sub cmdReset_Click() 

    Dim ctl As MSForms.Control 

    For Each ctl In Me.Controls 
     Select Case TypeName(ctl) 
      Case "TextBox" 
       ctl.Text = "" 
      Case "CheckBox", "OptionButton", "ToggleButton" 
       ctl.Value = False 
      Case "ComboBox", "ListBox" 
       ctl.ListIndex = -1 
     End Select 
    Next ctl 

End Sub 

Non ripopolare il ComboBox e ListBoxes, solo cancella la selezione, che è quello che presumo che si desidera.

+0

Grazie funziona brillantemente – methuselah

5

So che questa domanda ha quasi 2 anni, ma cercavo una risposta come questa. Tuttavia, io sto usando Access 2010 e ha scoperto la funzione non ha funzionato del tutto come previsto:

  • CTL può essere Dim-ed semplicemente come controllo
  • Per una casella di testo, la proprietà ctl.Text può essere assegnato solo a se il controllo è attivo (utilizzare ctl.Value invece)
  • Se un OptionButton fa parte di un OptionGroup non può essere assegnato un valore

Quindi, con questi problemi in mente, qui è la mia funzione riscritta:

Private Sub resetForm() 

    Dim ctl As Control ' Removed MSForms. 

    For Each ctl In Me.Controls 
     Select Case TypeName(ctl) 
      Case "TextBox" 
       ctl.value = "" 
      Case "CheckBox", "ToggleButton" ' Removed OptionButton 
       ctl.value = False 
      Case "OptionGroup" ' Add OptionGroup 
       ctl = Null 
      Case "OptionButton" ' Add OptionButton 
       ' Do not reset an optionbutton if it is part of an OptionGroup 
       If TypeName(ctl.Parent) <> "OptionGroup" Then ctl.value = False 
      Case "ComboBox", "ListBox" 
       ctl.ListIndex = -1 
     End Select 
    Next ctl 

End Sub 
+0

Per il ctl.Assegnazione ListIndex, sto ricevendo l'errore che sto usando la proprietà ListIndex in modo errato. Ho dovuto usare ctl = Null – Hill

2

Si può provare questo:

Private Sub btnReset_Click() 

    Call UserForm_Initialize 

End Sub 
+2

Il tuo contributo aggiungerebbe più valore al sito se dovessi includere una spiegazione perché il tuo approccio ha vantaggi rispetto ai suggerimenti già fatti, anni fa ... –

+1

Per favore aggiungi ulteriori spiegazioni. Questo è venuto sotto esame per la lunghezza e il contenuto. Potrebbe essere cancellato a un certo punto se la risposta non è migliorata. –

+0

@CindyMeister - Beh, è ​​molto meno codice per uno. Inoltre, le soluzioni di cui sopra non tengono conto dello stato dei controlli quando il modulo viene caricato per la prima volta (che può essere richiesto se si deve "resettare" un modulo). Questo dovrebbe essere ovvio ... se la soluzione ha funzionato. Sfortunatamente no. L'accesso mi dice che il metodo non è definito. – Hill

0

Microsoft ha questo documentato abbastanza bene ora ultima versione di Access. Sembra che alcune delle risposte precedenti si riferiscano a versioni precedenti. Il codice qui sotto funziona perfettamente nella mia app. Ho incluso solo i tipi di controllo di cui ho bisogno ma puoi trovare la documentazione per qualsiasi altro nei link Microsoft di seguito.

Rif: https://msdn.microsoft.com/en-us/vba/access-vba/articles/textbox-controltype-property-access?f=255&MSPPError=-2147217396

Dim ctl As Control 

For Each ctl In Me.Controls 
    With ctl 
     Select Case .ControlType 
      Case acTextBox 
       .Value = "" 
      Case acCheckBox 
       .Value = False 
      Case acComboBox 
       .SetFocus 
       .SelText = "" 
      Case acListBox 
       .Value = Null 
     End Select 
    End With 
Next ctl 

Si noti che per la casella combinata è necessario impostare la messa a fuoco non prima di impostare il valore. Rif: https://msdn.microsoft.com/en-us/vba/access-vba/articles/combobox-seltext-property-access

0

Aggiungendo la risposta più recente - se alcuni dei controlli hanno impostazioni predefinite, è possibile utilizzare

ctl.Value = ctl.DefaultValue

che lavora per me, almeno per le caselle di controllo e caselle combinate.