循环重复代码以设置用户窗体checkbox值

我有一个仪表板,使用带有checkbox的用户窗体框来select要在图表上显示的数据。

我的代码是非常复制和粘贴。

Private Sub CommandButton21_Click() UserForm1.Show If Worksheets("Data Directorate").Range("X4").Value = True Then UserForm1.CheckBox1 = True If Worksheets("Data Directorate").Range("X5").Value = True Then UserForm1.CheckBox2 = True If Worksheets("Data Directorate").Range("X6").Value = True Then UserForm1.CheckBox3 = True 

有没有办法使用循环来做到这一点?

以后我会重复更多的代码:

 Private Sub CheckBox1_Click() Select Case CheckBox1.Value Case True Worksheets("Data Directorate").Range("X4").Value = True Case False Worksheets("Data Directorate").Range("X4").Value = False End Select End Sub 

这重复了24个checkbox。 有可能循环这个?

我在这种情况下的做法是:

将checkbox的ControlSource属性设置为适当的单元格,只保留: UserForm1.Show

在这里输入图像说明

所有伟大的build议张贴在这个线程,所以我想添加一些东西,可能有助于简化你的循环。 控件有一个Tag属性,我可以说,除了存储有关控件的附加信息之外别无它物。

利用这个优势,我们可以在每个checkbox的Tag属性中包含链接的单元格。 (例如,在TaginputX4以链接到单元格X4 )。 这允许较less的信息被硬编码,这使得它更具适应性。

最后,代码看起来像这样。

 Private Sub UserForm_Click() For Each octrl In Me.Controls If TypeName(octrl) = "CheckBox" Then Sheet1.Range(octrl.Tag).Value = octrl.Value End If Next octrl End Sub 

有一件事要简化:不要使用If语句,而要使双方平等。 喜欢这个:

 Private Sub CommandButton21_Click() UserForm1.Show UserForm1.CheckBox1 = Worksheets("Data Directorate").Range("X4").Value 

而另一个:

 Private Sub CheckBox1_Click() Worksheets("Data Directorate").Range("X4").Value = CheckBox1.Value End Sub 

我build议使用更改事件,而不是点击事件。 有些用户可能使用TabSpace ,那么点击事件将不会触发。 喜欢这个:

 Private Sub CheckBox1_Change() ... 

关于循环通过CommandButton21_Click事件中的checkbox,取决于您的checkbox和表的顺序。 这可能工作,但你将不得不在你的桌子上尝试它(与你的单元格的顺序相比,checkbox的顺序可以毁了游戏…)

 Dim contr As control dim i as integer i=4 For Each contr In UserForm1.Controls If TypeName(contr) = "CheckBox" Then contr.Value = cells(i,24).Value 'column 24 is column X i=i+1 End If Next 

当CheckBox没有按照预期的顺序或者被添加/删除时,可能的变化是工作的:

 Dim contr As control Dim J as Integer Dim Offset as Integer Offset = 3 'set this to the difference between 1 and the first row containing data For Each contr In UserForm1.Controls If TypeName(contr) = "CheckBox" Then 'set j to the checkboxes "number" J = cInt(right(contr.name, len(contr.name) - len("CheckBox"))) 'use the checkbox number + offset to find the row we want contr.Value = cells(J + Offset,24).Value 'column 24 is column X End If Next 

希望这可以帮助。

对于你的问题的第二部分:

 Private Sub CheckBox1_Click() Worksheets("Data Directorate").Range("X4").Value = CheckBox1.Value End Sub 

您可以将给定框内的checkbox分组,并尝试以下操作

 Sub Test() Dim i As Long i = 5 For Each cb In UserForm1.Frame1.Controls If Worksheets("Data Directorate").Range("X" & i).Value = True Then cb.Value = True i = i + 1 Next cb End Sub