删除用户表单中动态创建的文本框的问题
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 按钮后单步执行代码,您应该能够验证这一点:
- 微调器从 0 开始
- 单击微调器 UP 按钮。
- 微调值增加
- 框值增加。
AgendaFromBox_Change()
被触发并构建 AgendaBox1
- Spinner UP 按钮被点击
- 微调值增加
- 框值增加。
AgendaFromBox_Change()
被触发并构建 AgendaBox1
& AgendaBox2
- 您现在有 2 份
Agendabox1
。
- 因为 VBA 不喜欢那样,所以第二个自动重命名为
- Spinner UP 按钮被点击
- 微调值增加
- 框值增加。
AgendaFromBox_Change()
被触发并构建 AgendaBox1
、AgendaBox2
和 AgendaBox3
- 您现在有 2 份
Agendabox2
和 3 份 AgendaBox1
- VBA 自动重命名重复项
- Spinner DOWN 按钮被点击
- 微调器值递减
- 盒子值递减。
AgendaFromBox_Change()
被触发并构建 另一个 AgendaBox1
& AgendaBox2
- 您现在有 4 份
AgendaBox1
,其中两份具有随机分配的名称和 3 份 AgendaBox2
- 名称可能不是随机的,但它们不是您所期望的。
AgendaFromSpinner_change()
继续执行,删除AgendaBox3
- Spinner DOWN 按钮被点击
- 微调器值递减
- 盒子值递减。
AgendaFromBox_Change()
被触发并构建 另一个 AgendaBox1
- 您现在有 5 份
AgendaBox1
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
- 稍后会省去麻烦
我的问题涉及在我的用户窗体上动态删除文本框。在用户窗体上有一个旋转按钮,用户可以使用它来自行创建文本框。当我向上旋转旋转按钮时,它会创建最多我设置的最大数量的文本框。但是,当我向后旋转按钮时,它只会删除最近创建的文本框,不会再删除。
创建盒子的代码如下
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 按钮后单步执行代码,您应该能够验证这一点:
- 微调器从 0 开始
- 单击微调器 UP 按钮。
- 微调值增加
- 框值增加。
AgendaFromBox_Change()
被触发并构建AgendaBox1
- Spinner UP 按钮被点击
- 微调值增加
- 框值增加。
AgendaFromBox_Change()
被触发并构建AgendaBox1
&AgendaBox2
- 您现在有 2 份
Agendabox1
。 - 因为 VBA 不喜欢那样,所以第二个自动重命名为
- 您现在有 2 份
- Spinner UP 按钮被点击
- 微调值增加
- 框值增加。
AgendaFromBox_Change()
被触发并构建AgendaBox1
、AgendaBox2
和AgendaBox3
- 您现在有 2 份
Agendabox2
和 3 份AgendaBox1
- VBA 自动重命名重复项
- 您现在有 2 份
- Spinner DOWN 按钮被点击
- 微调器值递减
- 盒子值递减。
AgendaFromBox_Change()
被触发并构建 另一个AgendaBox1
&AgendaBox2
- 您现在有 4 份
AgendaBox1
,其中两份具有随机分配的名称和 3 份AgendaBox2
- 名称可能不是随机的,但它们不是您所期望的。
- 您现在有 4 份
AgendaFromSpinner_change()
继续执行,删除AgendaBox3
- Spinner DOWN 按钮被点击
- 微调器值递减
- 盒子值递减。
AgendaFromBox_Change()
被触发并构建 另一个AgendaBox1
- 您现在有 5 份
AgendaBox1
- 您现在有 5 份
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
- 稍后会省去麻烦