因此无论出于何种原因,我无法让我的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
我输入的消息框试图调试正在发生的事情。对于上述两种情况,循环开始但是我得到的唯一消息框与我勾选到的已分配宏的框相关。它似乎没有循环通过任何其他复选框(虽然复选框的验证工作,因为循环至少将项目勾选/未勾选为复选框。
我不知道为什么其中任何一个都没有工作,鉴于上述情况,我花了相当多的时间寻找解决这个特定问题的答案,并通过逻辑对自己无济于事。唉,我把它交给互联网,看看他们是否可以提供帮助。
提前致谢。
答案 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会这样做,但如果有人能解释我想知道原因。
感谢。