Runtime error 9 subscript out of range как исправить excel

 

tgg

Пользователь

Сообщений: 12
Регистрация: 23.02.2014

Добрый вечер знатоки. Простой макрос стал прерываться ошибка runtime error 9 subscript out of range, долго искал причину.. а оказалось дело в следующем. При открытии другой Книги, или работая в другой книге в момент когда запускаются макросы (2 шт.каждые 60сек) в Книге1 и вылетает error

Изменено: tgg16.03.2018 10:48:28

 

А где собственно вопрос?

С уважением,
Федор/Все_просто

 

tgg

Пользователь

Сообщений: 12
Регистрация: 23.02.2014

#3

27.03.2015 20:31:46

На строке With Worksheets(«Лист1») всё и происходит!
Что надо изменить в коде (?) для работы одновременно в разных Книгах EXCEL

Код
Sub ShowWatch()     
ThisWorkbook.Sheets(1).Range("F1").Value = Now - Date     
Application.OnTime Now + TimeSerial(0, 0, 60), "ShowWatch"     
Application.OnTime Now + TimeSerial(0, 0, 60), "Proverka" 
End Sub 

Private Sub "Proverka"() 
With Worksheets("Лист1")             
If [I2] = "a" Then                 
Exit Sub             
 End If             
If [J2] <> "Ok" Then                 
Exit Sub             
 End If 
OtpravkaPisma     
[I2] = "a"     
[G2] = [D139]     
[G2].Value = [G2].Value         
End With End Sub

Изменено: tgg31.03.2015 22:50:24

 

Казанский

Пользователь

Сообщений: 8839
Регистрация: 11.01.2013

#4

27.03.2015 20:46:12

Начало второй процедуры:

Код
Private Sub Proverka()
With ThisWorkbook.Worksheets("Лист1")
  If .Range("I2") = "a" Then

Аналогично переделайте все квадратные скобки.

 

tgg

Пользователь

Сообщений: 12
Регистрация: 23.02.2014

Вот в чём вопрос??
Пол часа полёт нормальный!
Спасибо огромное, все работает.
Но мучает вопрос, в чем косяк случился?

Изменено: tgg31.03.2015 22:50:35

 

1. Worksheets(«Лист1»)  — без указания принадлежности к книге, относится к активной в момент запуска макроса книге. Видимо, в ней нет листа Лист1.
2. Оператор With фактически не работает, т.к. нигде нет обращения к свойству или методу, начинающегося с точки.
3. [I2], т.е. Range(«I2») — без указания листа, относится к активному в момент запуска макроса листу.

 

tgg

Пользователь

Сообщений: 12
Регистрация: 23.02.2014

Еще раз огромное спасибо!!

 

Юрий М

Модератор

Сообщений: 60574
Регистрация: 14.09.2012

Контакты см. в профиле

tgg, два момента:
1. Свои коды оформляйте соответствующим тегом — посмотрите, как выглядит код у Казанского.
2. Не нужно цитировать всё подряд.

 

tgg

Пользователь

Сообщений: 12
Регистрация: 23.02.2014

#9

19.06.2015 22:03:22

Доброго времени суток! Не прошло и полгода …. Я к Вам с поклоном и вопросом.
Макрос в модуле листа из этой темы (

http://www.planetaexcel.ru/forum/?FID=8&PAGE_NAME=read&TID=30902

), с той лишь разностью, что работает с диапазоном — If Not Intersect(ActiveCell, Range(«E18:E27»)) Is Nothing Then. Вот собственно сам макрос:

Код
Option Explicit 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If Not Intersect(ActiveCell, Range("E18:E27")) Is Nothing Then 
        Call Module1.Spravka 
    End If 
End Sub 

Но старая песня, опять при открытии другой книги excel этот макрос зачем-то срабатывает и встаёт на 2 строке.
Подскажите пожалуйста, как его поправить!?!
Спасибо!

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

Когда открывается книга, то она становится активной, и поэтому Ваш диапазон Range(«E18:E27») относится уже к ОТКРЫТОЙ книге.

There is no knowledge that is not power

 

tgg

Пользователь

Сообщений: 12
Регистрация: 23.02.2014

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

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

#12

19.06.2015 22:20:38

Цитата
tgg написал: Пробовались разные варианты

Ну так покажите эти «разные» варианты.

