循环重复代码以设置用户窗体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
属性中包含链接的单元格。 (例如,在Tag
inputX4
以链接到单元格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议使用更改事件,而不是点击事件。 有些用户可能使用Tab
和Space
,那么点击事件将不会触发。 喜欢这个:
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