Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

22 Сентябрь 2019, 07:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Как сравнить ошибки типа Err:512 и т.п.  (Прочитано 1751 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Al_Ex
Участник
**
Offline Offline

Сообщений: 32


« Стартовое сообщение: 1 Июнь 2017, 13:14 »

Всем привет!
Возникла такая непонятная проблема:
Есть колонка А с формулами, где в качестве результата возвращается ошибка (это валидное значение).
Как пример, в ячейке А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
Форумчанин
***
Offline Offline

Сообщений: 984


« Ответ #1: 1 Июнь 2017, 13:23 »

А может просто проверять аргумент, выводить что и как угодно и просто не допускать ошибки функции SIN?
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Al_Ex
Участник
**
Offline Offline

Сообщений: 32


« Ответ #2: 1 Июнь 2017, 13:26 »

А может просто проверять аргумент, выводить что и как угодно и просто не допускать ошибки функции SIN?
К сожалению нет, это такое условие и ошибка является валидным результатом работы функции.
Я привел простой пример, все немного сложнее, и нужно обязательно проверять на то, что ошибка вернулась та, которая ожидается.
Записан
Al_Ex
Участник
**
Offline Offline

Сообщений: 32


« Ответ #3: 1 Июнь 2017, 13:56 »

Решение пришло неожиданно, когда решил дважды обернуть ошибку функцией 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
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 469


« Ответ #4: 1 Июнь 2017, 14:01 »

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

Код:
=IF(ERRORTYPE(A1)=B2,"True","False"))

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

Ваше решение с обёртыванием дважды не будет работать, поскольку для разных ошибок "выше 7 статуса" результат будет одинаковый. Поэтому ERROR.TYPE(ERROR.TYPE(Err:513))=ERROR.TYPE(ERROR.TYPE(Err:512)) вернёт TRUE.
« Последнее редактирование: 1 Июнь 2017, 14:20 от mikekaganski » Записан

С уважением,
Михаил Каганский
Al_Ex
Участник
**
Offline Offline

Сообщений: 32


« Ответ #5: 1 Июнь 2017, 14:41 »

В ячейку В значение укладывается макросом по результату вычисления. Можно конечно изменить макрос и укладывать не Err:512, а просто 512. Правда такое тогда уже надо для всех типов ошибок.
Но вот функция ERRORTYPE. Честно говоря, о ней впервые слышу. Удобно конечно. Но что будет, если этот файл открыть не в Либре, а в Экселе (а он будет открываться в других приложениях, поддерживающих .ods). О такой формуле другие приложения не знают и она будет конвертиться в ERROR.TYPE (в лучшем случае) или просто будет ошибка. А это совсем другой результат.
Наверное оставлю свой вариант, посмотрю на общие результаты с учетом того, что ошибки выше 512 всегда будут равны. Неудобно, но ведь зачем-то это сделали. Ведь можно было сделать маппинг кодов для всех типов ошибок, но это уже оффтоп.
« Последнее редактирование: 1 Июнь 2017, 14:46 от Al_Ex » Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 984


« Ответ #6: 1 Июнь 2017, 14:59 »

Открывать ODS с макросами и нэйтивными функциями в Excel??? Да нельзя этого делать! Что мешает иметь свободный (и даже portable) OpenOffice|LibreOffice на каждом PC во вселенной?
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!