|
Александр L Пользователь Сообщений: 414 Александр |
Коллеги Всем привет , подскажите пжл возможно ли с помощь Try в Power Query при добавлении доп столбца формулой прописать аналог EСЛИОШИБКА ? |
|
PooHkrd Пользователь Сообщений: 6602 Excel x64 О365 / 2016 / Online / Power BI |
#2 14.02.2019 13:37:57 try чего-то там otherwise что-то вместо ошибки
Изменено: PooHkrd — 14.02.2019 13:44:59 Вот горшок пустой, он предмет простой… |
||
|
Александр L Пользователь Сообщений: 414 Александр |
#3 14.02.2019 13:39:34
Так у меня вроде так и прописано когда создаю доп столбец но не работает Изменено: Александр L — 14.02.2019 13:40:20 |
||
|
Максим Зеленский Пользователь Сообщений: 4646 Microsoft MVP |
#4 14.02.2019 13:42:15 Проще всего так:
Еще можно — создать столбец =[#»Количество (в базовых единицах), короба»]*[Вложения] и использовать в формуле его, чтобы не считать два раза, а потом удалить. F1 творит чудеса |
||
|
Максим Зеленский Пользователь Сообщений: 4646 Microsoft MVP |
#5 14.02.2019 13:44:00
Потому что деление на 0 это не совсем ошибка, которая стопорит запрос: F1 творит чудеса |
||
|
Александр L Пользователь Сообщений: 414 Александр |
А вы вот как обошли я тоже пробовал через If но применял три условия и вот не получалось(((. Спасибо сейчас попробую на массиве этот метод. |
|
А ещё есть null, деление на который даёт null, а не ошибку и не упомянутое выше |
|
|
Александр L Пользователь Сообщений: 414 Александр |
#8 14.02.2019 13:48:21 да с null я всегда пресекаю на начальном этапе))))) |
Hello @SHAKEDALROY
another approach is to not change the column type blindly but to make a Table.TransformColumns instead to check whether the data is a datetime or not. Here an M-code
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjDVMzTSMzJQMDSyMjBQitUBCllAhQwsYEJOOYlApBQbCwA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [DateTime = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"DateTime", type text}}),
ChangeToDateTime = Table.TransformColumns(#"Changed Type",{{"DateTime", each try DateTime.From(_, "de-DE") otherwise null , type datetime}} )
in
ChangeToDateTime
Copy paste this code to the advanced editor in a new blank query to see how the solution works.
If this post helps or solves your problem, please mark it as solution (to help other users find useful content and to acknowledge the work of users that helped you)
Kudoes are nice too
Have fun
Jimmy
В М можно вызвать и обработать ошибки во время выполнения. Если из других языков программирования вы знакомы с идеей исключения, обработка ошибок Power Query отличается по крайней мере одним существенным моментом.[1]
Предыдущая заметка Следующая заметка

Рис. 1. Три поля записи error; чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке
Скачать заметку в формате Word или pdf, примеры в формате Excel
Сообщение об ошибке
В Power Query каждое выражение должно что-то возвращать. Как правило, это значение. Но выражение также может вызвать ошибку – особый способ указать, что не получилось вернуть значение. Один из способов вызвать ошибку – создать запись с ключевым словом error. Такая запись имеет три поля: причина, сообщение и подробности. Поля с любыми другими именами будут проигнорированы.
Листинг 1[2]
|
= error [ Reason = «Business Rule Violated», Message = «Item codes must start with a letter», Detail = «Non-conforming Item Code: 456» ] |
Все три поля являются необязательными. Если поле Reason отсутствует, причина ошибки будет иметь значение по умолчанию – Expression.Error. Запись ошибки можно также создать с помощью функции Error.Record. В отличие от описанного выше подхода, в Error.Record атрибут Reason является обязательным.
Листинг 2
|
= error Error.Record( «Business Rule Violated», «Item codes must start with a letter», «Non-conforming Item Code: 456» ) |
Оба приведенных выше примера приводят к эквивалентной ошибке, изображенной на рис. 1 Глядя на рисунок, видно, как три поля/параметра соотносятся с отображаемым сообщением.
Вместо записи error также может принимать строку. Результирующее сообщение об ошибке будет иметь значение предоставленной строки, а его причина – значение Expression.Error.
Листинг 3

Рис. 2. Строка в error
Ярлык с многоточием
Существует также оператор быстрого доступа для создания ошибок, который пригодится во время разработки. Допустим, вы хотите протестировать запрос, часть кода которого еще не написана. Поскольку каждое выражение должно возвращать значение, или вызывать ошибку, вы не можете протестировать свой запрос, не поместив что-то в качестве заполнителя в нереализованные участки кода. Используйте оператор многоточия (…). При вызове … выдает ошибку Expression.Error: Значение не задано. Вот фрагмент кода, в котором не реализована ветвь else:
Листинг 4
|
let a = 6, Result = if a = 5 then true else ... in Result |
Когда условие (а = 5) принимает значение false, вызывается «…», что приводит к ошибке. Обратите внимание, ключевое слово error не используется. Оператор многоточия как определяет, так и вызывает ошибку.
Особое поведение
Что именно происходит, когда возникает ошибка? Какое поведение возвращает ошибку, а не значение? Рассмотрим выражение:
В обычных условиях сначала выполняется функция GetValue(). Затем полученное значение передается в someFunction(), которая возвращает финальный результат. Предположим, GetValue() выдает ошибку. Дальнейшее выполнение выражения прекращается. someFunction() не вызывается. Ошибка GetValue() становится итогом выражения. Такое поведение также известно, как повышение. Ошибка передается тому шагу, с которого была вызвана someFunction().
Дальнейшее зависит от того, предусмотрено ли в коде появление ошибки. Если да, запрос продолжит выполнение. Если нет, возникнет ошибка верхнего уровня. Запрос завершит работу и вернет значение ошибки.
Сдерживание ошибок
Если ошибка возникает в выражении, которое что-то определяет (поле записи, ячейку таблицы, переменную в выражении let, …), ошибка содержится в этом чём-то. Последствия ошибки ограничены этим чем-то и логикой, которая пытается получить доступ к значению этого чего-то. Ниже последствия ошибки GetValue содержатся в той части запроса, на которую она повлияла. Ошибка не остановила выполнение запроса. Запрос завершился успешно и вернул запись. Два поля – FieldB и FieldC – вернули ошибку, потому что они являются чем-то, затронутым ошибкой.
Листинг 5
|
let GetValue = () => error «Something bad happened!», DoSomething = (input) => input + 1, Result = [ FieldA = 25, FieldB = DoSomething(GetValue), FieldC = FieldA + FieldB ] in Result |

Рис. 3. Результат запроса
Сдерживание ошибок влечет за собой еще одну особенность. Ошибка сохраняется в чём-то, что ее содержит. Пока выполняется запрос, любая попытка получить доступ к значению этого чего-то приводит к повторному возникновению сохраненной ошибки. Когда происходит попытка доступа, логика, которая первоначально вызвала ошибку, не подвергается повторной оценке. Эта логика при повторном обращении могла бы вернуть допустимое значение. Но логика пропускается, и ранее сохраненная ошибка просто вызывается повторно.
Ниже функция GetDataFromWebService() вычисляется один раз, даже если к самим данным обращаются дважды. Если первое обращение вернуло ошибку, второе обращение тоже вернет ошибку, сохраненную ранее.
|
let Data = GetDataFromWebService() // повышенная ошибка in { List.Sum(Data[Amount]), List.Max(Data[TransactionDate]) } |
Ошибки верхнего уровня
Если ошибку не удалось сдержать, она передается из выражения в верхний уровень, как результат всего запроса. Далее в среду хоста и выполнение запроса останавливается. В следующем выражении ничто не содержит ошибку, поэтому её нельзя сдержать, и запрос завершается ошибкой:
Листинг 6
|
let GetValue= () => error «Something bad happened!», SomeFunction = (input) => input + 1 in SomeFunction(GetValue()) |
Сдерживание против исключения
Поведение Power Query по сдерживанию ошибок отличает его от большинства языков программирования, основанных на исключениях. В мире исключений ошибка автоматически распространяется вплоть до среды хоста, что приводит к завершению работы программы (если только в коде не будет предусмотрена обработка ошибок). В M ошибка локализуется, пока есть что-то, что ее содержит. Это позволяет успешно завершить запрос, даже если не удалось вычислить отдельные элементы.
Сдерживание ошибок – отличное поведение, учитывая цель использования M: обработка данных. Предположим, что выражение, определяющее значение столбца таблицы, содержит ошибку для одной ячейки из всей таблицы. В мире, основанном на исключениях, эта ошибка может привести к завершению всей обработки. В мире M ошибка просто влияет на эту единственную ячейку и любой код, который обращается к этой ячейке. Обработка продолжается, и будет получен результат.
На самом деле, из-за лени M, если к ячейке с ошибкой не будет обращений, то ошибка и не возникнет.
Листинг 7
|
let Data = #table({«Col1»}, {{«SomeValue»}, { error «bad» }}) in Table.RowCount(Data) // возвращает 2 |
Хотя одна ячейка и содержит ошибку, запрошенные данные (количество строк), не требуют вычисления значения ошибочной ячейки, поэтому выражение вернет значение 2.
Хотя сдерживание ошибок – отличное поведение по умолчанию, что, если оно не соответствует вашим потребностям? В частности, что делать с таблицами, если важно различать строки с ошибками и строки без ошибок? Возможно, вы не обращаетесь к содержимому строки напрямую, поэтому не делаете ничего, что могло бы вызвать распространение ошибок, но все же хотите знать, в каких строках есть ошибка, а в каких нет. Функции Table.SelectRowsWithErrors и Table.RemoveRowsWithErrors, то, что вам нужно.
Листинг 8
|
let Data = #table({«Col1»}, {{«SomeValue»}, { error «bad» }}) in [ RowsWithErrors = Table.RowCount(Table.SelectRowsWithErrors(Data)), RowsWithoutErrors = Table.RowCount(Table.RemoveRowsWithErrors(Data)) ] |

Рис. 4. Список, содержащий количество строк с ошибками и без
Обработка ошибок
Понимая, какие операции способны вызывать ошибку, вы можете использовать ключевое слово try, чтобы проверить, не возвращает ли выражение ошибку. try используется в двух вариантах…
|
try ExpressionToTry otherwise FallbackExpression |
… первый, try with otherwise, пытается выполнить ExpressionToTry. Если это выражение возвращает значение, всё Ok, переходим к следующему шагу запроса. Когда выражение выдает ошибку, вычисляется выражение otherwise и возвращается его значение.
|
try Number.FromText(input) otherwise 0 |
Если Number.FromText возвращает значение, оно и будет результатом выражения. Когда Number.FromText выдает ошибку, try обращается к части otherwise, и возвращает 0. Другими словами, если входные данные могут быть преобразованы в число, возвращается это число; в противном случае возвращается значение по умолчанию – 0.
Имейте в виду, что ошибки будут обработаны только в выражении, расположенном непосредственно справа от try. Если ошибку возвращает выражение otherwise, эта ошибка не будет обработана предшествующим try. Но… поскольку otherwise само по себе является выражением, try можно поместить внутрь него, чтобы обработать ошибку, вызванную otherwise.
|
try GetFromPrimary() otherwise try GetFromSecondary() otherwise «Возникли проблемы с обоими серверами. Возьми отгул на остаток дня :)» |
Проблема с конструкцией try with otherwise в том, что она неразборчива: любая ошибка возвращает альтернативное значение. Иногда последующие действия зависят от типа ошибки. Для этих ситуаций подойдет второй вариант – простое выражение try.
Эта форма всегда возвращает запись. Если выражение завершилось успешно, эта запись имеет вид:
|
[ HasError = false, Value = (значение выражения ExpressionToTry) ] |
Если выражение вызвало ошибку, возвращаемая запись выглядит следующим образом:
|
[ HasError = true, Error = (запись, описывающая возникшую ошибку) ] |
Например:
Листинг 9
|
let DoSomething = () => 45, Result = try DoSomething() in Result // [HasError = false, Value = 45] |

Рис. 5. Запись, возвращаемая try, если нет ошибки
Листинг 10
|
let DoSomething = () => error «bad», Result = try DoSomething() in Result // [HasError = true, Error = [Reason = «Expression.Error», Message = «bad», Details = null] |

Рис. 6. Запись, возвращаемая try, если есть ошибка
Запись, помещенная в поле Error, содержит ровно три поля: Reason, Message и Details.[3] Это верно, даже если в записи, первоначально использовавшейся для определения ошибки, отсутствовало одно или несколько из этих полей (помните, они необязательны при определении ошибки), или если она включала дополнительные поля.
Запись, возвращаемая try, может быть использована для реализации логики условного исправления. Следующий код обращается к вторичному источнику данных, если первичный выдает ошибку из-за недоступности сервера.
|
let Primary = try GetDataFromPrimary(), Source = if Primary[HasError] = false then Primary[Value] /* если Primary возвращает значение, используй его */ else if Primary[Error][Reason] = «External Source Error» and Primary[Error][Message] = «Server is unreachable» then GetDataFromSecondary() /* если ошибка Primary вызвана тем, что его источник недоступен, запроси данные с сервера Secondary */ else error Primary[Error] /* если Primary вернул иную ошибку, верни её в качестве результата запроса */ in Source |
Используя try with otherwise, мы бы запросили Secondary, если Primary выдаст любую ошибку, а не только когда основной сервер недоступен:
|
try GetDataFromPrimary() otherwise GetDataFromSecondary() |
Масштаб (область действия)
Обработка ошибок должна происходить на уровне, на котором они возникают. Нельзя обработать ошибки, содержащиеся на другом уровне.
|
let Data = #table({«Amount»}, {{10}, {error «help!»}, {error «save me!»}}) in try Data otherwise 0 |
try – бесполезный оператор в этом запросе. Возможно, разработчик надеялся с помощью try заменить ошибки нулями. Но в этом случае Data возвращает допустимую таблицу. Правда, в ней самой есть ячейки с ошибками, но эти ошибки содержатся на уровне ячеек. Поскольку они не влияют на выражение данных на уровне таблицы, try не дает эффекта.
try будет полезен в следующем случае, но его эффект может быть не таким, как предполагал разработчик.
Листинг 11
|
let Data = #table({«Amount»}, {{10}, {error «help!»}, {error «save me!»}}) in try List.Sum(Data[Amount]) otherwise 0 |
List.Sum суммирует значения в столбце [Amount] таблицы Data. Если выражение, определяющее значение элемента, вызывает ошибку, она повышается. List.Sum прекращает суммирование и возвращает ошибку. try обрабатывает эту ошибку, возвращая 0 вместо суммы элементов списка. Скорее всего, цель у разработчика была иная. Он хотел заменить элементы с ошибками на 0, и суммировать числовые значения. Необходимо применить try так, чтобы обработка ошибок велась на уровне ячеек таблицы. Кажется, что можно сделать так:
|
Table.TransformColumns(Data, (input) => try input otherwise 0) |
Однако, эта логика не улавливает ошибки, вызванные выражениями значений ячеек. Дело в том, что аргументы вычисляются до того, как их значения будут переданы в функцию. Если оценка приводит к ошибке, функция не вызывается. Вместо этого ошибка передается шагу, который вызвал функцию. В нашем случае, если выражение значения столбца выдает ошибку, функция преобразования (input) => … не вызывается, поэтому try не может обработать ошибку. Вместо этого ошибка передается обратно в Table.TransformColumns.
Проблема заключается в том, что выражение значения ячейки должно быть вычислено внутри try. Чтобы добиться этого, надо вернуться на уровень строки, и использовать функцию, которая получает строку. Затем внутри функции использовать ссылку на значение столбца строки и вот его подставить в try. Лишь тогда try сможет обработать ошибку. Чтобы реализовать это, нужно создать новый столбец, значения которого формировать путем проверки try. Затем можно удалить исходный столбец, а новому столбцу дать старое имя.
Листинг 12
|
let Data = #table({«Amount»}, {{10}, {error «help!»}, {error «save me!»}}), ErrorsReplacedWithZero = Table.AddColumn( Data, «NewAmount», (row) => try row[Amount] otherwise 0 ), RemoveOldAmount = Table.RemoveColumns(ErrorsReplacedWithZero, {«Amount»}), RenameNewAmount = Table.RenameColumns(RemoveOldAmount, {«NewAmount», «Amount»}) in List.Sum(RenameNewAmount[Amount]) // возвращает 10 |
Это довольно сложно. Но пример хорошо иллюстрирует общий подход к использованию try на уровне ячеек. Если же, как в нашем пример, вы просто хотите заменить любую ошибку значением по умолчанию, используйте Table.ReplaceErrorValues.
Листинг 13
|
let Data = #table({«Amount»}, {{10}, {error «help!»}, {error «save me!»}}), ErrorsReplacedWithZero = Table.ReplaceErrorValues( Data, {{«Amount», 0}} ) // заменяет ошибки в столбце Amount нулями in List.Sum(ErrorsReplacedWithZero[Amount]) // возвращает 10 |
Применить try к элементам списка сложнее. Для списков нет функции List.ReplaceErrorValues. Самым простым решением может быть преобразование списка в таблицу, обработка ошибки, а затем обратное преобразование таблицы в список.
Листинг 14
|
let Data = {10, error «help!», error «save me!»}, #»Преобразовано в таблицу» = Table.FromValue(Data), #»Замененные ошибки» = Table.ReplaceErrorValues(#»Преобразовано в таблицу», {{«Value», 0}}), Value = #»Замененные ошибки»[Value], #»Вычисленная сумма» = List.Sum(Value) in #»Вычисленная сумма» |

Рис. 7. Сумма элементов списка, содержащего ошибки
Нарушения правил
Вы можете использовать ошибки, как сигнал о несоответствиях. Допустим, вы обрабатываете CSV-файл, где значения в столбце ItemCode должны начинаться с буквы A. В начале запроса вы проверяете это, заменяя несоответствующие значения ошибками. Последующие этапы обработки, которые обращаются к столбцу, будут предупреждены, если они попытаются работать со значениями, нарушающими правила.
|
let Data = GetData(), // for testing use: #table({«ItemCode»}, {{«1»}, {«A2»}}) Validated = Table.TransformColumns( Data, { «ItemCode», each if Text.StartsWith(_, «A») then _ else error Error.Record( «Invalid Data», «ItemCode does not start with expected letter», _ ) } ) in Validated |
Такую проверку полезно применить в базовом запросе, на который будут ссылаться несколько других запросов. Это позволит вам выполнить проверку один раз (вспомните принцип Не повторяйся, Don’t repeat yourself), гарантируя, что пользователи, пытающиеся использовать ошибочные данные, будут предупреждены о наличии аномалий.
Другой вариант – добавить столбец со значениями true и false, в зависимости от того, соблюдается ли правило:
|
let Data = GetData(), // for testing use: #table({«ItemCode»}, {{«1»}, {«A2»}}) Validated = Table.AddColumn( Data, «ValidItemCode», each Text.StartsWith(_[ItemCode], «A»), type logical ) in Validated |
В этом примере логика заботится о том, является ли ItemCode допустимым. Если разработчик забудет выполнить проверку, неверные данные могут рассматриваться как действительные. В отличие от этого, подход замены несоответствующих данных ошибками гарантирует, что попытка получить доступ к недопустимому значению, закончится ошибкой. Пользователь будет вынужден поправить данные в источнике. Какой вариант выбрать, зависит от вашего контекста.
В следующей заметке
Я планирую рассказать о том, что остается за кулисами: организации разделов кода и о том, как M предоставляет возможность аннотировать значения дополнительной информацией (метаданными). Однако перед этим обсудим, как работает система типов в Power Query.
[1] Заметка написана на основе статьи Ben Gribaudo. Power Query M Primer (Part 15): Error Handling. Если вы впервые сталкиваетесь с Power Query, рекомендую начать с Марк Мур. Power Query.
[2] Номер листинга соответствует номеру запроса в приложенном Excel файле.
[3] Судя по рис. 6 современная реализация M создает пять полей.
Замените все значения ошибок для всех столбцов после импорта данных (при сохранении строк)
Вопрос:
Таблица Excel в качестве источника данных может содержать значения ошибок (#NA, # DIV/0), которые могут нарушить некоторые последующие этапы процесса преобразования в Power Query.
В зависимости от следующих шагов мы можем получить не вывод, а ошибку. Так как же справиться с этим делом?
Я нашел два стандартных шага в Power Query, чтобы поймать их:
- Удалить ошибки (интерфейс: Главная/Удалить строки/Удалить ошибки) → все строки с ошибками будут удалены
- Заменить значения ошибок (UI: Transform/Replace Errors) → столбцы должны быть сначала выбраны для выполнения этих операций.
Первая возможность для меня не является решением, так как я хочу сохранить строки и просто заменить значения ошибок.
В моем случае моя таблица данных будет меняться со временем, это означает, что имя столбца может измениться (например, годы) или появятся новые столбцы. Так что вторая возможность слишком статична, так как я не хочу каждый раз менять скрипт.
Поэтому я попытался получить динамический способ очистки всех столбцов, независимо от имен столбцов (и количества столбцов). Он заменяет ошибки на нулевое значение.
let
Source = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
//Remove errors of all columns of the data source. ColumnName doesn't play any role
Cols = Table.ColumnNames(Source),
ColumnListWithParameter = Table.FromColumns({Cols, List.Repeat({""}, List.Count(Cols))}, {"ColName" as text, "ErrorHandling" as text}),
ParameterList = Table.ToRows(ColumnListWithParameter ),
ReplaceErrorSource = Table.ReplaceErrorValues(Source, ParameterList)
in
ReplaceErrorSource
Вот разные три сообщения с запросами, после того как я добавил два новых столбца (с ошибками) к источнику: 
Если у кого-то есть другое решение для такой очистки данных, напишите здесь.
Лучший ответ:
let
src = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
cols = Table.ColumnNames(src),
replace = Table.ReplaceErrorValues(src, List.Transform(cols, each {_, "!"}))
in
replace
Почему в вашей итоговой таблицы не все данные, которые должны там оказаться? Вероятно вы совершили ошибку неверной фильтрации в пользовательском интерфейсе.
Text.SplitAny
List.Select
Character.FromNumber
Text.Combine
На чтение 17 мин. Просмотров 59.4k.
Есть одна вещь, которая волнует всех — как сэкономить больше времени и работать с умом.
Что ж, я уже давал много приемов и трюков Excel, которые значительно облегчат работу. Но сегодня речь пойдет о POWER QUERY. Да-да, вы все правильно поняли.
POWER QUERY — это то, что может изменить вашу жизнь. Сегодня в этой статье я поделюсь с вами некоторыми удивительными приемами Power Query, которые вы можете начать использовать прямо сейчас.
Эти советы не только помогут вам сэкономить время, но и вдохновят вас использовать POWER QUERY для управления данными. По крайней мере, я на это надеюсь.
Прежде чем мы перейдем к приемам, нужно прояснить пару моментов.
Содержание
- Почему я должен использовать Power Query?
- Как установить Power Query — Шаги
- Лучшие 25 приемов Power Query для экономии времени в повседневной работе
- Заключение
Почему я должен использовать Power Query?
Делюсь с вами некоторыми серьезными причинами, так как хочу, чтобы вы в дальнейшем изучали Power Query.
1. Самый простой способ преобразовать ваши данные
Одной из основных причин использования Power Query — легкость преобразования данных. Обычно вы используете формулы и сводные таблицы, но с Power Query все основные задачи формирования данных могут быть выполнены в кратчайшие сроки.
2. Power Query в реальном времени
Это вторая важная причина, по которой Power Query выполняется в реальном времени, как разовая настройка.
Напишите запрос один раз, и вы можете обновлять его каждый раз, когда происходит изменение данных, также вы можете определить время автоматического обновления (Совет № 26).
3. Нужно просто несколько кликов
Как я уже сказал, обычно вы используете формулы и сводные таблицы для преобразования данных, но с POWER QUERY вы можете многое сделать, просто щелкнув мышью.
Нет необходимости писать формулы или коды.
Как установить Power Query — Шаги
Прежде чем вы начнете использовать эти приемы, в вашем Excel должен быть установлен Power Query.
И если вы один из тех пользователей Excel, у которых нет надстройки с Power Query, используйте эти шаги для ее установки.
Для Excel 2016 или Office 365:
Если вы используете версию Excel 365 или Excel 2016, она уже находится на вкладке «Данные» — «Скачать & преобразовать».

Для версий 2013 и 2010:
Прежде всего, загрузите надстройку отсюда (официальный сайт Microsoft).Как только вы загрузите файл, откройте его и следуйте инструкциям. После этого автоматически откроется вкладка «Power Query» на ленте Excel.
Если вкладка «POWER QUERY» не появляется, вам не о чем беспокоиться.
Вы можете добавить ее, используя опцию Надстройки COM.
- Перейдите на вкладку «Файл» ➜ «Параметры» ➜ «Надстройки».
- В опциях «Надстройки» выберите «Надстройки COM» и нажмите Перейти.
- После этого отметьте галочкой «Microsoft Power Query for Excel».
- В конце нажмите ОК.
Все! Теперь у вас есть новая вкладка на ленте с названием «Power Query».
Откройте Power Query и загрузите в него данные
У вас есть разные способы добавить данные в редактор Power Query. Что ж, если у вас есть данные на рабочем листе, вы можете вставить их оттуда.
- Перейдите на вкладку «Данные» ➜ «Скачать & преобразовать» ➜ Из таблицы.
- Нажмите OK, чтобы преобразовать этот диапазон в таблицу Excel.
- И сразу после этого вы получите эту таблицу в редакторе Power Query, как показано ниже.
Лучшие 25 приемов Power Query для экономии времени в повседневной работе
Теперь пришло время изучить все эти советы по Power Query. Так что давайте начнем.
1. Заменить значения
У нас есть список с некоторыми значениями, и нам нужно заменить определенное значение или некоторые значения чем-то другим.
С помощью Power Query мы можем создать запрос и заменить эти конкретные значения очень быстро. В приведенном ниже списке я хочу заменить имя «Алена» на «Алёна».

Давайте сделаем:
- Прежде всего, загрузите список в редактор Power Query.
- После этого перейдите на вкладку «Преобразование» и нажмите «Замена значений».

- Теперь в поле «Значение для поиска» введите «Алена», а в поле «Заменить на» введите «Алёна» и после этого нажмите ОК.

- После того, как вы нажмете OK, все значения будут заменены новыми. Теперь можно нажать «Закрыть и загрузить», чтобы загрузить данные в таблицу.

А вот и лучшая часть: Вы только что создали запрос в режиме реального времени. При повторном обновлении запроса он заменит все вновь введенные значения.
2. Сортировка — по возрастанию и по убыванию
Как и при обычной сортировке, вы можете сортировать данные, используя Power Query. Я использую тот же список имен, который мы использовали выше. Вот, что нужно сделать.
- Прежде всего, загрузите данные в редактор
- В редакторе Power Query у вас есть две кнопки сортировки (по возрастанию и по убыванию).
- Нажмите на любую из этих кнопок, чтобы отсортировать.

- В конце нажмите «Закрыть и загрузить», чтобы загрузить данные в таблицу.
Вы, наверное, удивлены: «Зачем мне использовать Power Query, если я могу использовать обычную сортировку на листе?»
Как я уже писал, Power Query — работает в реальном времени. Вы можете создать запрос автообновления (Совет № 26), который будет обновляться через определенное время и автоматически сортировать ваши данные.
3. Удалить столбцы
Очень часто бывает, что вы получаете откуда-то данные, и вам нужно удалить некоторые столбцы из них. Дело в том, что вы должны удалять эти столбцы каждый раз, когда добавляете новые данные.
Но с Power Query вы можете создать запрос.
Вот шаги:
- Прежде всего, откройте данные в редакторе
- После этого выберите столбец или несколько столбцов

- Теперь щелкните правой кнопкой мыши и выберите «Удалить».

- В конце нажмите «Закрыть и загрузить», чтобы загрузить данные.
Совет. Также имеется опция «Удалить другие столбцы», в которой можно удалить все невыбранные столбцы.
4. Разделить столбец
Точно так же как опция как «Текст по столбцам» есть в запросе: «Разделить столбец». Сейчас я расскажу, как это работает.
В приведенном ниже списке у вас есть имя и фамилия с дефисом между ними.

Теперь вам нужно разделить их на две колонки. Используйте эти шаги:
- Прежде всего, откройте список в редакторе
- После этого выберите столбец и перейдите на вкладку «Преобразование» ➜ «Разделить столбец» ➜ «по разделителю».

- Выберите «Пользовательский» из выпадающего списка и введите «-» в него.
- Теперь у вас есть три варианта, как разбить столбец.
- Самый левый разделитель
- Самый правый разделитель
- По каждому вхождению разделителя

Поскольку у нас есть только один разделитель в ячейке, все три будут работать одинаково, но если у вас более одного разделителя, вы можете выбрать нужный.

- В конце нажмите OK и нажмите «Закрыть и загрузить», чтобы загрузить данные.
5. Переименовать столбец
Вы можете просто переименовать столбец, щелкнув правой кнопкой мыши, а затем нажмите «Переименовать».

Совет: допустим, у вас есть запрос на переименование столбца, а кто-то другой переименовал его по ошибке. Вы можете восстановить это имя одним щелчком мыши.
6. Дубликат столбца
В Power Query есть простой способ создать дубликат столбца.

Все, что вам нужно сделать, это щелкнуть правой кнопкой мыши столбец, для которого вам нужен дубликат, а затем нажать «Создать дубликат столбца».
7. Объединить столбец
Обычно для объединения столбцов и ячеек мы используем формулы в Excel, но с Power Query это можно сделать намного проще.
Помните, мы разделили список сотрудников (Совет № 4). Теперь, давайте объединим его, используя пробел.
Следуй этим шагам:
- Как только вы добавите данные в редактор, выберите оба столбца.
- После этого щелкните по ним правой кнопкой мыши и выберите «Объединить столбцы».

- Теперь в окне слияния столбцов выберите разделитель из выпадающего списка (здесь мы используем пробел) и добавьте имя для нового объединенного столбца.

- Нажмите OK и загрузите данные в таблицу.
Совет: вы также можете использовать собственный разделитель для объединения двух столбцов.
8. Транспонировать столбец или строку
В Power Query транспонирование — это проще простого. Да, всего один клик.
- Как только вы загрузите данные в редактор, вам просто нужно выбрать столбец (столбцы) или строку (и).
- Перейдите на вкладку «Преобразование» ➜ Таблица ➜ «Транспонировать».

И все.
9. Заменить / удалить ошибки
Это крутая вещь. Обычно для замены или удаления ошибок в Excel вы можете использовать опцию поиска и замены или код VBA. Но в Power Query все намного проще.
Посмотрите на столбец ниже, где у вас есть некоторые ошибки, вы можете заменить их.

Когда вы щелкнете правой кнопкой мыши по столбцу, у вас будет два варианта, как с ними справиться.
- Заменить ошибки
- Удалить ошибки

10. Изменить тип данных
Посмотрите, это обычное дело: У вас есть данные в столбце, но они не в нужном формате. Поэтому каждый раз нужно менять его формат.

В приведенном выше примере у нас есть столбец дат, но мы видим просто числа. Чтобы преобразовать их в дату, вы можете использовать Power Query. Это очень просто.
- Прежде всего, откройте данные в редакторе
- После этого выберите столбец и перейдите на вкладку Преобразование.
- Теперь из типа данных выберите «Дата».

Вот, что получилось.

Совет: в большинстве случаев Power Query автоматически определяет тип данных, но если это не так, вы можете изменить его, как в приведенном выше примере.
11. Добавить столбец из примеров
Вот в чем дело: в Power Query есть возможность добавить образец столбца, который на самом деле не является образцом, связанным с текущим столбцом. Позволь мне привести пример:
В приведенном выше примере мы преобразовали числа в даты, и теперь предположим, что вам нужно добавить столбец, в котором необходимо указать название дня недели для этих дат.
Вместо использования формулы или любого другого параметра, в Power Query мы можем использовать параметр «Добавить столбец из примеров».
Вот как это сделать:
- После того, как вы отправите свои данные в редактор, выберите столбец.
- Потом щелкните по нему правой кнопкой мыши и выберите «Добавить столбец из примеров».

- Здесь вы получите пустой столбец. Нажмите на первую ячейку столбца, чтобы получить список значений, которые вы можете вставить.

- Выберите «Название дня недели с Дата» и нажмите «ОК».

Все! Столбец заполнен.

12. Отменить таблицу
Я написал полное пошаговое руководство, чтобы отменить вывод данных в виде таблицы с помощью Power Query:
- Прежде всего, выберите данные кросс-таблицы и перейдите на вкладку «Данные».

- На вкладке данных перейдите к Скачать & Преобразовать → Из таблицы.
- Когда вы щелкнете по нему, он преобразует ваши данные кросс-таблицы в таблицу Excel (если это уже не так).
- Данные мгновенно загрузятся в редактор Power Query.

- Отсюда нам нужно выбрать все столбцы, которые мы хотим отключить.
- Для этого выберите столбец Янв, нажмите и удерживайте клавишу Shift и выберите столбец Дек.
- После этого щелкните по нему правой кнопкой мыши и выберите «Отменить свертывание столбцов».

- Теперь все значения 12-ти столбцов разделены на два столбца. В одном — месяц, в другом — сумма.

- Последнее, что вам нужно сделать, это переименовать столбцы. Для этого щелкните правой кнопкой мыши по столбцу и переименуйте их.
- В конце нажмите «Закрыть и загрузить».
Теперь ваши данные кросс-таблицы преобразуются в простые данные, и вы можете использовать их для создания сводных таблиц и всего прочего для дальнейшего анализа и составления отчетов о продажах.
13. Изменить регистр
Как в функциях, которые вы используете в Excel, в Power Query есть пакет опций для изменения регистра текста.
- нижний регистр
- ВЕРХНИЙ РЕГИСТР
- Каждое Слово С Прописной
Вы можете сделать это, щелкнув правой кнопкой мыши по столбцу и выбрать любой из трех указанных выше вариантов. Или перейдите на вкладку «Преобразование» ➜ «Столбец Текст» ➜ «Формат».

14. Усечь и Очистить
Чтобы очистить данные или удалить ненужные пробелы, вы можете использовать опции Усечь и Очистить в Power Query.
Шаги просты:
- Щелкните правой кнопкой мыши по столбцу или выберите все столбцы, если у вас несколько столбцов.
- Перейдите к опции преобразования и выберите любую из опций:

- Усечь: для удаления лишних пробелов из ячейки.
- Очистить: для удаления непечатаемых символов из ячейки.
15. Добавить префикс / суффикс
Итак, у вас есть список значений, и в этот список вы хотите добавить префикс / суффикс в каждую ячейку. В Excel вы можете использовать функцию СЦЕПИТЬ, но в Power Query есть более простой способ.
- Прежде всего, выберите столбец, в который нужно добавить префикс / суффикс.
- Затем перейдите на вкладку «Преобразование» ➜ Столбец Текст ➜ Формат ➜ Добавить префикс / Добавить суффикс.

- Как только вы нажмете одну из опций, откроется диалоговое окно для ввода текста.

- После ввода текста нажмите ОК.

Опция работает одинаково для чисел, текста и дат.
16. Извлечь значения
Если вы разбираетесь в формулах, то вы согласитесь со мной, что для извлечения текста или числа из ячейки необходимо комбинировать несколько функций. Power Query решает много подобных задач. У вас есть семь способов извлечь значения из ячейки. И да, одним щелчком мыши.
Просто посмотрите на варианты, которые у вас есть.

Эти опции закрыли все основные вещи задачи, которые вы привыкли решать с помощью формул.
17. Только дата или время
Часто бывает, что у вас есть дата и время в одной ячейке, но вам нужна только одна из них.

Для этого в Power Query вам нужен всего лишь один клик, вот шаги.
- Выберите столбец, где у вас есть дата и время вместе.
- Если вам нужна Дата: щелкните правой кнопкой мыши ➜ Преобразование ➜ Только дата;
- Если хотите Время: щелкните правой кнопкой мыши ➜ Преобразование ➜ Только время.

18. Объедините дату и время
Теперь у вас есть отдельно дата и время. Значит, пора узнать, как их объединить.
Это довольно просто.
- Прежде всего, загрузите ваши данные в редактор.

- После этого выберите оба столбца (Дата и время) и перейдите на вкладку преобразования.

- Теперь из группы Столбец «Дата и время» перейдите к «Дата» и нажмите «Объединить дату и время».

Теперь у вас есть новый столбец с объединенным данными.
19. Округление чисел
У нас есть функции для округления чисел в Excel, но также есть и Power Query.
Вот варианты:
- Округление с увеличением.
- Округление с уменьшением.
- Округление: Вы можете выбрать, до какого знака после запятой округлить.

Шаги:
- Прежде всего, откройте ваши данные в редакторе.
- Выберите столбец правой кнопкой мыши ➜ Преобразование ➜ Округление и выберите любой из трех вариантов.

Примечание. Когда вы выбираете опцию «Округление», вам нужно ввести количество десятичных знаков для округления.
20. Расчеты
В Power Query есть варианты, которые вы можете использовать для выполнения расчетов. Посмотрите на приведенный ниже список.
- Стандартный
- Статистика
- Научный
- Тригонометрические
- Округление
- Информация

Вы можете найти все эти опции на вкладке Преобразование.
Для выполнения любого из этих расчетов вам нужно выбрать столбец и выбрать опцию.
21. Группировка
Как и сводные таблицы, Power Query — отличный вариант для группировки. Вы можете найти эту опцию на вкладке Преобразование.
Допустим, у вас большой набор данных и вы хотите создать сводную таблицу. Вот что вам нужно сделать:
- На вкладке «Преобразование» нажмите «Группировать по», откроется диалоговое окно.

- Теперь в этом диалоговом окне выберите столбец, который вы хотите сгруппировать.

После этого добавьте имя, выберите операцию и столбец, в котором у вас есть значения.

- В конце нажмите ОК.

Примечание. В параметре «Группировать по» также есть несколько расширенных опций, которые можно использовать для создания многоуровневой групповой таблицы.
22. Удалить знак отрицания
Есть много методов удаления отрицательного знака, и один из них — это Power Query.
Щелкните правой кнопкой мыши по столбцу и перейдите в Преобразование, а затем нажмите на Абсолютное значение.

23. Добавить настраиваемый столбец
Хотя в Power Query есть много опций, вы также можете создать пользовательский столбец, используя формулу расчета. Выполните следующие шаги, чтобы его создать:
- Прежде всего, перейдите на вкладку Добавление столбца ➜ Настраиваемый столбец.

- Здесь у вас появится диалоговое окно для создания формулы для использования в столбце (сейчас я хочу умножить количество на цену). Ведите формулу в поле формулы.

Совет. Когда вы вводите формулу, в диалоговом окне появится сообщение, если в формуле есть какая-то ошибка.
24. Автообновление запроса
Из всех советов и приемов, которые я упомянул здесь, этот является наиболее важным. Когда вы создаете запрос, вы можете сделать его автоматическим обновляемым (вы можете установить таймер).
Вот шаги:
- На вкладке «Данные» нажмите «Существующие подключения»
- Теперь щелкните правой кнопкой мыши по нужному запросу, далее Изменить свойства подключения.
- Введите минуты в открывшемся диалоговом окне.

- В конце нажмите ОК.
25. Создайте сводную таблицу из нескольких рабочих книг.
Иногда мы получаем или собираем данные из разных книг. И в этом случае создание сводной таблицы потребует дополнительных усилий для объединения этих нескольких рабочих книг в одну.
Но вы можете сделать это радостью с помощью Power query. Выполните эти три простых шага, чтобы создать сводную таблицу из разных рабочих книг.
У меня есть четыре книги с данными о продажах для разных отделений.

Убедитесь, что все эти файлы в одной папке.
Шаг 1 — Объедините файлы с помощью Power Query
Прежде всего, нам нужно объединить все файлы в одну таблицу с Power Query.
- Перейдите на вкладку «Данные» ➜ «Скачать & Преобразовать» ➜ «Создать запрос» ➜ «Из файла» ➜ «Из папки».

- Теперь в окне выбора папки нажмите «Обзор» и выберите папку, в которой находятся все файлы.

- Нажмите ОК.
- Вы увидите окно «Объединить файлы».

- В этом окне выберите лист с вашими данными во всех книгах. Важно: Убедитесь, что во всех книгах указано одинаковое имя листа!

- После того, как вы нажмете OK, Power Query отправит все данные из рабочих книг в редактор.
Шаг 2 — Подготовка данных для сводной таблицы
Теперь нам нужно внести небольшие изменения в наши данные, чтобы подготовить их к сводной таблице. Если вы посмотрите на данные, у нас появился дополнительный столбец с именем исходного файла.

- Щелкните правой кнопкой мыши по этому столбцу и выберите «Разделить столбец» ➜ «По разделителю».

- В окне разделителя выберите «Пользовательский», добавьте «.» в качестве разделителя и выберите «Самый левый разделитель».

- Нажмите ОК.
- После этого удалите второй столбец.

- Теперь переименуйте первый столбец.

- Теперь ваши данные готовы. Нажмите на закрыть и загрузить.
Шаг 3 — Вставьте сводную таблицу
На данный момент у нас есть новая рабочая таблица в рабочей книге с объединенными данными из всех четырех файлов. Теперь пришло время создать из них сводную таблицу.

- Выберите таблицу и перейдите на вкладку «Вставка» и нажмите кнопку «Сводная таблица».

- Откроется окно создания сводной таблицы. Нажмите OK, и вы получите новую сводную таблицу в своей книге.

Поздравляю! Вы успешно создали новую сводную таблицу из разных файлов.

Заключение
Вы можете не пользоваться POWER QUERY. Но… Многие вещи, которые мы делаем с формулами и функциями или кодами VBA, могут быть автоматизированы с помощью Power Query.
Я надеюсь, что приведенные выше советы вдохновляют вас использовать его все больше и больше.
Не забудьте поделиться своими мнениями со мной в разделе комментариев. И, пожалуйста, не забудьте поделиться этой информацией со своими друзьями, я уверен, что они это оценят.
Я работаю с данными, импортированными из файла pdf. В импорте Power Query есть дополнительный столбец (Data.Column7), содержащий данные, принадлежащие соседним столбцам с обеих сторон (Data.Column6 и Data.Column8). Столбцы 6 и 8 имеют нулевые значения в ячейках, куда данные были помещены в столбец 7. Я хотел бы заменить нулевые значения в столбцах 6 и 8 правильными данными из столбца 7, оставив все остальные значения в столбцах 6 и 8 как есть. .
Посмотрев на сообщение здесь: Power Query / Power BI — замена null значения со значением из другого столбца
И смотрю это видео: https://www.youtube.com/watch?v=ikzeQgdKA0Q
Я пробовал следующую формулу:
= Table.ReplaceValue(#"Expanded Data",null, each _[Data.Column7] ,Replacer.ReplaceText,{"Data.Column6","Data.Column8"})
(Обратите внимание: «Расширенные данные» — это последний шаг перед этим шагом замены значения.)
Я не получаю никаких синтаксических ошибок, но шаг «Заменить значение» вообще ничего не делает. Мои нулевые значения в столбцах 6 и 8 не были заменены правильными данными из столбца 7.
Мы будем очень благодарны за любое понимание того, как добиться замены. Спасибо.
(Я должен упомянуть, что я новый пользователь Power Query, поэтому, пожалуйста, расскажите подробнее и предположите, что я ничего не знаю!)
2 ответа
Лучший ответ
Я уверен, что должен быть какой-то способ сделать это с помощью функции ReplaceValue, но я думаю, что было бы проще сделать следующее:
1: Создайте новый столбец с определением NewData6 = if [Data.Column6] = null, затем [Data.Column7] else [Data.Column6] 2: Сделайте то же самое для 8: NewData8 = if [Data.Column8] = null, то [Data.Column7] else [Data.Column8] 3: Удалить Data.Column6 / 7/8 4: При необходимости переименовать вновь созданные столбцы.
Вы можете выполнить эти шаги либо в расширенном редакторе, либо просто использовать кнопку создания настраиваемого столбца на вкладке добавления столбца.
1
Dharman
7 Окт 2021 в 15:14
Если столбцы имеют текстовый тип данных, то вместо фактических значений NULL в них могут быть пустые строки.
Попробуйте заменить в формуле null на "".
0
Alexis Olson
6 Окт 2021 в 18:54
Недавно мне нужно было сделать очень простую операцию в Power Query. В столбце с числами нужно было выполнить проверку “значение меньше N” и в новом столбце вывести соответствующий текст. Функция дополнительного столбца выглядит примерно так:
|
= if [Values] < 5 then «A» else «B» |
На самом деле некоторые значения – null (то есть пустые):

Данные содержат null и в результате сравнения возникает ошибка
И такая простая операция возвращает ошибку для этих значений!
Почему? Есть некоторая ловушка, спрятанная в глубинах документации (а именно на странице 67 PDF-файла “Power Query Formula Language Specification (October 2016)”, который можно найти тут.
Если коротко, то вот краткая выжимка из документации:
Значения
null можно сравнивать на равенство, но null равен только null:
|
null = null // true null = 5 // false null = true // false null = false // false null <> «a» // true |
Но если вы хотите сравнить
null с любым другим значением при помощи относительного оператора (например, <, >, <=, >=), тогда результат сравнения будет не логическое значение типа
true или
false, а именно
null. В разделе “6.7 Relational operators” об этом есть маленькое замечание:
If either or both operands are
null , the result is the
null value.
Так и в чем уловка? В выражении if…then…else после слова if должно идти логическое значение (например, как результат какого-то сравнения):
|
if logical_value then do_this else do_that |
Когда мы сравниваем (практически любые) значения одного типа, мы в результате получаем логическое значение:
true или
false . Но в случае с
null мы получим логическое значение только в случае, если мы сравниваем
null на равенство:
|
null = SomeValue // true o false |
НО если мы сделаем относительное сравнение
null с SomeValue, тогда результат – НЕ логическое значение (он будет
null), и выражение if…then…else вернет ошибку:
|
if null > 0 // null, и ‘if null’ возвращает error: null не является logical then do_this else do_that // всё вычисление также вернет error |
Как избавиться от этой ошибки, если ваши данные содержат
null и замена его на другое значение не подходит вам по каким-либо причинам?
Из сказанного выше очевидно, что мы должны проверить значение на равенство с
null, и только если оно не равно
null – выполнить относительное сравнение.
Нужно построить корректное выражение сравнения, добавив проверку на
null на первое место. В моем случае должно получиться такое выражение:
|
if [Values] = null then «C» else if [Values] < 5 then «A» else «B» |
Убедитесь, что вы сначала проверяете значения на равенство с
null ! Выражение if…then…else выполняет последовательное вычисление условий, и если первым условием будет идти относительное сравнение, ошибка снова появится и наследуется до конца расчета выражения:
|
if [Values] < 5 then // здесь ошибка по-прежнему появляется и передается далее then «A» else if [Values] = null then «C» else «B» |

Сначала проверяйте на равенство null, иначе ошибка опять появится
Follow me:
Share this: