Ricerca…
Sintassi
- IdentifierName [ argomenti ]
- Call IdentifierName [ (argomenti) ]
- [Let | Set] expression = IdentifierName [ (argomenti) ]
- [Let | Set] IdentifierName [ (argomenti) ] = espressione
Parametri
Parametro | Informazioni |
---|---|
IdentifierName | Il nome della procedura da chiamare. |
argomenti | Un elenco di argomenti separati da virgola da passare alla procedura. |
Osservazioni
Le prime due sintassi servono per chiamare le procedure Sub
; notare che la prima sintassi non prevede parentesi.
Vedi Questo è confuso. Perché non usare sempre le parentesi? per una spiegazione approfondita delle differenze tra le prime due sintassi.
La terza sintassi serve per chiamare le procedure Function
e Property Get
; quando ci sono parametri, le parentesi sono sempre obbligatorie. La parola chiave Let
è facoltativa quando si assegna un valore , ma la parola chiave Set
è necessaria quando si assegna un riferimento .
Quarta sintassi per chiamare le procedure Property Let
e Property Set
; l' expression
sul lato destro dell'assegnazione viene passata al parametro del valore della proprietà.
Sintassi di chiamata implicita
ProcedureName
ProcedureName argument1, argument2
Chiamare una procedura con il suo nome senza parentesi.
Edge case
La parola chiave Call
è richiesta solo in un caso limite:
Call DoSomething : DoSomethingElse
DoSomething
e DoSomethingElse
sono le procedure che vengono chiamate. Se la parola chiave Call
stata rimossa, allora DoSomething
sarebbe stato analizzato come un'etichetta di linea anziché come una chiamata di procedura, che avrebbe interrotto il codice:
DoSomething: DoSomethingElse 'only DoSomethingElse will run
Valori di ritorno
Per recuperare il risultato di una chiamata di procedura (ad esempio, procedure Function
o Property Get
), mettere la chiamata sul lato destro di un incarico:
result = ProcedureName
result = ProcedureName(argument1, argument2)
Le parentesi devono essere presenti se ci sono dei parametri. Se la procedura non ha parametri, le parentesi sono ridondanti.
Questo è confusionario. Perché non usare sempre le parentesi?
Le parentesi sono usate per racchiudere gli argomenti delle chiamate di funzione . Usarli per le chiamate di procedura può causare problemi imprevisti.
Perché possono introdurre bug, sia in fase di esecuzione, passando un valore probabilmente non intenzionale alla procedura, sia in fase di compilazione semplicemente essendo una sintassi non valida.
Run-time
Le parentesi ridondanti possono introdurre bug. Data una procedura che accetta un riferimento a un oggetto come parametro ...
Sub DoSomething(ByRef target As Range)
End Sub
... e chiamato con parentesi:
DoSomething (Application.ActiveCell) 'raises an error at runtime
Ciò solleverà un errore di runtime "Object Required" n. 424. Altri errori sono possibili in altre circostanze: qui il riferimento all'oggetto Range
Application.ActiveCell
viene valutato e passato per valore indipendentemente dalla firma della procedura che specifica che la target
sarà passata ByRef
. Il valore effettivo passato da ByVal
a DoSomething
nello snippet sopra riportato è Application.ActiveCell.Value
.
Le parentesi costringono VBA a valutare il valore dell'espressione tra parentesi e passano il risultato ByVal
alla procedura chiamata. Quando il tipo del risultato valutato non corrisponde al tipo previsto della procedura e non può essere convertito in modo implicito, viene generato un errore di runtime.
A tempo di compilazione
Questo codice non riuscirà a compilare:
MsgBox ("Invalid Code!", vbCritical)
Poiché l'espressione ("Invalid Code!", vbCritical)
non può essere valutata su un valore.
Questo potrebbe compilare e lavorare:
MsgBox ("Invalid Code!"), (vbCritical)
Ma sicuramente sembrerebbe sciocco. Evitare parentesi ridondanti.
Sintassi di chiamata esplicita
Call ProcedureName
Call ProcedureName(argument1, argument2)
La sintassi esplicita della chiamata richiede la parola chiave Call
e le parentesi attorno all'elenco degli argomenti; le parentesi sono ridondanti se non ci sono parametri. Questa sintassi è stata resa obsoleta quando la sintassi di chiamata implicita più moderna è stata aggiunta a VB.
Argomenti opzionali
Alcune procedure hanno argomenti opzionali. Gli argomenti opzionali vengono sempre dopo gli argomenti richiesti, ma la procedura può essere chiamata senza di essi.
Ad esempio, se la funzione, ProcedureName
avesse due argomenti richiesti ( argument1
, argument2
) e un argomento facoltativo, optArgument3
, potrebbe essere chiamato almeno in quattro modi:
' 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 struttura dell'intestazione della funzione che viene chiamata qui sarà simile a questa:
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String) As String
La parola chiave Optional
indica che questo argomento può essere omesso. Come accennato in precedenza, qualsiasi argomento opzionale introdotto nell'intestazione deve apparire alla fine, dopo ogni argomento richiesto.
È inoltre possibile fornire un valore predefinito per l'argomento nel caso in cui non venga passato un valore alla funzione:
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String = "C") As String
In questa funzione, se l'argomento per c
non viene fornito, il suo valore verrà impostato su "C"
. Se viene fornito un valore, questo sostituirà il valore predefinito.