There is no knowledge that is not power

 

tgg

Пользователь

Сообщений: 12
Регистрация: 23.02.2014

Так они ведь не работают как надо!

 

Rjn

Пользователь

Сообщений: 6
Регистрация: 16.03.2018

#14

16.03.2018 09:08:30

Добрый день!
В макросах новичок, второй день разбираюсь.
Подскажите  пожалуйста.
Есть макрос который из одного файла переносит информацию в другой файл.
Другой файл называется «Система прогнозирования свободных остатков_пробный.xlsm»
Если этот файл открыт, то  данные переносятся, если файл закрыт, то данные не переносятся и выходит ошибка subscript out of range
Ниже макрос

Код
Dim sbor As Range

Sub PerenosSbor()
   Dim lStart As Long, lEnd As Long, lLastRow As Long

   Application.ScreenUpdating = False
   Application.EnableEvents = False

  Workbooks("Система прогнозирования свободных остатков_пробный.xlsm").Save

   Application.Wait (Now + TimeValue("0:00:3"))

   '1. Определение первой ячейки с данными в столбце "A".
   'After:=Cells(Rows.Count, "A") указывает, с какой ячейки начать поиск.
   'Если не указывать, то поиск ведётся с ячейки "A1" и первой просматриватся
   'ячейка "A2". Если данные уже есть в ячейке "A1", то результат
   'будет неправильным. Поэтому нужно указать ячейку, с которой начинается поиск.

   lStart = Columns("A").Find(What:="?", After:=Cells(1, "A"), _
       LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, _
       SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Row

   '2. Определение последней ячейки с данными в столбце "A".

   lEnd = Columns("A").Find(What:="?", LookIn:=xlValues, LookAt:=xlPart, _
       SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
       MatchCase:=False, SearchFormat:=False).Row

   '3. Выделение диапазона с данными в столбце "A".

  Set sbor = Range("A" & lStart & ":G" & lEnd)

With Workbooks("Система прогнозирования свободных остатков_пробный.xlsm").Worksheets("1.СБОР")
lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
On Error Resume Next
.ShowAllData
sbor.Copy
.Range("A" & lLastRow).PasteSpecial xlPasteValuesAndNumberFormats
End With

Workbooks("Система прогнозирования свободных остатков_пробный.xlsm").Save
   Application.ScreenUpdating = True
   Application.EnableEvents = True
End Sub
 

Rjn

Пользователь

Сообщений: 6
Регистрация: 16.03.2018

В чем ошибка???
На сколько я знаю  историю создания макроса, данный макрос так же  писал не профи)

 

Hugo

Пользователь

Сообщений: 23250
Регистрация: 22.12.2012

Ведь естественно — если файл закрыт, то при попытке его сохранения должна быть ошибка.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#17

16.03.2018 09:19:33

Цитата
Rjn написал: В чем ошибка?

Вы же выше сами написали, что

Цитата
Rjn написал: Если этот файл открыт, то  данные переносятся, если файл закрыт, то данные не переносятся

Макрос написан именно так, что файл должен быть предварительно открыт

Согласие есть продукт при полном непротивлении сторон.

 

Rjn

Пользователь

Сообщений: 6
Регистрация: 16.03.2018

А где и как исправить макрос, что бы он работал при закрытом  файле?

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

1. Код в сообщении  следует оформлять кнопкой <…>
2. Не нужно форматировать шрифт мелким. Стандартный нормально смотрится.

 

vsahno

Пользователь

Сообщений: 42
Регистрация: 22.07.2017

#20

21.02.2019 19:08:28

Цитата
tgg написал:
Так они ведь не работают как надо!

У меня не были прописаны ПОЛНЫЕ ИМЕНА ФАЙЛОВ! — только название, без расширения:
Workbooks(«Авторизация»).Worksheets(«Лист8»)
НА моем компе макросы работали как надо! НО при установке у клиента … как там — …»runtime error 9 subscript out of range». Главное у них и по сети на 1 компе все прекрасно работало!!!
Пока додумался до: Workbooks(«Авторизация.xlsm»).Worksheets(«Лист8») —  больше часа убил и вспотел! :)

 

Дмитрий Минин

Пользователь

Сообщений: 2
Регистрация: 04.07.2022

#21

21.03.2023 10:15:59

