Power query формула если ошибка

Это продолжение перевода книги Кен Пульс и Мигель Эскобар. Язык М для Power Query. Главы не являются независимыми, поэтому рекомендую читать последовательно.

Предыдущая глава    Содержание    Следующая глава

По мере усложнения ваших решений в Power Query вы столкнетесь со сценарием, в котором вам нужно выполнить в столбце некую логику. И хотя в Power Query есть инструмент для этого, он отличается от того что ожидает встретить профессионал Excel.

Допустим вы импортируете расписание из текстового файла:

Ris. 18.1. Tekstovyj fajl soderzhit problemy

Рис. 18.1. Текстовый файл содержит проблемы

Скачать заметку в формате Word или pdf, примеры в формате архива

Имя сотрудника не включено в строки. Как его извлечь из шапки? Для решения этой задачи будет применена условная логика. Создайте новую книгу Excel. Пройдите по меню Данные –> Получить данные –> Из файла –> Из текстового/CSV-файла. Выберите файл 2015-03-14.txt. Кликните Импортировать. В окне предварительного просмотра кликните Преобразовать данные. В редакторе Power Query –> Главная –> Удалить строки –> Удаление верхних строк –> 4. Кликните Использовать первую строку в качестве заголовков.

Ris. 18.2. Familiya menedzhera popala v stolbtse Out

Рис. 18.2. Имя менеджера попала в столбце Out; чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке

У вас может возникнуть соблазн перенести имя Джона Томпсона в строки. Но есть и другие менеджеры, и вы понятия не имеете, сколько их. Решение может заключаться в том, чтобы добавить столбец с формулой, проверяющей, являются ли данные в столбце Out временем, и извлекающей данные, если тест не выполняется.

Поэкспериментируйте. Щелкните правой кнопкой мыши столбец Out –> Тип изменения –> Время. Как и следовало ожидать, все строки конвертируются красиво, но имя сотрудника возвращает ошибку:

Ris. 18.3. U Dzhona Tompsona net vremeni

Рис. 18.3. У Джона Томпсона нет времени))

Это ожидаемо, но можно ли это как-то использовать? Вы можете применить функцию Time.From(), чтобы преобразовать данные в допустимое время. И основываясь на знаниях Excel, вы бы ожидали, что это сработает:

(1) =IFERROR(Time.From([Out]),null)

К сожалению, эта формула вернет ошибку, так как Power Query не распознает функцию IFERROR (ЕСЛИОШИБКА). Power Query имеет собственную функцию для такой проверки, хотя и с совершенно иным синтаксисом:

=try <operation> otherwise <alternate result>

Оператор try пытается выполнить операцию. Если это удастся, то возвратит результат операции. Если, результатом является ошибка, то try вернет иное значение (или иную логику), указанное в части otherwise.

Это означает, что формула (1) может быть записана в Power Query следующим образом:

(2) =try Time.From([Out]) otherwise null

Такая формула вернет значение null для любой строки, содержащей имя сотрудника в столбце Out, и время для любой строки, в которой есть допустимое время.

В редакторе Power Query удалите шаг Измененный тип 1. Перейдите на вкладку Добавление столбца, кликните Настраиваемый столбец. Введите формулу (2). Нажмите Ok.

Ris. 18.4. Novyj stolbets vozvrashhaet vremya i null vmesto oshibki

Рис. 18.4. Новый столбец возвращает время и null вместо ошибки

Теперь можно добавить еще один столбец с простой логикой: если Пользовательская содержит null, верни значение из столбца Out, если это не так, верни null. Power Query использует для этого следующий синтаксис:

=if <logical test> then <result> else <alternate result>

Добавление столбца –> Настраиваемый столбец –> Присвойте ему имя Employee. Введите формулу:

=if [Custom]=null then [Out] else null

Ris. 18.5. Nakonets u Dzhona Tompsona est svoya sobstvennaya kolonka

Рис. 18.5. Наконец, у Джона Томпсона есть своя собственная колонка

Любопытно, если нажать шестеренку рядом со строкой Добавлен пользовательский столбец, появится окно, подсказывающее, как работает условный оператор:

