ReDiming an array in VBA

后端 未结 2 1950
逝去的感伤
逝去的感伤 2021-01-26 23:47

I have a serious problem with resizing a 2-dimensional array in VBA. I\'ve done a lot of reading about this (popular) issue, but still I can\'t figure out what\'s wrong in my co

相关标签:
2条回答
  • 2021-01-27 00:35

    I think you could implement this general solution to your particular solution if you apply this code to change the nr. of dimensions before you add the/a new category.

    Option Explicit
    Public Sub redimarray()
        'This sub redimensions an array as an array of arrays, so to acces the k'th element in the n-th dimension you need to type: my_array(n)(k)
        'and you can still simply redefine the array dimensions by:
        'my_array =FlexArray("lower_bound_n-th_dim,lower_bound_n-th_dim,_n+1-th_dim,upper_bound_n-th_dim,_n+1-th_dim) = e.g.: FlexArray("2,3,9,11")
    
        'if you then want to have conventional array element conventional_array(3,4) you can copy the entire my_array into a 1 dimensional array where
        ' the array elements are added like a (nr-of_elements_per_dimension)-base numbering system. once they have been manipulated, you can store them back into
        'nr of elements per dimension:
        'dim 0 = 4, 0-3
        'dim 1 = 3, 4-6
        'dim 2 = 8, 1-8
        'nr of elements in 1dim array = 4*3*8 = 96
        '(0)(4)(1)
        '(0)(4)(2)
        '...
        '(0)(4)(8)
        '(0)(5)(1)
        'so working_array(3,5,2) = (3-0)*nr_elem(dim 1)*nr_elem(dim 2)+(5-4)*nr_elem(dim 2)+(2-1)
    
        'dim 0 = nr_elements(0), start_element(0)-end_element(0)
        'dim 1 = nr_elements(1), start_element(1)-end_element(1)
        'dim 2 = nr_elements(2), start_element(2)-end_element(2)
        'so working_array(3,5,2) = (end_element(0)-start_element(0))*nr_elements(1)*nr_elements(2)+(end_element(1)-start_element(1))*nr_elements(2)+'so working_array(3,5,2) = (end_element(0)-start_element(0))*nr_elements(1)*nr_elements(2)+(end_element(2)-start_element(2))=index in 1 dimensional array.
    
        Dim NewArray() As Variant
    
        NewArray = FlexArray("1,2,3,8,2,9")
        'NewArray = FlexibleArray("1,2,3,8,2,9")
        MsgBox (NewArray(1)(8))
    
    End Sub
    Public Function FlexArray(strDimensions As String) As Variant
    
        Dim arrTemp     As Variant
        Dim varTemp     As Variant
    
        Dim varDim      As Variant
        Dim intNumDim   As Integer
    
        Dim iDim        As Integer
        Dim iArr        As Integer
    
        varDim = Split(strDimensions, ",")
        intNumDim = (UBound(varDim) + 1) / 2
    
        ' Setup redimensioned source array
        ReDim arrTemp(intNumDim)
    
        iArr = 0
        For iDim = LBound(varDim) To UBound(varDim) Step 2
    
            ReDim varTemp(varDim(iDim) To varDim(iDim + 1))
            arrTemp(iArr) = varTemp
            iArr = iArr + 1
        Next iDim
    
        FlexArray = arrTemp
    End Function
    
    0 讨论(0)
  • 2021-01-27 00:42

    It's because you can't change the lower bound of the second dimension, you need to keep it the same..

    You declare ReDim distinctList(0 To 1, 0 To j) at the top

    when you redim, you need to keep lower bound of the second dimension at 0

    ReDim Preserve distinctList(0 To 1, 0 To UBound(distinctList, 2) + 1)
    
    0 讨论(0)
提交回复
热议问题