如何一次删除一个动态添加的用户窗体控件?

How to remove dynamically added userform controls one at a time?

我正在构建一个锻炼记录应用程序,允许用户在用户表单为 运行 时添加动作、重复次数和相关重量。 (您也可以将其视为 "order-picking",例如“3”"red""pencils"、“2”[​​=28=]"markers" 等)

单击“+”按钮时,代码添加了两个文本框和组合框。

单击“-”按钮时,只会删除最后添加的控件组,但如果再次单击“-”按钮,我将收到 "Catastrophic Failure" 错误消息。

我很确定这些控件需要使用 controls.remove (object).name 删除,但是一旦最后一组被删除,我需要将对象变量更新到下一个可以删除的组,我'我在挣扎。

我在这里找到了类似的问题和答案,但那些删除了所有用户窗体控件。我只想删除最后添加的组。

Option Explicit
Public movementCounter As Integer
Public repsTextBox As Object
Public movementComboBox As Object
Public weightTextBox As Object
Public cntrlsColl As Collection

Private Sub addMvmtCmndButt_Click()

    movementCounter = movementCounter + 1

    Set repsTextBox = Controls.Add("Forms.TextBox.1")
    Set movementComboBox = Controls.Add("Forms.ComboBox.1")
    Set weightTextBox = Controls.Add("Forms.TextBox.1")

    With repsTextBox
        .Name = "RepsTextBox" & movementCounter
        .Height = 18
        .Width = 45
        .Left = 10
        .Top = 30 * (movementCounter - 1) + 5
    End With

    With movementComboBox
        .Name = "MovementComboBox" & movementCounter
        .Height = 18
        .Width = 90
        .Left = 65
        .Top = 30 * (movementCounter - 1) + 5
        .RowSource = listsSht.Range("movementList").Address
    End With

    With weightTextBox
        .Name = "WeightTextBox" & movementCounter
        .Height = 18
        .Width = 45
        .Left = 165
        .Top = 30 * (movementCounter - 1) + 5
    End With

End Sub

Private Sub deleteMvmtCmndButt_Click()

'Works, but only for the most recently added group of controls
    With Me.Controls
        .Remove repsTextBox.Name
        .Remove movementComboBox.Name
        .Remove weightTextBox.Name
    End With

'update what the next group of controls will be on-deck
'    If movementCounter > 0 Then
'        repsTextBox.Name = "RepsTextBox" & movementCounter
'        movementComboBox.Name = "MovementComboBox" & movementCounter
'        weightTextBox.Name = "WeightTextBox" & movementCounter
'    End If

End Sub

试试下面的代码...

Private Sub deleteMvmtCmndButt_Click()

    If movementCounter > 0 Then
        With Me.Controls
            .Remove "RepsTextBox" & movementCounter
            .Remove "MovementComboBox" & movementCounter
            .Remove "WeightTextBox" & movementCounter
        End With
        movementCounter = movementCounter - 1
    End If

End Sub

希望对您有所帮助!