IsArraySafe


Description:
If you use 'Dim nArray()' and later want to see if you've redimensioned the array, or if it's still empty, traditionally you would just use some error logic and attempt to read from it. This bit of code demonstrates using CopyMemory to look into the VARIANT and SAFEARRAY structures to see if the array actually contains any dimensions. I present it, because it's actually a bit faster than using the error logic, and could save some runtime if you call such subroutine quite a bit.
 
Code:
Private Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
   (dest As Any, src As Any, ByVal length As Long) As Long
   
Public Function IsArraySafe(ArrayVal As Variant) As Boolean

    If (VarType(ArrayVal) And vbArray) Then
    
        Dim lpSafeArray As Long
        Dim nDimensions As Long
        
        CopyMemory lpSafeArray, ByVal VarPtr(ArrayVal) + 8, 4
        CopyMemory nDimensions, ByVal lpSafeArray, 2
        
        If nDimensions > 0 Then
            IsArraySafe = True
        Else
            IsArraySafe = False
        End If
    
    Else
        Debug.Assert False
        'ArrayVal doesn't look to contain an Array
    End If

End Function
 
Sample Usage:
 
If Not IsArraySafe(nArray()) Then
     Redim nArray(100)
End If