从用户窗体中删除dynamic添加的控件

我有一个Excel的用户窗体dynamic添加checkbox。 我很早就join了checkbox,代码如下所示:

Set chkBox = Me.Controls.Add("Forms.Checkbox.1", "Checkbox" & i) 

之后,我想删除所有这些checkbox。 我试着这个代码:

  Dim j As Integer 'Remove all dynamically updated checkboxes For Each cont In Me.Controls For j = 1 To NumControls If cont.Name = "Checkbox" & j Then Me.Controls.Remove ("Checkbox" & j) End If Next j Next cont 

但是收到以下错误信息: 错误信息

任何帮助将不胜感激。

一个更好的方法可能是跟踪你创build的控件(例如在一个集合中),并用它来删除它们。

这样你的代码就不会被绑定到名称格式上,也可以应用到其他控件types。

 Private cbxs As Collection Private Sub UserForm_Initialize() Set cbxs = New Collection End Sub ' Remove all dynamicly added Controls Private Sub btnRemove_Click() Dim i As Long Do While cbxs.Count > 0 Me.Controls.Remove cbxs.Item(1).Name cbxs.Remove 1 Loop End Sub ' Add some Controls, example for testing purposes Private Sub btnAdd_Click() Dim i As Long Dim chkBox As Control For i = 1 To 10 Set chkBox = Me.Controls.Add("Forms.CheckBox.1", "SomeRandomName" & i) chkBox.Top = 40 + i * 20 chkBox.Left = 20 cbxs.Add chkBox, chkBox.Name ' <-- populate tracking collection Next ' Demo that it works for other control types For i = 1 To 10 Set chkBox = Me.Controls.Add("Forms.ListBox.1", "SomeOtherRandomName" & i) chkBox.Top = 40 + i * 20 chkBox.Left = 60 chkBox.Add chkBox, chkBox.Name Next End Sub 

如果你已经知道控件的名称,types和多less,为什么双循环?

注意只能删除在运行时创build的控件。

 'the following removes all controls created at runtime Dim i As Long On Error Resume Next With Me.Controls For i = .Count - 1 to 0 step -1 .Remove i Next i End With Err.Clear: On Error GoTo 0 

并为你的情况:“如果所有的命名是正确的

 Dim j& For j = 1 To NumControls Me.Controls.Remove "Checkbox" & j Next j 

添加一个检查控制似乎解决这个问题。 不完全确定为什么,但它的工作原理。

  Dim j As Integer 'Remove all dynamically updated checkboxes For Each cont In Me.Controls If TypeName(cont) = "CheckBox" Then For j = 1 To NumControls If cont.Name = "Checkbox" & j Then Me.Controls.Remove cont.Name Exit For End If Next j End If Next cont 

假设没有其他控件名称以“checkbox”开头,

 For Each cont In Me.Controls If InStr(cont.Name, "Checkbox") = 1 Then Me.Controls.Remove cont.Name End If Next cont