【问题标题】:How to create controls dynamically at runtime如何在运行时动态创建控件
【发布时间】:2017-10-27 17:39:24
【问题描述】:

我正在尝试根据正在查看的特定工作表上的列数在 Excel 用户窗体中创建可变数量的控件(组合框)。理想情况下,我想删除现有的并在运行时创建新的,而不是创建 100 个左右,只是在可见和不可见之间来回切换。我目前拥有的将创建一个组合框和循环,但它只创建 1。看起来组合框被覆盖并以创建的最后一个组合框结束。有什么建议可以在运行时使用相同的用户表单吗?

Private Sub CommandButton1_Click()
 Dim cCont As New Control

 Dim ws As Worksheet
 Dim lc As Long
 Dim i As Long

 Set ws = Loan_Data

 lc = Loan_Data.Cells(1, Columns.Count).End(xlToLeft).Column


 For i = 1 To lc
    Set cCont = Me.Controls.Add("Forms.CommandButton.1", "NewCombo" & i)
    With cCont
        .Caption = cCont.Name
        .AutoSize = True
        .Visible = True
    End With
 Next i

结束子

【问题讨论】:

  • 你确定你不只是创建一堆控件都在同一个位置,最后一个在上面吗?
  • 看起来你正在创建按钮,但它是在彼此之上创建它们;从而使它看起来只是在创建一个。创建后您需要更新位置
  • 好吧,我觉得自己很笨。谢谢大家

标签: vba excel


【解决方案1】:

我可以与您分享一个我用来在运行时创建一些组合框的过程示例。

Private Sub Agrega_Combo(Unidades As Integer)
'Procedimiento para agregar los ComboBox, etiquetas y unidades a la lista.
    Dim i, j As Integer
    Dim Cmb As Control
    Dim Lbl As Control

    'Ciclo para crear los ComboBox y Etiquetas en el 'ArrUnidades'
    For i = 1 To UBound(ArrUnidades)
    'Agrega el ComboBox
        Set Cmb = Me.Controls.Add("Forms.combobox.1")
        'Se establece el nombre y la posición del nuevo ComboBox
        With Cmb
            .Name = "Combobox" & i
            .Left = 66
            .Width = 36
            If i = 1 Then
                .Top = 34
            Else
                .Top = 34 + (24 * (i - 1))
            End If
        End With
    'Agrega la Etiqueta'
        Set Lbl = Me.Controls.Add("Forms.label.1")
        With Lbl
            .Name = "Label" & i
            .Caption = ArrUnidades(i) & " :"
            .Left = 30
            .Width = 36
            If i = 1 Then
                .Top = 38
            Else
                .Top = 38 + (24 * (i - 1))
            End If
        End With
        'Ciclo para agregar las unidades indicadas al llamar el procedimiento.
        For j = 1 To Unidades
            Me.Controls("ComboBox" & i).AddItem j
        Next j
        'Selecciona el primer valor de la lista.
        Me.Controls("ComboBox" & i).Text = Me.Controls("ComboBox" & i).List(0)
    Next i
End Sub

希望对你有帮助。

【讨论】:

    【解决方案2】:

    通过一些数学运算,您就可以得到完全动态的结果。使用放置控件的框架。现在你有了相对于框架的坐标。使用“y_offset”和“lineheight”变量和/或“x_offset”和“linewidth”变量并创建具有计算位置(顶部和左侧)的控件。在创建期间计算偏移量 + (lines*lineheight) 并根据结果设置 Frames ScrollHeight (和/或 ScrollWidth)...

    有时会这样做。效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 2020-05-04
      • 1970-01-01
      相关资源
      最近更新 更多