Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jim-oflaherty-jr-qalocate-com/abc191d0e76bbc015a086b133b2521e4 to your computer and use it in GitHub Desktop.
Save jim-oflaherty-jr-qalocate-com/abc191d0e76bbc015a086b133b2521e4 to your computer and use it in GitHub Desktop.
VBA Array Size for CodeReview Question/Answers - Tests Crossing Zero Index...
Public Function f_test()
Dim blnResult As Boolean
Dim astrTemp() As String
On Error GoTo NormalExit
ReDim astrTemp(-1 To 1)
astrTemp(-1) = "A"
astrTemp(0) = "B"
astrTemp(1) = "C"
Debug.Print "1. LBound: " + CStr(LBound(astrTemp))
Debug.Print "1. UBound: " + CStr(UBound(astrTemp))
Debug.Assert f_ua_lngSize(astrTemp) = 3
ReDim astrTemp(-2 To 0)
astrTemp(-2) = "A"
astrTemp(-1) = "B"
astrTemp(0) = "C"
Debug.Print "2. LBound: " + CStr(LBound(astrTemp))
Debug.Print "2. UBound: " + CStr(UBound(astrTemp))
Debug.Assert f_ua_lngSize(astrTemp) = 3
ReDim astrTemp(0 To 2)
astrTemp(0) = "A"
astrTemp(1) = "B"
astrTemp(2) = "C"
Debug.Print "3. LBound: " + CStr(LBound(astrTemp))
Debug.Print "3. UBound: " + CStr(UBound(astrTemp))
Debug.Assert f_ua_lngSize(astrTemp) = 3
ReDim astrTemp(-3 To -1)
astrTemp(-3) = "A"
astrTemp(-2) = "B"
astrTemp(-1) = "C"
Debug.Print "4. LBound: " + CStr(LBound(astrTemp))
Debug.Print "4. UBound: " + CStr(UBound(astrTemp))
Debug.Assert f_ua_lngSize(astrTemp) = 3
ReDim astrTemp(1 To 3)
astrTemp(1) = "A"
astrTemp(2) = "B"
astrTemp(3) = "C"
Debug.Print "5. LBound: " + CStr(LBound(astrTemp))
Debug.Print "5. UBound: " + CStr(UBound(astrTemp))
Debug.Assert f_ua_lngSize(astrTemp) = 3
blnResult = True
NormalExit:
f_test = blnResult
End Function
'Return Value:
' -1 - Not an Array
' 0 - Empty
' > 0 - Defined
Public Function f_ua_lngSize( _
ByRef pr_avarValues As Variant _
, Optional ByVal pv_lngDimensionOneBased As Long = 1 _
) As Long
Dim lngSize As Long: lngSize = M_UA_SIZE_NOT_ARRAY 'Default to not an Array
Dim lngLBound As Long
Dim lngUBound As Long
On Error GoTo Recovery
If (IsArray(pr_avarValues) = True) Then
lngSize = M_UA_SIZE_EMPTY 'Move default to Empty
lngLBound = LBound(pr_avarValues, pv_lngDimensionOneBased)
lngUBound = UBound(pr_avarValues, pv_lngDimensionOneBased)
If (lngLBound <= lngUBound) Then
lngSize = lngUBound - lngLBound + 1 'Non-Empty, so return size
End If
End If
NormalExit:
f_ua_lngSize = lngSize
Exit Function
Recovery:
GoTo NormalExit
End Function
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment