Vendredi 26 août 2005
5
26
/08
/Août
/2005
00:00
Ces quelques remarques sont issues d' une réponse que j'ai fait un jour à Chti160 sur XLD à propos de la façon d'appeler une procédure en lui passant des paramètres
Peux tu me dire si dans cette expression, les parentheses sont utiles ou pas
expression.AutoFill (Destination, Type) et si oui quelle est leurs signification
Non, ici les parenthèses ne sont pas utiles (quoique, on verra quelques lignes plus bas)
En fait, quand on appelle une procédure (ou une méthode) qui ne renvoie aucune valeur, et qu'on lui passe des paramètres, il n'y a pas à mettre les parenthèses
Ex :
Sub Appel(V As Double)
'...
End Sub
Sub Test()
Dim D as Double
Appel D
End Sub
Mais si on appelle une fonction (donc une procédure qui renvoie une valeur) et qu'on lui passe des paramètres, ceux-ci doivent être placés entre parenthèses
Ex :
Function Appel(V As Double) As Double
'...
End Function
Sub Test()
Dim D as Double, F as Double
F = Appel(D)
End Sub
Maintenant, petite astuce. Quelquefois, vous voulez appeler la procédure du haut, qui attend un argument Double et dans votre procédure appelante, votre variable est d'un autre type, disons Long. Ca donnera ça :
Sub Appel(V As Double)
'...
End Sub
Sub Test()
Dim D as Long
Appel D
End Sub
Ecrit comme ceci votre programme vous renverra une erreur de compilation, parce que V est un argument par référence, il attend donc une variable Double. La parade à cela pourrait être d'écrire :
Sub Test()
Dim D as Long
Appel Cdbl(D)
End Sub
ou encore plus simplement
Sub Test()
Dim D as Long
Appel (D)
End Sub
On constate que le simple fait de mettre D entre parenthèses rend le transtypage automatique, ou plus exactement, il transmet le paramètre par valeur et non plus par référence, comme l'indique la déclaration de la procédure Appel.
ça marche aussi avec une fonction, en doublant les parenthèses alors :
Function Appel(V As Double) As Double
Appel = V - 3.5
End Function
Sub Test()
Dim D As Long, F As Double
F = Appel((D))
End Sub
Attention toutefois aux effets indésirables : si une variable est passée par référence à une procédure, ça peut être pour accélerer le traitement (parce que ça va plus vite que quand on passe l'argument ByVal), mais ça peut être aussi parce qu'on applique un certain traitement à la variable D définie dans Test, donc qu'on s'attend à ce que celle-ci nous revienne modifiée.
Bon, en général, c'est nous qui écrivons nos macros, nous sommes supposés savoir ce que nous faisons. C'est pourquoi dans le cas ci-dessus, je me simplifierai bien la vie en écrivant directement :
Function Appel(ByVal V As Double) As Double
Appel = V - 3.5
End Function
Mais beaucoup de méthodes intégrées de VBA attendent des arguments par référence, alors l'astuce ci-dessus pourra peut-être vous simplifier la vie un jour, moi ça m'est déjà arrivé.
Ceci dit, pour conclure, lorsqu'on envoie une variable à une autre procédure pour la modifier (comme dans l'exemple 1), je recommanderai plutôt l'écriture sous forme de fonction, comme dans mon deuxième exemple, et alors je pourrai écrire plus simplement :
Function Appel(ByVal V As Double) As Double
'...
End Function
Sub Test()
Dim D as Long, F as Double
F = Appel(D)
End Sub
De plus mon argument D est passé ByVal, il n'y a plus d'erreur à craindre, et le résultat est récupéré dans une variable (F) du bon type cette fois.
Peux tu me dire si dans cette expression, les parentheses sont utiles ou pas
expression.AutoFill (Destination, Type) et si oui quelle est leurs signification
Non, ici les parenthèses ne sont pas utiles (quoique, on verra quelques lignes plus bas)
En fait, quand on appelle une procédure (ou une méthode) qui ne renvoie aucune valeur, et qu'on lui passe des paramètres, il n'y a pas à mettre les parenthèses
Ex :
Sub Appel(V As Double)
'...
End Sub
Sub Test()
Dim D as Double
Appel D
End Sub
Mais si on appelle une fonction (donc une procédure qui renvoie une valeur) et qu'on lui passe des paramètres, ceux-ci doivent être placés entre parenthèses
Ex :
Function Appel(V As Double) As Double
'...
End Function
Sub Test()
Dim D as Double, F as Double
F = Appel(D)
End Sub
Maintenant, petite astuce. Quelquefois, vous voulez appeler la procédure du haut, qui attend un argument Double et dans votre procédure appelante, votre variable est d'un autre type, disons Long. Ca donnera ça :
Sub Appel(V As Double)
'...
End Sub
Sub Test()
Dim D as Long
Appel D
End Sub
Ecrit comme ceci votre programme vous renverra une erreur de compilation, parce que V est un argument par référence, il attend donc une variable Double. La parade à cela pourrait être d'écrire :
Sub Test()
Dim D as Long
Appel Cdbl(D)
End Sub
ou encore plus simplement
Sub Test()
Dim D as Long
Appel (D)
End Sub
On constate que le simple fait de mettre D entre parenthèses rend le transtypage automatique, ou plus exactement, il transmet le paramètre par valeur et non plus par référence, comme l'indique la déclaration de la procédure Appel.
ça marche aussi avec une fonction, en doublant les parenthèses alors :
Function Appel(V As Double) As Double
Appel = V - 3.5
End Function
Sub Test()
Dim D As Long, F As Double
F = Appel((D))
End Sub
Attention toutefois aux effets indésirables : si une variable est passée par référence à une procédure, ça peut être pour accélerer le traitement (parce que ça va plus vite que quand on passe l'argument ByVal), mais ça peut être aussi parce qu'on applique un certain traitement à la variable D définie dans Test, donc qu'on s'attend à ce que celle-ci nous revienne modifiée.
Bon, en général, c'est nous qui écrivons nos macros, nous sommes supposés savoir ce que nous faisons. C'est pourquoi dans le cas ci-dessus, je me simplifierai bien la vie en écrivant directement :
Function Appel(ByVal V As Double) As Double
Appel = V - 3.5
End Function
Mais beaucoup de méthodes intégrées de VBA attendent des arguments par référence, alors l'astuce ci-dessus pourra peut-être vous simplifier la vie un jour, moi ça m'est déjà arrivé.
Ceci dit, pour conclure, lorsqu'on envoie une variable à une autre procédure pour la modifier (comme dans l'exemple 1), je recommanderai plutôt l'écriture sous forme de fonction, comme dans mon deuxième exemple, et alors je pourrai écrire plus simplement :
Function Appel(ByVal V As Double) As Double
'...
End Function
Sub Test()
Dim D as Long, F as Double
F = Appel(D)
End Sub
De plus mon argument D est passé ByVal, il n'y a plus d'erreur à craindre, et le résultat est récupéré dans une variable (F) du bon type cette fois.
Par Ti
-
Publié dans : Sur Excel
Ecrire un commentaire 0 - Voir le commentaire - Voir les 0 commentaires
Ecrire un commentaire 0 - Voir le commentaire - Voir les 0 commentaires
Commentaires