Ошибка индекса вне диапазона с массивом — понятия не имею, почему?

#arrays #excel #vba

Вопрос:

Я объявил массив как таковой Dim rArray() As Variant , но когда я пытаюсь использовать значения, которые в нем хранятся (как показано ниже) Я получаю ошибку индекса вне диапазона. UBound(rArray) И LBound(rArray) оба возвращают значения 14 и 1, но ошибка возникает в Debug.Print строке.

Если я использую оператор for, как показано ниже

 For Each rArr in rArray  

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

Я перепробовал несколько способов решить эту проблему, но безуспешно, и потратил почти половину своего дня на эту проблему. Может ли кто-нибудь указать, что мне нужно изменить, чтобы это сработало.

 Set rng = Range("D4", Range("D4").End(xlDown)) rng.NumberFormat = "0" rArray = rng.Value  For x = UBound(rArray) To LBound(rArray) Step -1  Debug.Print rArray(x) Next x  

Правка: еще один факт, заслуживающий упоминания, заключается в том, что массив объявлен и используется в функции, но он не передается из функции или в функцию. Разве массивы не могут быть объявлены и использованы в функциях?

Комментарии:

1. я не эксперт, но что, если вы выведете x и посмотрите, при каком значении x возникает проблема

2. Спасибо. Мне не нужно печатать x, во время отладки я вижу, что значение x равно 14, с которого начинается цикл — в массиве хранится 14 элементов.

3. в качестве шага по устранению неполадок, что делать, если вы удалите цикл и попытаетесь выполнить x=13? и попробуйте для x=1

4. Попробовал это — и я получаю ту же ошибку — индекс вне диапазона. Именно это навело меня на мысль, что именно так я храню значения в массиве.

5. Я не знаю, я действительно не использую VBA, но вы хорошо задали вопрос, и он звучит достаточно тривиально, вы получите ответ.

Ответ №1:

Когда вы присваиваете значения листа вариантному массиву, вы всегда получаете двумерный массив, основанный на 1 (например, 1 к чему-то, 1 к чему-то; никогда 0 к чему-то, 0 к чему-то). Если вы получаете значения из одного столбца, второй ранг равен просто 1 к 1.

Это можно доказать следующим образом.

 Dim x As Long, rArray As Variant, rng As Range  Set rng = Range("D4", Range("D4").End(xlDown)) rng.NumberFormat = "0" 'don't really understand why this is here rArray = rng.Value  Debug.Print LBound(rArray, 1) amp; ":" amp; UBound(rArray, 1) Debug.Print LBound(rArray, 2) amp; ":" amp; UBound(rArray, 2)  For x = UBound(rArray, 1) To LBound(rArray, 1) Step -1  Debug.Print rArray(x, 1) Next x  

Поэтому вам нужно запросить элемент в первом ранге массива; недостаточно просто запросить элемент.

Комментарии:

1. Еще раз спасибо, Джипед. Итак, если я изменю массив на целое Dim rArray () As Integer число, то он должен работать правильно, но это не так?

2. Честно говоря, я не думаю, что вы можете поместить значения рабочего листа во что-либо, кроме массива вариантов, если вы не пройдете по ячейкам и не заполните массив по отдельности. Иногда нестандартное мышление просто так не сработает. Придерживайтесь массивов вариантов.

3. Спасибо! Цените потраченное время и усилия. Я спрашивал, потому что я никогда раньше не работал с 2-D массивами, так что это может занять у меня немного больше времени. Но я рад учиться — просто в сжатые сроки.

4. Сработало как надо — еще раз спасибо. Следовало написать здесь, прежде чем я попытался применить свои небольшие знания.