Lazy loaded imageEP015:学习M函数两个非常核心的逻辑控制功能:条件判断和错误处理及相关表操作函数

type
status
date
slug
summary
tags
category
icon
password
notion image

(本文3000字,阅读需要8分钟左右)
本节课主要讲解 Power Query(M语言)中两个非常核心的逻辑控制功能:条件判断错误处理,同时穿插讲解相关的表操作函数。
以下是本节课内容的完整结构化整理:
我为你精心设计了四个典型的财务BP实战场景,分别对应本课讲授的四个核心知识点。

一、 单条件判断 (if ... then ... else)

业务场景:预算执行监控

你正在处理每月的部门费用报告。你需要快速标记出哪些部门的实际花费超过了预算,以便进行后续的差异分析会议。

示例数据:费用表

部门
预算金额
实际发生额
营销中心
50000
48000
研发中心
80000
85000
人力资源
20000
19500
供应链
60000
62000

M函数应用

界面操作:我们添加一个条件列,命名为 "执行状态"
右击:在所要添加自定义列的步骤前面的步骤,点击插入新步骤
输入函数:
 

深度解析

  • 技术层面:这是最基础的 if 逻辑。Power Query 会逐行扫描(利用 each),比较 [实际发生额][预算金额] 两个数值字段。
  • 财务BP视角
    • 痛点:以往可能需要在 Excel 里用 =IF(C2>B2, "超支", "正常"),如果数据源更新,公式可能得重拖。
    • 价值:在清洗阶段就打好标签。后续你可以直接在 Power BI 或透视表中筛选“超支”部门,专注于异常管理,而不是盯着所有数字看。

二、 列的重排 (Table.ReorderColumns)

业务场景:输出管理驾驶舱底表

经过上面的计算,你生成了一张包含“预算”、“实际”、“差异金额”、“差异率”、“执行状态”的大宽表。但是,新生成的“执行状态”列在表格的最右边。为了给业务部门发邮件,你希望把最重要的“执行状态”和“差异率”放在“部门”的紧后方,让人一眼看到重点。

示例数据:接上例

M函数应用

你不需要手写这个长函数,直接在界面上拖拽列头即可。但你要看懂代码:

深度解析

  • 技术层面:这个函数接受一个列表(List,即大括号 {} 包裹的内容)作为参数,列表里的顺序就是最终表格的列顺序。
  • 财务BP视角
    • 痛点:在 Excel 里调整列顺序需要 剪切 -> 插入剪切的单元格,很容易手滑覆盖掉数据。
    • 价值“结论先行”是财务汇报的黄金法则。通过调整列顺序,设计阅读者的视线路径。作为BP,交付的不仅仅是数据,而是经过整理的、带有观点的信息。

三、 多条件嵌套 (else if)

业务场景:客户利润贡献度分级

你需要分析客户的盈利能力,将客户划分为不同的战略等级,以便销售团队制定不同的维护策略。

示例数据:客户利润表

客户名称
毛利率
客户A
0.35
客户B
0.18
客户C
0.05
客户D
-0.02

M函数应用

界面操作:我们添加一个条件列,命名为 "客户评级"
完整步骤函数:

深度解析

  • 技术层面:注意逻辑顺序,M语言是从上往下判断的。一旦满足条件,就不再执行后面的判断。所以要把最严苛的条件(>=0.30)放在最前面。
  • 财务BP视角
    • 痛点:复杂的 IF 嵌套在 Excel 单元格里非常难读,且容易出错(括号地狱)。
    • 价值:这种分层逻辑是财务分析的核心。通过 M 函数固化下来的逻辑,可以确保每次计算评级标准的一致性。你可以建议销售砍掉“亏损客户”,或者提升“潜力客户”的价格。

四、 容错处理 (try ... otherwise)

业务场景:计算同比差异率 (YoY%)

