找到Userform.control在

时间:2018-04-11 09:19:04

标签: vba

我有一个带有两个框架(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

但是当我查看控件的属性时,我找不到任何要查询的字段,这些字段显示了它所在的框架。

2 个答案:

答案 0 :(得分:2)

只需使用父名称即可。 ctrl.Parent.Name

enter image description here

答案 1 :(得分:1)

一般情况下,ctrl.Parent.NameUserForm上工作正常,但是如果控件位于这样的工作表上:

enter image description here

或者喜欢ActiveX元素:

enter image description here

然后形状的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个属性:

  • 宽度
  • Heigth

了解这些,您可以生成底部和右侧位置:

  • Bottom = Top + Height
  • 右=左+宽

一旦知道这些,如果以下条件为TRUE,它们会重叠:

if (Frame.Left < Checkbox.Right && Frame.Right > Checkbox.Left &&
     Frame.Top > Checkbox.Bottom && Frame.Bottom < Checkbox.Top ) 

Determine if two rectangles overlap each other?