VBA
Appels de procédure
Recherche…
Syntaxe
- IdentifierName [ arguments ]
- Call IdentifierName [ (arguments) ]
- [Let | Set] expression = IdentifierName [ (arguments) ]
- [Let | Set] IdentifierName [ (arguments) ] = expression
Paramètres
Paramètre | Info |
---|---|
IdentifiantNom | Le nom de la procédure à appeler. |
arguments | Une liste d'arguments séparés par des virgules à transmettre à la procédure. |
Remarques
Les deux premières syntaxes servent à appeler des procédures Sub
; Notez que la première syntaxe n'implique pas de parenthèses.
Voir c'est déroutant. Pourquoi ne pas toujours utiliser les parenthèses? pour une explication approfondie des différences entre les deux premières syntaxes.
La troisième syntaxe consiste à appeler les procédures Function
et Property Get
; lorsqu'il y a des paramètres, les parenthèses sont toujours obligatoires. Le mot clé Let
est facultatif lors de l'attribution d'une valeur , mais le mot clé Set
est requis lors de l'attribution d'une référence .
La quatrième syntaxe consiste à appeler les procédures Property Let
et Property Set
; l' expression
à droite de l'affectation est transmise au paramètre value de la propriété.
Syntaxe d'appel implicite
ProcedureName
ProcedureName argument1, argument2
Appelez une procédure par son nom sans parenthèses.
Boîtier Edge
Le mot-clé d' Call
n'est requis que dans un seul cas:
Call DoSomething : DoSomethingElse
DoSomething
et DoSomethingElse
sont des procédures appelées. Si le mot-clé Call
été supprimé, alors DoSomething
sera analysé sous la forme d'une étiquette de ligne plutôt que d'un appel de procédure, ce qui briserait le code:
DoSomething: DoSomethingElse 'only DoSomethingElse will run
Valeurs de retour
Pour récupérer le résultat d'un appel de procédure (par exemple, les procédures Function
ou Property Get
), placez l'appel sur le côté droit d'une affectation:
result = ProcedureName
result = ProcedureName(argument1, argument2)
Les parenthèses doivent être présentes s'il y a des paramètres. Si la procédure n'a pas de paramètres, les parenthèses sont redondantes.
Ceci est déroutant. Pourquoi ne pas toujours utiliser les parenthèses?
Les parenthèses sont utilisées pour inclure les arguments des appels de fonction . Leur utilisation pour les appels de procédure peut provoquer des problèmes inattendus.
Parce qu'ils peuvent introduire des bogues, à la fois en exécutant en transmettant une valeur éventuellement non intentionnelle à la procédure, et à la compilation en étant simplement une syntaxe non valide.
Temps d'exécution
Les parenthèses redondantes peuvent introduire des bogues. Étant donné une procédure qui prend une référence d'objet comme paramètre ...
Sub DoSomething(ByRef target As Range)
End Sub
... et appelé avec des parenthèses:
DoSomething (Application.ActiveCell) 'raises an error at runtime
Cela provoquera une erreur d'exécution "Object Required" # 424. D'autres erreurs sont possibles dans d'autres circonstances: ici, la référence d'objet Application.ActiveCell
Range
est en cours d' évaluation et transmise par valeur, quelle que soit la signature de la procédure spécifiant que la target
serait transmise ByRef
. La valeur réelle transmise à DoSomething
par ByVal
dans l'extrait de DoSomething
ci-dessus est Application.ActiveCell.Value
.
Les parenthèses forcent VBA à évaluer la valeur de l'expression entre crochets et à transmettre le résultat ByVal
à la procédure appelée. Lorsque le type du résultat évalué ne correspond pas au type attendu de la procédure et ne peut pas être converti implicitement, une erreur d'exécution est générée.
Compiler-temps
Ce code ne pourra pas être compilé:
MsgBox ("Invalid Code!", vbCritical)
Parce que l'expression ("Invalid Code!", vbCritical)
ne peut pas être évaluée à une valeur.
Cela compilerait et fonctionnerait:
MsgBox ("Invalid Code!"), (vbCritical)
Mais serait vraiment idiot. Évitez les parenthèses redondantes.
Syntaxe d'appel explicite
Call ProcedureName
Call ProcedureName(argument1, argument2)
La syntaxe d'appel explicite requiert le mot-clé Call
et les parenthèses autour de la liste d'arguments; les parenthèses sont redondantes s'il n'y a pas de paramètres. Cette syntaxe a été rendue obsolète lorsque la syntaxe d'appel implicite plus moderne a été ajoutée à VB.
Arguments optionnels
Certaines procédures ont des arguments facultatifs. Les arguments facultatifs viennent toujours après les arguments requis, mais la procédure peut être appelée sans eux.
Par exemple, si la fonction ProcedureName
devait avoir deux arguments obligatoires ( argument1
, argument2
) et un argument optionnel, optArgument3
, elle pourrait être appelée au moins de quatre manières:
' Without optional argument
result = ProcedureName("A", "B")
' With optional argument
result = ProcedureName("A", "B", "C")
' Using named arguments (allows a different order)
result = ProcedureName(optArgument3:="C", argument1:="A", argument2:="B")
' Mixing named and unnamed arguments
result = ProcedureName("A", "B", optArgument3:="C")
La structure de l'en-tête de la fonction appelée ici ressemblerait à ceci:
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String) As String
Le mot clé Optional
indique que cet argument peut être omis. Comme mentionné précédemment, tous les arguments facultatifs introduits dans l'en-tête doivent apparaître à la fin, après tous les arguments requis.
Vous pouvez également fournir une valeur par défaut pour l'argument si une valeur n'est pas transmise à la fonction:
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String = "C") As String
Dans cette fonction, si l'argument pour c
n'est pas fourni, sa valeur par défaut sera "C"
. Si une valeur est fournie, cela remplacera la valeur par défaut.