Добрый день!
Подскажите, как исправить ошибку, мозгов не хватает понять и разобраться?!

Код
Sub GetCoordinates()
    Dim fso As Object
    Dim objShell As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim strPath As String
    Dim arrDetails As Variant
    Dim latRef As String, lonRef As String
    Dim latDeg As Double, latMin As Double, latSec As Double, lonDeg As Double, lonMin As Double, lonSec As Double, alt As Double
    Dim i As Integer
    
    'Путь к файлу
    strPath = "C:UsersMininDODesktopExifTool-54_[10].JPG"
    
    'Создание объектов
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(fso.GetParentFolderName(strPath))
    Set objFile = objFolder.ParseName(fso.GetFileName(strPath))
    
    'Получение деталей файла
    arrDetails = Split(objFolder.GetDetailsOf(objFile, 27), ";")
    
    'Извлечение координат
    For i = 0 To UBound(arrDetails)
        If InStr(arrDetails(i), "GPS Latitude Ref") > 0 Then
            latRef = arrDetails(i + 1)
        ElseIf InStr(arrDetails(i), "GPS Latitude") > 0 Then
            latDeg = CDbl(Split(arrDetails(i + 1), "°")(0))
            latMin = CDbl(Split(arrDetails(i + 1), "°")(1))
            latSec = CDbl(Split(Split(arrDetails(i + 1), "°")(2), ".")(0))
        ElseIf InStr(arrDetails(i), "GPS Longitude Ref") > 0 Then
            lonRef = arrDetails(i + 1)
        ElseIf InStr(arrDetails(i), "GPS Longitude") > 0 Then
            lonDeg = CDbl(Split(arrDetails(i + 1), "°")(0))
            lonMin = CDbl(Split(arrDetails(i + 1), "°")(1))
            lonSec = CDbl(Split(Split(arrDetails(i + 1), "°")(2), ".")(0))
        ElseIf InStr(arrDetails(i), "GPS Altitude") > 0 Then
            alt = CDbl(Replace(arrDetails(i + 1), " m", ""))
        End If
    Next i
    
    'Преобразование координат в десятичные градусы
    If latRef = "S" Then
        latDeg = -latDeg
    End If
    If lonRef = "W" Then
        lonDeg = -lonDeg
    End If
    latDeg = latDeg + (latMin / 60) + (latSec / 3600)
    lonDeg = lonDeg + (lonMin / 60) + (lonSec / 3600)
    
    'Вывод координат в ячейки Excel
    Sheets("Sheet1").Range("A1").Value = latDeg
    Sheets("Sheet1").Range("B1").Value = lonDeg
    Sheets("Sheet1").Range("C1").Value = alt
    
    'Очистка объектов
    Set fso = Nothing
    Set objShell = Nothing
    Set objFolder = Nothing
    Set objFile = Nothing
End Sub

Прикрепленные файлы

  • Безымянный.jpg (228.87 КБ)

 

Существует ли лист «Sheet1» в активной книге?

 

Дмитрий Минин

Пользователь

Сообщений: 2
Регистрация: 04.07.2022

#23

21.03.2023 11:00:04

Цитата
написал:
Существует ли лист «Sheet1» в активной книге?

Понял ошибку и уже исправил.

  • Индекс VBA Excel вне диапазона

Индекс VBA Excel вне диапазона

Индекс VBA вне диапазона или, как правило, известен как ошибка времени выполнения 9, возникает, когда мы выбираем такую ​​ячейку, лист или книгу, которые на самом деле не соответствуют диапазону или критериям, определенным в Excel. Как будто мы выбрали диапазон из 100 ячеек или столбца, и мы вызвали значения, хранящиеся в 120 ячейках того же столбца. Это означает, что мы выходим за пределы диапазона, чтобы выбрать и вызвать значения, которые не входят в наши определенные критерии. Когда возникает такая ситуация, мы получаем сообщение «Ошибка выполнения 9» во время компиляции или запуска кода. Сообщение об ошибке VBA Subscript out of Range поможет нам исправить ошибку, связанную с диапазоном, выбранным в Excel.

Пример индекса VBA Excel вне диапазона

Ниже приведены различные примеры VBA Subscript вне диапазона в Excel.

Вы можете скачать этот VBA Subscript вне шаблона Excel здесь — VBA Subscript вне шаблона Excel

Индекс VBA вне диапазона — пример № 1

Сначала рассмотрим простой пример. Для этого нам нужно перейти в окна VBA и добавить новый модуль, выбрав пункт меню «Вставка», как показано ниже.

Мы получим белое пустое окно модуля. Это где мы должны сделать работу кодирования.

Теперь напишите «Подкатегория выполняемой функции», для лучшей практики сохраните имя функции в «Подкатегории», как мы делали здесь для VBA Subscript вне диапазона.

Код:

 Sub Subscript_OutOfRange1 () End Sub 

Здесь, в Excel, у нас есть только один лист с именем «Лист1», как показано ниже.

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

Теперь перейдите в окно VBA и напишите Sheets (2), а затем выберите функцию Select, как показано ниже. Это означает, что мы выбираем последовательность листов 2- й позиции с помощью функции выбора.

Код:

 Sub Subscript_OutOfRange1 () Sheets (2). Выберите End Sub 

Теперь скомпилируйте полный код или сделайте это шаг за шагом, чтобы узнать, какая часть кода является ошибкой. Поскольку у нас есть только одна строка кода, мы можем напрямую запустить код, нажав кнопку воспроизведения под строкой меню. Мы получим сообщение об ошибке « V-Time error 9, Subscript out of range » в VBA, как показано ниже.

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

Теперь снова запустите код. И поскольку мы не увидели никакой ошибки, это означает, что наш код завершает успешный запуск.

Индекс VBA вне диапазона — пример № 2

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

Код:

 Sub Subscript_OutOfRange2 () End Sub 

Теперь с помощью Worksheet мы активируем Sheet1, как показано ниже.

Код:

 Sub Subscript_OutOfRange2 () Рабочие листы ("Sheet1"). Активировать конечную Sub 

Теперь скомпилируйте полный код и запустите. Мы заметим, что не появилось сообщение об ошибке, что означает, что выполнение кода прошло успешно. Теперь давайте поместим пространство между «Листом 1»

Снова скомпилируйте и запустите код.

Как мы видим выше, даже если наш полный процесс и способ написания кода верны, но мы взяли правильное имя листа как «Лист 1». Который на самом деле не имеет места между «Лист1».

Это показывает, что все еще есть шансы получить ошибку, если не написать или написать правильное имя листа или имя книги.

Индекс VBA вне диапазона — пример № 3

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

Код:

 Sub Subscript_OutOfRange3 () End Sub 

Теперь с помощью DIM определите массив любого размера и передайте его в строку или целое число. Что зависит от того, что мы хотим хранить в массиве, числа или текст.

Здесь мы рассмотрели массив 2 × 3 как String, как показано ниже.

Код:

 Sub Subscript_OutOfRange3 () Dim SubArray (2, 3) As Sub String End Sub 

Таким образом, он сформирует таблицу для 2 строк и 3 столбцов, и мы можем хранить любые значения в соответствии с нашими потребностями. Поскольку мы выбрали строку, то мы будем рассматривать текст или алфавиты в нем.

Теперь во второй строке кода выберите созданный массив, но с дополнительным или большим столбцом и назначьте текст как ABC или любой другой текст по вашему выбору. Здесь мы выбрали массив 2 × 5, как показано ниже.

Код:

 Sub Subscript_OutOfRange3 () Dim SubArray (2, 3) As String SubArray (2, 5) = ABC End Sub 

Теперь скомпилируйте и запустите код. Как мы можем видеть на скриншоте ниже, мы получили сообщение об ошибке VBA Subscript of Range в Run-time error 9.

Причина получения этой ошибки заключается в том, что мы выбрали неверный диапазон массива в пределах 2 дополнительных столбцов от 2 × 3 до 2 × 5, что выходит за пределы кода. Теперь, если мы снова выберем правильный диапазон массива как 2 × 3 и посмотрим, что произойдет.

После компиляции и запуска кода. Мы увидим, что не получили никакой ошибки, что означает, что наш код был успешно выполнен.

Плюсы Excel VBA Subscript вне диапазона

  • Индекс VBA вне диапазона позволяет нам узнать, что за ошибка произошла. Так что мы можем конкретно найти решение полученного кода ошибки.
  • Поскольку индекс VBA выходит за пределы диапазона «Ошибка времени выполнения 9», очень полезно знать, какая ошибка произошла в Excel.

То, что нужно запомнить

  • Рекомендуется использовать подкатегорию в имени выполняемой функции с последовательностью кода, чтобы ее было легко отслеживать.
  • Сохраните файл как Macro-Enabled Workbook, чтобы избежать потери написанного кода.
  • Если у вас огромные строки кода, лучше скомпилировать каждую строку кода одну за другой, нажав клавишу F8. Этот метод компилирует каждый шаг кода, чтобы мы могли сразу узнать, какая часть кода действительно имеет ошибку с первого раза.

Рекомендуемые статьи

Это было руководство по Excel VBA Subscript вне диапазона. Здесь мы обсудили причину возникновения ошибки VBA Subscript out of Range (Ошибка времени выполнения 9), а также некоторые практические примеры и загружаемый шаблон Excel. Вы также можете просмотреть наши другие предлагаемые статьи —

  1. Как исправить ошибку VBA 1004?
  2. Понимание ошибок в Excel
  3. Полное руководство по VBA при ошибке
  4. Использование функции IFERROR Excel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
Sub Statistika()
 SearchingPath = Application.GetOpenFilename("Ôàéëû Microsoft Office Excel (*.xls), *.xls", _
 Title:="Ïîèñê ôàéëîâ äëÿ áàçû äàííûõ (Car*.xls)")
 
 'Ìåõàíèçì âûäåëåíèÿ ïóòè ê ïàïêå èç ïîëíîãî ïóòè ê ôàéëó
 k = InStr(1, StrReverse(SearchingPath), "")
 SearchingPath = Left(SearchingPath, Len(SearchingPath) - k + 1)
 
 Application.ScreenUpdating = False
 
 'Íîâûé ñïîñîá çàäàíèÿ ïàïêè ñ ôàéëàìè
 'With Application.FileDialog(msoFileDialogFolderPicker)
 '    .Show
 '    SearchingPath = .SelectedItems(1)
 'End With
 
 Set DataCell = Workbooks("statistika").Sheets("Ñóììû").Range("A1")
 With Application.FileSearch
   .LookIn = SearchingPath
   '.Filename = SearchingPath
   .Filename = "Car*.xls"
   .Execute
   NumOfFiles = .Execute
   For i = 1 To .FoundFiles.Count
  'ïðîâåðêà íàõîæäåíèÿ îáðàáîòàííîãî ôàéëà â áàçå äàííûõ
    Do
     
     'ìåõàíèçì âûäåëåíèÿ íàçâàíèÿ ôàéëà èç ïîëíîãî ïóòè ê íåìó
     FullName = .FoundFiles(i)
     k = InStr(1, StrReverse(FullName), "")
     Path = Left(FullName, Len(FullName) - k + 1)
     Filename = Right(FullName, k - 1)
     
     
     'DataCell.Range("I2").FormulaR1C1 = _
      '  "=MID(R[0]C[-1],4,2)&"".""&MID(R[0]C[-1],6,2)&"".99"""
     'DataCell.Range("G1").Copy
     Set NameCell = Workbooks("statistika").Sheets("Ñóììû").Range("C9900")
     Do
      Set NameCell = NameCell.Offset(1, 0)
      s = NameCell.Address
      d = NameCell.Value
      If NameCell.Value = Filename Then
        'MsgBox ("Ôàéë " & FileName & " óæå îáðàáàòûâàëñÿ")
        i = i + 1
      End If
     Loop Until IsEmpty(NameCell.Offset(0, -1)) Or (NameCell.Value = Filename)
    Loop Until IsEmpty(NameCell.Offset(0, -1)) Or i > .FoundFiles.Count
    
    If Not (i > .FoundFiles.Count) Then
     Workbooks.Open (.FoundFiles(i))
     'Sheets("Car").Activate
     Set CarCell = Sheets("Car").Range("A1")
    'Íàõîæäåíèå ïåðâîé ïóñòîé ÿ÷åéêè â òàáëèöå
     Set DataCell = Workbooks("statistika").Sheets("Ñóììû").Range("A1")
     Do
       Set DataCell = DataCell.Offset(1, 0)
     Loop Until IsEmpty(DataCell.Range("B1")) And IsEmpty(DataCell.Range("C1"))
     
     s = DataCell.Address
     With DataCell
     'Ïåðåíîñ "øàïêè" (îáùèõ äàííûõ) â áàçó
        .Range("C1").Value = Filename
        .Range("B1").FormulaR1C1 = _
        "=MID(R[0]C[1],4,2)&"".""&MID(R[0]C[1],6,2)&"".07"""
        .Range("G1").Copy
        
        
     'ñôîðìèðîâàííàÿ ñòðîêà ÿâëÿåòñÿ øàáëîíîì îáùèõ äàííûõ. Îíà óäàëÿåòñÿ
        Set ShablonRow = _
         Workbooks("statistika").Sheets("Ñóììû").Range(DataCell.Row & ":" & DataCell.Row)
     'Ïåðåíîñ äàííûõ î òîâàðå â áàçó
        Set CarCell = Workbooks(Filename).Sheets("Car").Range("A1")
        
        Do
         If Not (CarCell.Column > 20) Then
           Set CarCell = CarCell.Offset(0, 1)
         Else
           Set CarCell = CarCell.Offset(1, -20)
         End If
        Loop Until (CarCell.Value = "òîâàð") Or (CarCell.Row > 50)
        
       If Not (CarCell.Value = "òîâàð") Then
        MsgBox ("ÿ÷åéêè ñî çíà÷åíèåì ""òîâàð"" â ôàéëå " & Filename & " íåò")
       Else
        Set BegCell = CarCell
        s = CarCell.Address
        
        Do
         If Not (CarCell.Column > 20) Then
            Set CarCell = CarCell.Offset(0, 1)
         Else
            Set CarCell = CarCell.Offset(1, -20)
         End If
         If IsEmpty(CarCell) Then
          n = n + 1
         Else
          n = 0
         End If
         s = CarCell.Address
        Loop Until (CarCell.Value = "Âñåãî:") Or (n > 20 * 20)
        
       If Not (CarCell.Value = "Âñåãî:") Then
        MsgBox ("ÿ÷åéêè ñî çíà÷åíèåì ""Âñåãî:"" â ôàéëå " & Filename & " íåò")
       Else
        Set EndCell = CarCell
        s = EndCell.Address
        Set CarCell = Workbooks(Filename).Sheets("Car").Range("A1")
        Set CarCell = BegCell.Offset(1, -1) 'ñòðîêà ïîñëå BegCell, ñòîëáåö À
        Do
         With CarCell
         'ïîñòàâùèê
          s = CarCell.Address
          If Not IsEmpty(.Range("B1")) And ((.Range("B1").Font.ColorIndex = 3) Or _
          (.Range("B1").Font.ColorIndex = 10) Or (.Range("B1").Font.ColorIndex = 43)) And _
          IsEmpty(.Range("A1")) Then
           vFirma = .Range("B1").Value
           Set CarCell = CarCell.Offset(1, 0)
           s = CarCell.Address
           bool = False
           Do
            With CarCell
             If Not IsEmpty(.Range("H1")) And ((.Range("H1").Font.ColorIndex = 3) Or _
              (.Range("H1").Font.ColorIndex = 10) Or (.Range("H1").Font.ColorIndex = 43)) _
              And IsEmpty(.Range("A1")) Then
               vSumma = .Range("H1").Value
               Set DataCell = DataCell.Offset(1, 0)
               ShablonRow.Copy
               DataCell.Range("1:1").PasteSpecial
               DataCell.Range("F1").Value = vSumma
               DataCell.Range("G1").Value = vFirma
               bool = True
               Set CarCell = CarCell.Offset(-2, 0)
               s = CarCell.Address
             End If
             Set CarCell = CarCell.Offset(1, 0)
             s = CarCell.Address
            End With
           Loop Until bool
          End If
          Set CarCell = CarCell.Offset(1, 0)
          s = CarCell.Address
         End With
        Loop Until CarCell.Row = EndCell.Row - 1
       End If 'âñåãî:
       End If 'òîâàð
     End With
     ShablonRow.Delete shift:=xlUp
     .Filename = .FoundFiles(i)
     Workbooks(Filename).Close SaveChanges:=False
     'MsgBox ("Çàêîí÷åíà îáðàáîòêà ôàéëà " & .FileName)
     'Workbooks("statistika").Save
    End If ' not(i > .FoundFiles.Count)
   Next i
   'MsgBox ("Îáðàáîòêà äàííûõ çàêîí÷åíà")
   Application.ScreenUpdating = True
 End With
 
 
 
End Sub

Home / VBA / VBA Subscript Out of Range Runtime Error (Error 9)

Subscript Out of Range Error (Run Time: Error 9) occurs when you refer to an object or try to use a variable in a code that doesn’t exist in the code, in that case, VBA will show this error. As every code that you write is unique, so the cause of the error would be.

In the following example, you have tried to activate the “Sheet1” which is an object. But as you can see in the workbook no worksheet exists with the name “Sheet1” (instead you have “Sheet2”) so VBA show “Subscript Out of Range” to notify you that there’s something wrong with the code.

Subscript Out of Range

There could be one more situation when you have to face the error “Subscript Out of Range Error” when you are trying to declare a dynamic array but forget to use the DIM and ReDim statement to redefine the length of the array.

Now in the above code, you have an array with the name “myArray” and to make it dynamic we have initially left the array length blank. But before you add an item you need to redefine the array length using the ReDim statement.

And that’s the mistake we have made in the above code and VBA has returned the “Script Out of Range” error.

Sub myMacro()
Dim myArray() As Variant
myArray(1) = "One"
End Sub

How Do I Fix Subscript Out of Range in Excel?

The best way to deal with this Subscript Out of Range is to write effective codes and make sure to debug the code that you have written (Step by Step).

When you run a code step by step it is easy for you to know on which line of that code you have an error as VBA will show you the error message for Error 9 and highlight that line with yellow color.

