以编程方式向用户窗体-VBA中添加和删除组合框,文本框和复选框

问题描述 投票:0回答:1

enter image description here我正在创建一个用户窗体,该窗体具有1个组合框(1),2个文本框(2和3)和11个复选框(A-K),如图所示。将显示所有控件的第一个实例,但是当用户单击“添加类”时,必须创建一组新的所有控件,并且“删除类”应删除特定的行。

我已经设法获得一个实例的需求,但是我无法弄清楚我是怎么做N次的,而且用户表单的大小也在不断扩大。

Private Sub cmdAddClass()

 Dim cCheckBox As Control, r As Long, r1 As Range

 Set r1 = Sheets("Sheet1").Range("A2:A12") 

 Set cComboBox = Me.Controls.Add("Forms.ComboBox.1")
 With cComboBox
  .Height=25.5
  .Width=102
  .Top=50
  .Left =6
 End With

 Set cTextBox = Me.Controls.Add("Forms.TextBox.1")
 With cTextBox
  .Height=25.5
  .Width=54
  .Top=50
  .Left =114
 End With

 For r = 1 To WorksheetFunction.CountA(r1)
  If r1(r) <> vbNullString Then 
   Set cCheckBox = Me.Controls.Add("Forms.CheckBox.1", "Checkbox" & r, True)
    With cCheckBox
     .Width = 21
     .Height = 11
     .Top = 50
     If r = 1 Then
       .Left = 270
     ElseIf r = 2 Then
       .Left = 348
     ElseIf r = 3 Then
       .Left = 420
     ElseIf r = 4 Then
       .Left = 492
     ElseIf r = 5 Then
       .Left = 564
     ElseIf r = 6 Then
       .Left = 636
     ElseIf r = 7 Then
       .Left = 701.95
     ElseIf r = 8 Then
       .Left = 780
     ElseIf r = 9 Then
       .Left = 876
     ElseIf r = 10 Then
       .Left = 966
     Else
       .Left = 1050
     End If
    End With
  End If
 Next r
End Sub
vba controls userform
1个回答
0
投票

这里是您可以适应的示例。

Private Sub btnAddClass_Click()
    Dim ctrl As Control, newCtrl As Control, offsetTop As Integer

    offsetTop = 30

    For Each ctrl In Me.Controls

        If TypeName(ctrl) <> "CommandButton" Then

            If TypeName(ctrl) = "ComboBox" Then
                Set newCtrl = Me.Controls.Add("Forms.ComboBox.1")
            ElseIf TypeName(ctrl) = "TextBox" Then
                Set newCtrl = Me.Controls.Add("Forms.TextBox.1")
            ElseIf TypeName(ctrl) = "CheckBox" Then
                Set newCtrl = Me.Controls.Add("Forms.Checkbox.1")
            End If

            With newCtrl
                .Height = ctrl.Height
                .Width = ctrl.Width
                .Top = ctrl.Top + offsetTop
                .Left = ctrl.Left
            End With
        Else
            ctrl.Top = ctrl.Top + offsetTop
        End If

    Next ctrl
End Sub

Private Sub btnRemoveClass_Click()
    Dim ctrl As Control, offsetTop As Integer

    offsetTop = 30

    For Each ctrl In Me.Controls

        If TypeName(ctrl) <> "CommandButton" Then
            If ctrl.Top = btnAddClass.Top - offsetTop Then
                Me.Controls.Remove (ctrl.Name)
            End If
        End If

    Next ctrl

    btnAddClass.Top = btnAddClass.Top - offsetTop
    btnRemoveClass.Top = btnRemoveClass.Top - offsetTop
End Sub

注意:

为了使它正常工作,我需要解释一下设置:

  1. 您的控件的第一行的Top属性设置为12
  2. 有两个名为btnAddClassbtnRemoveClass的按钮,其中Top设置为42

控件和按钮之间的offset高为30

要添加新控件,您只需在每个控件上循环,创建一个新控件,然后将其Top设置为现有控件Top值+偏移量(即30)。同时,您将按钮向下移动30并将用户窗体高度增加30。

要删除控件,您可以通过检查Top相对于btnAddClass的属性来获取最后一行。然后,您删除这些控件,并将按钮上移30个,并将用户窗体的高度减少30个。

© www.soinside.com 2019 - 2024. All rights reserved.