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.


 
Par Ti - Publié dans : Sur Excel
Ecrire un commentaire - Voir les 0 commentaires
Retour à l'accueil

Catégories

Recommander

Recherche

Créer un blog gratuit sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus