VBA动态复选框定位

VBA动态复选框定位,vba,excel,checkbox,userform,Vba,Excel,Checkbox,Userform,我有一个Excel VBA用户表单,我试图根据给定词典中的项目数添加一些复选框 这是可行的,但我的每个复选框都会被添加到左上角,相互重叠。我如何放置它们,使最新的一个直接低于前一个 这是我的相关代码: With CreateObject("Scripting.Dictionary") 'Variable Checkboxes Dim i As Long Dim chkBox As MSForms.CheckBox For i = 1 To .count - 1 Set chkBox =

我有一个Excel VBA用户表单,我试图根据给定词典中的项目数添加一些复选框

这是可行的,但我的每个复选框都会被添加到左上角,相互重叠。我如何放置它们,使最新的一个直接低于前一个

这是我的相关代码:

With CreateObject("Scripting.Dictionary")
'Variable Checkboxes
Dim i As Long
Dim chkBox As MSForms.CheckBox
For i = 1 To .count - 1
    Set chkBox = Me.Controls.Add("Forms.Checkbox.1", "Checkbox" & i)
    chkBox.Caption = .Keys()(i)
    chkBox.VALUE = False  
Next i

您可以使用
Left
Top
属性来操纵相对于其容器的位置

因此,在这种情况下,要将它们堆叠在一起,可以执行如下操作:

Const Spacing As Integer = 8 ' Gap between controls.
For i = 1 To .count - 1
    Set chkBox = Me.Controls.Add("Forms.Checkbox.1", "Checkbox" & i)
    ' Position the new checkbox.
    ' This assumes all will be the same size.  
    chkBox.Top = (chkBox.Height + Spacing) * (i - 1)
    ...  
Next

你可能会想玩一下这个,但这很有希望让你开始。

我认为一个问题是如何分配复选框。尝试使用复选框而不是MSForms.Checkbox。可能会出现更多选项,包括顶部选项:

With CreateObject("Scripting.Dictionary")
'Variable Checkboxes
Dim i As Long
Dim chkBox As CheckBox
For i = 1 To .Count - 1
    Set chkBox = Me.Controls.Add("Forms.Checkbox.1", "Checkbox" & i)
    chkBox.Caption = .Keys()(i)
    chkBox.Value = False
    chkBox.Top = ...enter top location here...

Next i

End Sub

非常感谢。我看到了上面和左边的引用,我很困惑为什么没有它们。我会把你的答案标记为正确!实际上,使用这段代码,我在Set chkbox行上得到了一个类型不匹配。我想这是因为我添加了一个Forms.Checkbox.1。是否有其他类型的可选ProgID?复选框是MSForms的成员。但根据它的命名方式,它给出了不同的选择。VBA有时会发生令人沮丧的事情。如果将Dim chkBox用作MSFOrms.Checkbox,则它似乎接受.Top方法,即使它没有显示在向下滚动的上下文中。您可能还需要包含chkBox.Visible=True,以便在表单上显示它。如果这能解决问题,请告诉我。