Stefano Bertolucci Ответов: 1

Есть ли способ сделать лучшую реализацию функции excel IFERROR с помощью VBA ?


Всем привет,
Я хотел бы иметь функцию, которая возвращает подписанное максимальное доступное число в Excel в случае переполнения (т. е. + или - 9.99999999999999 E+307) в случае переполнения и ноль в случае недостаточного потока.
IFERROR позволяет мне установить только одно значение в случае ошибки.

Я придумал какой-то код, но он не работает

Основная причина, я думаю, заключается в том, что аргумент, который может быть выражением, вычисляется Excel перед передачей его в функцию, поэтому я не могу контролировать то, что происходит

Есть зацепка ?

Спасибо

Что я уже пробовал:

Option Explicit
Function Test(ByVal x As Variant) As Variant
Application.Volatile
Dim retval As Variant
Application.ScreenUpdating = False
On Error GoTo ErrorHandling
retval = Evaluate(x)
If VarType(retval) = vbError Then
Select Case retval
 Case CVErr(xlErrDiv0)
 MsgBox "#DIV/0! error"
 Case CVErr(xlErrValue)
 MsgBox "#VALUE! error"
Case Else
         MsgBox "UNKNOWN ERROR  - Error# " & Err.Number & " : " & Err.Description
         End Select
End If

Test = retval
Application.ScreenUpdating = True
Exit Function
ErrorHandling:
Select Case Err.Number
Case 10 ' Divide by 0
MsgBox "Division by 0"
 Case Else
         MsgBox "UNKNOWN ERROR  - Error# " & Err.Number & " : " & Err.Description
         End Select
End Function

1 Ответов

Рейтинг:
0

CHill60

Я заставил это работать только с одним изменением - декларация должна быть публичной

Public Function Test(ByVal x As Variant) As Variant
Убедитесь, что у вас есть эта функция в модуль - не в Лист1 или thisworkbook.

Если вы попытаетесь изучить аргумент x во время отладки вы видите только, например, "Error 2007" для 1/0, но вы справляетесь с этим с помощью Evaluate(x)