将父Control设置为另一个控件

时间:2015-09-15 08:51:48

标签: excel vba excel-vba controls

我需要使用VBA代码将父Control设置为另一个控件。 实际上我正在循环以动态创建不同的控件,我现在想要通过子父级链接它们。

有人有想法吗?

2 个答案:

答案 0 :(得分:0)

这是我创建一个新控件并设置一些值的函数。最后一项任务是我想要设置父项的地方           公共函数apply_change(ihm_f,oNode,iMyName $,project $)

Dim new_elem
Dim oSubNodes As IXMLDOMNode

If oNode.Attributes.getNamedItem("Type").Text <> "Page" Then
    If (oNode.Attributes.getNamedItem("Type").Text = "RefEdit") Then

        Set new_elem = ihm_f.Designer.Controls.Add("RefEdit.Ctrl", oNode.nodeName, True)

    Else
        Set new_elem = ihm_f.Designer.Controls.Add("Forms." & oNode.Attributes.getNamedItem("Type").Text & ".1", oNode.nodeName, True)
    End If
    With new_elem
        On Error Resume Next
        .Width = oNode.Attributes.getNamedItem("Width").Text
        .Top = oNode.Attributes.getNamedItem("Top").Text
        .Left = oNode.Attributes.getNamedItem("Left").Text
        .Height = oNode.Attributes.getNamedItem("Height").Text
        Set .Parent = get_parent(oNode.ParentNode.nodeName, oNode, ihm_f)
    End With
    If oNode.Attributes.getNamedItem("Type").Text = "MultiPage" Then
    Call new_elem.Pages.Remove(0)
    Call new_elem.Pages.Remove(0)
     For Each oSubNodes In oNode.ChildNodes()
        Call new_elem.Pages.Add(oSubNodes.BaseName, oSubNodes.Attributes.getNamedItem("Caption").Text, oSubNodes.Attributes.getNamedItem("Index").Text)
     Next oSubNodes
    End If
End If
Set apply_change = ihm_f
End Function

getparent函数返回一个Controle,可以是任何东西..比如文本框或组合框等。

答案 1 :(得分:-1)

您在问题中提供的信息很少,很难猜出您的目标。

但是,我猜你要记录Control Xxxxx是控件Yyyyy的父级,其中“parent”的定义与Excel的父级定义无关。我进一步猜测你不知道如何按编号访问控件。

下面的宏按照集合Controls中的索引号列出了表单上每个控件的名称,类型和顶部位置。可以通过这种方式访问​​控件的任何属性。如果控件Xxxxx是控件Yyyyy的父级,则可以在表单加载时扫描集合以查找其索引号,并记录此信息以供在需要时使用。

Private Sub UserForm_Initialize()

  Dim InxCtrl As Long
  Dim LenNameMax As Long
  Dim LenTypeMax As Long

  LenNameMax = 0
  For InxCtrl = 0 To Controls.Count - 1
    If LenNameMax < Len(Controls(InxCtrl).Name) Then
      LenNameMax = Len(Controls(InxCtrl).Name)
    End If
    If LenTypeMax < Len(TypeName(Controls(InxCtrl))) Then
      LenTypeMax = Len(TypeName(Controls(InxCtrl)))
    End If
  Next

  Debug.Print PadR("Name", LenNameMax) & "|" & PadR("Type", LenTypeMax) & "|     Top"
  For InxCtrl = 0 To Controls.Count - 1
    Debug.Print PadR(Controls(InxCtrl).Name, LenNameMax) & "|" & _
                PadR(TypeName(Controls(InxCtrl)), LenTypeMax) & "|" & _
                PadL(Format(Controls(InxCtrl).Top, "#,###.00"), 8)
  Next

End Sub