Subscript out of range — ошибка 9 — означает обращение к отсутствующему элементу массива или коллекции. Причиной бывает и неверное имя листа.
Проверим границы массива перед обращением по индексу.
Что подготовить
Создайте «Проверка» с полями Индекс и Артикул. Список VBA.Array содержит три кода и имеет индексы 0, 1, 2.
Индекс 3 в таком списке отсутствует. Позиция «третий элемент» не равна индексу 3 при нижней границе 0.
Код и порядок выполнения
Option Explicit
Sub ReadArraySafely()
Dim values As Variant
Dim i As Long
values = VBA.Array("P-101", "P-102", "P-103")
i = 2
If i < LBound(values) Or i > UBound(values) Then
MsgBox "Индекс вне границ": Exit Sub
End If
With ThisWorkbook.Worksheets("Проверка")
.Range("A2").Value = i
.Range("B2").Value = values(i)
End With
End SubLBound и UBound задают фактические пределы. При i = 2 получается P-103. При i = 3 процедура сообщает о выходе за границы до чтения элемента.
Если сбой возникает на Worksheets("Прайс"), проверять нужно коллекцию и точное имя листа, а не размер массива. Номер ошибки один, но объекты разные.
Как проверить результат
При индексе 2 ожидается P-103. Изменение i на 3 должно дать подсказку без записи нового результата.
Ограничения и частые ошибки
Для невыделенного динамического массива вызов границ сам может быть ошибочным: сначала требуется ReDim. У двумерного массива проверяют каждое измерение отдельно.
При импорте модуля ThisWorkbook меняется на книгу-получатель. Если нужный лист остался в исходной книге, прежнее строковое имя не создаст его автоматически.
Не исправляйте ошибку произвольным уменьшением индекса на 1. Сначала определите, что хранит переменная: индекс, пользовательскую позицию или номер строки Excel.
Проверка перед рабочим запуском
- Известна нижняя граница 0.
- Проверена верхняя граница 2.
- Индекс 3 отклоняется.
- Листы и массивы диагностируются как разные коллекции.
Сначала выполните пример на учебной копии с указанными именами листов и диапазонами. Сравните исходные данные и результат, затем сохраните проверенный вариант процедуры.
Продолжить изучение: ReDim Preserve, LBound и UBound в VBA, Как найти значение в массиве VBA, Как обратиться к листу и проверить его наличие в VBA.
Разберитесь с макросами вместе с преподавателем
На занятии вы записываете действия, читаете код и проверяете результат на небольшом примере. Преподаватель подберёт задания под ваш уровень и поможет понять связь между командами VBA и изменениями в книге.
Начните с бесплатного вводного урока: 45 минут, один на один, без обязательств. Обсудите цель и попробуйте формат. Решение о продолжении — после занятия.