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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow