通过VBA UserForm中的checkbox控件循环

Excel VBA中有一个用户窗体,每个月都有一个checkbox。

select一个或多个会导致在工作表上显示所需的月份,我将代码复制粘贴了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 

然后写我的代码,但似乎有一个问题,当我把“我”,而不是数字。

假设你没有使用Tristatecheckbox,那么.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子句并不是绝对必要的,但是尽可能less地parsing嵌套的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