我的仪表板使用带有复选框的userform框字段来选择要在图表上显示的数据。
我的代码非常复制和粘贴。
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个复选框。是否有可能循环这个?
答案 0 :(得分:2)
这个主题中发布的所有好建议,所以我想添加一些可能有助于简化循环的东西。控件具有Tag
属性,据我所知,除了存储有关控件的其他信息之外,什么也没做。
利用这个优势,我们可以在每个复选框的Tag
属性中包含链接的单元格。 (例如,在X4
中输入Tag
以链接到单元格X4
)。这允许较少的信息被硬编码,这使其更具适应性。
最后,代码看起来像这样。
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
答案 1 :(得分:1)
要简化的一件事:不要使用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
我建议使用更改事件而不是click事件。某些用户可能会使用Tab
和Space
,因此点击事件不会触发。像这样:
Private Sub CheckBox1_Change()
...
关于循环执行CommandButton21_Click事件中的复选框,这取决于复选框和表格的顺序。这可能有用,但你必须在你的桌子上尝试(复选框的顺序与你的单元格的顺序相比可能会破坏游戏......)
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
希望这有帮助。
答案 2 :(得分:1)
我在这种情况下的方法是:
将复选框的ControlSource
属性设置为适当的单元格,仅保留:
UserForm1.Show
答案 3 :(得分:0)
对于问题的第二部分:
Private Sub CheckBox1_Click()
Worksheets("Data Directorate").Range("X4").Value = CheckBox1.Value
End Sub
答案 4 :(得分:0)
您可以对给定框架内的复选框进行分组,然后尝试以下
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