Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 将父控件设置为另一个控件_Vba_Excel_Controls - Fatal编程技术网

Vba 将父控件设置为另一个控件

Vba 将父控件设置为另一个控件,vba,excel,controls,Vba,Excel,Controls,我需要使用VBA代码将父控件设置为另一个控件。 实际上,我正在循环动态创建不同的控件,现在我想通过子-父链接它们 有人有想法吗?你在问题中提供的信息太少,很难猜测你的目标 但是,我猜想您希望记录控件Xxxxx是控件Yyyyy的父级,其中“父级”的定义与Excel的父级定义无关。我进一步猜测,您不知道如何按数字访问控件 下面的宏通过集合控件中的索引号列出窗体上每个控件的名称、类型和顶部位置。控件的任何属性都可以通过这种方式访问。如果控件Xxxxx是控件Yyyyy的父控件,则可以在加载表单时扫描集合

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


有人有想法吗?

你在问题中提供的信息太少,很难猜测你的目标

但是,我猜想您希望记录控件Xxxxx是控件Yyyyy的父级,其中“父级”的定义与Excel的父级定义无关。我进一步猜测,您不知道如何按数字访问控件

下面的宏通过集合
控件
中的索引号列出窗体上每个控件的名称、类型和顶部位置。控件的任何属性都可以通过这种方式访问。如果控件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
Private子用户表单_Initialize()
变暗InxCtrl为长
Dim LenNameMax尽可能长
Dim LenTypeMax尽可能长
LenNameMax=0
对于InxCtrl=0的控件,计数为-1
如果LenNameMax
这是我创建新控件并设置一些值的函数。最后一个作业是我要设置父项的地方 公共功能应用变更(ihm\U f、oNode、iMyName$、project$)

Dim新元素
作为IXMLDOMNODONDE的Dim OSUBNODE
如果是oNode.Attributes.getNamedItem(“Type”).Text“Page”,则
如果是(oNode.Attributes.getNamedItem(“Type”).Text=“RefEdit”),则
设置new_elem=ihm_f.Designer.Controls.Add(“RefEdit.Ctrl”,oNode.nodeName,True)
其他的
Set new_elem=ihm_f.Designer.Controls.Add(“Forms.”&oNode.Attributes.getNamedItem(“Type”).Text&“.1”,oNode.nodeName,True)
如果结束
用新元素
出错时继续下一步
.Width=oNode.Attributes.getNamedItem(“宽度”).Text
.Top=oNode.Attributes.getNamedItem(“Top”).Text
.Left=oNode.Attributes.getNamedItem(“左”).Text
.Height=oNode.Attributes.getNamedItem(“高度”).Text
Set.Parent=get\u Parent(oNode.ParentNode.nodeName、oNode、ihm\u f)
以
如果oNode.Attributes.getNamedItem(“Type”).Text=“多页”,则
调用新元素页。删除(0)
调用新元素页。删除(0)
对于oNode.ChildNodes()中的每个oSubNodes
调用new_elem.Pages.Add(oSubNodes.BaseName,oSubNodes.Attributes.getNamedItem(“标题”).Text,oSubNodes.Attributes.getNamedItem(“索引”).Text)
下一个oSubNodes
如果结束
如果结束
设置应用更改=ihm\U f
端函数

getparent函数返回一个可以是任何内容的控件。。像文本框或组合框等…

什么样的控件?文本框?组合框?列表框?你打算用它们做什么?您是否有代码可以发布以显示问题所在?请提供更多信息!谢谢您的回答,但我需要将父控件设置为控件。例如,我有一个控件是框架,另一个控件是文本框,我需要将框架设置为文本框的父级。@Prog\u就是生命。设计表单时,通过将文本框放置在框架内,将框架定义为文本框的父级。属性父级在文档中描述为只读,因此我怀疑您是否可以在运行时将文本框和帧与VBA关联。是的,我终于找到了该怎么做。。我只需要“examplectrl.controls.add(..)”这是您需要帮助的无效代码吗?如果是这样,这应该在你的问题范围之内。
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