excel vba清除用户表单中的所有refedit控件
问题描述:
我需要向EXCEL VBA中正在处理的用户表单添加一个Reset按钮。我有以下代码可以完成大部分工作,但是,我还没有弄清楚如何清除refedit控件。这是我到目前为止有:excel vba清除用户表单中的所有refedit控件
===
'Reset Button
Private Sub CommandButton2_Click()
For Each ctrl In Me.Controls
Select Case TypeName(ctrl)
Case "TextBox"
ctrl.Text = ""
Case "ComboBox"
ctrl.ListIndex = -1
Case "OptionButton", "CheckBox"
ctrl.Value = False
Case "ListBox"
For i = 0 To ctrl.ListCount - 1
If ctrl.Selected(i) Then
ctrl.Selected(i) = False
End If
Next i
End Select
Next
End Sub
===
这适用于文本框,复选框,等我曾尝试加入2个不同的代码片段,以这种sub清除refedit控件。
1:
For i = 0 To crtl.RefEdit - 1
ctrl.Selected(i) = vbNullString
Next i
===
2:
Case "RefEdit"
ctrl.RefEdit = vbNullString
===
无论如所期望的工作原理。任何建议表示赞赏!
感谢,
丹
答
像这样的东西应该为你工作:
Dim ctrl As Control
Dim i As Long
For Each ctrl In Me.Controls
Select Case TypeName(ctrl)
Case "TextBox": ctrl.Text = vbNullString
Case "ComboBox": ctrl.ListIndex = -1
Case "OptionButton", "CheckBox": ctrl.Value = False
Case "RefEdit": ctrl.Value = vbNullString
Case "ListBox": For i = 0 To ctrl.ListCount - 1
ctrl.Selected(i) = False
Next i
End Select
Next ctrl
答
这的确很难知道你需要做的明确控制的东西,因为你正在使用对于仅在运行时解析的Variant/Object
的后期绑定调用,即编辑器无法帮助您发现对象的成员 - 当您键入.
点时,不会获得IntelliSense下拉列表。
最重要的是,TypeName
是使你的代码容易拼写错误,并在你所引用的第三方ActiveX控件库,它定义了一个TextBox
或ListBox
或RefEdit
类/控制显得格外万一,你有没有方式来确切地告诉你正在看哪一个。
改为使用TypeOf...Is
进行类型检查,并考虑将ctrl
控件转换为适当的类型,以便保持所有代码的早期绑定,强类型;你编译时验证,智能感知和自动完成所有的方式 - 请注意如何TypeOf...Is
的作品,你需要把条件中的每个Case
分支becasue,所以你Select Case True
代替:
Private Sub ClearControls()
Dim ctrl As MSForms.Control
For Each ctrl In Me.Controls
Select Case True
Case TypeOf ctrl Is MSForms.TextBox
Dim txtBox As MSForms.TextBox
Set txtBox = ctrl
txtBox.Text = vbNullString
Case TypeOf ctrl Is MSForms.ComboBox
Dim cmbBox As MSForms.ComboBox
Set cmbBox = ctrl
cmbBox.ListIndex = -1
Case TypeOf ctrl Is MSForms.OptionButton
Dim optBtn As MSForms.OptionButton
Set optBtn = ctrl
optBtn.Value = False
Case TypeOf ctrl Is MSForms.CheckBox
Dim chkBox As MSForms.CheckBox
Set chkBox = ctrl
chkBox.Value = False
Case TypeOf ctrl Is MSForms.ListBox
Dim lstBox As MSForms.ListBox
Set lstBox = ctrl
Dim i As Long
For i = 0 To lstBox.ListCount - 1
lstBox.Selected(i) = False
Next
Case TypeOf ctrl Is RefEdit.RefEdit
Dim refEditCtrl As RefEdit.RefEdit
Set refEditCtrl = ctrl
refEditCtrl.Value = vbNullString
End Select
Next
End Sub
是否'ListBox'情况工作,与格式? (我从来没有见过这样的) – BruceWayne
@BruceWayne它会的,是的。这种格式不是必需的,只是个人偏好。 – tigeravatar