Lidando com os índices de uma matriz dinâmica

O programador em VB tem, às vezes, que determinar o maior índice de uma matriz dinâmica mesmo sem saber se ela já foi redimensionada. Nos casos em que a matriz ainda não foi redimensionada, a função UBound gera um erro. Mas, deste mesmo inconveniente podemos tirar uma solução. Basta criarmos uma função dentro da qual chamamos UBound para uma matriz passada como argumento e onde tratamos o erro gerado por UBound. Veja a seguir um exemplo deste tipo de função:


Private Function GetUpper(varArray As Variant) As Long
    Dim Upper As Long
    On Error Resume Next
    Upper = UBound(varArray)
    If Err.Number Then
        If Err.Number = 9 Then
            Upper = -1
        Else
            With Err
                On Error GoTo 0
                Err.Raise Err.Number, "GetUpper", Err.Description
            End With
            Exit Function
        End If
    Else
        If Upper < 0 Then
            On Error GoTo 0
            Err.Raise vbObjectError, "GetUpper",  _

                 "Função não se aplica a matrizes com índice máximo negativo."
        End If
    End If
    On Error GoTo 0
    GetUpper = Upper
End Function

Acima, foi convencionado que o valor -1 será retornado para o caso de a matriz ainda não estar redimensionada. A mesma idéia pode ser usada para criar uma função que retorna o índice mais baixo de uma matriz dinâmica:

Private Function GetLower(varArray As Variant) As Long
    Dim Lower As Long
    On Error Resume Next
    Lower = LBound(varArray)
    If Err.Number Then
        If Err.Number = 9 Then
            Lower = -1
        Else
            With Err
                On Error GoTo 0
                Err.Raise Err.Number, "GetLower", Err.Description
            End With
            Exit Function
        End If
    Else
        If Lower < 0 Then
            On Error GoTo 0
            Err.Raise vbObjectError, "GetLower",  _

                 "Função não se aplica a matrizes com índice mínimo  negativo."
        End If
    End If
    On Error GoTo 0
    GetLower = Lower
End Function

Combinando o serviço das duas funções acima, podemos criar uma que retorna o número de elementos  de uma matriz dinâmica:

Public Function GetArrayElementCount(varArray As Variant) As Long

        GetArrayElementCount = GetUpper(varArray) - GetLower(varArray) + 1

End Function