Ris. 18.6. Dobavlenie uslovnogo stolbtsa

Рис. 18.6. Добавление условного столбца

Сейчас вы можете заполнить имя сотрудника в пустые строки. Щелкните правой кнопкой мыши столбец Employee (сотрудник) –> Заполнить –> Вниз.

Поскольку Power Query обрабатывает шаги последовательно, вам не нужно хранить промежуточные вычисления. Вы можете удалить столбец Пользовательская и очистить остальные данные. Щелкните правой кнопкой мыши столбец Пользовательская –> Удалить. Щелкните правой кнопкой мыши столбец Work Date –> Тип изменения –> Используя локаль –> Дата –> Языковый стандарт –> Английский (США). Перейдите на вкладку Главная. Выберите столбец Work Date –> Удалить строки –> Удалить ошибки. Щелкните правой кнопкой мыши столбец Out –> Тип изменения –> Используя локаль –> Время –> Языковый стандарт –> Английский (США). Выберите столбцы с Reg Hrs по Expense –> Тип изменения –> Используя локаль –> Десятичное число –> Языковый стандарт –> Английский (США). Переименовать запрос в Timesheet. Запрос готов к загрузке:

Ris. 18.7. Tabel ucheta rabochego vremeni sotrudnikov

Рис. 18.7. Табель учета рабочего времени сотрудников

In Excel we can use IFERROR to if our calculation results in an error, and we can then tell Excel to produce a different result, instead of the error.

Power Query doesn’t have IFERROR but it does have a way of checking for errors and replacing that error with a default answer, it’s called try otherwise

In this post I’ll show you how to use try otherwise to handle errors when loading data, how to handle errors in your transformations and how to handle errors when your query can’t locate a data source.

Watch the Video

Subscribe YouTube

Download Sample Excel Workbook

Enter your email address below to download the sample workbook.

By submitting your email address you agree that we can email you our Excel newsletter.

First up, let’s load data from this table.

sample data

I’ve already generated a couple of errors in this table, and of course I can obviously see them and I could fix them before loading into Power Query.

But when using Power Query this isn’t always the situation. Your query will be loading data without knowing what it is so how would it handle these errors?

Let’s load the data into Power Query and call it Errors from Sheet

errors in sheet

Straight away you can see the errors in the column.

Now of course you could use Remove Errors but that would remove the rows with the errors and that’s not what I want.

remove errors

Or I could use Replace Errors, but this doesn’t give me any idea what the cause of the error is.

replace errors

I want to see what caused the error and to do this I’ll add a Custom Column and use try [End]

try end

This creates a new column with a Record in each row

column of records

In this record are two fields. HasError states whether or not there’s an error in the [End] column

error record

If there is an Error then the 2nd field is another record containing information about that error

If there isn’t an error, then the 2nd field is the value from the [End] column

record with no error

If I expand the new column I get 3 new columns containing the HasError value which is boolean, and either an Error or a Value

expanding record column

Checking what’s in the Error Records, you can see the Reason for the error, DataFormat.Error, this is from Power Query

examining error record

There’s the Message, which is the error from the Excel sheet, and some errors give extra Detail, but not in this case.

If I expand this Error column I can see all of these fields.

expanded error column

I’ve ended up with a lot of extra columns here and it’s a bit messy so let’s tidy it up. In fact I’ll duplicate the query and show you another way to get the same information in a neater way

The new query is called Errors from Sheet (Compact) and I’ve deleted all steps except the first two.

compact query

What I want to do is , check for an error in the Try_End column, and if there is one I want to see the error message from Excel.

If there isn’t an error I want the value from the [End] column.

I can do all of this in a new column using an if then else

Add a new Custom Column called Error or Value and enter this code

try if then else

What this is saying is:

  • If the boolean value [HasError] in the [Try_End] column is true then
  • return the [Message] in the [Error] record of the [Try_End] column
  • else return the [Value] from the [Try_End] column

With that written I can remove both the End and Try_End columns so the final table looks like this

try if then else result

