【问题标题】:VBA dynamic checkboxes positioningVBA动态复选框定位
【发布时间】:2015-03-03 09:09:07
【问题描述】:

我有一个 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

【问题讨论】:

    标签: vba excel checkbox userform


    【解决方案1】:

    您可以使用LeftTop 属性来操作相对于其容器的位置。

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

    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
    

    您可能会想尝试一下,但这应该可以帮助您入门。

    【讨论】:

      【解决方案2】:

      我认为一个问题是您如何分配复选框。尝试使用 Checkbox 而不是 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
      

      【讨论】:

      • 谢谢!我看到了对 Top 和 Left 的引用,并且很困惑为什么我没有它们。我会将您的答案标记为正确!
      • 实际上,使用此代码我在 Set chkbox 行上遇到类型不匹配。我认为这是因为我添加了 Forms.Checkbox.1。是否有其他类型的替代 ProgID?
      • 复选框是 MSForms 的成员。但是根据它的调用方式给出不同的选择。有时会发生关于 VBA 的令人沮丧的事情。如果您使用 Dim chkBox As MSFOrms.Checkbox,它似乎接受 .Top 方法,即使它没有显示在上下文向下滚动中。您可能还需要包含 chkBox.Visible = True 以使其显示在表单上。让我知道是否可以解决。
      猜你喜欢
      • 2016-09-21
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 2018-07-26
      相关资源
      最近更新 更多