#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. Сработало как надо — еще раз спасибо. Следовало написать здесь, прежде чем я попытался применить свои небольшие знания.