Что значит ошибка "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, если изначально планировалось использовать ее.