shambalad
asked on
Test to determine if variant is an array
I am working in Access 2010.
I need to determine if a variant is an array. I put together the following function:
Public Function IsArray(varIn As Variant) As Boolean
Dim i As Integer
On Error GoTo ExitFunction
i = UBound(varIn)
IsArray = True
ExitFunction:
On Error GoTo 0
End Function
It appears to work. Is there some unforeseen circumstance I'm not thinking of where this procedure wouldn't work?
Is there a better way to determine if a variant is an array?
I need to determine if a variant is an array. I put together the following function:
Public Function IsArray(varIn As Variant) As Boolean
Dim i As Integer
On Error GoTo ExitFunction
i = UBound(varIn)
IsArray = True
ExitFunction:
On Error GoTo 0
End Function
It appears to work. Is there some unforeseen circumstance I'm not thinking of where this procedure wouldn't work?
Is there a better way to determine if a variant is an array?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks again.
th
th
You are welcome!
/gustav
/gustav
ASKER
Gustav -
I must say your perspective never ceases to intrigue me. I have been looking over the IsReDimmed function you posted last night and I have a question about one of the lines of code:
booIsReDimmed = LBound(varArrayToCheck) Imp True
I'm trying to discern your rationale behind adding the 'Imp True' piece. If I understand correctly how the Imp function works, when the second expression is True, the result is always True. In other words, this line of code should always return True. Would it be correct to say that the intent here is to ensure a valid 'True' value is always returned (as opposed to simply some non-zero result) so long as the LBound function does not kick out an exception? Or is there more to this than meets the eye?
Thanks,
Todd
I must say your perspective never ceases to intrigue me. I have been looking over the IsReDimmed function you posted last night and I have a question about one of the lines of code:
booIsReDimmed = LBound(varArrayToCheck) Imp True
I'm trying to discern your rationale behind adding the 'Imp True' piece. If I understand correctly how the Imp function works, when the second expression is True, the result is always True. In other words, this line of code should always return True. Would it be correct to say that the intent here is to ensure a valid 'True' value is always returned (as opposed to simply some non-zero result) so long as the LBound function does not kick out an exception? Or is there more to this than meets the eye?
Thanks,
Todd
Good question. I forgot myself, and Imp is not carried forward to the never languages.
The catch is Null Imp True:
True Imp True = True
False Imp True = True
Null Imp True = True
But that is not important here. The goal is that if LBound does not fail, the expression should in any case - no matter if LBound returns zero (False) or some other number (True) return True.
The rationale behind the function is, that if a dynamic array has not been ReDim'med or has been erased, functions like LBound() and UBound() will fail. This is so basic that one could believe code could be found all over the net, but no. On the contrary, the question is raised again and again in the user groups how to check this.
There is - as far as I can see - no way to find out except to apply xBound() on the array and see if it fails. Very primitive.
Note that the array to test is not passed as an array but as a variant. This is to allow for the array to be declared as whatever type you like. Doing so, you will have to check if the variable is an array but that is very easy to do.
Another method I just looked up is suggested by A. D. Tejpal using the IsError function (which I never have used):
/gustav
The catch is Null Imp True:
True Imp True = True
False Imp True = True
Null Imp True = True
But that is not important here. The goal is that if LBound does not fail, the expression should in any case - no matter if LBound returns zero (False) or some other number (True) return True.
The rationale behind the function is, that if a dynamic array has not been ReDim'med or has been erased, functions like LBound() and UBound() will fail. This is so basic that one could believe code could be found all over the net, but no. On the contrary, the question is raised again and again in the user groups how to check this.
There is - as far as I can see - no way to find out except to apply xBound() on the array and see if it fails. Very primitive.
Note that the array to test is not passed as an array but as a variant. This is to allow for the array to be declared as whatever type you like. Doing so, you will have to check if the variable is an array but that is very easy to do.
Another method I just looked up is suggested by A. D. Tejpal using the IsError function (which I never have used):
Public Function Fn_IsArrayInitialized(ByVal varArray As Variant) As Boolean
On Error Resume Next
Fn_IsArrayInitialized = Not IsError(UBound(varArray) >= 0)
End Function
It seems to do exactly the same as mine but a bit simpler./gustav
ASKER
Yeah, it's 2:46AM on a Sunday morning and I probably should shut this computer down and go to sleep. It's a good thing I don't take myself too seriously...
Thanks for the IsReDimmed function. It will be useful.
Good night.
Todd