Подтвердить что ты не робот

Как объявить переменную массива в VBA?

Мне нужно добавить массив var в

Public Sub Testprog()

Dim test As Variant
Dim iCounter As Integer

If test = Empty Then
    iCounter = 0
    test(iCounter) = "test"
Else
    iCounter = UBound(test)
End If
End Sub

Ошибка при test(iCounter) = "test"

Пожалуйста, предложите некоторое решение

4b9b3361

Ответ 1

Как правило, вы должны объявлять переменные определенного типа, а не Variant. В этом примере переменная test должна иметь тип String.

И, поскольку это массив, вам нужно указать, что конкретно, когда вы объявляете переменную. Существует два способа объявления переменных массива:

  • Если вы знаете размер массива (количество элементов, которое он должен содержать) при написании программы, вы можете указать это число в круглых скобках в объявлении:

    Dim test(1) As String   'declares an array with 2 elements that holds strings
    

    Этот тип массива называется статическим массивом, поскольку его размер является фиксированным или статическим.

  • Если вы не знаете размер массива при написании приложения, вы можете использовать динамический массив. Динамический массив - это тот, размер которого не указан в заявлении (Dim), а скорее определяется позже во время выполнения программы с помощью инструкции ReDim. Например:

    Dim test() As String
    Dim arraySize As Integer
    
    ' Code to do other things, like calculate the size required for the array
    ' ...
    arraySize = 5
    
    ReDim test(arraySize)  'size the array to the value of the arraySize variable
    

Ответ 2

В дополнение к ответу Коди Грея, есть третий способ (все это применимо и к ней):

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

Dim test() as String
Dim arraySize as Integer

Do While someCondition
    '...whatever
    arraySize = arraySize + 1
    ReDim Preserve test(arraySize)
    test(arraySize) = newStringValue
Loop

Обратите внимание на ключевое слово Preserve. Без него переназначение массива также инициализирует все элементы.

Ответ 3

Как указано другими, ваша проблема заключается в том, что вы не объявили массив

Ниже я попытался воссоздать вашу программу, чтобы она работала так, как вы планировали. Я старался уходить как можно больше (например, оставляя ваш массив как вариант)

Public Sub Testprog()
    '"test()" is an array, "test" is not
    Dim test() As Variant
    'I am assuming that iCounter is the array size
    Dim iCounter As Integer

    '"On Error Resume Next" just makes us skip over a section that throws the error
    On Error Resume Next

    'if test() has not been assigned a UBound or LBound yet, calling either will throw an error
    '   without an LBound and UBound an array won't hold anything (we will assign them later)

    'Array size can be determined by (UBound(test) - LBound(test)) + 1
    If (UBound(test) - LBound(test)) + 1 > 0 Then
        iCounter = (UBound(test) - LBound(test)) + 1

        'So that we don't run the code that deals with UBound(test) throwing an error
        Exit Sub
    End If

    'All the code below here will run if UBound(test)/LBound(test) threw an error
    iCounter = 0

    'This makes LBound(test) = 0
    '   and UBound(test) = iCounter where iCounter is 0
    '   Which gives us one element at test(0)
    ReDim Preserve test(0 To iCounter)

    test(iCounter) = "test"
End Sub

Ответ 4

В дополнение к ответу RolandTumble на ответ Коди Грея, оба прекрасных ответа, вот еще один очень простой и гибкий способ, когда вы знаете все содержимое массива во время кодирования - например, вы просто хотите построить массив, содержащий 1, 10, 20 и 50. Это также использует объявление варианта, но не использует ReDim. Как и в ответе Роланда, подсчитанное количество элементов массива не обязательно должно быть специально известно, но доступно с помощью uBound.

sub Demo_array()
    Dim MyArray as Variant, MyArray2 as Variant, i as Long

    MyArray = Array(1, 10, 20, 50)  'The key - the powerful Array() statement
    MyArray2 = Array("Apple", "Pear", "Orange") 'strings work too

    For i = 0 to UBound(MyArray)
        Debug.Print i, MyArray(i)
    Next i
    For i = 0 to UBound(MyArray2)
        Debug.Print i, MyArray2(i)
    Next i
End Sub

Мне нравится это больше, чем любой другой способ создания массивов. Что отличает то, что вы можете добавлять или вычитать элементы массива прямо в инструкции Array, и ничего не нужно делать для кода. Чтобы добавить Egg в ваш 3-х элементный массив продуктов, просто введите

"Яйцо"

в соответствующем месте, и все готово. Теперь у вашего массива продуктов есть 4 элемента, и ничего не нужно было изменять в Dim, а ReDim полностью опущен.

Если массив, основанный на 0, не нужен, т.е. используя MyArray (0) - одно решение просто затмевает 0 или "" для этого первого элемента.

Обратите внимание, что это может быть плохо оценено некоторыми пуристами кодирования; одно справедливое возражение состояло бы в том, что "жесткие данные" должны быть в утверждениях Const, а не в инструкциях кода в подпрограммах. Другой говядиной может быть то, что если вы вставляете 36 элементов в массив, вы должны установить константу в 36, а не код в незнании этого. Последнее возражение является спорным, поскольку это накладывает требование поддержания Const с 36, а не полагаться на UBOUND. Если вы добавите 37-й элемент, но оставите Const на 36, проблема возможна.

Ответ 5

Вы должны объявить переменную массива как массив:

Dim test(10) As Variant

Ответ 6

Дэвид, пришла ошибка Microsoft Office Excel перестала работать. Два варианта проверки онлайн для решения и закрытия программы и другого варианта. Закройте программу. Я уверен, что ошибка в моем массиве, но я все читаю и, похоже, это способ определения массивов.

Ответ 7

Индекс массива принимает только длинное значение.

Вы объявили iCounter как целое число. Вы должны объявить его длинным.