For:
Dim arr1 : arr1 = Array()
Dim arr2
Dim arr3 : ReDim arr3(1) : Erase arr3
WScript.Echo UBound(arr1)
WScript.Echo UBound(arr2)
WScript.Echo UBound(arr3)
Will return -1 for arr1, but "VBScript runtime error: Subscript out of range: 'UBound'" for arr2 and arr3.
A general purpose function to test if an array is "Dimmed" or "Empty" should also (probably) test if the variable is actually an array.
Function IsDimmedArray(arrParam)
Dim lintUBound : lintUBound = 0
Dim llngError : llngError = 0
IsDimmedArray = False
If Not IsArray(arrParam) Then : Exit Function
'' Test the bounds
On Error Resume Next
lintUBound = UBound(arrParam)
llngError = Err.Number
If (llngError <> 0) Then : Err.Clear
On Error Goto 0
If (llngError = 0) And (lintUBound >= 0) Then : IsDimmedArray = True
End Function ' IsDimmedArray(arrParam)
For me, 99% of the time when I am checking if an array is "Dimensioned", is if I need to get the UBound of the array and I want to prevent a runtime-error in the cases where the array is not dimensioned. So I will usually pass the UBound as a parameter like:
Function IsDimmedArray(arrParam, intUBoundParam)
intUBoundParam = 0
...
I don't know if this practice actually saves any "Time", but it does save 1 line of code with nearly every use, and is an easy way to enforce the practice of error checking.
Also, I include it for completeness, but in practice, the checking of "UBound >= 0" in IsDimmedArray:
If (llngError = 0) And (lintUBound >= 0) Then : IsDimmedArray = True
is typically not necessary because usually it will be used in cases like:
Dim arrX
Dim lintUBound
Dim intNdx
arrX = Array()
lintUBound = UBound(arrX)
WScript.Echo "arrX is an array with UBound=" & lintUBound
For intNdx = 0 to lintUBound
WScript.Echo "This will not print: " & intNdx
Next
So, in this case, lintUBound = -1 and the For ... Next will be skipped.