2012-10-10 154 views
6

我有一个VBA表格,包含多种选择选项,包括下拉菜单,文本字段,复选框和收音机。在VBA中重置表格

我只是想知道最好的方法来清除所有这些领域的按钮按下。我的一位朋友试图通过向我发送下面的代码给我发邮件,但不幸的是它不起作用,我检查了变量名称。

有关如何改善它的任何建议?

在此先感谢。

Private Sub btnReset_Click() 

Unload Me 
UserForm.Show 

End Sub 

这是用户表单的其他代码。

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 

回答

14

我认为当它命中Unload Me行时,代码执行停止,这就是为什么它不适合你。这是通用事件过程,用于重置表单上的所有(大部分)控件。

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 

它不重新填充组合框和列表框,只是清除选择,这是我想你想要的。

+0

感谢它的出色工作 – methuselah

5

我知道这个问题差不多2岁,但我一直在寻找这样的答案。但是,我使用Access 2010中,发现如预期的功能并没有完全工作:

  • CTL可暗淡-ED只是作为控制
  • 对于一个文本框,在ctl.Text属性只能分配给如果控件有焦点(使用ctl.Value代替)
  • 如果一个选项按钮是它不能被赋值
在考虑这些问题

因此,一个选项组的一部分,这里是我的改写功能:

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

对于ctl。ListIndex赋值,我得到错误,我正确使用ListIndex属性。我不得不使用ctl = Null – Hill

2

你可以试试这个:

Private Sub btnReset_Click() 

    Call UserForm_Initialize 

End Sub 
+2

如果您的答案中包含解释为什么您的方法比已提出的建议具有优势,那么您的贡献将为网站增添更多价值......多年前... –

+1

请添加更多解释。这篇文章的长度和内容正在审查中。如果答案没有改善,它可能会在某些时候被删除。 –

+0

@CindyMeister - 呃,它的代码少了很多。此外,上面的解决方案并未考虑表单首次加载时的控件状态(如果需要“重置”表单,可能需要这样做)。这应该是显而易见的......如果解决方案奏效。不幸的是,事实并非如此。访问告诉我方法没有定义。 – Hill

0

微软有此记载得相当好现在访问的最新版本。它看起来像上面的一些答案指的是旧版本。下面的代码完美地工作在我的应用程序中。我只包含了我需要的控件类型,但您可以在下面的Microsoft链接中找到任何其他文档。

编号: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 

注意,组合框,你必须设置值之前有设置焦点。 编号:https://msdn.microsoft.com/en-us/vba/access-vba/articles/combobox-seltext-property-access

0

添加到最近的答案 - 如果你的一些控件有缺省值,你可以使用

ctl.Value = ctl.DefaultValue

对我来说,至少对于复选框和组合框其中一期工程。