vba 完成表格后清除单选按钮
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12330833/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Clear radio-buttons after completing forms
提问by bzoei
I'm having a series of userforms, making a questionnaire. Each userform consists of a couple optionbuttons/checkboxes. The program works fine. However, when I start the program again (without quitting Excel) the radiobuttons and checkboxes are filled in the same way like the previous user did.
我有一系列用户表单,制作问卷。每个用户表单都包含几个选项按钮/复选框。该程序运行良好。但是,当我再次启动程序(不退出 Excel)时,单选按钮和复选框的填充方式与前一个用户相同。
I tried with each userform initialization to call to a module:
我尝试使用每个用户表单初始化来调用模块:
Option base 0
Sub clearBtns()
Dim optBtn(10) As Variant
optBtn(0) = "optA"
optBtn(1) = "optB"
optBtn(2) = "optC"
optBtn(3) = "optD"
optBtn(4) = "optE"
optBtn(5) = "chkA"
optBtn(6) = "chkB"
optBtn(7) = "chkC"
optBtn(8) = "chkD"
optBtn(9) = "chkE"
optBtn(10) = "chkF"
Dim cnt As Integer
For cnt = 0 To 10
If Not optBtn(cnt) Is Nothing Then
optBtn(cnt).Value = False
End If
Next cnt
End Sub
unfortunately this doesn't work (error 424, object required). It has probably something to do with this part:
不幸的是,这不起作用(错误 424,需要对象)。它可能与这部分有关:
If Not optBtn(cnt) Is Nothing Then
There has to be an easier way to do this. For extra information: after each form is completed, I use:
必须有一种更简单的方法来做到这一点。有关额外信息:完成每个表格后,我使用:
Me.Hide
form_x.Show
The last form is different, with:
最后一种形式是不同的,有:
Unload Me
Maybe there's a problem?
也许有问题?
For further explanation:
进一步解释:
Option Base 0
Public Sub clearBtns()
Dim optBtn(10) As Variant
optBtn(0) = "optA"
optBtn(1) = "optB"
optBtn(2) = "optC"
optBtn(3) = "optD"
optBtn(4) = "optE"
optBtn(5) = "chkA"
optBtn(6) = "chkB"
optBtn(7) = "chkC"
optBtn(8) = "chkD"
optBtn(9) = "chkE"
optBtn(10) = "chkF"
Dim formArray(27) As Variant
formArray(0) = "page1_1"
formArray(1) = "page1_2"
formArray(2) = "page1_3"
formArray(3) = "page2_1"
formArray(4) = "page2_2"
formArray(5) = "page2_3"
formArray(6) = "page3_1"
formArray(7) = "page3_2"
formArray(8) = "page3_3"
formArray(9) = "page4_1"
formArray(10) = "page4_2"
formArray(11) = "page4_3"
formArray(12) = "page5_1"
formArray(13) = "page6_1"
formArray(14) = "page6_2"
formArray(15) = "page6_3"
formArray(16) = "page7_1"
formArray(17) = "page7_2"
formArray(18) = "page7_3"
formArray(19) = "page8_1"
formArray(20) = "page8_2"
formArray(21) = "page8_3"
formArray(22) = "page9_1"
formArray(23) = "page9_2"
formArray(24) = "page9_3"
formArray(25) = "page10_1"
formArray(26) = "page10_2"
formArray(27) = "page10_3"
Dim cnt As Integer
Dim fCnt As Integer
For fCnt = 0 To 27
For cnt = 0 To 10
On Error Resume Next
formArray(fCnt).Controls(optBtn(cnt)).Value = False
Next cnt
Next fCnt
End Sub
Above code doesn't work.
上面的代码不起作用。
Public Sub clearBtns()
Dim optBtn(10) As Variant
optBtn(0) = "optA"
optBtn(1) = "optB"
optBtn(2) = "optC"
optBtn(3) = "optD"
optBtn(4) = "optE"
optBtn(5) = "chkA"
optBtn(6) = "chkB"
optBtn(7) = "chkC"
optBtn(8) = "chkD"
optBtn(9) = "chkE"
optBtn(10) = "chkF"
Dim cnt As Integer
For cnt = 0 To 10
On Error Resume Next
page1_1.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page1_2.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page1_3.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page2_1.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page2_2.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page2_3.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page3_1.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page3_2.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page3_3.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page4_1.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page4_2.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page4_3.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page5_1.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page6_1.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page6_2.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page6_3.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page7_1.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page7_2.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page7_3.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page8_1.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page8_2.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page8_3.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page9_1.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page9_2.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page9_3.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page10_1.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page10_2.Controls(optBtn(cnt)).Value = False
Next cnt
cnt = 0
For cnt = 0 To 10
On Error Resume Next
page10_3.Controls(optBtn(cnt)).Value = False
Next cnt
On Error GoTo 0
End Sub
Above code works, but it takes a lot more code and is very inefficient.
上面的代码可以工作,但它需要更多的代码并且效率很低。
回答by enderland
There has to be an easier way to do this. For extra information: after each form is completed, I use:
Me.Hide form_x.Show
The last form is different, with:
Unload Me
必须有一种更简单的方法来做到这一点。有关额外信息:完成每个表格后,我使用:
Me.Hide form_x.Show
最后一种形式是不同的,有:
Unload Me
Instead of using Hide
on all the forms use Unload
. The Userform_Initialize
method will onlybe called when the forms are actually initialized - this does NOT happen when you show a formerly hidden form.
不是Hide
在所有表单上使用,而是使用Unload
. 该Userform_Initialize
方法只会在表单实际初始化时调用 - 当您显示以前隐藏的表单时不会发生这种情况。
So, when you do something with these forms like
所以,当你用这些形式做一些事情时
form1.show 'initialize called
'stuff that changes the form attributes
form1.hide
form1.show 'initialize NOT called
You need to either use Unload
or move your code into the UserForm_Activate
method of each UserForm (which may cause you other issues depending on how these are actually being used).
您需要使用Unload
或移动您的代码到UserForm_Activate
每个用户窗体的方法中(这可能会导致其他问题,具体取决于它们的实际使用方式)。
回答by Daniel
I'm assuming your array: "optA", "optB" etc are actual names of controls. The error occurs because optBtn(cnt)
does not refer to an object, but only a string value from your array.
我假设您的数组:“optA”、“optB”等是控件的实际名称。发生错误的原因optBtn(cnt)
是不引用对象,而只引用数组中的字符串值。
Based on that to achieve what you are seeming to want, replace this code:
基于此实现您似乎想要的,替换此代码:
For cnt = 0 To 10
If Not optBtn(cnt) Is Nothing Then
optBtn(cnt).Value = False
End If
Next cnt
with this code:
使用此代码:
On Error Resume Next
For cnt = 0 To 10
Me.Controls(optBtn(cnt)).Value = False
Next cnt
On Error GoTo 0
回答by user1527032
This will reset (deselect) all option buttons on 'Userform2Clear'
这将重置(取消选择)“Userform2Clear”上的所有选项按钮
Dim opt as Control
For Each opt In Userform2Clear.Controls
If TypeName(opt) = "OptionButton" Then opt = False
Next