Добрый день, ознакомление с VBA начал буквально вчера. Столкнулся с проблемой
Пытаюсь написать макрос, который будет копировать информацию со всех листов книги и вставлять на первый лист ALL. Кол-во листов и их названия будут всегда разные. Чтобы макрос не выдавал ошибку и не прерывался натыкаясь на несуществующий лист, я попытался применить функцию On error, если ошибка, то переходим к следующему листу. Но он всё равно выдает ошибку, когда добирается до листа, которого нет.
Просьба помочь разобраться, и доступно объяснить в чём моя ошибка, только учусь, пока слабо разбираюсь даже в элементарном) Заранее спасибо
Добрый день, ознакомление с VBA начал буквально вчера. Столкнулся с проблемой
Пытаюсь написать макрос, который будет копировать информацию со всех листов книги и вставлять на первый лист ALL. Кол-во листов и их названия будут всегда разные. Чтобы макрос не выдавал ошибку и не прерывался натыкаясь на несуществующий лист, я попытался применить функцию On error, если ошибка, то переходим к следующему листу. Но он всё равно выдает ошибку, когда добирается до листа, которого нет.
Просьба помочь разобраться, и доступно объяснить в чём моя ошибка, только учусь, пока слабо разбираюсь даже в элементарном) Заранее спасибоIgnat161
Посмотрите здесь И вообще: Sheets(5) - это пятый по порядку слева направо лист, а Лист5 - это (если не исправлять ничего) лист, который был вставлен в книгу пятым (и не важно, где он находится). Кстати, листы очень удобно перебирать в цикле. Что-то типа вот так [vba]
Код
Sub Макрос1() sc_ = ThisWorkbook.Sheets.Count For i = 1 To sc_ If Sheets(i).Name <> "ALL" Then r1_ = Sheets("ALL").Range("A" & Rows.Count).End(xlUp).Row + 1 With Sheets(i) .Range(.Range("A8"), .Range("A8").SpecialCells(xlLastCell)).Copy Sheets("ALL").Range("A" & r1_) End With End If Next i End Sub
[/vba]
Посмотрите здесь И вообще: Sheets(5) - это пятый по порядку слева направо лист, а Лист5 - это (если не исправлять ничего) лист, который был вставлен в книгу пятым (и не важно, где он находится). Кстати, листы очень удобно перебирать в цикле. Что-то типа вот так [vba]
Код
Sub Макрос1() sc_ = ThisWorkbook.Sheets.Count For i = 1 To sc_ If Sheets(i).Name <> "ALL" Then r1_ = Sheets("ALL").Range("A" & Rows.Count).End(xlUp).Row + 1 With Sheets(i) .Range(.Range("A8"), .Range("A8").SpecialCells(xlLastCell)).Copy Sheets("ALL").Range("A" & r1_) End With End If Next i End Sub
Sub copy_rows() 'перебираем все листы в активной рабочей книге For Each sh In ActiveWorkbook.Sheets 'если попадается лист ALL то действий не производим. If sh.Name <> "ALL" Then 'определяем последнюю заполненную строку на перебираемом листе lr = sh.Cells(Rows.Count, 1).End(xlUp).Row ' выделяем ряд с восьмого по последний sh.Rows("8:" & lr).Copy 'определяем последнюю незаполненную строку на листа ALL k = Sheets("ALL").Cells(Rows.Count, 1).End(xlUp).Row + 1 'вставляем данные Sheets("ALL").Rows(k).PasteSpecial Paste:=xlPasteValues End If Next ' переход к следующему листу End Sub
[/vba]
Альтернативный вариант [vba]
Код
Sub copy_rows() 'перебираем все листы в активной рабочей книге For Each sh In ActiveWorkbook.Sheets 'если попадается лист ALL то действий не производим. If sh.Name <> "ALL" Then 'определяем последнюю заполненную строку на перебираемом листе lr = sh.Cells(Rows.Count, 1).End(xlUp).Row ' выделяем ряд с восьмого по последний sh.Rows("8:" & lr).Copy 'определяем последнюю незаполненную строку на листа ALL k = Sheets("ALL").Cells(Rows.Count, 1).End(xlUp).Row + 1 'вставляем данные Sheets("ALL").Rows(k).PasteSpecial Paste:=xlPasteValues End If Next ' переход к следующему листу End Sub
Спасибо за помощь. Я понимаю, что мой код ни куда не годится, но это первый макрос, который я попробовал создать, подскажите, где там всё-таки ошибка?
Спасибо за помощь. Я понимаю, что мой код ни куда не годится, но это первый макрос, который я попробовал создать, подскажите, где там всё-таки ошибка?Ignat161
Sheets(5) - это пятый по порядку слева направо лист, а Лист5 - это (если не исправлять ничего) лист, который был вставлен в книгу пятым (и не важно, где он находится).
Sheets(5) - это пятый по порядку слева направо лист, а Лист5 - это (если не исправлять ничего) лист, который был вставлен в книгу пятым (и не важно, где он находится).
Если ошибка возникает при активном обработчике ошибок (между возникновением ошибки и операторами Resume, Exit SubExit Function или Exit Property), обработчик ошибок в текущей процедуре не сможет обработать ошибку. Управление передается вызывающей процедуре.
Если у вызывающей процедуры есть включенный обработчик ошибок, он активируется для обработки ошибки. Если обработчик ошибок вызывающей процедуры уже активен, управление возвращается по цепочке предыдущим вызывающим процедурам до тех пор, пока не будет найден включенный, но неактивный обработчик ошибок. Если такой обработчик ошибок не найден, ошибка оказывается неустранимой в той точке, где она реально возникла.
Если ошибка возникает при активном обработчике ошибок (между возникновением ошибки и операторами Resume, Exit SubExit Function или Exit Property), обработчик ошибок в текущей процедуре не сможет обработать ошибку. Управление передается вызывающей процедуре.
Если у вызывающей процедуры есть включенный обработчик ошибок, он активируется для обработки ошибки. Если обработчик ошибок вызывающей процедуры уже активен, управление возвращается по цепочке предыдущим вызывающим процедурам до тех пор, пока не будет найден включенный, но неактивный обработчик ошибок. Если такой обработчик ошибок не найден, ошибка оказывается неустранимой в той точке, где она реально возникла.