VBA UserForm中的循环通过复选框控件



我在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"代替数字时,似乎出现了问题。

假设您没有使用三态复选框,那么.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引用)

试试这个。。

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

我还没有检查代码,但如果它不到位,这应该会让你走上正确的道路。。。

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

最新更新