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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow