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 |
tgg Пользователь Сообщений: 12 |
Добрый вечер знатоки. Простой макрос стал прерываться ошибка runtime error 9 subscript out of range, долго искал причину.. а оказалось дело в следующем. При открытии другой Книги, или работая в другой книге в момент когда запускаются макросы (2 шт.каждые 60сек) в Книге1 и вылетает error Изменено: tgg — 16.03.2018 10:48:28 |
А где собственно вопрос? С уважением, |
|
tgg Пользователь Сообщений: 12 |
#3 27.03.2015 20:31:46 На строке With Worksheets(«Лист1») всё и происходит!
Изменено: tgg — 31.03.2015 22:50:24 |
||
Казанский Пользователь Сообщений: 8839 |
#4 27.03.2015 20:46:12 Начало второй процедуры:
Аналогично переделайте все квадратные скобки. |
||
tgg Пользователь Сообщений: 12 |
Вот в чём вопрос?? Изменено: tgg — 31.03.2015 22:50:35 |
1. Worksheets(«Лист1») — без указания принадлежности к книге, относится к активной в момент запуска макроса книге. Видимо, в ней нет листа Лист1. |
|
tgg Пользователь Сообщений: 12 |
Еще раз огромное спасибо!! |
Юрий М Модератор Сообщений: 60383 Контакты см. в профиле |
tgg, два момента: |
tgg Пользователь Сообщений: 12 |
#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. Вот собственно сам макрос:
Но старая песня, опять при открытии другой книги excel этот макрос зачем-то срабатывает и встаёт на 2 строке. |
||
Johny Пользователь Сообщений: 2737 |
Когда открывается книга, то она становится активной, и поэтому Ваш диапазон Range(«E18:E27») относится уже к ОТКРЫТОЙ книге. There is no knowledge that is not power |
tgg Пользователь Сообщений: 12 |
Пробовались разные варианты, это первый вариант макроса, с указанием листа и принадлежности к книге. Но результат всегда был один и тот же. |
Johny Пользователь Сообщений: 2737 |
#12 19.06.2015 22:20:38
Ну так покажите эти «разные» варианты. There is no knowledge that is not power |
||
tgg Пользователь Сообщений: 12 |
Так они ведь не работают как надо! |
Rjn Пользователь Сообщений: 6 |
#14 16.03.2018 09:08:30 Добрый день!
|
||
Rjn Пользователь Сообщений: 6 |
В чем ошибка??? |
Hugo Пользователь Сообщений: 23134 |
Ведь естественно — если файл закрыт, то при попытке его сохранения должна быть ошибка. |
Sanja Пользователь Сообщений: 14837 |
#17 16.03.2018 09:19:33
Вы же выше сами написали, что
Макрос написан именно так, что файл должен быть предварительно открыт Согласие есть продукт при полном непротивлении сторон. |
||||
Rjn Пользователь Сообщений: 6 |
А где и как исправить макрос, что бы он работал при закрытом файле? |
vikttur Пользователь Сообщений: 47199 |
1. Код в сообщении следует оформлять кнопкой <…> |
vsahno Пользователь Сообщений: 42 |
#20 21.02.2019 19:08:28
У меня не были прописаны ПОЛНЫЕ ИМЕНА ФАЙЛОВ! — только название, без расширения: |
||
Подстрочный индекс Excel VBA вне допустимого диапазона
Индекс вне диапазона — это ошибка, с которой мы сталкиваемся в VBA, когда пытаемся сослаться на что-то или на переменную, которая не существует в коде, например, предположим, что у нас нет переменной с именем x, но мы используем функцию msgbox для x, которую мы столкнется с ошибкой нижнего индекса вне диапазона.
Ошибка VBA Subscript out of range возникает из-за того, что объект, к которому мы пытаемся получить доступ, не существует. Это тип ошибки в Кодирование VBAКод VBA относится к набору инструкций, написанных пользователем на языке программирования приложений Visual Basic в редакторе Visual Basic (VBE) для выполнения определенной задачи.читать далее, и это «Ошибка времени выполнения 9». Важно понимать принципы написания эффективного кода, и еще более важно понимать ошибка вашего кода VBAОбработка ошибок VBA относится к устранению различных ошибок, возникающих при работе с VBA. читать далее для эффективной отладки кода.
Если ваша ошибка кодирования, и вы не знаете, что это за ошибка, когда вы ушли.
Врач не может дать лекарство своему пациенту, не зная, что это за болезнь. Конечно, и врачи, и пациенты знают, что есть болезнь (ошибка), но важнее понять болезнь (ошибку), чем давать от нее лекарство. Если вы можете прекрасно понять ошибку, то найти решение будет намного проще.
На аналогичном примечании в этой статье мы увидим одну из важных ошибок, с которыми мы обычно сталкиваемся регулярно, то есть ошибку «Нижний индекс вне диапазона» в Excel VBA.
Вы можете использовать это изображение на своем веб-сайте, в шаблонах и т. д. Пожалуйста, предоставьте нам ссылку на авторствоСсылка на статью должна быть гиперссылкой
Например:
Источник: Нижний индекс VBA вне допустимого диапазона (wallstreetmojo.com)
Что такое ошибка нижнего индекса вне диапазона в Excel VBA?
Например, если вы обращаетесь к листу, которого нет в рабочей тетради, то мы получаем Ошибка времени выполнения 9: «Нижний индекс вне диапазона».
Если вы нажмете кнопку «Конец», подпроцедура завершится, если вы нажмете «Отладка», вы перейдете к строке кода, где произошла ошибка, а справка приведет вас на страницу веб-сайта Microsoft.
Почему возникает ошибка Subscript Out of Range?
Как я сказал как врач важно найти покойника, прежде чем думать о лекарстве. Ошибка VBA Subscript out of range возникает, когда строка кода не читает введенный нами объект.
Например, посмотрите на изображение ниже. У меня есть три листа с именами Лист1, Лист2, Лист3.
Теперь в коде я написал код для выбора листа «Продажи».
Код:
Sub Macro2() Sheets("Sales").Select End Sub
Если я запущу этот код с помощью клавиши F5 или вручную, я получу Ошибка времени выполнения 9: «Нижний индекс вне диапазона».
Это потому, что я пытался получить доступ к объекту рабочего листа «Продажи», который не существует в рабочей книге. Это ошибка времени выполнения, поскольку эта ошибка возникла при выполнении кода.
Другая распространенная ошибка нижнего индекса, которую мы получаем, — это когда мы ссылаемся на книгу, которой там нет. Например, посмотрите на приведенный ниже код.
Код:
Sub Macro1() Dim Wb As Workbook Set Wb = Workbooks("Salary Sheet.xlsx") End Sub
Приведенный выше код говорит, что переменная WB должна быть равна рабочей книге «Salary Sheet.xlsx». На данный момент эта книга не открывается на моем компьютере. Если я запущу этот код вручную или через клавишу F5, я получу Ошибка времени выполнения 9: «Нижний индекс вне диапазона».
Это связано с книгой, о которой я говорю, которая либо не открыта, либо вообще не существует.
Ошибка индекса VBA в массивах
Когда вы объявляете массив как динамический массив и не используете слово DIM или РЕДИМ в VBAОператор VBA Redim увеличивает или уменьшает объем памяти, доступный для переменной или массива. Если с этим оператором используется Preserve, создается новый массив другого размера; в противном случае изменяется размер массива текущей переменной.читать далее чтобы определить длину массива, мы обычно получаем ошибку VBA Subscript out of range. Например, посмотрите на приведенный ниже код.
Код:
Sub Macro3() Dim MyArray() As Long MyArray(1) = 25 End Sub
В приведенном выше примере я объявил переменную как массив, но не назначил начальную и конечную точки; скорее, я сразу присвоил первому массиву значение 25.
Если я запущу этот код с помощью клавиши F5 или вручную, мы получим Ошибка времени выполнения 9: «Нижний индекс вне диапазона».
Чтобы решить эту проблему, мне нужно присвоить длину массива с помощью слова Redim.
Код:
Sub Macro3() Dim MyArray() As Long ReDim MyArray(1 To 5) MyArray(1) = 25 End Sub
Этот код не выдает никаких ошибок.
Как показать ошибки в конце кода VBA?
Если вы не хотите видеть ошибку, пока код запущен и работает, но вам нужен список ошибок в конце, вам нужно использовать обработчик ошибок «On Error Resume». Посмотрите на приведенный ниже код.
Код:
Sub Macro1() Dim Wb As Workbook On Error Resume Next Set Wb = Workbooks("Salary Sheet.xlsx") MsgBox Err.Description End Sub
Как мы видели, этот код выдает Ошибка времени выполнения 9: «Нижний индекс вне диапазона в экселе VBA. Но я должен использовать обработчик ошибок При ошибке продолжить дальше в VBAОператор VBA On Error Resume — это аспект обработки ошибок, используемый для игнорирования строки кода, из-за которой возникла ошибка, и продолжения со следующей строки сразу после строки кода с ошибкой.читать далее во время выполнения кода. Никаких сообщений об ошибках мы не получим. Скорее в конце окна сообщения отображается описание ошибки, подобное этому.
Вы можете скачать шаблон подписки Excel VBA вне диапазона здесь: — Подстрочный индекс VBA вне шаблона диапазона
УЗНАТЬ БОЛЬШЕ >>
Post Views: 693
I have a problem in excel Vba when I try to run this code, I have an error of subscript out of range:
Private Sub UserForm_Initialize()
n_users = Worksheets(Aux).Range("C1").Value
Debug.Print Worksheets(Aux).Range("B1:B" & n_users).Value
ListBox1.RowSource = Worksheets(Aux).Range("B1:B" & n_users).Value
ComboBox1.RowSource = Worksheets(Aux).Range("B1:B" & n_users).Value
ComboBox2.RowSource = Worksheets(Aux).Range("B1:B" & n_users).Value
End Sub
And Debug.Print works well, so the only problem is in Range(«B1:B» & n_users).Value.
asked Oct 19, 2013 at 15:15
user2898085user2898085
492 gold badges4 silver badges14 bronze badges
5
If the name of your sheet is «Aux», change each Worksheets(Aux)
reference to Worksheets("Aux")
. Unless you make Aux
a string variable, for example:
Dim Aux As String
Aux = "YourWorksheetName"
n_users = Worksheets(Aux).Range(C1).Value
you must use quatations around sheet references.
answered Oct 19, 2013 at 16:36
ARichARich
3,2004 gold badges30 silver badges56 bronze badges
1
Firstly, unless you have Aux
defined somewhere in the actual code, this will not work. The sheet-name reference must be a string value, not an empty variable (which ARich explains in his answer).
Second, the way in which you are trying to populate the rowsource value is incorrect. The rowsource property of a combobox is set using a string value that references the target range. By this I mean the same string value you would use in an excel formula to reference a cell in another sheet. For instance, if your worksheet is named «Aux» then this would be your code:
ComboBox1.RowSource = "Aux!B1:B" & n_users
I think you can also use named ranges. This link explains it a little.
answered Oct 19, 2013 at 18:13
Ross BrasseauxRoss Brasseaux
3,8411 gold badge27 silver badges46 bronze badges
2
I can’t see how you can get an Error 9 on that line. As others have pointed out repeatedly, the place you’ll get it is if the variable Aux doesn’t have a string value representing the name of a worksheet. That aside, I’m afraid that there is a LOT wrong with that code. See the comments in the below revision of it, which as near as I can figure is what you’re trying to get to:
Private Sub UserForm_Initialize()
'See below re this.
aux = "Sheet2"
'You should always use error handling.
On Error GoTo ErrorHandler
'As others have pointed out, THIS is where you'll get a
'subscript out of range if you don't have "aux" defined previously.
'I'm also not a fan of NOT using Option Explicit, which
'would force you to declare exactly what n_users is.
'(And if you DO have it declared elsewhere, I'm not a fan of using
'public variables when module level ones will do, or module
'level ones when local will do.)
n_users = Worksheets(aux).Range("C1").Value
'Now, I would assume that C1 contains a value giving the number of
'rows in the range in column B. However this:
'*****Debug.Print Worksheets(aux).Range("B1:B" & n_users).Value
'will only work for the unique case where that value is 1.
'Why? Because CELLS have values. Multi-cell ranges, as a whole,
'do not have single values. So let's get rid of that.
'Have you consulted the online Help (woeful though
'it is in current versions) about what the RowSource property
'actually accepts? It is a STRING, which should be the address
'of the relevant range. So again, unless
'Range("B1:B" & n_users) is a SINGLE CELL that contains such a string
'(in which case there's no point having n_users as a variable)
'this will fail as well when you get to it. Let's get rid of it.
'****ListBox1.RowSource = Worksheets(aux).Range("B1:B" & n_users).Value
'I presume that this is just playing around so we'll
'ignore these for the moment.
'ComboBox1.RowSource = Worksheets(aux).Range("B1:B" & n_users).Value
'ComboBox2.RowSource = Worksheets(aux).Range("B1:B" & n_users).Value
'This should get you what you want. I'm assigning to
'variables just for clarity; you can skip that if you want.
Dim l_UsersValue As Long
Dim s_Address As String
l_UsersValue = 0
s_Address = ""
'Try to get the n_users value and test for validity
On Error Resume Next
l_UsersValue = Worksheets(aux).Range("C1").Value
On Error GoTo ErrorHandler
l_UsersValue = CLng(l_UsersValue)
If l_UsersValue < 1 Or l_UsersValue > Worksheets(aux).Rows.Count Then
Err.Raise vbObjectError + 20000, , "User number range is outside acceptable boundaries. " _
& "It must be from 1 to the number of rows on the sheet."
End If
'Returns the cell address
s_Address = Worksheets(aux).Range("B1:B" & n_users).Address
'Add the sheet name to qualify the range address
s_Address = aux & "!" & s_Address
'And now that we have a string representing the address, we can assign it.
ListBox1.RowSource = s_Address
ExitPoint:
Exit Sub
ErrorHandler:
MsgBox "Error: " & Err.Description
Resume ExitPoint
End Sub
answered Oct 19, 2013 at 20:09
Alan KAlan K
1,9473 gold badges19 silver badges30 bronze badges
5