循环重复代码以设置userform复选框值

时间:2015-05-28 12:43:32

标签: excel vba loops

我的仪表板使用带有复选框的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个复选框。是否有可能循环这个?

5 个答案:

答案 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事件。某些用户可能会使用TabSpace,因此点击事件不会触发。像这样:

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

enter image description here

答案 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