Возникновение ошибок в таблицах Excel явление не редкое. Например
В
Замена ошибок в таблице в Power Query.xlsx (46,6 КиБ, 68 скачиваний)
В файле приведены исходные данные и все варианты решений, которые разбираются в статье.
Для начала создадим очень простую таблицу продаж, в которой заранее создадим условия для возникновения ошибок как в стандартных формулах Excel, так и в вычисляемых столбцах Power Query. Это позволит нам рассмотреть не только обработку явных ошибок, но и некоторые нюансы работы с числами в Power Query.
Итак, в столбце План созданной таблицы я намеренно записал нулевые значения и плюс к этому одно значение суммы планируемых продаж записал явным текстом
Так же я создал столбец "Средний чек"(столбец F) с формулой, которая в некоторых строках будет возвращать значение ошибки. В нашем случае это ошибка
В статье мы все ошибки будем заменять на null(что в последствии будет в выгруженной таблице пустой ячейкой). Но в реальных условиях это может быть любое значение.
Начнем с обработки ошибок в вычисляемых столбцах.
Для того, чтобы в вычисляемом столбце Power Query пропустить ошибку вычислений(нечто вроде ЕСЛИОШИБКА в функциях Excel), применяется конструкция
Для этого создадим новый вычисляемый столбец "Выполнение плана": внутри редактора PowerQuery переходим на вкладку Добавить столбец -Пользовательский столбец и в появившемся окне вписываем формулу
Но т.к. мы заранее ожидаем появление ошибки, формулу мы записываем сразу с обработкой ошибок:
Как это работает: при возникновении ошибки в условии
В большинстве случаев такой подход сработает отлично и будет возвращать ожидаемое нами значение. Но есть и такие ошибки, обработка которых в Power Query для привыкших к работе в Excel пользователей, будет казаться глюком или багом. И к одной из таких ошибок как раз относится ошибка деления на 0. Чтобы было более наглядно предлагаю сначала изучить результат работы наших вычислений:
Как видим, в строке 6 у нас все как ожидалось: деление на текст вызвало ошибку и она была заменена значением null. А деление на 0 почему-то ни ошибки, ни null не вернуло – вместо него загадочное
Дело в том, что для Power Query деление на 0 вообще не является ошибкой и в итоге для таких операций мы как раз можем получить значение
Да, выглядит странно и не логично, но такова реальность.
Поэтому, для избежания ошибки деления на 0, придется применять обычные условия проверки
Для изменения функции созданного вычисляемого столбца не надо его удалять – достаточно в примененных шагах справа от названия шага нажать левой кнопкой мыши на знак шестеренки:
и в появившемся окне изменить функцию.
Но т.к. мы все же допускаем возможность возникновения и других ошибок(в нашем случае математические операции с текстом), мы не заменяем функцию полностью, а создаем на её основе более сложную(т.е.
null // записываем null
else // если в столбце План не 0
// пробуем вычислить и если будет ошибка вычислений
// запишем null
try [#"Продажи, руб"]/[План]
otherwise null
Чтобы начинающие не запутались в функции я разбил её на блоки и проставил комментарии.
Выглядит как-то несколько сложно и запутано, да еще и не надежно – поэтому далее в статье мы разберем и другие варианты.
Помимо ошибок в вычисляемых столбцах бывают и другие ситуации – когда ошибки уже есть в загружаемой таблице и тогда они отображаются в ячейках как Error:
Ошибки в Power Query это отдельный объект "Error" и если выделить такую ячейку внутри таблицы, то внизу увидим вполне понятное описание для этой ошибки:
Можно, конечно, создать еще вычисляемый столбец и проверять на ошибки, но….В данном случае в Power Query есть несколько более удобных инструментов для борьбы с ошибками: удаление строк с ошибками полностью и замена ошибок. Что очень удобно – эти инструменты можно так же использовать и для замены ошибок в созданных уже в Power Query столбцах, в том числе вычисляемых. Т.е. можно просто создавать вычисления без
Если мы хотим полностью избавиться от строк с ошибками в определенном столбце, то необходимо щелкнуть правой кнопкой мыши по этому столбцу и выбрать пункт Удалить ошибки:
Будут удалены все строки таблицы, в выбранном столбце которых есть ошибки.
Так же можно удалить строки во всей таблице сразу. Для этого щелкаем правой кнопкой мыши на значке таблицы на пересечении заголовков строк и столбцов и выбираем Удалить ошибки:
Отличие данного метода от предыдущего в том, что при таком удалении поиск ошибок происходит ВО ВСЕХ столбцах всей таблицы. И если хоть в одной ячейке любого столбца таблицы будет ошибка – строка будет удалена из таблицы полностью.
Т.к. удаление строк полностью из-за ошибки только в одном из столбцов не всегда правильно с точки зрения целостности и полноты данных(ведь далеко не всегда нужно удаление полностью строк – в них могут содержаться нужные и важные данные), в Power Query есть так же инструмент для замены ошибок на заданное значение. Т.е. по сути никакого удаления нет – мы заменяем значение любой ошибки на некое другое значение. Для замены ошибок в конкретном столбце необходимо щелкнуть правой кнопкой мыши по этому столбцу и выбрать пункт Заменить ошибки:
в появившемся окне необходимо указать значение, которым будут заменены все ошибки в этом столбце. Мы укажем значение null(чтобы в итоговой таблице такие ячейки отображались как пустые):
В данном случае никакие строки не удаляются, но любые ошибки в столбце будут заменены на указанное значение(в данном случае это null).
Казалось бы, что для удаления ошибок во всех столбцах всей таблицы логично было бы сделать тоже, что при удалении ошибок, но…Такой функции не предусмотрено – заменить ошибки можно только выделив предварительно все столбцы и выбрав замену ошибок через меню. При этом пункт замены теперь доступен только из меню редактора – в меню по правому клику мыши его нет. Т.е. для замены ошибок в двух и более столбцах необходимо: выделить столбцы -перейти на вкладку Преобразование -раскрыть пункт Замена значений и выбрать там пункт Заменить ошибки:
Как уже упоминал выше, для замены ошибок во всех столбцах(иначе говоря во всей таблице), необходимо сначала выделить все столбцы этой таблицы. И вот здесь есть нюанс: Power Query всегда в таких случаях создает текстовое перечисление имен столбцов следующего вида:
Где "Средний чек" и "Выполнение плана" это имена наших столбцов, в которых мы решили заменить ошибки. Для примера их всего два, но в реальности здесь перечисляются имена всех столбцов таблицы, которых может быть и 20 и 50.
Если наша исходная таблица всегда содержит одинаковый набор столбцов, то проблем нет – создали запрос и забыли. Но если это всегда разные таблицы и столбцы имеют разные имена или могут дополняться, удаляться и т.п. - мы в лучшем случае заменим ошибки не во всех столбцах, а в худшем получим ошибку запроса(хотя здесь спорный вопрос, что из этого лучше 😊).
К сожалению, встроенной возможности заменить все ошибки во всей таблице нет. Но это можно сделать путем написания не самого хитрого кода на языке М. Я приведу код, который обращается к исходной таблице с именем "Таблица1" и заменяет во всех столбцах ошибки на null. При этом совершенно неважно как называются столбцы таблицы – код сам их считывает и использует далее для замены:
let //подключаемся к умной таблице с именем "Таблица1" Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], //создаем список имен всех столбцов этой таблицы в виде списка ({"Column1", "Column2" и т.д.}) col_names = Table.ColumnNames(Source), //конкретное значение, на которое надо заменить все ошибки - в нашем случае это значение null(будет пустой ячейкой) errval = null, //т.к. в исходном варианте ReplaceErrorValues выглядит как ReplaceErrorValues(Source, {{Column1, null}, {Column2, null}, ...} //т.е. для каждого столбца нужно указать значение для замены ошибок - null //Значит нам надо создать сначала список значений null, который будет по кол-ву элементов равен кол-ву столбцов //а затем преобразовать его в список списков для того, чтобы корректно передать его функции ReplaceErrorValues //создаем список значений(list) для замены ошибок, равный по кол-ву элементов кол-ву столбцов исходной таблицы to_rep_val = List.Repeat({errval}, List.Count(col_names)), //преобразуем список имен столбцов и значений для замены в единый список сопоставлений нужного вида: to_replace = List.Zip({col_names,to_rep_val}), //заменяем ошибки replace_err = Table.ReplaceErrorValues(Source, to_replace) in replace_err |
Данный код вставляется через расширенный редактор Power Query: внутри редактора переходим на вкладку Главная -Расширенный редактор:
Вставляем туда приведенный выше код.
- здесь "Таблица1" это имя таблицы на листе, к которой мы делаем запрос и в которой заменяем ошибки. Указывается обязательно в кавычках.
- здесь null – это значение, на которое будут заменены все ошибки в таблице.
Если заменить надо на текстовое значение – то оно должно обязательно указываться в кавычках:
Числовое значение указывается без кавычек:
Все остальное в коде можно не трогать, это код формирования корректного запроса.
При этом, после вставки кода и изменения источника данных можно спокойно продолжать работу с таблицей – все шаги по преобразованию будут добавлены после замены ошибок.