web-dev-qa-db-fra.com

Supprimer les contrôles ajoutés dynamiquement de Userform

J'ai un Userform Excel avec des cases à cocher ajoutées dynamiquement. J'ajoute les cases à cocher avec un code qui ressemble à ceci:

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

Plus tard, je veux supprimer toutes ces cases à cocher. J'essaye ce 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

Mais je reçois le message d'erreur suivant: Error MEssage

toute aide serait grandement appréciée.

9
ale10ander

Une meilleure approche consiste peut-être à garder trace des contrôles que vous créez (par exemple, dans une collection) et à les utiliser pour les supprimer.

De cette façon, votre code n'est pas lié au format du nom et peut également être appliqué à d'autres types de contrôle.

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
12
chris neilsen

si vous connaissez déjà le nom des contrôles, le type et combien, pourquoi double boucle?

notez que seuls les contrôles créés au moment de l'exécution peuvent être supprimés.

'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

et pour votre cas: 'si tous les noms sont corrects

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

En supposant qu’il n’y ait pas d’autres noms de contrôle commençant par "Checkbox",

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

Ajouter un contrôle pour le contrôle semble résoudre ce problème. Pas tout à fait sûr pourquoi, mais ça marche.

   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
1
ale10ander

J'ai réécrit le code original à l'aide de boutons de commande et je viens d'ajouter "Me.Controls.Count" plutôt que "NumControls" et de définir "Cont" comme contrôle. Cela semble fonctionner pour moi. S'il vous plaît laissez-moi savoir si cela fonctionne pour vous:

->

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
0
MrPantsMan