我在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”而不是数字时似乎有问题。
答案 0 :(得分:2)
假设您没有使用Tristate复选框,那么.Value
只能是True
或False
,所以我们应该能够逃避这样的事情:
(假设您的代码在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