Declare a 0-Length String Array in VBA - Impossible?

前端 未结 3 516
旧巷少年郎
旧巷少年郎 2021-01-12 21:31

Is it really not possible to declare a 0-length array in VBA? If I try this:

Dim lStringArr(-1) As String

I get a compile error saying rang

3条回答
  •  情话喂你
    2021-01-12 22:04

    If we're going to use WinAPI anyway, we can also cleanly create the array from scratch using the WinAPI SafeArrayCreate function instead of redimensioning it.

    Struct declarations:

    Public Type SAFEARRAYBOUND
        cElements As Long
        lLbound As Long
    End Type
    Public Type tagVariant
        vt As Integer
        wReserved1 As Integer
        wReserved2 As Integer
        wReserved3 As Integer
        pSomething As LongPtr
    End Type
    

    WinAPI declarations:

    Public Declare PtrSafe Function SafeArrayCreate Lib "OleAut32.dll" (ByVal vt As Integer, ByVal cDims As Long, ByRef rgsabound As SAFEARRAYBOUND) As LongPtr
    Public Declare PtrSafe Sub VariantCopy Lib "OleAut32.dll" (pvargDest As Any, pvargSrc As Any)
    Public Declare PtrSafe Sub SafeArrayDestroy Lib "OleAut32.dll"(ByVal psa As LongPtr)
    

    Use it:

    Public Sub Test()
        Dim bounds As SAFEARRAYBOUND 'Defaults to lower bound 0, 0 items
        Dim NewArrayPointer As LongPtr 'Pointer to hold unmanaged string array
        NewArrayPointer = SafeArrayCreate(vbString, 1, bounds)
        Dim tagVar As tagVariant 'Unmanaged variant we can manually manipulate
        tagVar.vt = vbArray + vbString 'Holds a string array
        tagVar.pSomething = NewArrayPointer 'Make variant point to the new string array
        Dim v As Variant 'Actual variant
        VariantCopy v, ByVal tagVar 'Copy unmanaged variant to managed one
        Dim s() As String 'Managed string array
        s = v 'Copy the array from the variant
        SafeArrayDestroy NewArrayPointer 'Destroy the unmanaged SafeArray, leaving the managed one
        Debug.Print LBound(s); UBound(s) 'Prove the dimensions are 0 and -1    
    End Sub
    

提交回复
热议问题