Как сравнить ошибки типа Err:512 и т.п.

Автор Al_Ex, 1 июня 2017, 13:14

0 Пользователи и 1 гость просматривают эту тему.

Al_Ex

Всем привет!
Возникла такая непонятная проблема:
Есть колонка А с формулами, где в качестве результата возвращается ошибка (это валидное значение).
Как пример, в ячейке А1 написана формула =SIN({#NUM!}) (для данного кейса это валидная формула) в результате вернет ошибку Err:512.
Есть колонка В, где описан ожидаемый результат в виде констант, в т.ч. и ошибки. В колонке В1 написано Err:512.
В колонке С написана такая формула: =IF(ERROR.TYPE(A1)=ERROR.TYPE(B1),"True","False").

Согласно https://help.libreoffice.org/Calc/ERROR.TYPE_function функция для ошибок выше 7 статуса всегда возвращает #N/A.
Соответственно моя формула не работает и всегда возвращает #N/A. И таких типов ошибок уже набралось немало.
Нужно написать формулу так, чтобы можно было сравнивать и такие типы ошибок, чтобы был однозначный результат "True" или "False".

Были такие идеи:
1. Для каждой ячейки сделать такую проверку 
=ERROR.TYPE(IF(ERROR.TYPE(A1)="#N/A", "#N/A", A1))
Но что непонятно, конструкция IF(ERROR.TYPE(A1)="#N/A", "#N/A", A1) если натыкается на ошибку вида Err:512 всегда возвращает #N/A независимо от условии в IF.
2. Преобразовать значение в текст и сравнить как строки. В макросе это можно придумать, но в формулах я не нашел однозначного варианта как можно значение ошибки преобразовать в текст.

Может у кого-то будут идеи, как можно это реализовать?

economist

А может просто проверять аргумент, выводить что и как угодно и просто не допускать ошибки функции SIN?
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Al_Ex

Цитата: economist от  1 июня 2017, 13:23
А может просто проверять аргумент, выводить что и как угодно и просто не допускать ошибки функции SIN?
К сожалению нет, это такое условие и ошибка является валидным результатом работы функции.
Я привел простой пример, все немного сложнее, и нужно обязательно проверять на то, что ошибка вернулась та, которая ожидается.

Al_Ex

Решение пришло неожиданно, когда решил дважды обернуть ошибку функцией ERROR.TYPE.
Формула работает корректно, но сам синтаксис довольно тяжелый, а сократить нельзя, т.к. перестает работать.

=IF(ERROR.TYPE(ERROR.TYPE(A1))=7,IF(ERROR.TYPE(ERROR.TYPE(A1))=ERROR.TYPE(ERROR.TYPE(B2)),"True","False"),IF(ERROR.TYPE(A1)=ERROR.TYPE(B2),"True","False"))

mikekaganski

#4
Позвольте, а почему нельзя использовать ERRORTYPE?
Это позволило бы, в т.ч., упростить условие до

=IF(ERRORTYPE(A1)=B2,"True","False"))

и хранить в B2 не ошибку, а числовое значение 512.

Ваше решение с обёртыванием дважды не будет работать, поскольку для разных ошибок "выше 7 статуса" результат будет одинаковый. Поэтому ERROR.TYPE(ERROR.TYPE(Err:513))=ERROR.TYPE(ERROR.TYPE(Err:512)) вернёт TRUE.
С уважением,
Михаил Каганский

Al_Ex

#5
В ячейку В значение укладывается макросом по результату вычисления. Можно конечно изменить макрос и укладывать не Err:512, а просто 512. Правда такое тогда уже надо для всех типов ошибок.
Но вот функция ERRORTYPE. Честно говоря, о ней впервые слышу. Удобно конечно. Но что будет, если этот файл открыть не в Либре, а в Экселе (а он будет открываться в других приложениях, поддерживающих .ods). О такой формуле другие приложения не знают и она будет конвертиться в ERROR.TYPE (в лучшем случае) или просто будет ошибка. А это совсем другой результат.
Наверное оставлю свой вариант, посмотрю на общие результаты с учетом того, что ошибки выше 512 всегда будут равны. Неудобно, но ведь зачем-то это сделали. Ведь можно было сделать маппинг кодов для всех типов ошибок, но это уже оффтоп.

economist

Открывать ODS с макросами и нэйтивными функциями в Excel??? Да нельзя этого делать! Что мешает иметь свободный (и даже portable) OpenOffice|LibreOffice на каждом PC во вселенной?
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...