Arguments to procedures in VBA can be optional, and optionally they can have a default value. For example
Public Function create(par As cDataRow, colNum As Long, rCell As Range, _ Optional keepFresh As Boolean = False, _ Optional v As Variant) As cCell
We can also test for the presence of a variant argument by using isMissing(). See Getting Started with argument passing for how all this works in VBA
If IsMissing(v) Then pValue = rCell.Value Else pValue = v End If
In javaScript though, all arguments are optional. Consider this
function a ( arg1, arg2) { ... }
There would be no complaints if you called this function with 0, 1 or 2 arguments, but how to detect what was passed? Let’s assume that arg1 was an object.
if(!arg1) { ... }
would be good enough to test if a had been passed with a valid object address, but if arg1 was, say a boolean, and had the value false, then !a would yield the same result as if arg1 was not present. So we need another way. Since javaScript will convert to a string to compare to another string, comparing a missing value against a string will cause it to be converted to ‘undefined’. We can leverage this as below to detect a missing argument.
if (arg1 == 'undefined' ) {... arg was missing ...}
However, this would fall apart if ‘undefined’ was a valid value for arg1.
typeof Operator to test for optional/missing argument
Luckily we can use the typeof operator instead.
if (typeof arg1 == 'undefined') {... arg was missing ...}
Since we are going to be using this a lot, let’s make a convenient function of it
function isUndefined ( arg) { return typeof arg == 'undefined'; }
So in future we can conveniently say,
if (isUndefined(arg1)) {...arg1 was missing .. }
And to minimize conversion, do a vbaHack of
function IsMissing(arg1) { return isUndefined (arg1); }
Dealing with default value for optional argument
We are going to convert an existing VBA project, though, so it’s still going to be a pain to deal with each optional argument, especially if it has an optional parameter. Here’s a generalized function we can use to deal with missing arguments and their default value
function fixOptional (arg, defaultValue) { if (isUndefined(arg) ){ if (isUndefined(defaultValue) ) MsgBox('programming error: no default value for missing argument'); return defaultValue; } else return arg; }
and here is how we use it it
function x ( par , colNum, rCell, keepFresh, v){ // deal with optional parameters this.value = fixOptional ( v , rCell ); };
Transitioning is covered more comprehensively in my my book, Going Gas – from VBA to Apps script.
For more like this, see From VBA to Google Apps Script . Why not join our forum, follow the blog or follow me on twitter to ensure you get updates when they are available. Much of the code referred to here is the mcpher library. You can find out how to include it in your project here.