Почему обработка ошибок VBA здесь игнорируется? - PullRequest
1 голос
/ 22 января 2020

Следующие операторы (в al oop) заканчиваются ошибкой, когда строка 1 пуста.
Я ожидал, что ошибка будет игнорироваться и обрабатываться следующий лист.
Как получилось код останавливается, когда on error активен? Я ожидаю, что он проигнорирует ошибку и продолжит обработку после метки skip.

Sub listSheets()
    Dim sh As Worksheet, ar
    Dim a
    Set a = Application

    For Each sh In ThisWorkbook.Sheets
        Sheet1.Cells(3 + sh.Index, 1) = sh.Name
        On Error GoTo skip
        ar = sh.Range("1:1").SpecialCells(xlCellTypeConstants)  'code stops here if row 1 empty
        ar = a.Transpose(a.Transpose(ar))
        Sheet1.Cells(3 + sh.Index, 2) = Join(ar, "//")
        ar = Null
skip:
    Next sh
End Sub

Примечание. Для перехвата ошибок установлено значение "Разрыв необработанных ошибок"

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Я полагаю, что причина кроется в том, что вы уже столкнулись с ошибкой. Однако вы никогда не очищали свою ошибку от обработчика. Вторая ошибка не будет пропустить эту строку снова.

Поэтому, чтобы повторить это, у меня было три листа, пустой ряд во втором и третьем. Ваш On Error Goto прошел второй лист, но вернул бы Error 1004 на третьем.

Возможно, вы захотите включить Err.Clear

On Error Resume Next
    ar = sh.Range("1:1").SpecialCells(xlCellTypeConstants)  'error 1004 on certain sheets
skip:
    Err.Clear
Next sh

РЕДАКТИРОВАТЬ: Только что нашли альтернативное решение здесь


И даже тогда, возможно, даже полностью отказаться от обработки ошибок и использовать что-то вроде:

If WorksheetFunction.CountA(sh.Rows(1)) > 0 Then
    ar = sh.Range("1:1").SpecialCells(xlCellTypeConstants)
End If
1 голос
/ 22 января 2020

Оператор Resume необходим после возникновения ошибки, при которой обработчик ошибок включается оператором On Error. Согласно справке VBA ...

Если ошибка возникает, когда обработчик ошибки активен (между возникновением ошибки и оператором Resume, Exit Sub, Exit Function или Exit Property), Обработчик ошибок текущей процедуры не может обработать ошибку.

Для получения дополнительной информации перейдите по следующей ссылке ...

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/on-error-statement

...