我正在创建一个用户窗体,该窗体具有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
这里是您可以适应的示例。
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
注意:
为了使它正常工作,我需要解释一下设置:
Top
属性设置为12
btnAddClass
和btnRemoveClass
的按钮,其中Top
设置为42
控件和按钮之间的offset
高为30
。
要添加新控件,您只需在每个控件上循环,创建一个新控件,然后将其Top
设置为现有控件Top
值+偏移量(即30)。同时,您将按钮向下移动30并将用户窗体高度增加30。
要删除控件,您可以通过检查Top
相对于btnAddClass
的属性来获取最后一行。然后,您删除这些控件,并将按钮上移30个,并将用户窗体的高度减少30个。