Здравствуйте! Задумал я для Excel 2003 написать функцию ЕСЛИОШИБКА, (которая имеется в 2007 и выше): [vba]
Код
Function ЕСЛИОШИБКА(проверяемое_значение As Variant, значение_если_ошибка As Variant) If ActiveCell.FormulaR1C1 = "=ISERROR(проверяемое_значение)" = True Then ЕСЛИОШИБКА = Application.Transpose(значение_если_ошибка) Else: ЕСЛИОШИБКА = Application.Transpose(проверяемое_значение) End If End Function
[/vba]
Пишу для проверки
Код
=ЕСЛИОШИБКА(1/0;99)
и вижу #ДЕЛ/0!
На всякий случай пытаюсь написать наоборот [vba]
Код
Function ЕСЛИОШИБКА(проверяемое_значение As Variant, значение_если_ошибка As Variant) If ActiveCell.FormulaR1C1 = "=ISERROR(проверяемое_значение)" = False Then ЕСЛИОШИБКА = Application.Transpose(проверяемое_значение) Else: ЕСЛИОШИБКА = Application.Transpose(значение_если_ошибка) End If End Function
[/vba] ничего не меняется
В чём тут может быть дело? Спасибо! P.S. Если это увидят модераторы, то переименуйте пожалуйста мою тему в ЕСЛИОШИБКА-2003
Здравствуйте! Задумал я для Excel 2003 написать функцию ЕСЛИОШИБКА, (которая имеется в 2007 и выше): [vba]
Код
Function ЕСЛИОШИБКА(проверяемое_значение As Variant, значение_если_ошибка As Variant) If ActiveCell.FormulaR1C1 = "=ISERROR(проверяемое_значение)" = True Then ЕСЛИОШИБКА = Application.Transpose(значение_если_ошибка) Else: ЕСЛИОШИБКА = Application.Transpose(проверяемое_значение) End If End Function
[/vba]
Пишу для проверки
Код
=ЕСЛИОШИБКА(1/0;99)
и вижу #ДЕЛ/0!
На всякий случай пытаюсь написать наоборот [vba]
Код
Function ЕСЛИОШИБКА(проверяемое_значение As Variant, значение_если_ошибка As Variant) If ActiveCell.FormulaR1C1 = "=ISERROR(проверяемое_значение)" = False Then ЕСЛИОШИБКА = Application.Transpose(проверяемое_значение) Else: ЕСЛИОШИБКА = Application.Transpose(значение_если_ошибка) End If End Function
[/vba] ничего не меняется
В чём тут может быть дело? Спасибо! P.S. Если это увидят модераторы, то переименуйте пожалуйста мою тему в ЕСЛИОШИБКА-2003vzdorny
Сообщение отредактировал vzdorny - Воскресенье, 28.07.2019, 14:40
Прошу прощения, в момент создания темы мне показалось, что это название отражает суть вопроса, а сейчас возможность редактирования уже отсутствует
Прошу прощения, в момент создания темы мне показалось, что это название отражает суть вопроса, а сейчас возможность редактирования уже отсутствуетvzdorny
Сообщение отредактировал vzdorny - Понедельник, 29.07.2019, 20:56
Function ЕСЛИОШИБКА1(проверяемое_значение As Variant, значение_если_ошибка As Variant) ЕСЛИОШИБКА1 = проверяемое_значение If IsError(ЕСЛИОШИБКА1) Then ЕСЛИОШИБКА1 = значение_если_ошибка End Function
[/vba]
Поменял. И формулу в теги засунул
Такой вариант [vba]
Код
Function ЕСЛИОШИБКА1(проверяемое_значение As Variant, значение_если_ошибка As Variant) ЕСЛИОШИБКА1 = проверяемое_значение If IsError(ЕСЛИОШИБКА1) Then ЕСЛИОШИБКА1 = значение_если_ошибка End Function
Для массивных операций, что-то в голову упростить ничего не лезет.
[vba]
Код
Function ЕСЛИОШИБКА1(ByVal проверяемое_значение As Variant, ByVal значение_если_ошибка As Variant) As Variant Dim i As Long, j As Long If IsArray(проверяемое_значение) Then On Error Resume Next For i = 1 To UBound(проверяемое_значение) For j = 1 To UBound(проверяемое_значение, 2) If Err Then Err.Clear If IsError(проверяемое_значение(i)) Then проверяемое_значение(i) = значение_если_ошибка Else If IsError(проверяемое_значение(i, j)) Then проверяемое_значение(i, j) = значение_если_ошибка End If Next Next Else 'ЕСЛИОШИБКА1 = проверяемое_значение If IsError(проверяемое_значение) Then проверяемое_значение = значение_если_ошибка End If ЕСЛИОШИБКА1 = проверяемое_значение End Function
[/vba]
Так наверно правильнее
[vba]
Код
Function ЕСЛИОШИБКА1(ByVal проверяемое_значение As Variant, ByVal значение_если_ошибка As Variant) As Variant Dim i As Long, j As Long If IsArray(проверяемое_значение) Then On Error Resume Next j = UBound(проверяемое_значение, 2) If Err Then Err.Clear For i = 1 To UBound(проверяемое_значение) If IsError(проверяемое_значение(i)) Then проверяемое_значение(i) = значение_если_ошибка Next Else For i = 1 To UBound(проверяемое_значение) For j = 1 To UBound(проверяемое_значение, 2) If IsError(проверяемое_значение(i, j)) Then проверяемое_значение(i, j) = значение_если_ошибка Next Next End If Else If IsError(проверяемое_значение) Then проверяемое_значение = значение_если_ошибка End If ЕСЛИОШИБКА1 = проверяемое_значение End Function
[/vba]
Для массивных операций, что-то в голову упростить ничего не лезет.
[vba]
Код
Function ЕСЛИОШИБКА1(ByVal проверяемое_значение As Variant, ByVal значение_если_ошибка As Variant) As Variant Dim i As Long, j As Long If IsArray(проверяемое_значение) Then On Error Resume Next For i = 1 To UBound(проверяемое_значение) For j = 1 To UBound(проверяемое_значение, 2) If Err Then Err.Clear If IsError(проверяемое_значение(i)) Then проверяемое_значение(i) = значение_если_ошибка Else If IsError(проверяемое_значение(i, j)) Then проверяемое_значение(i, j) = значение_если_ошибка End If Next Next Else 'ЕСЛИОШИБКА1 = проверяемое_значение If IsError(проверяемое_значение) Then проверяемое_значение = значение_если_ошибка End If ЕСЛИОШИБКА1 = проверяемое_значение End Function
[/vba]
Так наверно правильнее
[vba]
Код
Function ЕСЛИОШИБКА1(ByVal проверяемое_значение As Variant, ByVal значение_если_ошибка As Variant) As Variant Dim i As Long, j As Long If IsArray(проверяемое_значение) Then On Error Resume Next j = UBound(проверяемое_значение, 2) If Err Then Err.Clear For i = 1 To UBound(проверяемое_значение) If IsError(проверяемое_значение(i)) Then проверяемое_значение(i) = значение_если_ошибка Next Else For i = 1 To UBound(проверяемое_значение) For j = 1 To UBound(проверяемое_значение, 2) If IsError(проверяемое_значение(i, j)) Then проверяемое_значение(i, j) = значение_если_ошибка Next Next End If Else If IsError(проверяемое_значение) Then проверяемое_значение = значение_если_ошибка End If ЕСЛИОШИБКА1 = проверяемое_значение End Function