EP031 List.RemoveNulls:财务BP如何跨车间多工段合并提取唯一合格物料与工装清单

文 / 老汪(汽车零部件财务与商业智能实战派)

大家好,我是老汪。

在咱们汽车零部件制造企业(Tier 1 一级供应商),月末成本会计和产线财务 BP 最头疼的一件事,就是核算各车间的辅料、刀具和特种化学品消耗。

比如我们工厂生产铝合金底盘控制臂和制动总成,整个生产流程要跨越精密压铸、CNC粗加、CNC精加、荧光探伤、总成装配五大工段。各工段在领用物料时,由于工序特点截然不同,各工段交上来的报表是一张参差不齐的“五列宽表”:

  • 压铸车间领用脱模剂、冲头颗粒、除渣剂,列长有 7 行;
  • CNC 粗加主要领用粗铣刀片、切削液、拉钉,列长有 5 行;
  • 荧光探伤只领用磁粉探伤剂、水基清洗剂和滤色片,列长只有 3 行,底下全是一大堆空的 null!
  • 而且,像 水溶性切削液、水基清洗剂、定位插销 这种通用耗材,在粗加、精加、装配车间被重复领用。

月末关账前夕,工厂财务经理和供应链采购主管突然火急火燎找到你:

“老汪,采购部要跟供应商核对本月所有特种刀辅料的寄售结算单价,你能不能在 10 分钟内,把这 5 个工段实际消耗的物料合并出来?要求必须是一维清单、绝对不能有空项(null)、绝对不能有重复物料,我们要核定总唯一品类数!”

很多刚入行的财务新手是怎么干的?
打开 Excel,把第二列复制粘贴到第一列底下,再把第三列粘贴到底下,接着手动点筛选、勾掉空白项,最后点【数据】➔【删除重复值】。
平时 5 列还能折腾,一旦遇上 20 个工位、12 个月份的宽表,复制粘贴到眼花手抽筋,还不小心漏掉了关键工段的特种刀具!下个月数据一更新,又得全部重来一遍!

今天老汪就教大家用 Power Query 的 M 函数,打出一套“列转列表 ➔ 打平合并 ➔ 瞬间去空 ➔ 极速去重”的组合拳,核心主角就是咱们今天重点拆解的高频函数:List.RemoveNulls!


一、 为什么老汪说“去空”是数据建模的试金石?

很多人觉得“去空”还不简单吗?在界面上点筛选不就完了?
但在纯正的 Power Query M 语言世界里,表格(Table)是由列构成的,而每一列的底层本质就是一个列表(List)。

在清洗参差不齐的多列宽表时,如果我们直接合并表格,那些短列留下的 null(空值)会像牛皮癣一样四处蔓延。一旦后面要计算工装品类总数、做单价匹配(VLOOKUP / Table.Join),空值就会导致关联报错、计数虚高。

1. 函数语法拆解:List.RemoveNulls

List.RemoveNulls(list as list) as list
  • 参数:接收一个任意类型的列表 list;
  • 返回值:返回一个剔除了所有 null 元素的新列表;
  • 底层特性:
    1. 它只剔除真正的空值 null,对于空字符串 ""、空格 " " 或数字 0 是不作剔除的(这非常符合财务严谨逻辑,领用量为 0 是事实,而未领用的空白单元格在系统里是 null);
    2. 它是惰性求值的,执行效率极高,处理几十万行的列表也是毫秒级完成。

二、 业务实操:从五工段参差宽表到唯一清单

老汪在随堂配套课件的 原始业务数据表.xlsx 中,给大家还原了汽车零部件车间的真实领用明细:

压铸工段领用物料 CNC粗加工段领用物料 CNC精加工段领用物料 荧光探伤工段领用物料 总成装配工段领用物料
M-CAST-01 高温压铸脱模剂 M-CNC-01 硬质合金飞面铣刀片 M-CNC-04 CBN超硬精镗刀片 M-NDT-01 荧光磁粉探伤剂 M-ASM-01 气动定扭套筒头
M-CAST-02 氮化硅热电偶保护管 M-CNC-02 水溶性极压切削液 M-CNC-05 陶瓷微调精镗刀头 M-NDT-02 环保水基清洗剂 M-ASM-02 厌氧螺纹紧固防松胶
M-CAST-03 铝合金熔炼除渣剂 M-CNC-03 BT40主轴拉钉 M-CNC-02 水溶性极压切削液 M-NDT-03 高感光黑光灯滤色片 M-ASM-03 VCI气相防锈包装袋
M-CAST-04 压射冲头颗粒润滑剂 M-CNC-06 碳钢粗加工刀垫 M-CNC-07 主轴高压气隙防护油 (null) M-NDT-02 环保水基清洗剂
M-CAST-05 石墨坩埚高温涂料 M-CNC-08 工件重型定位插销 M-CNC-08 工件重型定位插销 (null) M-ASM-04 矿物集装箱干燥剂
M-CAST-06 模具冷却铜水嘴 (null) M-CNC-09 雷尼绍高精度测针 (null) (null)
M-CAST-07 压铸冲头耐磨套 (null) (null) (null) (null)

