I am supporting CandidateX

CandidateX is a startup that focuses on creating inclusion-focused hiring solutions, designed to increase access to job opportunities for underestimated talent. Check them out if you have a few minutes to spare. They need visibility!

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.