【问题标题】:Loop Through CheckBox Controls in VBA UserForm循环通过 VBA 用户窗体中的复选框控件
【发布时间】:2013-08-01 16:27:45
【问题描述】:

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

【问题讨论】:

    标签: excel vba loops


    【解决方案1】:

    假设你没有使用三态复选框,那么.Value 只能是TrueFalse,所以我们应该可以这样处理:

    (假设您的代码在用户窗体中运行,因此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 引用)

    【讨论】:

      【解决方案2】:

      试试这个..

      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
      

      【讨论】:

      • 这行“.OLEObjects”似乎有问题,它引发了错误“未找到方法或数据成员”
      • OLEObjects 我认为是指工作表中的控件。在UserForm(至少到 Excel 2003)中,我们可能想要Controls...
      【解决方案3】:

      我没有检查过代码,但如果它没有出现,这应该会让你走上正确的道路......

      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
      

      【讨论】:

      • AFAIK,VBA 不支持表单中的控件数组,所以你不能创建CheckBox(...),以后也不能以这种方式访问​​它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2021-12-05
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多