В vba, как мне изменить размер массива, который является элементом другого массива

У меня есть 6 динамических массивов. Я хочу включить имена этих 6 массивов в другой массив. Затем я хочу выбрать по одному каждый из 6 динамических массивов и изменить размер выбранного массива до размера, определяемого количеством строк во входном файле. Код, который я использовал, дает мне ошибку компиляции, см. Ниже:

    '================================================================
    ' DICTIONARIES
    '
    Dim FilePathNames               As Dictionary
    Dim WorkBookNames               As Dictionary
    Dim Sheet1Names                 As Dictionary
    Dim Sheet2Names                 As Dictionary
    '==============================================================
    ' GENERIC WORKBOOK OBJECT NAMES
    ' XXX(0) = FULL WORKBOOK PATH
    ' XXX(1) = WORKBOOK NAME
    ' XXX(2) = WORKSHEET1 NAME
    ' XXX(3) = WORKSHEET2 NAME (FieldXControl)
    ' XXX(4) = NUMBER OF ROWS IN WORKSHEET1
    ' XXX(5) = NUMBER OF ROWS IN WORKSHEET2
    Public XXX(6) As Variant
    Public CCC()  As Variant
    Public Keys() As String
    '================================================================
    Dim CMI()     As String
    Dim CML()     As String
    Dim CMN()     As String
    Dim CM1()     As String
    Dim CM2()     As String
    Dim CMS()     As String


    'Changed the code as suggested 
    CCC = Array(CMI, CML, CMN, CM1, CM2, CMS)


    'The following code is placed between a For loop 
    'Will loop through this 6 times conditioned on the For loop
    'Not a simple 0, 1, 2 etc.
    '
    Call DictionaryKeys(R)  'R is an integer conditioned by the For loop
    Call ObjectNames(Keys)
    Call ActivateFile       'A Sub that will activate XXX(1)
    XXX(4) = GetLastRowExt(XXX(1), XXX(2), "A") 'Function to get last row of XXX(2)
    XXX(5) = GetLastRowExt(XXX(1), XXX(3), "A") 'Function to get last row of XXX(3)

    ReDim CCC(N)(XXX(5) - 2)     '<===========Get a Sytax erro
                                 'Hope you can see what I'm trying to do
                                 'N is an integer between 0 and 5
                                 'How do I code for this?
    Go and do other stuff
    Next                         'End of For loop



    Public Sub ObjectNames(XXK As String)
    XXX(0) = FilePathNames.Item(XXK)
    XXX(1) = WorkBookNames.Item(XXK)
    XXX(2) = Sheet1Names.Item(XXK)
    XXX(3) = Sheet2Names.Item(XXK)
    End Sub

person Gggggggg    schedule 27.02.2020    source источник
comment
Вы заполнили CCC строками, а не массивами. CCC = Array(CMI, CML, CMN, CM1, CM2, CMS)   -  person Tim Williams    schedule 27.02.2020
comment
OMW - Это была ошибка, но после исправления все еще возникает ошибка. Теперь я получаю синтаксическую ошибку   -  person Gggggggg    schedule 28.02.2020
comment
на какой линии?   -  person Tim Williams    schedule 28.02.2020
comment
В строке CCC(N)(XXX(5) - 2). Я думаю, что пришел к выводу, что невозможно получить доступ к элементу массива, который является элементом другого массива. Я хотел сделать это, чтобы у меня не было кусков повторяющегося кода. И количество элементов внутри каждого из внутренних массивов может варьироваться.   -  person Gggggggg    schedule 28.02.2020
comment
В приведенном выше коде я показал только 6 элементов. В живом коде 15 элементов, то есть 15 массивов в группах по 3. Я не хочу иметь 15 блоков кода. Мне нужен один блок кода, который может обращаться к 15 различным массивам с общим именем массива.   -  person Gggggggg    schedule 28.02.2020


Ответы (1)


Вы не можете изменить размер внутреннего массива напрямую, но вы можете легко обойти это:

Sub Tester()

    Dim CMI()     As String
    Dim CML()     As String
    Dim CMN()     As String
    Dim CM1()     As String
    Dim CM2()     As String
    Dim CMS()     As String
    Dim CCC As Variant, arr, N As Long


    CCC = Array(CMI, CML, CMN, CM1, CM2, CMS)

    For N = LBound(CCC) To UBound(CCC)

       'ReDim CCC(N)(1 to N+5) 'no can do...

        arr = CCC(N)            'extract the inner array
        ReDim arr(1 To N + 5)   'resize it
        CCC(N) = arr            'put it back

    Next N

    For N = LBound(CCC) To UBound(CCC)
        Debug.Print LBound(CCC(N)), UBound(CCC(N))
    Next N
End Sub
person Tim Williams    schedule 28.02.2020
comment
Спасибо, я попробую это и дам вам знать, как это происходит. Мне нужно иметь возможность работать со всеми массивами в одном наборе кода. Но вы дали мне отправную точку, и я посмотрю, смогу ли я развить ее. - person Gggggggg; 28.02.2020