DONNER UNE VALEUR À L'ENSEMBLE D'UN MÊME TYPE DE CONTROLE

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 27 déc. 2007 à 09:20
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 27 déc. 2007 à 22:34
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45198-donner-une-valeur-a-l-ensemble-d-un-meme-type-de-controle

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 déc. 2007 à 22:34
pour le = Nothing final, c'est juste pour 'faire propre' mais VB le fera de lui même dès que l'on sortira de la portée de la variable.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
27 déc. 2007 à 16:33
Bonjour Renfield,

Merçi... que des bonnes remarques ! J'ai modifié la fonction en conséquence.

Après essais, il n'y a aucun problème pour mettre la propriété Picture des PictureBoxes à Nothing, en gardant VbLet. J'ai trouvé peu d'information sur ces constantes (VbSet, VBGet, VBLet et Vbmethod). D'après mes tests, VBLet passe un peu près partout, sauf si on veut faire un "Move" avec CallByName, où là il faudrait VBMethod. A priori, on utilise rarement ces possibilités, c'est pour cela que je les laisse de côté. Mais si on veut vraiment être complet, il me semble qu'il faudrait faire les 4 syntaxes avec les constantes précédentes, accompagné d'un traitement d l'erreur avec ON ERROR RESUME NEXT... car il me semble qu'il ne peut exister qu'une seule bonne constante selon la "propriété" choisie.

J'ai regardé pour VB6. En effet, il faut Object au lieu de Userform. Mais, il existe un autre problème qui différencie VBA de VB6. En effet, il n'est pas possible de lister directement les contrôles contenus dans une FRAME avec VB6, contrairement à VBA... Finalement, VBA est beaucoup plus souple sur ce point. En VB6, je suis obligé de passer par CONTAINER pour obtenir un résultat identique, et au prix d'une nouvelle variable... La fonction donne ceci :

=

Property Let TypeControl(oObjet As Object, NameContainer As String, NameControl As String, _
NamePropriete As String, ValuePropriete As Variant)
' DONNE UNE VALEUR A UNE PROPRIETE A L'ENSEMBLE D'UN TYPE DE CONTROLE

Dim cTypeControl As Control

For Each cTypeControl In oObjet.Controls
If StrComp(TypeName(cTypeControl), NameControl, vbTextCompare) = 0 Then
If NameContainer = vbNullString Then
CallByName cTypeControl, NamePropriete, VbLet, ValuePropriete
Else
On Error Resume Next
If StrComp(cTypeControl.Container, NameContainer, vbTextCompare) = 0 Then
If Err = 0 Then CallByName cTypeControl, NamePropriete, VbLet, ValuePropriete
End If
End If
End If
Next

End Property

=

pour l'utiliser :
TypeControl(Me, vbNullString, "picturebox", "picture") = Nothing

(Voir les sources en téléchargement)

On mettra vbnullstring ou "", quand on veut que tous les contrôles de la feuille soient modifiés. Si on veut qu'une partie, on indiquera le "Conteneur", Frame1 par exemple.

CallByName existe aussi en VB2005, je verrai si une adaptation est possible.

=

Petite question pour éclairer ma lanterne... Quand "Set cTypeControl = Nothing" est utile et quand c'est pas utile. Dans les snippets, je vois bien souvent cette ligne en utilisation avec les FOR EACH...

Amicalement,
Us.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 déc. 2007 à 09:20
Pas mal, ca montre le peu connu CallByName en action...

le Set cTypeControl = Nothing est inutile
en remplacant le 'As UserForm' par 'As Object', ton snippet serait compatible VB6.

enfin, favorise:
If StrCmp(TypeName(cTypeControl), NameControl, vbTextCompare)=0 Then
à
If UCase(TypeName(cTypeControl)) = UCase(NameControl) Then

après, on pourrais imaginer la présenter ainsi:
Property Let TypeControl(oObjet As UserForm, NameControl As String, _
NamePropriete As String, ValuePropriete As Variant)

et faire :
TypeControl(UserForm1, "Textbox", "value")= vbNullString

gaffe aussi au fait que la propriété pourrait être de type object. Un VbSet serait alors nécessaire...
imaginons par exemple un Set global sur un ensemble de PictureBoxes pour remettre leur propriété Picture à Nothing
Rejoignez-nous