你需要计算各门店的销售同比增长率。但数据源往往很脏:有些新店去年没有数据(空值 null),有些店去年在装修(销售额为0),甚至有些系统导出的去年数据里写的是“未开业”(文本)。直接做除法运算 (今年-去年)/去年 会导致大量报错(#DIV/0! 或类型错误)

示例数据:门店销售同比表

门店
今年销售
去年销售
北京店
120000
100000
上海店
80000
0
深圳店
50000
装修中
广州店
90000
null

M函数应用

添加自定义列计算 "同比增长率"。如果不使用 try,上海、深圳、广州店都会报错导致查询中断。
(注:业务上也可以设置为 null 或者 "N/A",视分析需求而定,这里为了计算方便设为0)
注意上述函数输入公式框时,是不需要写each
  • 为什么要去掉 each?
    • 当你使用“自定义列”对话框时,Power Query 会自动在后台生成 Table.AddColumn(..., each ...) 的代码。如果你在框里再写一个 each,代码就会变成 each each try...,这会导致错误或者生成函数对象,而不是你要的数值。
notion image
以下为该添加自定义列步骤的完整函数:

深度解析

  • 技术层面
    • 上海店:除数为0,在数学上错误。
    • 深圳店:数字减文本,类型错误。
    • try 就像一个防弹衣,只要公式计算出问题,马上启动 otherwise 后面的逻辑,保证整个表格能顺利生成。
    • 在 M 语言(Power Query 的底层语言)中,“除以零”并不算是一个错误(Error),而是一个合法的数值,叫做 Infinity(无穷大),所以你看上海店的结果并没有返回0值。
    • 既然它不是“错误”, try ... otherwise 容错机制就不会被触发,所以它就没有变成 0,而是老老实实地显示了 Infinity
  • 财务BP视角
    • 痛点:这是财务最头疼的时刻。Excel 出现 #N/A#DIV/0! 会导致后续的求和(SUM)全部失效。
    • 价值:构建健壮的自动化报表。不管底层数据有多少脏乱差的情况(比如备注混入了数字列),你的模型都能“扛得住”,输出干净的数据给老板看。

这四个场景串联起来,其实就是财务BP处理月度经营分析报告的一个缩影:判断异常 -> 分级管理 -> 清洗脏数据 -> 呈现关键信息。希望这些例子能让你对 M 函数在财务领域的应用更有体感!

五、 关键知识点总结

  1. 数据类型敏感:M 语言区分数据类型(文本 vs 数值),不同类型直接运算会报错,这是与 Excel 公式的最大区别之一。
  1. each 的作用:在添加列时,each 必不可少,它代表了“行上下文”,即针对表中的每一行数据应用逻辑,但在输入公式框操作时,不用输入,否则会重复,会在执行过程中自动生成。
  1. 学习建议
      • 常用的 M 函数(如添加列、排序)不需要死记硬背,可以先通过界面操作生成,然后观察代码学习。
      • try...otherwise 在处理脏数据(数据类型不统一)时非常有用。
 
【扫码识别下发二维码,获取本文使用到的及历史以来提及、发布的相关精选和原创资料,和我们一起充电,加入后可享受每月6次免费咨询提问,帮助解决您的特定问题!】

如果本篇文章对您有帮助或启发,请帮我们点赞、转发、推荐、关注,让更多想转型财务BP、锻造数据分析和可视化洞察能力的财务同行们看到,关注【老汪洞察】,不迷路!
notion image
 
notion image
 
 
温馨提示
🙏🏻
如果您不想错过【老汪洞察】的文章,请将我们设为"星标",这样每次最新文章推送才会第一时间出现在您的订阅列表里。 方法:点击文章页面左上角蓝色文字“老汪洞察”进入主页,点击关注后,再点主页右上角"...",然后选择"设为星标",即可完成,感谢您的支持。
 
上一篇
EP016:筛选表、删除重复项、行列数计算
下一篇
YouTube博主必看:如何升级油管专用版 AdSense账号,接入自己的网站赚取广告费(实操指南)
Loading...
文章列表
让财税成为经营的力量
管理报表
从Power Query到Power BI,入门到精通
699课程讲义
VBA小工具
电脑与网络
知识运用