Supprimer ajouter Dynamiquement des Contrôles à partir d'un Userform
J'ai un Userform excel avec ajoutées dynamiquement des cases à cocher. J'ai ajouter les cases dès le début avec un code qui ressemble à ceci:
Set chkBox = Me.Controls.Add("Forms.Checkbox.1", "Checkbox" & i)
Plus tard, je veux enlever tous ces cases à cocher. J'essaie 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:
toute aide serait grandement appréciée.
l'un des problèmes ici sont peut-être les paranthesese " ("Checkbox" & j)"
vérifier à qui j il échoue et vérifier si c'est une case à cocher ajouté au moment de l'exécution et PAS en mode conception
En regardant en arrière, ce qui est probablement corrigé mon code n'était pas le vérifier, mais à la sortie, pour une fois, il a trouvé la bonne. @PatrickLepelletier est probablement vrai, c'est probablement la vérification de la mauvaise case. Cela étant dit, Chris du code ci-dessous devrait corriger ce problème.
je suis revenu à ce poste, seul à me demander pourquoi je ne l'avais pas vu: je fais ce genre de choses avec un
vérifier à qui j il échoue et vérifier si c'est une case à cocher ajouté au moment de l'exécution et PAS en mode conception
En regardant en arrière, ce qui est probablement corrigé mon code n'était pas le vérifier, mais à la sortie, pour une fois, il a trouvé la bonne. @PatrickLepelletier est probablement vrai, c'est probablement la vérification de la mauvaise case. Cela étant dit, Chris du code ci-dessous devrait corriger ce problème.
je suis revenu à ce poste, seul à me demander pourquoi je ne l'avais pas vu: je fais ce genre de choses avec un
On error resume next
OriginalL'auteur ale10ander | 2015-01-06
Vous devez vous connecter pour publier un commentaire.
Une meilleure approche serait de garder la trace des commandes que vous créez (par exemple dans une collection), et de l'utiliser pour les supprimer.
De cette façon, votre code n'est pas lié au format de nom, et peut être appliquée à d'autres types de contrôle.
Thx @L42. Oui, je voudrais utiliser je généralisée nom. Juste gardé pour le rendre plus clair pour l'OP, comment cela se rapporte à son code d'origine
J'apprécie la suggestion! Dans cette application particulière, j'ai voulu supprimer les cases qui ont été créés au moment de l'exécution (et donc à ce schéma de nommage), tout en laissant tous les autres le seul contrôle. Mais vous avez raison, c'est plus propre, et plus générique de code. +1
je ne suis pas sûr, mais ne serait pas une collection de commencer à 0 ?
en fait non, les Articles de la collection commence à 1. (Dictionnaires de l'autre main commence à 0). VBA peut être tout à fait incompatible avec l'index de départ
OriginalL'auteur chris neilsen
En supposant qu'aucun autre contrôle des noms commençant par "Case",
OriginalL'auteur Gene Skuratovsky
si vous connaissez déjà le nom des champs, le type, et combien, pourquoi la double boucle ?
noter que SEULS les contrôles créés lors de l'exécution peut être retiré.
et pour votre cas : "si tout de nommage sont corrects
OriginalL'auteur Patrick Lepelletier
Ajout d'une vérification pour le contrôle semble résoudre ce problème. Pas tout à fait sûr pourquoi, mais ça fonctionne.
La boucle intérieure est en train de vérifier le numéro de chaque contrôle. Dans la boucle externe, j'ai appris à contrôler Un, mais je ne sais pas avec toute certitude que c'est le contrôle de 1. J'ai donc vérifier chaque numéro jusqu'à ce que je trouve le bon numéro.
Ce n'était pas la vérification de contrôle fixe, mais plutôt à la sortie, quand j'ai trouver ce que je cherche, j'ai arrêter de regarder. Il se trouve que mes cases à cocher ont été vérifiées avant toute autre chose. L'on a accepté la réponse est plus stable; il ne repose pas sur la chance 🙂
OriginalL'auteur ale10ander
J'ai réécrit le code d'origine à l'aide de boutons de commande, et ont juste ajouté "Moi.Les contrôles.Le comte" plutôt que "NumControls" et défini "Cont" comme un Contrôle. Il semble fonctionner pour moi. S'il vous plaît laissez-moi savoir si cela fonctionne pour vous:
-->
OriginalL'auteur MrPantsMan