Программно добавлять и удалять Combobox, Textbox и Checkbox для пользовательской формы - VBA - PullRequest
0 голосов
/ 28 апреля 2020

enter image description here Я создаю пользовательскую форму, которая имеет 1 комбинированный список (1), 2 текстовых поля (2 и 3) и 11 флажков (AK), как на рисунке. Будет представлен первый экземпляр всех элементов управления, но когда пользователь нажимает кнопку «Добавить класс», необходимо создать новый набор всех элементов управления, а когда «Удалить класс» следует удалить определенную строку.

Мне удалось получить требование для одного экземпляра, но я не мог понять, как мне это сделать 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

1 Ответ

1 голос
/ 28 апреля 2020

Вот пример, который вы можете адаптировать.

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 ctrl.Top = btnAddClass.Top - offsetTop 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

            End If
        End If
    Next ctrl

    btnAddClass.Top = btnAddClass.Top + offsetTop
    btnRemoveClass.Top = btnRemoveClass.Top + offsetTop
    Me.Height = Me.Height + offsetTop
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. Есть две кнопки с именами btnAddClass и btnRemoveClass с Top, установленными на 42

Высота offset между элементами управления и кнопками составляет 30.

Чтобы добавить новые элементы управления, просто l oop над каждым элементом управления, создайте новый и установите его Top равным существующему значению Top элемента управления + смещение (т.е. 30). В то же время вы сдвигаете кнопки вниз на 30 и увеличиваете высоту пользовательской формы на 30.

Чтобы удалить элементы управления, вы получаете последнюю строку, проверяя свойство Top относительно btnAddClass. Затем вы удаляете эти элементы управления и смещаете кнопки вверх на 30 и уменьшаете высоту пользовательской формы на 30.

...