Непредвиденная ошибка обработчика ошибок VBA

Хотя это не лучший способ использовать предложение GOTO, просто из любопытства я хотел бы спросить, почему третий последний оператор, использующий предложение GOTO, не работает в приведенной ниже процедуре.

Подпроцедура вычисляет квадратный корень из положительного числа. Если задано отрицательное число, вступит в силу сеанс контроля ошибок, в котором спрашивается, будет ли пользователь повторно реализовывать подпрограмму снова. Сначала я ввел -1, появится запрос «Хотите попробовать еще раз?»; позже введено -2, возникает непредвиденная ошибка. щелкните, чтобы увидеть изображение непредвиденной ошибки. Если я заменю GOTO на «resume» или вызову сам суб, никаких непредвиденных ошибок не произойдет.

Одна интерпретация такова: «потому что исходное состояние ошибки не было устранено». (Джон Уокенбах). Может ли кто-нибудь предложить дополнительные разъяснения по этому поводу?

Sub enterSqrt3()
    Dim pos_num As Variant, ans As Double, decision As Variant

TryAgain:
    On Error GoTo errHandle
    pos_num = InputBox("Please input a positive number. ")
    If pos_num = "" Then
        Exit Sub
    Else
        ans = Sqr(pos_num)
        MsgBox "The answer is " & ans
        Exit Sub
    End If

errHandle:
    decision = MsgBox("Would you like to try again? ", vbYesNo)
    If decision = vbYes Then
'        Resume TryAgain   ' it works
'        Call enterSqrt3   ' it works
         GoTo TryAgain     ' it does not work after input the second     
                           ' negative input.
    End If
End Sub

Как уже упоминалось, вы не удалили активное исключение - см. excelmatters.com/2015/03/17/on-error-wtf

Rory 04.09.2018 11:48

Вам необходимо добавить On Erroro Goto -1, см. здесь для объяснения.

Storax 04.09.2018 11:51

@Rory доза означает, что первое исключение все еще активно, поэтому при возникновении новой ошибки вторая ошибка не запускает обработчик исключений?

Xianhao ZHU 04.09.2018 11:54

да. И если вы обнаружите, что используете On Error Goto -1, вам нужно остановиться и внимательно посмотреть на то, что вы делаете. ;)

Rory 04.09.2018 11:56

Просто взгляните на примеры по предоставленной ссылке. @Rory: Да, использовать On Error Goto -1, конечно, не рекомендуется.

Storax 04.09.2018 11:57

Также добавьте обработчик ошибок, все из errHandle:, за пределами основной части процедуры. Поместите Exit Sub непосредственно перед errHandle, а не в блок кода IF.

Darren Bartrup-Cook 04.09.2018 14:33
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
6
175
0

Другие вопросы по теме