Remove Dynamically Added Controls from Userform

帅比萌擦擦* 提交于 2019-11-30 03:20:26

问题


I have an excel Userform with dynamically added checkboxes. I add the checkboxes early on with code that looks like this:

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

Later, I want to remove all of these checkboxes. I'm trying this code:

    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

But am getting the following error message:

any help would be greatly appreciated.


回答1:


A better approach may be to keep track of the controls you create (eg in a collection), and use that to remove them.

This way your code is not bound to the name format, and can be applied to other control types too.

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



回答2:


Assuming there are no othe control names starting with "Checkbox",

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



回答3:


if you already know the name of the controls, the type, and how many, why double loop ?

note that ONLY controls created at runtime can be removed.

'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

and for your case : 'if all naming are correct

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



回答4:


Adding a check for the control seemed to fix this. Not entirely sure why, but it works.

   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



回答5:


I rewrote the original code using command buttons, and just added "Me.Controls.Count" rather than "NumControls" and defined "Cont" as a Control. It seems to be working for me. Please let me know if this works for you:

-->

On Error Resume Next
Dim Cont As Control
Dim C As Integer
'Remove all dynamically updated checkboxes
For Each Cont In Me.Controls
    For C = 1 To Me.Controls.Count
    If Cont.Name = "CommandButton" & C Then
        Me.Controls.Remove ("CommandButton" & C)
    End If
    Next C
Next Cont


来源:https://stackoverflow.com/questions/27790320/remove-dynamically-added-controls-from-userform

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!