When a call is made to a Sub or Function Procedure, you can supply Arguments in the exact order they appear in the Procedure's definition, or you can supply them in any position by name. To illustrate this point, I'll use a fictitious Function called fCalculateInterest() which accepts 3 Arguments (Currency, Single, and Long) and returns a value of type Currency.
-
Public Function fCalculateInterest(curPrincipal As Currency, sngRate As Single, lngTermInMonths As Long) As Currency
-
fCalculateInterest = curPrincipal * sngRate * lngTermInMonths
-
End Function
-
A simple Call to this Function would be:
-
Dim curInterest As Currency
-
curInterest = fCalculateInterest(100000,.0725, 240)
-
The above Function was called by supplying its Arguments in the correct positions, each delimited by a comma. If the positions of the Arguments change, you may either get a Data Type mismatch Error, or erroneous results. By the use of Named Arguments, you can supply the Arguments by name without any regard to position. A Named Argument consists of an Argument name followed by by a Colon and an Equal Sign (:=). We will now call that very same Function but this time reversing the positions of Arguments:
-
Dim curInterest As Curremcy
-
curInterest = fCalculateInterest(lngTermInMonths:=240, sngRate:=.0725, curPrincipal:=100000)
-
Named Arguments are extremely useful when you are calling a Procedure that has Optional Arguments. If you use Named Arguments, you don't have to include commas to denote missing position Arguments, if you don't use them, you must. The following Sub Procedure will illustrate my point, It accepts 4 Arguments, 3 of which are Optional (String, Long, Boolean).
-
Private Sub TestArgs(Arg1 As Integer, Optional Arg2 As String, Optional Arg3 As Long, Optional Arg4 As Boolean)
-
End Sub
-
A typical call to this Sub Procedure would be as follows:
-
Call TestArgs(1234, "Argument2", 999999, False)
-
If you wanted to call TestArgs without passing the 2nd and 3rd Optional Arguments, and without using Named Arguments, the syntax would be:
- Call TestArgs(1234,,,False)
If you wanted to call TestArgs without passing the 2nd and 3rd Optional Arguments, and use Named Arguments, without regard to the positions of the Arguments, the syntax would be:
- Call TestArgs(Arg4:=False, Arg1:=1234)
NOTE: As a more realistic and practical example, and as suggested by Mary, I've included an example using the popular SendObject() Method. All Arguments of this method were used, except [TemplateFile], and their standard positions within this Method were modified. This was only possible by using this weeks Tip, Named Arguments:
-
DoCmd.SendObject OutputFormat:=acFormatXLS, ObjectName:="tblEmployeePFD", _
-
ObjectType:=acSendTable, Subject:="Named Arguments", Bcc:="Joe Dunn", _
-
To:="Tom Jones", CC:="Chris Myers", EditMessage:=False, _ MessageText:="Demonstration of the Usage of Named Arguments"
-
The morale of the story is: Is is very advantageous to use Named Arguments, especially when utilizing Optional Arguments.