The other thing that you can do is to use an “Error Handler” to jump to a specific line of error when it happens.

In the following code, we have written a line to activate the sheet but before that, we have used the goto statement to move to the error handler. In the error handler, you have a message box that shows you a message with the Err. Description that an error has occurred.

So, when you run this code and the “Sheet1” is not in the workbook where you are trying to activate it. It will show you a message box just like below.

And if the “Sheet1” is there then there won’t be any message at all.

Sub myMacro()

Dim wks As Worksheet

On Error GoTo myError
Sheets("Sheet1").Activate

myError:
MsgBox "There's an error in the code: " & Err.Description & _
". That means there's some problem with the sheet " & _
"that you want to activate"

End Sub

I found a macro on the web to protect a worksheet with a password. It works fine, but when I save the file I get the message: run-time error ‘9’: subscription out of range. I have never programmed or used visual basic before and could use some help . Thank you

The macro is:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'Step 1:Protect the sheet with a password
    Sheets("Sheet1").protect Password:="btfd"

'Step 2: Save the workbook
    ActiveWorkbook.Save
End Sub

Community's user avatar

asked Feb 20, 2014 at 22:06

user3334808's user avatar

«Subscript out of range» indicates that you’ve tried to access an element from a collection that doesn’t exist. Is there a «Sheet1» in your workbook? If not, you’ll need to change that to the name of the worksheet you want to protect.

answered Feb 20, 2014 at 22:10

The Dark Canuck's user avatar

Why are you using a macro? Excel has Password Protection built-in. When you select File/Save As… there should be a Tools button by the Save button, click it then «General Options» where you can enter a «Password to Open» and a «Password to Modify».

answered Feb 20, 2014 at 22:21

Gordon Bell's user avatar

Gordon BellGordon Bell

13.1k3 gold badges45 silver badges64 bronze badges

When you get the error message, you have the option to click on «Debug»: this will lead you to the line where the error occurred. The Dark Canuck seems to be right, and I guess the error occurs on the line:

Sheets("Sheet1").protect Password:="btfd"

because most probably the «Sheet1» does not exist. However, if you say «It works fine, but when I save the file I get the message: run-time error ‘9’: subscription out of range» it makes me think the error occurs on the second line:

ActiveWorkbook.Save

Could you please check this by pressing the Debug button first?
And most important, as Gordon Bell says, why are you using a macro to protect a workbook?

answered Feb 21, 2014 at 9:17

Matteo NNZ's user avatar

Matteo NNZMatteo NNZ

11.8k11 gold badges53 silver badges88 bronze badges

Понравилась статья? Поделить с друзьями:
  • Runtime error 9 subscript out of range in vba excel
  • Runtime error 6 overflow что за ошибка excel
  • Runtime error 57121 excel
  • Runtime error 438 object doesn t support this property or method excel
  • Runtime error 380 excel