2015-07-31 3 views
5

Я читаю о том, как использовать On Error Resume Next, и я пытаюсь выяснить, как долго эта строка будет применяться к программе. На веб-узле Microsoft я нашел это предложение: «Операция On Error Resume Next становится неактивной при вызове другой процедуры». Что именно это значит? Что считается процедурой?VBA: Как долго работает On Error Resume Next?

Я спрашиваю, потому что я использую строку в своей программе, но я не хочу, чтобы она Resume Next все ошибки времени выполнения, которые встречаются, просто очевидные на следующей строке.


Код: Dim zRange Как Range

Call FilterTableFor(fieldNameColumn, Array("baseunitprice", "burden", "MTLBURRATE", "PurPoint", "Vendornum")) 

On Error Resume Next 
Set zRange = commentsColumnRange.SpecialCells(xlCellTypeVisible) 
zRange.Formula = "target" 

Call FilterTableFor(fieldNameColumn) 

Я также нашел (и известный на некоторое время), что On Error или GoTo линии считаются бедными кодирования. Есть ли Try-Catch, который я могу использовать для такой строки?

Я думаю, что-то вроде этого:

Dim zRange As Range 

Call FilterTableFor(fieldNameColumn, Array("baseunitprice", "burden", "MTLBURRATE", "PurPoint", "Vendornum")) 

Try 
Set zRange = commentsColumnRange.SpecialCells(xlCellTypeVisible) 
zRange.Formula = "target" 
Catch() 

Call FilterTableFor(fieldNameColumn) 

Где я даже не делать ничего с ним, так как я не чувствую необходимость.

Спасибо за ваше время.

+1

Использование 'On Error ...' не «считается плохим кодирования». Только использовать его * плохо * есть. В VBA нет «Try ... Catch». –

+0

@TimWilliams делает VBA не следовать всем правилам Visual Basic? – Tawm

+0

VBA - базовый VB6. Это не VB.NET – MatthewD

ответ

2

Вы хотите использовать только "On Error Resume Next", когда

  1. Вы знаете, почему происходит ошибка.

  2. Вы знаете, что это не повлияет на другие части кода.

  3. Вы используете «On Error Goto 0» сразу после кода ошибки.

Сказав это, вы должны почти НИКОГДА его не использовать. Вы должны выяснить, почему возникает ошибка, и код для его обработки.

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

Лучшей альтернативой является использование goto таким образом. Но некоторые люди нахмурились почти так же.

sub SomeSub() 
    On Error Goto TestFailed 

    'Some code 

    'Some code 

    'Some code 

Exit sub 

TestFailed: 
    'Some code here to alert you to and/or handle the fallout of the error. 
End sub 
+0

Итак, для того, чтобы игнорировать одну строку, бы я сделать что-то вроде: 'On Error Resume Next' ' ошибка code' 'On Error Goto 0 ' ничего себе, что это некрасиво, но вы получите идею – Tawm

+0

Да On Ошибка возобновления Далее - затем строка кода - затем Вкл. Ошибка Перейти к 0. Но запустите предупреждения. Вы не должны привыкать к этому. Если вы получаете определенную ошибку. Отправьте код здесь при переполнении стека, и сообщество поможет вам понять, как его кодировать. – MatthewD

+0

Если программа была больше, я бы выяснил, как исправить ошибку. Вероятно, это можно записать в ~ 30 строк, поэтому мне кажется, что добавить 3-10 строк, чтобы исправить это, это пустая трата времени. Однако, спасибо! :) – Tawm

0

Вы не всегда нужна куча коды для обработки ошибки, но вы действительно должны сделать что-то с ним. Возможно, просто измените свой код на свойство cells.font.color на vbRed. Просто делать On Error Resume Next (a line of code that might error) On Error Goto 0 ужасно плохая форма.

И, как и другие указал, On Error Goto Label по существу версия УВЫ из Try ... Catch, и я использую его frequently

0

Чтобы ответить на ваш вопрос «Как долго On Error Resume Next работы?"

Ответ: до следующего определения On error ...

Так что, если вы не определите On error resume next, он будет пропускать каждую ошибку, пока не определит On error goto 0 или On error goto label

5

ОБЪЕМ ON ERROR... ЗАЯВЛЕНИЯ

Эффект от ON ERROR ... заканчивается, если встречается одно из следующих условий:

  1. Другой ON ERROR .... (Возможно, в форме ON ERROR RESUME x или ON ERROR GOTO x)
  2. Exit Sub/Exit Function в пределах того же суб/функции, где определено.
  3. End Sub/End Function of sub/function where defined.

ЭТО ПЛОХО ДЛЯ ИСПОЛЬЗОВАНИЯ ON ERROR RESUME NEXT?

Да и №

Я бы сказал, не использовать, не зная, что эффект от этого заявления будет. Избегайте, если это возможно. Держите область короче, где это невозможно.

Чтобы свести на нет эффект на ON ERROR RESUME NEXT заявление, вы можете вызвать ON ERROR GOTO 0

+0

Источник ссылки пожалуйста? – Roland

+0

У меня нет ссылки на источник. Ответ основан на моем опыте. Лучший способ проверить - проверить сами.:) –

+1

@PradeepKumar Быть после списка не было проблемой; проблема заключалась в том, что у вас были пробелы между «**» маркерами и текстом между ними. –

Смежные вопросы