2012-10-10 48 views
6

Tengo un formulario VBA con una variedad de opciones de selección que incluyen menús desplegables, campos de texto, casillas de verificación y radios.Restablecer el formulario en VBA

Solo quería saber la mejor manera de borrar todos estos campos con solo presionar un botón. Un amigo mío ha intentado ayudarme enviándome el código siguiente, pero lamentablemente no funciona, he comprobado los nombres de las variables.

¿Algún consejo sobre cómo puedo mejorarlo?

Gracias de antemano.

Private Sub btnReset_Click() 

Unload Me 
UserForm.Show 

End Sub 

Aquí está el otro código para la forma de usuario.

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 

Respuesta

14

creo que cuando llegue a la línea Unload Me, detiene la ejecución de código y es por eso que no funciona para usted. Aquí hay un procedimiento de evento genérico para restablecer todos (la mayoría) de los controles en el formulario.

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 

No repoblar la ComboBoxes y ListBoxes, simplemente borra la selección, que es lo que se presupone que desea.

+0

Gracias, funciona brillantemente – methuselah

5

Sé que esta pregunta tiene casi 2 años pero estaba buscando una respuesta como esta. Sin embargo, estoy usando Access 2010 y descubrió la función no funcionó del todo como se esperaba:

  • CTL pueden Dim-ed simplemente como control
  • Para un cuadro de texto, la propiedad ctl.Text sólo se puede asignar a si el control tiene el foco (ctl.Value utilizar en su lugar)
  • Si un OptionButton es parte de un OptionGroup no se le puede asignar un valor

Así que con estas cuestiones en mente, aquí es mi función reescrito:

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

Para el ctl.Asignación de ListIndex, obtengo el error de que estoy usando la propiedad ListIndex incorrectamente. Tuve que usar ctl = nulo – Hill

2

Usted puede intentar esto:

Private Sub btnReset_Click() 

    Call UserForm_Initialize 

End Sub 
+2

Su contribución agregaría más valor al sitio si incluyera una explicación de por qué su enfoque tiene ventajas sobre las sugerencias ya hechas, hace años ... –

+1

Agregue más explicaciones. Esto estuvo bajo revisión por duración y contenido. Puede eliminarse en algún momento si la respuesta no mejora. –

+0

@CindyMeister - Bueno, es mucho menos código para uno. Además, las soluciones anteriores no tienen en cuenta el estado de los controles cuando se carga el formulario por primera vez (lo que puede requerirse si se quiere "restablecer" un formulario). Esto debería ser obvio ... si la solución funcionó. Lamentablemente, no es así. El acceso me dice que el método no está definido. – Hill

0

Microsoft tiene esta bastante bien documentado ahora para la última versión de Access. Parece que algunas de las respuestas anteriores se refieren a versiones anteriores. El código a continuación funciona perfectamente en mi aplicación. Solo incluí los tipos de control que necesito pero puede encontrar documentación para otros en los enlaces de Microsoft a continuación.

Ref: 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 

Tenga en cuenta que para el cuadro combinado que tiene que establecer el foco allí antes de ajustar el valor. Ref: https://msdn.microsoft.com/en-us/vba/access-vba/articles/combobox-seltext-property-access

0

Agregando a la respuesta más reciente - si algunos de sus controles tienen valores predeterminados, puede utilizar

ctl.Value = ctl.DefaultValue

que funciona para mí, al menos por casillas de verificación y cuadros combinados.

Cuestiones relacionadas