我在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
只能是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引用)
试试这个。。
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