我有一个带有两个框架(Frame1和Frame2)的Excel VBA Userform,我填充了很多Checkbox,具体取决于表单加载时的数据量:
感兴趣的代码是:
Private Sub enterNewTextbox(number As Long, nameAdd As String, side As String)
Dim boxTop As Long
Dim a As Long
Dim nameCB As String
Dim checkBox As Control
boxTop = 10 + (number * 18) - 18
nameCB = side & number & "CB"
If side = "Left" Then
Set checkBox = Frame1.Controls.Add("Forms.CheckBox.1", nameCB)
Else
Set checkBox = Frame2.Controls.Add("Forms.CheckBox.1", nameCB)
End If
With checkBox
.Value = False
.Top = boxTop
.Left = 12
.Width = 190
.Name = nameCB
.Caption = nameAdd
End With
End Sub
现在我想再次遍历所有控件并获取添加到左框架的所有控件 - 如下所示:
For Each ctrl In Me.Controls
If TypeName(ctrl) = "Checkbox" Then
If **{find the name of the frame that the Checkbox is in}** = "Frame1" Then
'Be awesome here
End If
End If
但是当我查看控件的属性时,我找不到任何要查询的字段,这些字段显示了它所在的框架。
答案 0 :(得分:2)
答案 1 :(得分:1)
一般情况下,ctrl.Parent.Name
在UserForm
上工作正常,但是如果控件位于这样的工作表上:
或者喜欢ActiveX元素:
然后形状的Parent
引用工作表名称,您必须解决 坐标系 问题:
Sub TestMe()
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
Debug.Print shp.Name
Debug.Print shp.Parent.Name
Next shp
End Sub
返回:
Frame
Sheet1
Button 4
Sheet1
在编程学校中,存在很多问题,例如" 定义坐标系中的两个方格是否相互重叠 "
每个复选框和每个框架都有以下4个属性:
了解这些,您可以生成底部和右侧位置:
一旦知道这些,如果以下条件为TRUE
,它们会重叠:
if (Frame.Left < Checkbox.Right && Frame.Right > Checkbox.Left &&
Frame.Top > Checkbox.Bottom && Frame.Bottom < Checkbox.Top )