2012-09-08 38 views
0

我正在制作一系列用户表单,进行问卷调查。每个用户窗体包含一对选项按钮/复选框。该程序正常工作。 但是,当我再次启动程序(不退出Excel)时,按照与前一用户相同的方式填充单选按钮和复选框。完成表单后清除单选按钮

我与每个用户窗体初始化试图调用模块:

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 

不幸的是,这并不工作(错误424,所需的对象)。它可能与这部分有关:

If Not optBtn(cnt) Is Nothing Then 

必须有一个更简单的方法来做到这一点。 对于额外的信息:完成每一个表格后,我用:

Me.Hide 
form_x.Show 

最后一种形式是不同的,有:

Unload Me 

也许有一个问题?

对于进一步的解释:

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 

上面的代码不起作用。

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 

上面的代码工作,但它需要更多的代码,是非常低效的。

+1

为什么你只是隐藏这些形式的所有选项按钮?你能不能卸下它们? – whytheq

回答

4

必须有这样做的更简单的方法。对于额外的信息:完成 每个表单后,我用:

Me.Hide 
form_x.Show 

最后一种形式是不同的,有:

Unload Me 

而是对所有的形式使用Unload使用Hide的。 Userform_Initialize方法将只有当表单被实际初始化时调用 - 当您显示以前隐藏的表单时,不会发生这种情况。

所以,当你做这些形式类似

form1.show 'initialize called 
'stuff that changes the form attributes 
form1.hide 
form1.show 'initialize NOT called 

您必须要么使用Unload或移动你的代码到每个用户窗体的UserForm_Activate方法(这可能会导致你的其他问题,这取决于如何,这些都是实际上正在使用)。

+0

谢谢,它的工作! – bzoei

1

我假设你的数组:“OPTA”,“optB”等都是控制实际名称。发生此错误的原因是optBtn(cnt)不引用对象,而只引用数组中的字符串值。与此代码

For cnt = 0 To 10 
    If Not optBtn(cnt) Is Nothing Then 
    optBtn(cnt).Value = False 
    End If 
Next cnt 

此基础上实现你似乎在想什么,将这段代码

On Error Resume Next 
For cnt = 0 To 10 
    Me.Controls(optBtn(cnt)).Value = False 
Next cnt 
On Error GoTo 0 
+0

“Me.Controls”到底是什么?我想我必须用“UserForm”或类似的东西来替换“Me”,因为这个代码在模块中? (我收到一条错误消息,说明我无法使用关键字'我') – bzoei

+0

如果我放置表单名称(即form1)而不是“我”,它就可以工作。但是,当我把所有的表单名称放在一个数组中,并把数组(x)而不是“我”不起作用。这是为什么?没有数组我必须使用更多的代码。 – bzoei

+0

对不起,我认为你所有的代码都在用户表单中。如果你想为你的表单使用一个数组,你需要使用像formArray(index).Controls(controlsArray(Index)).value = False这样的格式。 –

0

这将重置(取消)在“Userform2Clear”

Dim opt as Control 
For Each opt In Userform2Clear.Controls 
    If TypeName(opt) = "OptionButton" Then opt = False 
Next