Страница: 1 |
Страница: 1 |
Вопрос: Ошибка обработки ошибок...
Добавлено: 17.04.07 11:52
Автор вопроса: demtruder
Всем привет!
Какая-то лажа с обработкой ошибок получается!
Подскажите, плз, если я чё не правильно делаю.
Sub Test()
On Error GoTo End_Line
Cells(6, 1).Resize(LastRow - 5, 25).Select
On Error GoTo End_Line2
Cells(6, 1).Resize(LastRow - 5, 34).Select
Exit Sub
End_Line:
******************************************
Exit Sub
End_Line2:
******************************************
Exit Sub
End Sub
На Resize вылазит ошибка Run-time(1004).
Это понятно, ибо LastRow = 5 (иногда), и Resize(0)не может выполнится.
Так вот, первый ресайз при ошибке переходит на обработку ошибки, а второй - если на первом не было ошибки - всё-равно выдаёт сообщение об ошике и выполнение макроса преостанавливается!
Подскажите, плз, в чём может быть дело?
Заранее благодарен!
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #1
Добавлено: 17.04.07 12:20
Это лишнее. Ссылка на обработчик ошибок должна быть одна.
Последний Exit Sub тоже на хрен не нужен.
Номер ответа: 2
Автор ответа:
Боцман
ICQ: 295725312
Вопросов: 53
Ответов: 830
Web-сайт:
Профиль | | #2
Добавлено: 17.04.07 12:38
Интерестно, а первый Exit Sub разве нужен?
Номер ответа: 3
Автор ответа:
demtruder
Вопросов: 6
Ответов: 12
Профиль | | #3
Добавлено: 17.04.07 12:43
Дело в том, что мне необходимо выполнить вторую команду (с ресайзом) даже в том случае, если вылазит ошибка на первой команде.
Т.е., второй ресайз находится после End_Line. Если ина нем вылази ошибка, то необходимо перейти к выполнению кода после End_Line2...
А насчёт последнего Exit Sub'а согласен - он нарен не нужен.
Номер ответа: 4
Автор ответа:
demtruder
Вопросов: 6
Ответов: 12
Профиль | | #4
Добавлено: 17.04.07 12:47
Первый Exit Sub нужен для прерывания выполнения кода, если ошибок не вылезло. В противном случае, после выполнения основного кода будет выполнятся код обработки ошибок.
Номер ответа: 5
Автор ответа:
GenyaA
Вопросов: 0
Ответов: 185
Web-сайт:
Профиль | | #5
Добавлено: 17.04.07 13:01
Честно говоря, я не вижу, каким образом могло бы быть так, чтобы при НЕошибочном выполнении первого resize был бы ошибочным второй, если между ними LastRow не меняется... Я прогнал Ваш пример - никаких ошибок не возникает при LastRow >=6.
Номер ответа: 6
Автор ответа:
demtruder
Вопросов: 6
Ответов: 12
Профиль | | #6
Добавлено: 17.04.07 13:24
Дело в том, что этот код не не полный, и я опустил большую его часть. Дело в том, ресайзы выполняются на разных листах, и, соответственно, различные LastRow.
К сожалению, значение LastRow иногда составляет 5, из-за чего и вылетает ошибка. Просто в этом случае лист не содержит данных для обработки ( а 5 - потому как используется шаблон).
Номер ответа: 7
Автор ответа:
GenyaA
Вопросов: 0
Ответов: 185
Web-сайт:
Профиль | | #7
Добавлено: 17.04.07 13:37
...
В конце концов поставьте вместо On Error
If LastRow < 6 then GoTo End_Line 'для первого
If LastRow < 6 then GoTo End_Line2 'для второго
(Я бы лично и GoTo не использовал бы, а делал бы всё через else - мне было бы самому понятней, а значит и отладка была бы проще.)
Номер ответа: 8
Автор ответа:
demtruder
Вопросов: 6
Ответов: 12
Профиль | | #8
Добавлено: 17.04.07 13:46
Йобт! Вот это я наворотил с On Error'ами! Как говорится, будь проще, и люди к тебе потянутся!
Очень хорошая идея! Так действительно намного нагляднее!Благодарю!
P.S. А всё-таки интересно, чего вторая ошибка не перехватывается?
Номер ответа: 9
Автор ответа:
GenyaA
Вопросов: 0
Ответов: 185
Web-сайт:
Профиль | | #9
Добавлено: 17.04.07 13:55
Не думаю, что можно что-то сказать определенное, если мы не знаем, как у Вас LastRow вычисляется...
(Опять же есть мое личное мнение - более одного Select на одну решаемую задачу - это грубо и требует оптимизации.)
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 18.04.07 03:14
Жуть... что топстартер, что отвечающие
sub ()
on error goto e
exit sub
e:
select case err.number
case 53
msgbox "file not found"
'...
end select
end sub