删除用户表单中动态创建的文本框的问题

Issue with deleting dynamically created textboxes in a userform

我的问题涉及在我的用户窗体上动态删除文本框。在用户窗体上有一个旋转按钮,用户可以使用它来自行创建文本框。当我向上旋转旋转按钮时,它会创建最多我设置的最大数量的文本框。但是,当我向后旋转按钮时,它只会删除最近创建的文本框,不会再删除。

创建盒子的代码如下

Private Sub AgendaFromBox_Change()
Dim BoxValue As Integer
BoxValue = AgendaFromBox.Value
    If BoxValue > 10 Then
        AgendaFromBox.Value = 10
        Exit Sub
    End If
    If BoxValue = 0 Then
        Exit Sub
    End If
Dim NewBox As Control
Dim NewLabel As Control
For i = 1 To BoxValue
Set NewBox = Me.Controls.Add("Forms.Textbox.1")
Set NewLabel = Me.Controls.Add("Forms.Label.1")
    With NewBox
        .Name = "AgendaBox" & i
        .Top = 100 + 30 * i
        .Left = 20
        .Width = 100
        .Height = 20
        .ControlSource = "'Hidden'!C" & 2 + i
    End With
    With NewLabel
        .Name = "AgendaLabel" & i
        .Top = 100 + 30 * i
        .Left = 5
        .Width = 14
        .Height = 20
        .Caption = i & "."
    End With
Worksheets("Hidden").Range("B" & 2 + i) = i
Next i

NumOutBefore = BoxValue



End Sub

此代码是链接到旋转按钮的文本框更改事件的一部分。删除框的代码如下

Private Sub AgendaFromSpinner_Change()
AgendaFromBox.Value = AgendaFromSpinner.Value
Dim BoxValue1 As Integer
Static NumOutBefore As Integer
BoxValue1 = AgendaFromBox.Value

If BoxValue1 > 9 Then Exit Sub
If BoxValue1 < 1 Then Exit Sub
If BoxValue1 < NumOutBefore Then
    Controls.Remove "AgendaBox" & i
    Controls.Remove "AgendaLabel" & i
End If

NumOutBefore = AgendaFromSpinner.Value

End Sub

此代码是旋转按钮更改事件的一部分。任何想法或想法都会有所帮助。提前谢谢你。

我认为这就是您的代码中发生的情况。如果您在每个模块的第一行设置一个断点,然后在单击微调器 up/down 按钮后单步执行代码,您应该能够验证这一点:

  1. 微调器从 0 开始
  2. 单击微调器 UP 按钮。
    1. 微调值增加
    2. 框值增加。
    3. AgendaFromBox_Change() 被触发并构建 AgendaBox1
  3. Spinner UP 按钮被点击
    1. 微调值增加
    2. 框值增加。
    3. AgendaFromBox_Change() 被触发并构建 AgendaBox1 & AgendaBox2
      • 您现在有 2Agendabox1
      • 因为 VBA 不喜欢那样,所以第二个自动重命名为
  4. Spinner UP 按钮被点击
    1. 微调值增加
    2. 框值增加。
    3. AgendaFromBox_Change() 被触发并构建 AgendaBox1AgendaBox2AgendaBox3
      • 您现在有 2Agendabox23AgendaBox1
      • VBA 自动重命名重复项
  5. Spinner DOWN 按钮被点击
    1. 微调器值递减
    2. 盒子值递减。
    3. AgendaFromBox_Change() 被触发并构建 另一个 AgendaBox1 & AgendaBox2
      • 您现在有 4AgendaBox1,其中两份具有随机分配的名称和 3AgendaBox2
      • 名称可能不是随机的,但它们不是您所期望的。
    4. AgendaFromSpinner_change()继续执行,删除AgendaBox3
  6. Spinner DOWN 按钮被点击
    1. 微调器值递减
    2. 盒子值递减。
    3. AgendaFromBox_Change() 被触发并构建 另一个 AgendaBox1
      • 您现在有 5AgendaBox1
    4. AgendaFromSpinner_change()继续执行,删除AgendaBox2,但至少还有一个AgendaBox2something仍然可见,所以看起来它没有删除它。

要解决这个问题,应该这样做:

Private Sub AgendaFromBox_Change()
Static BoxValue As Integer
    if BoxValue > AgendaFromBox.Value then
      'we need to update BoxValue no matter what
      BoxValue = AgendaFromBox.Value
      'we're decrementing the spinner - we don't need to do anything else here
      Exit sub
    else
      'we need to update BoxValue no matter what
      BoxValue = AgendaFromBox.Value
    end if
    If BoxValue > 10 Then
        AgendaFromBox.Value = 10
        Exit Sub
    End If
    If BoxValue = 0 Then
        Exit Sub
    End If

Dim NewBox As Control
Dim NewLabel As Control

    Set NewBox = Me.Controls.Add("Forms.Textbox.1")
    Set NewLabel = Me.Controls.Add("Forms.Label.1")
    With NewBox
        .Name = "AgendaBox" & boxvalue
        .Top = 100 + 30 * boxvalue
        .Left = 20
        .Width = 100
        .Height = 20
        .ControlSource = "'Hidden'!C" & 2 + boxvalue
    End With
    With NewLabel
        .Name = "AgendaLabel" & boxvalue
        .Top = 100 + 30 * boxvalue
        .Left = 5
        .Width = 14
        .Height = 20
        .Caption = boxvalue & "."
    End With
    Worksheets("Hidden").Range("B" & 2 + i) = boxvalue

'not sure where this came from or what it does.
'I don't see it declared anywhere
NumOutBefore = BoxValue

End Sub

我的猜测是您没有在模块中声明 Option Explicit 或者 NumOutBefore 在模块顶部公开声明。确保您已声明 Option Explicit - 稍后会省去麻烦