大家看,这张表有两大典型痛点:
1. 空值 null 很多:探伤工段和装配工段耗材少,下半截全是空白;
2. 重复领用多:切削液在粗加和精加都领了,清洗剂在探伤和装配都领了,定位销也在两个车间出现。

我们要将其变成一列纯净、唯一、可直接对账的《全车间物料唯一清单》。


三、 手把手高级编辑器实操

进入 Power Query,打开【高级编辑器】,输入老汪精心调校的高性能清洗流水线:

let
    // 1. 动态自适应定位当前目录(Q001规范,开箱即用永不报红字)
    当前目录 = try 
        let 
            rawPath = Text.From(Excel.CurrentWorkbook(){[Name="当前路径"]}[Content]{0}[Column1]),
            cleanPath = Text.Trim(rawPath),
            fixedPath = if Text.EndsWith(cleanPath, "\") then cleanPath else cleanPath & "\"
        in 
            fixedPath
    otherwise 
        "./",

    // 2. 读取原始宽表
    文件路径 = 当前目录 & "原始业务数据表.xlsx",
    源 = Excel.Workbook(File.Contents(文件路径), null, true),
    各工段表_Sheet = 源{[Item="各工段领用物料宽表", Kind="Sheet"]}[Data],
    提升的标题 = Table.PromoteHeaders(各工段表_Sheet, [PromoteAllScalars=true]),

    // 3. 【核心技巧一】:二维宽表化为“列列表”(List of Lists)
    // Table.ToColumns 会把 5 个工段列提取为 5 个独立的 List
    工段列列表集合 = Table.ToColumns(提升的标题),

    // 4. 【核心技巧二】:将 5 个工段 List 打平合并为单一长列表
    合并所有工段物料 = List.Combine(工段列列表集合),

    // 5. 【核心步骤三·本节主角】:瞬间剔除列表中所有的 null 空项
    剔除空值列表 = List.RemoveNulls(合并所有工段物料),

    // 6. 【核心步骤四】:跨车间物料去重,得到唯一清单
    唯一物料清单 = List.Distinct(剔除空值列表),

    // 7. 还原为整洁的标准财务报表
    转换为表 = Table.FromList(唯一物料清单, Splitter.SplitByNothing(), {"物料唯一编码与品名"}, null, ExtraValues.Error),
    添加索引 = Table.AddIndexColumn(转换为表, "序号", 1, 1, Int64.Type),
    最终报表 = Table.ReorderColumns(添加索引, {"序号", "物料唯一编码与品名"})
in
    最终报表

四、 老汪敲黑板:关键逻辑复盘与避坑指南

平时很多财务同学写代码容易在这几个坑里翻车,老汪给大家敲黑板提个醒:

1. 💡 免改路径直接刷新秘籍

平时大家做财务分析最怕换台电脑一刷新就报错“找不到文件路径”。老汪已经在课件的【配置】表写好自适应公式并定义了名称。大家解压压缩包后,无论拷到公司电脑的 D 盘还是家用笔记本的桌面,直接点击【全部刷新】即可秒出结果,绝不报红字!大家可以把这套规范直接抄到自己日常的财务模板里。

2. 为什么不用界面的“逆透视列(Unpivot)”?

有的同学会问:“老汪,这题我用逆透视列也能把多列打平,为什么一定要用 M 函数?”
老汪告诉你一线实战的大实话:
– 逆透视在列数固定时很方便,但如果车间下个月新增了【工段6_热处理】、【工段7_喷涂】,或者某个月某工段停产被删了一列,界面的逆透视步骤就会因为“找不到固定列名”而直接崩溃;
– 而老汪教你的 Table.ToColumns 是全动态提取!管你是 5 列还是 50 列,它自动把所有列抓取为列表集合,不管表头怎么变、工位怎么增减,刷新永远稳如泰山!

3. 先去空还是先去重?

必须是先 List.RemoveNulls 去空,再去 List.Distinct 去重!
如果先去重,列表中依然会保留一个孤零零的 null,你最后还得再洗一次;先去空把所有杂质彻底拿掉,去重后的列表就纯净无比。


五、 随堂课件下载与动手实操

光看不练假把式。老汪已经把本节课涉及的完整练习题做成了一个标准课件包,内含:
– 📂 原始业务数据表.xlsx(五工段参差领用宽表,供你亲自动手演练)
– 📂 最终完成版_带PQ查询.xlsx(内嵌完整 M 语言清洗管道与自适应配置表)
– 📂 M_动态自适应脚本.m(可直接用记事本打开复制的纯净代码)

大家下载后解压,亲自把老汪这套流水线跑一遍,体验一下 3 秒钟搞定多车间物料对账的爽快感!

📦

本节实操随堂 Excel 课件包免费下载

包含配套的《原始业务数据表.xlsx》(练手用)与《最终完成版_带PQ查询.xlsx》(预置当前路径自适应公式,下载解压即可直接刷新),以及纯文本 M 语言代码文件。

文件:EP031_List_RemoveNulls_多工序物料去空去重_课件包.zip | 大小:20.6 KB | 格式:.zip 压缩包


📥 立即免费下载本节课件包 (.zip)

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容