3

我在 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”而不是数字时似乎出现了问题。

4

3 回答 3

2

假设你没有使用三态复选框,那么.Value只能是Trueor False,所以我们应该能够摆脱这样的事情:

(假设您的代码在用户窗体内运行,因此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 引用通常是个好主意)

于 2013-08-01T08:25:43.100 回答
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
于 2013-08-01T07:30:45.300 回答
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
于 2013-08-01T07:30:51.110 回答