Sök…
Syntax
- Identifieringsnamn [ argument ]
- Call IdentifierName [ (argument) ]
- [Låt | Ställ] expression = Identifieringsnamn [ (argument) ]
- [Let | Set] IdentifierName [ (argumenter) ] = uttryck
parametrar
Parameter | Info |
---|---|
IdentifierName | Namnet på proceduren att ringa. |
argument | En kommaseparerad lista med argument som ska överföras till proceduren. |
Anmärkningar
De två första syntaxerna är avsedda att anropa Sub
procedurer; Observera att den första syntaxen inte innehåller parenteser.
Se Detta är förvirrande. Varför inte bara använda parenteser? för en grundlig förklaring av skillnaderna mellan de två första syntaxerna.
Den tredje syntaxen är för att ringa procedurer för Function
och Property Get
; när det finns parametrar är parenteserna alltid obligatoriska. Let
nyckelordet är valfritt vid tilldelning av ett värde , men Set
nyckelordet krävs vid tilldelning av en referens .
Den fjärde syntaxen är för att anropa procedurer för Property Let
och Property Set
; expression
till höger om tilldelningen överförs till egenskapens värdeparameter.
Implicit samtalssyntax
ProcedureName
ProcedureName argument1, argument2
Ring en procedur med namnet utan parenteser.
Kanten fall
Den Call
nyckelordet krävs bara en kant fall:
Call DoSomething : DoSomethingElse
DoSomething
och DoSomethingElse
är procedurer som kallas. Om nyckelordet Call
togs bort skulle DoSomething
tolkas som en radetikett snarare än ett procedursamtal, vilket skulle bryta koden:
DoSomething: DoSomethingElse 'only DoSomethingElse will run
Returnera värden
För att hämta resultatet av ett procedursamtal (t.ex. Function
eller Property Get
procedurer), placera samtalet till höger om en uppgift:
result = ProcedureName
result = ProcedureName(argument1, argument2)
Parenteser måste finnas när det finns parametrar. Om proceduren inte har några parametrar är parenteserna överflödiga.
Detta är förvirrande. Varför inte bara alltid använda parenteser?
Parenteser används för att bifoga argument för funktionssamtal . Att använda dem för procedursamtal kan orsaka oväntade problem.
Eftersom de kan införa buggar, både vid körning genom att överföra ett eventuellt oavsiktligt värde till proceduren och vid sammanställning genom att helt enkelt vara ogiltig syntax.
Körning
Redundanta parenteser kan införa buggar. Med tanke på en procedur som tar en objektreferens som en parameter ...
Sub DoSomething(ByRef target As Range)
End Sub
... och ringde med parenteser:
DoSomething (Application.ActiveCell) 'raises an error at runtime
Detta höjer ett "Objekt obligatoriskt" runtime-fel # 424. Andra fel är möjliga under andra omständigheter: här utvärderas Application.ActiveCell
Range
objektreferensen och passeras efter värde oberoende av procedurens signatur som anger att target
ska passeras ByRef
. Det verkliga värdet som överförs ByVal
till DoSomething
i ovanstående kodstycke är Application.ActiveCell.Value
.
Parenteser tvingar VBA att utvärdera värdet på det parenteserade uttrycket och överföra resultatet ByVal
till den kallade proceduren. När typen av det utvärderade resultatet inte överensstämmer med procedurens förväntade typ och inte implicit kan konverteras, höjs ett körtidfel.
Kompileringen
Denna kod kommer inte att kompilera:
MsgBox ("Invalid Code!", vbCritical)
Eftersom uttrycket ("Invalid Code!", vbCritical)
inte kan utvärderas till ett värde.
Detta skulle sammanställa och fungera:
MsgBox ("Invalid Code!"), (vbCritical)
Men skulle definitivt se dumt ut. Undvik överflödiga parenteser.
Explicit Call Syntax
Call ProcedureName
Call ProcedureName(argument1, argument2)
Den uttryckliga samtalssyntaxen kräver sökordet Call
och parenteser runt argumentlistan; parenteser är överflödiga om det inte finns några parametrar. Denna syntax gjordes föråldrad när den mer moderna implicita samtalssyntaxen lades till VB.
Valfritt argument
Vissa förfaranden har frivilliga argument. Valfria argument kommer alltid efter nödvändiga argument, men proceduren kan kallas utan dem.
Till exempel, om funktionen ProcedureName
skulle ha två obligatoriska argument ( argument1
, argument2
) och ett valfritt argument, optArgument3
, kan det kallas minst fyra sätt:
' 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")
Strukturen för funktionshuvudet som kallas här skulle se ut så här:
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String) As String
Det Optional
nyckelordet indikerar att detta argument kan utelämnas. Som nämnts tidigare - alla valfria argument som införts i rubriken måste visas i slutet, efter eventuella nödvändiga argument.
Du kan också ange ett standardvärde för argumentet i det fall att ett värde inte skickas till funktionen:
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String = "C") As String
I den här funktionen, om argumentet för c
inte tillhandahålls kommer värdet som standard att vara "C"
. Om levereras ett värde då detta kommer att åsidosätta standardvärdet.