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 Sub

LBound и UBound задают фактические пределы. При i = 2 получается P-103. При i = 3 процедура сообщает о выходе за границы до чтения элемента.

Если сбой возникает на Worksheets("Прайс"), проверять нужно коллекцию и точное имя листа, а не размер массива. Номер ошибки один, но объекты разные.

Учебный код: Ошибка 9 Subscript out of range в VBA.
Учебный код: Ошибка 9 Subscript out of range в VBA.

Как проверить результат

При индексе 2 ожидается P-103. Изменение i на 3 должно дать подсказку без записи нового результата.
При индексе 2 ожидается P-103. Изменение i на 3 должно дать подсказку без записи нового результата.

При индексе 2 ожидается P-103. Изменение i на 3 должно дать подсказку без записи нового результата.

Ограничения и частые ошибки

Для невыделенного динамического массива вызов границ сам может быть ошибочным: сначала требуется ReDim. У двумерного массива проверяют каждое измерение отдельно.

При импорте модуля ThisWorkbook меняется на книгу-получатель. Если нужный лист остался в исходной книге, прежнее строковое имя не создаст его автоматически.

Не исправляйте ошибку произвольным уменьшением индекса на 1. Сначала определите, что хранит переменная: индекс, пользовательскую позицию или номер строки Excel.

Проверка перед рабочим запуском

  • Известна нижняя граница 0.
  • Проверена верхняя граница 2.
  • Индекс 3 отклоняется.
  • Листы и массивы диагностируются как разные коллекции.

Сначала выполните пример на учебной копии с указанными именами листов и диапазонами. Сравните исходные данные и результат, затем сохраните проверенный вариант процедуры.

Продолжить изучение: ReDim Preserve, LBound и UBound в VBA, Как найти значение в массиве VBA, Как обратиться к листу и проверить его наличие в VBA.

Разберитесь с макросами вместе с преподавателем

На занятии вы записываете действия, читаете код и проверяете результат на небольшом примере. Преподаватель подберёт задания под ваш уровень и поможет понять связь между командами VBA и изменениями в книге.

Начните с бесплатного вводного урока: 45 минут, один на один, без обязательств. Обсудите цель и попробуйте формат. Решение о продолжении — после занятия.

Записаться на бесплатный урок