Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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
27 déc. 2007 à 22:34
27 déc. 2007 à 16:33
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.
27 déc. 2007 à 09:20
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