Excel VBA макросы и сообщения об ошибках
Я очень неопытен в Excel и столкнулся с проблемой программирования макроса. Он просто останавливается без какого-либо сообщения об ошибке, независимо от того, установил ли я точку останова и перешагнул или нет.
Я что-то пропустил? Должен ли я включать сообщения об ошибках явно?
Как то так, в модуле:
Function Provoke(XYZ As Integer) As Integer
Provoke = XYZ / 0
End Function
Функция используется в формуле внутри ячейки, как это
=Provoke(4711)
Как я могу заставить его жаловаться на деление на ноль?
2 ответа
Если в функции возникает ошибка при вызове из рабочего листа как UDF, вы не увидите никаких сообщений об ошибках - вы просто получите ошибку #VALUE, возвращенную в ячейку (и)
Если вы вызовете ту же функцию из Sub в VBA, вы увидите ошибку.
Если вы хотите иметь возможность возвращать более конкретные сообщения об ошибках, вам нужно немного больше кодировать.
Например
Function Provoke(XYZ As Integer)
On Error GoTo haveError
Provoke = XYZ / 0
Exit Function
haveError:
'what type of error did we get?
Select Case Err.Number
Case 11: Provoke = CVErr(xlErrDiv0)
Case Else: Provoke = "Error!"
End Select
End Function
Хорошая ссылка для этого: http://www.cpearson.com/excel/ReturningErrors.aspx
Да, вам нужно предусмотреть, чтобы сообщить VBA, что делать в случае возникновения ошибки.
Произошла ошибка из-за этой строки в вашем коде:
Provoke = XYZ / 0
Ни одно число не делится на ноль, и это приводит к ошибке. Основная математика: any number ÷ 0 = ∞
,
Чтобы проверить это воочию, вы можете попробовать что-то вроде этого, чтобы перехватить номер ошибки, а также источник и описание:
Function Provoke(XYZ As Integer)
On Error Resume Next
Provoke = XYZ / 0
If Err.Number <> 0 Then Provoke = "Error# " & Err.Number & " - generated by " & Err.Source & " - " & Err.Description
On Error GoTo 0
End Function
Теперь, если вы попробуете
=Provoke(4711)
Вы получите результат как:
Error# 11 - generated by VBAProject - Division by zero