Что значит ошибка "subscript out of range" и почему она возникает?

Ошибка "subscript out of range" - распространенная проблема при работе с массивами, коллекциями и строками в программах. Эта ошибка означает попытку обратиться к несуществующему элементу.

Что означает ошибка "subscript out of range"

Буквальный перевод этой ошибки с английского - "индекс выходит за пределы допустимого диапазона". Она возникает, когда программа пытается получить доступ к элементу массива, коллекции или строки, используя индекс, который выходит за границы определенного для них диапазона.

Например, если массив содержит 5 элементов с индексами от 0 до 4, а программа запрашивает элемент с индексом 5, будет сгенерирована именно эта ошибка. То же самое произойдет, если запросить отрицательный индекс или индекс больше максимально допустимого.

В каких объектах может возникнуть эта ошибка:

  • Массивы (arrays)
  • Коллекции (collections)
  • Строки (strings)

Это наиболее распространенные объекты, где наблюдается ошибка "subscript out of range". В них организован последовательный доступ к элементам по индексу. Попытка получить элемент по несуществующему индексу и приводит к этой проблеме.

Рассмотрим типичные ситуации, когда может возникнуть ошибка "subscript out of range":

При обращении к несуществующему элементу массива

Например, в коде на VBA определен массив с 3 элементами:

Dim values(1 To 3) As Integer values(1) = 5 values(2) = 7 values(3) = 9 

Если после этого обратиться к элементу с индексом 4, как здесь:

values(4) = 11 

будет сгенерирована ошибка "subscript out of range". Так как в массиве всего 3 элемента с индексами 1, 2, 3. Индекс 4 выходит за эти пределы, поэтому и возникает проблема.

При обращении к закрытой рабочей книге Excel

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

Workbooks("Sales.xlsx").Worksheets("Report").Activate 

Здесь происходит попытка активировать лист "Report" в закрытой книге "Sales.xlsx". Так как сама книга закрыта и не доступна, выдается сообщение "subscript out of range".

Аналогичная ситуация при попытке обратиться к листу Excel, который не существует в открытой книге. К примеру, есть лист "Data", а код запрашивает лист "Report".

При ошибке в индексе элемента массива

Еще один распространенный случай - ошибка в индексе элемента массива. Рассмотрим пример:

Dim values(1 To 5) As Long For i = 1 To 6 values(i) = i * 10 Next i 

Здесь массив может содержать 5 элементов с индексами от 1 до 5. Но цикл проходит до значения i=6. Соответственно, на последней итерации происходит обращение к несуществующему элементу values(6). Что и вызывает ошибку "subscript out of range".

Для решения достаточно исправить условие цикла:

For i = 1 To 5 

Чтобы не выходить за границы массива.

При объявлении массива без указания числа элементов

Еще одна распространенная ошибка - объявление массива без явного указания количества элементов:

Dim values() As Long 

В этом случае интерпретатор VBA выделит массив размером 0 по умолчанию. Любая попытка обратиться к элементам этого массива завершится ошибкой "subscript out of range".

Для исправления нужно указать количество элементов при объявлении, используя ключевое слово Dim или функцию ReDim:

Dim values(5) As Long или ReDim values(5) 

При обращении к несуществующему элементу коллекции

Аналогичная ситуация может возникнуть и при работе с коллекциями. Если код содержит обращение по неверному ключу, будет сгенерирована ошибка "subscript out of range".

Например, для коллекции Worksheets есть попытка получить лист с именем "Data":

Dim ws As Worksheet Set ws = Worksheets("Data") 

Но такого листа нет, соответственно, возникает проблема доступа к несуществующему элементу коллекции Worksheets.

Это лишь несколько наиболее частых сценариев появления ошибки "subscript out of range". В целом причина одна - попытка получить элемент из массива, коллекции или строки по неверному индексу или ключу.

Как обнаружить и исправить ошибку "subscript out of range"

Чтобы обнаружить и исправить ошибку "subscript out of range", можно использовать следующие методы:

Использование пошаговой отладки кода

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

Анализируя значения переменных и параметры в этот момент, можно понять причину ошибки "subscript out of range" и исправить код.

Добавление обработчика ошибок

Еще один способ - добавить обработчик ошибок VBA с помощью оператора On Error. Например:

On Error GoTo ErrorHandler ...код, где может возникнуть ошибка... ErrorHandler: MsgBox "Возникла ошибка: " & Err.Description 

Тогда при возникновении ошибки "subscript out of range" или любой другой будет выведено сообщение, указывающее на проблему. Это позволит быстрее обнаружить дефектный участок кода.

Проверка границ доступа к массиву

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

Для массива проверка индекса выглядит так:

If index >= LBound(myArray) And index <= UBound(myArray) Then 'обращение к элементу массива End If 

Функции LBound и UBound возвращают границы массива. Сравнивая с ними индекс, можно контролировать выход за допустимые пределы.

Использование UBound и LBound для проверки размеров

"Subscript out of range что значит" - эта ошибка означает выход индекса массива или коллекции за допустимый диапазон. Чтобы этого избежать, можно использовать функции UBound и LBound.

Например, в VBA:

Dim values(1 To 5) As Long For i = LBound(values) To UBound(values) values(i) = i * 10 Next i 

Эти функции возвращают нижнюю и верхнюю границы массива соответственно. Цикл выполняется от минимального индекса 1 до максимального 5, не вызывая ошибку выхода за пределы.

Проверка имени переменной в случае использования индекса как переменной

Еще одна распространенная ситуация: индекс элемента массива или коллекции задается переменной. "subscript out of range что значит access" в этом случае возникает из-за ошибки в имени самой переменной.

Например, вот такой код на VBA даст ошибку:

Dim i As Long Dim values(1 To 5) As Long values(myIndex) = 10 'выдаст ошибку, т.к. нет переменной myIndex, а есть i 

Чтобы исправить, нужно указать верное имя переменной в качестве индекса:

values(i) = 10 

Или же объявить переменную myIndex, если изначально планировалось использовать ее.

Комментарии