Excel VBA - 循环使用表单控件复选框不起作用

时间:2017-08-20 23:49:37

标签: excel-vba vba excel

因此无论出于何种原因,我无法让我的VBA代码循环遍历工作表上的表单控件复选框,以便拥有“全选”复选框。我发现了以下两种不同的方法,据说可以用来做到这一点:

方法1:

Sub SelectAll_Click()

Dim CB As CheckBox
For Each CB In ActiveSheet.CheckBoxes
  If CB.Name = ActiveSheet.CheckBoxes("cbSiteAll").Name Then
    MsgBox CB.Name & ": " & CB.Value, vbOKOnly
    CB.Value = ActiveSheet.CheckBoxes("cbSiteAll").Value
  Else
    MsgBox CB.Name & ": " & CB.Value, vbOKOnly
  End If
Next CB
End Sub

方法2:

Sub SelectAll_Click()

Dim CB As Shape
Dim sh As Worksheet

Set sh = ActiveSheet
For Each CB In sh.Shapes
  If CB.Type = msoFormControl Then
    If CB.FormControlType = xlCheckBox Then
      MsgBox CB.Name, vbOKOnly
      If CB.Name <> Application.ActiveSheet.CheckBoxes("cbSiteAll").Name Then
        CB.Value = Application.ActiveSheet.CheckBoxes("cbSiteAll").Value
        MsgBox xCheckBox.Name & ": " & xCheckBox.Value, vbOKOnly
      End If
    End If
  End If
Next CB
End Sub

我输入的消息框试图调试正在发生的事情。对于上述两种情况,循环开始但是我得到的唯一消息框与我勾选到的已分配宏的框相关。它似乎没有循环通过任何其他复选框(虽然复选框的验证工作,因为循环至少将项目勾选/未勾选为复选框。

我不知道为什么其中任何一个都没有工作,鉴于上述情况,我花了相当多的时间寻找解决这个特定问题的答案,并通过逻辑对自己无济于事。唉,我把它交给互联网,看看他们是否可以提供帮助。

提前致谢。

2 个答案:

答案 0 :(得分:2)

为了本帖子中的其他人的利益,Shape对象包含GroupItems属性。此属性仍是Shape对象,实际上是Shapes(https://msdn.microsoft.com/VBA/Excel-VBA/articles/shape-groupitems-property-excel)的集合。因此,当您迭代Shapes列表时,您只能访问“顶级”列表。形状;换句话说,只能通过GroupItems属性访问分组的形状。

如果您希望在工作表中对要包含在For Each...循环中的形状进行分组,则一种解决方案是递归迭代。类似下面的代码:

Option Explicit

Public Sub RunMe()
    RecursiveLoop Sheet1.Shapes
End Sub

Private Sub RecursiveLoop(col As Object)
    Dim shp As Shape

    For Each shp In col
        If IsGrouped(shp) Then
            RecursiveLoop shp.GroupItems
        Else
            Debug.Print shp.Name
        End If
    Next
End Sub

Private Function IsGrouped(shp As Shape) As Boolean
    Dim grp As GroupShapes

    On Error Resume Next
    Set grp = shp.GroupItems
    On Error GoTo 0

    IsGrouped = (Not grp Is Nothing)
End Function

答案 1 :(得分:0)

所以经过一番摆弄,我偶然发现了上面的答案。问题是我将其余的复选框分组,无论出于何种原因,这都阻止了它们在上面代码的循环中被拾取。我解开了他们,突然代码工作了。我不确定为什么VBA / Excel会这样做,但如果有人能解释我想知道原因。

感谢。