Checking for Errors and Replacing Them With Default Values

In this scenario I don’t care what the error is or what caused it, I just want to make sure my calculations don’t fail.

I duplicate the original query again, calling this one Error in Calculation, and remove every step except the Source step

I add a new Custom column called Result and what I’ll do here is divide [Start] by [End]

error dividing

this gives me an error as I know it will in rows 1 and 3

errors in calc column

so to avoid this, edit the step and use try .. otherwise

try otherwise to replace errors

now the errors are replaced with 0.

errors fixed

Errors Loading Data from A Data Source

I’ll create a new query and load from an Excel workbook

new query from workbook

Navigating to the file I want I load it

loading workbook

and loading this table

loading table from workboiok

table loaded to power query

I’m not going to do any transformations because I just want to show you how to deal with errors finding this source file.

I’ll open the Advanced Editor (Home -> Advanced Editor) and change the path, so that I know I’ll get an error. Here I change the drive letter to X.

I don’t have an X: drive so I know this will cause the workbook loading to fail.

change path to file

error loading file

So that’s what happens when the file can’t be found so let’s say I have a backup or alternate file that I want to load if my main file can’t be found.

Open the Advanced Editor again and then use try otherwise to specify the backup file’s location

try otherwise backup file

close the editor and now my backup file is loaded.

backup file loaded

 

Александр L

Пользователь

Сообщений: 414
Регистрация: 16.02.2015

Александр

Коллеги Всем привет , подскажите пжл возможно ли с помощь Try  в Power Query при добавлении доп столбца формулой прописать аналог EСЛИОШИБКА ?
Мне просто необходимо чтобы при расчёте выводился ноль если происходит ошибка.
Спасибо  

 

PooHkrd

Пользователь

Сообщений: 6602
Регистрация: 22.02.2017

Excel x64 О365 / 2016 / Online / Power BI

#2

14.02.2019 13:37:57

try чего-то там otherwise что-то вместо ошибки
так.
В вашем случае нужно понимать что PQ деление на ноль не воспринимает как именно ошибку, для него это вполне существующее значение. Посему настоятельно керемендую перед делением осуществлять проверку знаменателя на равенство нулю:

Код
=if [#"Количество (в базовых единицах), короба"] * [Вложения] = 0 then 0 else [База]/([#"Количество (в базовых единицах), короба"] * [Вложения])

Изменено: PooHkrd14.02.2019 13:44:59

Вот горшок пустой, он предмет простой…

 

Александр L

Пользователь

Сообщений: 414
Регистрация: 16.02.2015

Александр

#3

14.02.2019 13:39:34

Код
=try ([База]/([#"Количество (в базовых единицах), короба"]*[Вложения])) otherwise 0

Так у меня вроде так и прописано когда создаю  доп столбец но не работает

Изменено: Александр L14.02.2019 13:40:20
(вставил формулу)

 

Максим Зеленский

Пользователь

Сообщений: 4655
Регистрация: 11.06.2014

Microsoft MVP 2018-2022

#4

14.02.2019 13:42:15

Проще всего так:

Код
=if ([#"Количество (в базовых единицах), короба"]*[Вложения]) = 0 then 0 else ([База]/([#"Количество (в базовых единицах), короба"]*[Вложения]))

Еще можно — создать столбец =[#»Количество (в базовых единицах), короба»]*[Вложения] и использовать в формуле его, чтобы не считать два раза, а потом удалить.

F1 творит чудеса

 

Максим Зеленский

Пользователь

Сообщений: 4655
Регистрация: 11.06.2014

Microsoft MVP 2018-2022

#5

14.02.2019 13:44:00

Цитата
Александр L написал:
у меня вроде так и прописано когда создаю  доп столбец но не работает

Потому что деление на 0 это не совсем ошибка, которая стопорит запрос:
0/0 = NaN,
20/0 = Infinity
-20/0 = -Infinity

F1 творит чудеса

 

Александр L

Пользователь

Сообщений: 414
Регистрация: 16.02.2015

Александр

А вы вот как обошли я тоже пробовал через If но применял три условия и вот не получалось(((. Спасибо сейчас попробую на массиве этот метод.

 

А ещё есть null, деление на который даёт null, а не ошибку и не упомянутое выше

 

Александр L

Пользователь

Сообщений: 414
Регистрация: 16.02.2015

Александр

#8

14.02.2019 13:48:21

да с null  я всегда пресекаю на начальном этапе)))))

In this post, I am going to talk about the IFERROR function in Power Query. There is no explicit IFERROR function in Power Query but we have try and otherwise statement which works similar to the IFERROR function in Excel.

IFERROR in Power Query (try and otherwise) – Video

Power Query try and otherwise – Example 1

  1. Consider this sample data. I have Employee ID, Total Pay, and Hours.
  2. I created a Custom Column to calculate Pay per Hour
= [Total Pay] / [Hours]

Simple Data Model with error

Note – Emp ID 6 returns an error because 200 is divided by a text = “nil”. To correct the above error, I am going use try and otherwise within the formula

= try [Total Pay]/[Hours] otherwise null

As an output, I got a null instead of an Error.

Datamodel with null

Power Query try and otherwise – Example 2

The try and otherwise statement can also be applied to the entire step.

  1. I deleted the Custom Column for Pay/Hours
  2. And Changed Type, results in an error since it wasn’t able to find the previous step

Error

This is a step-level error that happened at the Changed Type Step.

To fix this error I will surround my entire formula with the try and otherwise statement in the formula bar.

= try
    Table.TransformColumnTypes(Source, {{'Pay/Hours', type number}})
otherwise
    #'Removed Columns'

If the above formula (which is trying to change the type of Pay/Hours) returns an error then the otherwise statement returns the previous step – Removed Columns. The query throws no errors.

Datamodel Example 2

Power Query try and otherwise – Example 3

This time let’s write the try statement (without otherwise). Let’s calculate Pay/Hours but this time with only the try keyword.

Create a new Custom column with the following formula,

= try [Total Pay]/[Hours]

As a result, it gives me a column that contains records.

Datamodel Record Example 3

Expanding Custom column is going to return 3 more columns.

Datamodel Expanded Custom

  1. HasError – Shows TRUE if the formula resulted in an Error.
  2. Value – Is the output of the formula with no errors.
  3. Error – Again contains records that will describe the error upon expanding.

Upon further expanding the Error column.

Datamodel expanded Error

We again get 3 more columns,

  1. Reason – This tells the reason for the error.
  2. Message – This shows what actually the error is.
  3. Detail – Tells the information of the error, message about the error.

On further expanding Detail column we get even more details about the error on that particular row.

Datamodel Expanded Detail

So this is a very crude way of doing some very basic error reporting on your data in case your Power Query steps result in any errors.

More on Power Query

Promote Double Headers in Power Query

5 Tricks to Reduce Steps in Power Query

Remove Top Rows and Combine Data from Multiple Excel Files

Quick VLOOKUP in Power Query

Dynamic Unpivoting in Power Query

Chandeep

Welcome to Goodly! My name is Chandeep.
On this blog I actively share my learning on practical use of Excel and Power BI. There is a ton of stuff that I have written in the last few years. I am sure you’ll like browsing around.
Please drop me a comment, in case you are interested in my training / consulting services. Thanks for being around
Chandeep

В Power Query существует функция для проверки условия – if. Чтобы записать определенное условие в Power Query, используется структура с оператором if-then-else.

Создать условие можно двумя способами:

  • Через создание условного столбца,
  • Написать на Power Query через редактор кода.

Рассмотрим все способы работы с конструкцией if-then-else.

Необходимо проставить статусы для заказов. Статус «выполнен», если % выполнения – 100%. Если меньше 100%, то статус «в работе».

Выбираем: вкладка Данные → Получить данные → Из других источников → Из таблицы/диапазона. Для новых версий Excel: вкладка Данные → Из таблицы/диапазона:

Функцию if очень легко создать с помощью условного столбца. На вкладке Добавление столбца выбираем Условный столбец:

В диалоговом окне заполняем все необходимые поля:

  • В поле «Имя нового столбца» вводим имя будущего столбца «Статус». 
  • В поле «Имя столбца» указываем столбец для оценки условия. Выбираем столбец «% выполнения заказа».
  • В поле «Оператор» представлен список операторов. Для нашего примера выбираем оператор «равно». 

Для разных типов данных будет предложен разный список операторов сравнения:

  • Текст: начинается с, не начинается с, равняется, содержит и т. д.
  • Номера: равно, не равно, больше или равно и т. д.
  • Время: до, после, равно, не равно и т. д.

Все множество значений будет проверено по первому условию. Если будут найдены результаты, удовлетворяющие первому условию, им будет присвоено значение по результатам выполнения первого условия. 

  • В поле «Значение» вводим конкретное значение для сравнения. 
  • В полях «Значение», «Имя столбца» и «Оператор» составляем наше условие.
  • В поле «Вывод» указываем значение, которое будет возвращено, если условие выполнено.
  • В поле «В противном случае» указываем другое значение, которое нужно вернуть, если условие не выполняется.

В результате получаем новый столбец со статусами:

Осталось выгрузить получившийся отчет в Excel с помощью кнопки «Закрыть и загрузить» на вкладке Главная:

С помощью опции «Условный столбец» вы можете вставить дополнительные условия. 

Выбранный столбец по условию

В таблице заказов необходимо перевести все суммы в рубли. Имеются данные по суммам заказов, в какой валюте заказ выполнен и конкретные курсы валют на дату заказа.

Выбираем: вкладка Данные → Получить данные → Из других источников → Из таблицы/диапазона. После загрузки данных в Power Query создаем условный столбец. На вкладке Добавление столбца выбираем Условный столбец:

В диалоговом окне заполняем все необходимые поля:

  • В поле «Имя нового столбца» вводим имя будущего столбца «Курс валюты».
  • В поле «Имя столбца» указывается столбец для оценки условия. Из выпадающего списка столбцов выбираем столбец «Валюта».
  • В поле «Оператор» представлен список операторов. Выбираем для нашего примера оператор «содержит». 
  • В поле «Значение» вводим конкретное значение для сравнения USD.

Помните, что Power Query чувствителен к регистру: строчные и прописные буквы для него разные символы!

В поле «Вывод» выбираем из выпадающего списка команду «Выберите столбец»:

Далее из выпадающего списка имен столбцов выбираем столбец «USD»:

Теперь пропишем еще два условия. Нажимаем на кнопку «Добавить предложение». После этого появляется новая строчка «Иначе если», которую заполняем по аналогии с первым условием. 

В поле «Имя столбца» выбираем столбец «Валюта». В поле «Оператор» выбираем оператор «содержит». В поле «Вывод» выбираем из выпадающего списка команду «Выберите столбец», далее указываем столбец EUR:

Добавляем аналогичное условие для валюты CNY. Осталось заполнить последнее поле в случае невыполнения ни одного из 3-х наших условий. В поле «В противном случае» указываем значение 1, которое нужно вернуть, если условия не выполняются. Это значение будет присвоено, если заказ был сделан в рублях (RUB):

Рассмотрим, как работает условный столбец: 

  1. Все множество значений будет проверено по первому условию. Если будут найдены результаты, удовлетворяющие первому условию, то для них будет присвоено значение по результатам выполнения первого условия. 
  2. Для остальных значений из множества будет проверено следующее условие. И так далее до тех пор, пока не будут проверены все условия. 
  3. Если для элементов множества не будет выполнено ни одно условие, то в условный столбец попадет значение из поля «В противном случае».

Получаем новый столбец с нужными курсами валют:

Для решения нашей задачи создаем настраиваемый столбец, в котором перемножаем столбец с суммами заказов и столбец с нужным курсом:

Присваиваем имя новому столбцу «Сумма заказа в рублях», прописываем формулу и нажимаем Ок:

Осталось выгрузить получившийся отчет в Excel с помощью кнопки Закрыть и загрузить на вкладке Главная:

Базовые условия можно проверить с помощью условного столбца, но задать более сложные условия с вычислениями можно только на языке М через написание кода. Рассмотрим на примере ниже.

Настраиваемый столбец c конструкцией if-then-else

Необходимо присвоить скидку в 10% всем заказчикам со способом оплаты «аванс» и рассчитать цену со скидкой.

Выбираем: вкладка Данные → Получить данные → Из других источников → Из таблицы / диапазона. Для решения нашей задачи создаем настраиваемый столбец, в котором прописываем конструкцию if…then…else:

Присваиваем имя новому столбцу «Цена со скидкой» и прописываем формулу: если способ оплаты «аванс», то высчитываем цену со скидкой (Цена – Цена*10%). Если другие способы оплаты, то выводим обычную цену.

Обратите внимание, что в качестве разделителя десятичной части используется точка вместо запятой:

В результате работы нашей формулы получаем новый столбец уже с корректной финальной ценой:

Выгружаем получившийся отчет в Excel с помощью кнопки Закрыть и загрузить на вкладке Главная. 

Условие с обработкой пустой ячейки null

Функция if имеет особенности в работе с пустыми ячейками (null). При попытке выполнить операции сравнения с null появится ошибка. Значения null можно проверить на равенство, но null равен только null. Если вы хотите сравнить null с любым другим значением при помощи относительного оператора (например, <, >, <=, >=), тогда результат сравнения будет не логическим значением типа true или false, а именно null. В этом случае выражение if…then…else покажет ошибку. Как избавиться от этой ошибки, если ваши данные содержат null, и замена его на другое значение не подходит? 

Нужно увеличить стоимость заказа на стоимость доставки (200 руб.) во всех случаях, кроме самовывоза.

Загружаем данные в Power Query с помощью команд Данные → Получить данные → Из таблицы/диапазона. Создаем настраиваемый столбец, выбрав Добавление столбца – Настраиваемый столбец. В диалоговом окне присваиваем имя будущего столбца «Полная стоимость заказа» и прописываем формулу. В столбце «Доставка» имеются пустые ячейки, которые в Power Query считываются как null:

Сначала проверяем значения на равенство с null. Если ячейка в столбце «Доставка» пустая, то выводим значение из столбца «Стоимость заказа». На языке М эта запись будет выглядеть так:

 if [Доставка] = null then [Стоимость заказа] else

 Теперь записываем следующее условие:

Выражение if…then…else выполняет последовательное вычисление условий. Если первым условием будет идти относительное сравнение, ошибка снова появится и останется до конца расчета выражения. Именно поэтому сначала проверяем значение на наличие null.

В итоге получаем готовый расчет, который выполнен с помощью всего одного шага:

Заключение

Мы разобрали, как писать простые условия с помощью условного столбца и рассмотрели более сложные варианты написания конструкции if…then…else.

Выделим следующие особенности работы с функцией if:

  1. Условие «if» в Power Query пишется в нижнем регистре, формулы Power Query чувствительны к регистру.
  2. Вместо запятых, разделяющих аргументы значение_если_истина и значение_если_ложь, используем then и else (в нижнем регистре).
  3. При попытке выполнить операции сравнения с null появится ошибка. Сначала проверяем на равенство null, а затем записываем последующие условия.
  4. Текстовый тип данных может сравниваться только с текстом, а числа сравниваются с числами.
  5. Для чисел можно использовать следующие логические операторы:
  • =  равно
  • <>  не равно
  • >  больше, чем
  • >=  больше или равно
  • <  меньше, чем
  • <=  меньше или равно

6. Для текста и операций сравнения используем разные функции:

  • Text.Contains — содержит
  • not Text.Contains — не содержит
  • Text.StartsWith — начинается с
  • not Text.StartsWith — не начинается с
  • Text.EndsWith — заканчивается на
  • not Text.EndsWith — не заканчивается на

Понравилась статья? Поделить с друзьями:
  • Power query содержит ошибки переполнения
  • Power query показать ошибки
  • Power query ошибка ole db или odbc
  • Power query ошибка binary
  • Power query обработка ошибок