在VBA UserForm中循环通过CheckBox控件

时间:2013-08-01 07:22:27

标签: excel vba loops

我在Excel VBA中有一个用户表单,每个月都有一个复选框。

选择一个或多个导致所需的月份显示在工作表上,我将代码复制粘贴12次并且它可以正常工作,但我确信有一个更好的方法可以使用For循环。

这是我的代码的一部分(它持续了12次):

    If CheckBox1.Value = True Then
        ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("1").Visible = True
    Else
       ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("1").Visible = False
    End If

    If CheckBox2.Value = True Then
        ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("2").Visible = True
    Else
       ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("2").Visible = False
    End If

我试着写:

for i in range 1 to 12

然后编写我的代码但是当我输入“i”而不是数字时似乎有问题。

3 个答案:

答案 0 :(得分:2)

假设您没有使用Tristate复选框,那么.Value只能是TrueFalse,所以我们应该能够逃避这样的事情:

(假设您的代码在UserForm中运行,以便可以直接访问Controls

Dim mthIdx as Long
Dim nm as String
Dim c As Control

With ActiveSheet.PivotTables("PivotTable1").PivotFields("month")
    For mthIdx = 1 To 12
        nm = "CheckBox" & mthIdx
        Set c = Controls(nm)
        .PivotItems(mthIdx).Visible = c.Value
    Next
End With

With子句并不是绝对必要的,但通常最好尽可能不经常地解析嵌套的COM引用。

答案 1 :(得分:1)

试试这个..

Dim i As Integer
Dim sN As String
Dim chx As MSForms.CheckBox
Dim obj As OLEObject

For i = 1 to 12
    sN = format(i) 
    Set obj = OLEObjects("CheckBox" & sN)
    Set chx = obj.Object

    If chx.Value = True Then
        ActiveSheet.PivotTables("PivotTable" & sN).PivotFields("month").PivotItems(sN).Visible = True
    Else
       ActiveSheet.PivotTables("PivotTable" & sN).PivotFields("month").PivotItems(sN).Visible = False
    End If
Next

答案 2 :(得分:0)

我没有检查过代码,但如果它没有通过,那么这应该会让你走上正确的道路......

For i = 1 to 12
    If CheckBox(i).Value = True Then
        ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems(i).Visible = True
    Else
       ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems(i).Visible = False
    End If
Next i