我想访问工作表中的所有ActiveX、CheckBoxes和OptionButtons。我试图为此做一个循环,但我的循环不能全部得到。
在检查了那些我无法得到的名字后,我发现它们是分组的(通过选择它们,右键单击,分组)。如何访问工作表中的所有控件,即使它们是分组的?
下面是我现在使用的代码,它允许我获得直接在工作表中的控件,没有分组,但它不允许我获得分组控件。
我正在阅读由用户填充的表单,一些用户已经对控件进行了分组,而另一些用户则没有,这就是为什么我无法预先知道控件是否分组,所以我需要访问我的代码读取的当前工作表中的所有控件。
'ws is my worksheet
Dim obj As OLEObject
For Each obj In ws.OLEObjects
Debug.Print obj.Name
Next obj
End If发布于 2019-03-01 10:52:54
要获取所有ActiveX对象,即使将其放入组中,也可以从使用Shapes-Collection而不是OLEObjects-Collection开始。
您可以检查形状的Type = msoOLEControlObject (12),以便只列出OLEObjects。组具有类型msoGroup (6),并具有一个集合GroupItems,该集合GroupItems包含该组中的所有形状。
您可以编写递归例程。请参阅下面的代码来编写所有OLEObjects。
Update:代码现在创建一个字典,其中包含所有CheckBoxex和RadioButtons以及它们的值。请注意,您需要对脚本库的引用。
Sub ListAllObjects()
Dim ListOfOptions as Dictionary
Set ListOfOptions = New Dictionary
ListObjects ActiveSheet.Shapes, ListOfOptions
End Sub
Sub ListObjects(objArr, ListOfOptions)
Dim sh As Shape
For Each sh In objArr
If sh.Type = msoOLEControlObject Then
' Debug.Print sh.Name; sh.Type; TypeName(sh.OLEFormat.Object.Object)
' Found OptionButton or CheckBox: Add it to Dictionary.
If TypeName(sh.OLEFormat.Object.Object) = "OptionButton" Or TypeName(sh.OLEFormat.Object.Object) = "CheckBox" Then
ListOfOptions.Add sh.Name, sh.OLEFormat.Object.Object.Value
End If
End If
If sh.Type = msoGroup Then
ListObjects sh.GroupItems, ListOfOptions
End If
Next sh
End Sub到Ungroup
Dim sh As Shape
For Each sh In ActiveSheet.Shapes
If sh.Type = msoGroup Then sh.Ungroup
Next shhttps://stackoverflow.com/questions/54942622
复制相似问题