【问题标题】:Set parent Control to another control将父控件设置为另一个控件
【发布时间】:2015-12-11 10:51:03
【问题描述】:

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

有人有想法吗?

【问题讨论】:

  • 什么样的控件?文本框?组合框?列表框?你打算用它们做什么?您是否有可以发布的代码来显示问题所在?请提供更多信息!

标签: vba excel controls


【解决方案1】:

这是我创建新控件并设置一些值的函数。最后一个任务是我要设置父级的地方 公共函数 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,它可以是任何东西……比如文本框或组合框等。

【讨论】:

  • 这是您寻求帮助的无效代码吗?如果是这样,它应该在您的问题范围内。
【解决方案2】:

您在问题中提供的信息太少,以至于很难猜测您的目标。

但是,我猜您想记录控件 Xxxxx 是控件 Yyyyy 的父级,其中“父级”的定义与 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

【讨论】:

  • 感谢您的回答,但我需要将父级设置为控件。例如,我有一个控件是框架,另一个是文本框,我需要将框架设置为文本框的父级。
  • @Prog_is_life。在设计表单时,您可以通过将文本框放置在框架中来将框架定义为文本框的父级。属性 Parent 在文档中被描述为只读,因此我怀疑您是否可以在运行时将 Textbox 和 Frame 与 VBA 关联。
  • 是的,我终于找到了怎么做......我只需要“examplectrl.controls.add(..)”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多