文 / 老汪(汽车零部件财务与商业智能实战派)
“老汪,我们车间质检台账里有 6 道检验工序(光谱、CNC、探伤、动平衡、粗糙度、耐压)。每天几百个批次,如果某个批次出现异常,怎样才能自动抓出到底是在‘哪几列’发生了超差,把具体的工序名字提取出来拼成一句话?”
在汽车零部件制造现场,质量分析(QA)与成本会计常常需要协同作战。如果只知道某一行有不合格,却不能自动动态输出具体是哪个项目超标,追溯责任和核算返工废品损失就会耗费大量人工比对时间。今天老汪就带大家拆解一个看似朴实无华、实则内藏乾坤的元数据级神级函数 ——Table.ColumnNames!
一、 为什么老汪说“Table.ColumnNames 是元数据级清洗的关键钥匙”?
在前面的课程中,我们学会了 Record.ToList(提取单行记录的所有值)和 List.PositionOf(查找下标位置)。
但是,如果我们想获取一张表格的“所有列标题名(Field Headers)”本身,该用什么函数?
答案就是 Table.ColumnNames。
1. 函数基本语法拆解
Table.ColumnNames(table as table) as list
- 参数(table):目标数据表;
- 返回值(list):由该表全部列名组成的纯文本字符串列表,例如
{"检验批次号", "核心零部件名称", "材料光谱分析", ...}。
2. 它的三大实战威力(老汪敲黑板)
- 表头智能防呆校验(防漏列):
– 自动检测各分厂上传的 Excel 模板是否缺斤少两:
powerquery List.ContainsAll(Table.ColumnNames(源), {"批次号", "零件名", "客户"}) - 动态列重排与安全提取(防插列):
– 配合
Table.SelectColumns或Table.ReorderColumns,直接传给它动态列表,再也不用在代码里写死固定的列名字串! - 反射定位:将数据值动态反查为列名(神级组合拳!): – 当单行中某几列满足特定条件(如不合格、发生费用)时,反向查出对应的列标题名字,完成智能归因分析!
二、 走进车间:汽车零部件底盘安全件质量检测现场
拿老汪经手的一家知名汽车底盘与动力总成制造企业(Tier 1)为例。厂里生产比亚迪海豹、特斯拉Model Y、极氪001等明星车型的铝合金控制臂、制动卡钳和副车架。
质检车间导出的《工序质检明细台账》如下(包含 9 列大宽表,文末可免费下载配套 Excel 随堂课件):
| 检验批次号 | 核心零部件名称 | 主机厂客户 | 材料光谱分析 | CNC加工尺寸 | X光探伤气孔 | 动平衡同心度 | 表面粗糙度 | 气密水压耐压 |
|---|---|---|---|---|---|---|---|---|
| QC-202611-01 | 铝合金底盘下控制臂 | 比亚迪海豹 | 合格 | 合格 | 合格 | 合格 | 合格 | 合格 |
| QC-202611-02 | 双活塞制动卡钳体 | 蔚来ES6总成 | 合格 | 合格 | 气孔超标 | 合格 | 粗糙度超差 | 合格 |
| QC-202611-03 | 轻量化通风制动盘 | 特斯拉Model Y | 合格 | 合格 | 合格 | 超差偏心 | 合格 | 合格 |
| QC-202611-04 | 电池包下壳体铝托盘 | 吉利极氪001 | 合格 | 合格 | 合格 | 合格 | 合格 | 微漏泄压 |
| QC-202611-05 | 前悬架高强副车架 | 理想L7底盘 | 材质杂质超标 | 合格 | 气孔超标 | 合格 | 合格 | 合格 |
| QC-202611-06 | 驱动电机前置端盖 | 小鹏G6三电 | 合格 | 尺寸超差 | 合格 | 合格 | 合格 | 合格 |
| QC-202611-07 | 后悬架双球节摆臂 | 小米SU7总成 | 合格 | 合格 | 合格 | 合格 | 合格 | 合格 |
| QC-202611-08 | 高精度转向节臂管 | 广汽埃安Hyper | 合格 | 尺寸超差 | 合格 | 超差偏心 | 粗糙度超差 | 合格 |
📱 移动端排版体验:上方表格已配置横向平滑滚动容器,在手机端手指左右滑动即可舒展查看完整 9 列数据,单元格字距舒展绝不挤爆!
大家仔细观察:每个批次发生异常的列都不一样,有的批次(02批次)在“X光探伤气孔”和“表面粗糙度”两处出问题,有的批次(08批次)多达三项超标。我们必须动态把这些列名提取出来!
三、 白话拆解:四大函数神级联动五步法
很多财务同学觉得 M 语言深奥,老汪用一张图给你讲清楚这套组合拳的流转逻辑:
[当前行记录] ──Record.ToList──> {合格, 气孔超标, 粗糙度超差...}
│
(抓出非合格下标)
↓
{ 1, 3 }
│
Table.ColumnNames(源) ──────────→ (动态取名) ──> {"X光探伤气孔", "表面粗糙度"}
│
Text.Combine
↓
"X光探伤气孔、表面粗糙度"
- 第一步(取表头):用
Table.ColumnNames(源)提取所有列名,并用List.Skip(..., 3)得到 6 个纯质检项目列名列表; - 第二步(行转值):用
Record.SelectFields和Record.ToList提取当前行的 6 个检测值列表; - 第三步(抓下标):用
List.Select(List.Positions(值列表), (i) => 值列表{i} <> "合格")找出所有异常项目的数字下标; - 第四步(反查名):用
List.Transform(下标列表, each 质检项目列清单{_})动态反射拿到对应的中文列标题名; - 第五步(拼文本):用
Text.Combine用顿号连接成通顺的业务说明!
四、 高级编辑器手把手实操代码
在随堂 Excel 课件中,老汪已将 Q001 动态相对路径标准置入【配置】表。进入 Power Query 高级编辑器,贴入老汪的标准自适应代码:
let
// 💡 老汪敲黑板(免改路径直接刷新秘籍):换电脑解压后直接点【全部刷新】永不报红字!
当前路径 = try
let
raw = Text.From(Excel.CurrentWorkbook(){[Name="当前路径"]}[Content]{0}[Column1]),
clean = Text.Trim(raw)
in
if Text.EndsWith(clean, "\") then clean else clean & "\"
otherwise
"./",
// 1. 读取原始业务数据源
数据源路径 = 当前路径 & "原始业务数据表.xlsx",
源 = Excel.Workbook(File.Contents(数据源路径), null, true),
质检原始表 = 源{[Item="工序质检明细台账", Kind="Sheet"]}[Data],
提升标题 = Table.PromoteHeaders(质检原始表, [PromoteAllScalars=true]),
更改类型 = Table.TransformColumnTypes(提升标题, {
{"检验批次号", type text},
{"核心零部件名称", type text},
{"主机厂客户", type text},
{"材料光谱分析", type text},
{"CNC加工尺寸", type text},
{"X光探伤气孔", type text},
{"动平衡同心度", type text},
{"表面粗糙度", type text},
{"气密水压耐压", type text}
}),
// 2. 核心大招:动态提取表头列名并剥离出纯质检科目
全表列名清单 = Table.ColumnNames(更改类型),
质检项目列清单 = List.Skip(全表列名清单, 3),
// 3. 神级组合拳:逐行找出异常列名并拼装
添加异常列名清单 = Table.AddColumn(更改类型, "异常缺陷工序名称清单", each
let
当前行质检记录 = Record.SelectFields(_, 质检项目列清单),
当前行质检列表 = Record.ToList(当前行质检记录),
// 抓出所有不等于“合格”的列下标
异常下标列表 = List.Select(List.Positions(当前行质检列表), (idx) => 当前行质检列表{idx} <> "合格"),
// 动态反射回对应列名
异常列名列表 = List.Transform(异常下标列表, each 质检项目列清单{_}),
// 拼接成通畅文本
输出文本 = if List.IsEmpty(异常列名列表) then "无" else Text.Combine(异常列名列表, "、")
in
输出文本, type text),
// 4. 统计缺陷项目数量并给出质量处置对策
添加缺陷项数 = Table.AddColumn(添加异常列名清单, "缺陷项目总数(项)", each
if [异常缺陷工序名称清单] = "无" then 0
else List.Count(Text.Split([异常缺陷工序名称清单], "、")), Int64.Type),
添加综合判定 = Table.AddColumn(添加缺陷项数, "质检综合判定", each
if [#"缺陷项目总数(项)"] = 0 then "✅ 全检合格"
else if [#"缺陷项目总数(项)"] = 1 then "⚠️ 单项超差待返工"
else "🚨 多重缺陷报废预警", type text),
添加处置对策 = Table.AddColumn(添加综合判定, "质量处置对策", each
if [#"缺陷项目总数(项)"] = 0 then "准予出厂放行,直接入库"
else if [#"缺陷项目总数(项)"] = 1 then "开具《单项返工单》,派发至责任工段"
else "启动质量仲裁复核,核算产线废品损失", type text),
// 整理最终呈现报表
整理输出字段 = Table.SelectColumns(添加处置对策, {
"检验批次号", "核心零部件名称", "主机厂客户",
"质检综合判定", "异常缺陷工序名称清单", "缺陷项目总数(项)", "质量处置对策"
})
in
整理输出字段
五、 最终清洗效果与车间管理看板
运行上述 M 脚本后,我们在 Excel 中得到的标准化分析看板如下(支持移动端自由横向滑动):
| 检验批次号 | 核心零部件名称 | 主机厂客户 | 质检综合判定 | 异常缺陷工序名称清单 | 缺陷项目总数(项) | 质量处置对策 |
|---|---|---|---|---|---|---|
| QC-202611-01 | 铝合金底盘下控制臂 | 比亚迪海豹 | ✅ 全检合格 | 无 | 0 | 准予出厂放行,直接入库 |
| QC-202611-02 | 双活塞制动卡钳体 | 蔚来ES6总成 | 🚨 多重缺陷报废预警 | X光探伤气孔、表面粗糙度 | 2 | 启动质量仲裁复核,核算产线废品损失 |
| QC-202611-03 | 轻量化通风制动盘 | 特斯拉Model Y | ⚠️ 单项超差待返工 | 动平衡同心度 | 1 | 开具《单项返工单》,派发至责任工段 |
| QC-202611-04 | 电池包下壳体铝托盘 | 吉利极氪001 | ⚠️ 单项超差待返工 | 气密水压耐压 | 1 | 开具《单项返工单》,派发至责任工段 |
| QC-202611-05 | 前悬架高强副车架 | 理想L7底盘 | 🚨 多重缺陷报废预警 | 材料光谱分析、X光探伤气孔 | 2 | 启动质量仲裁复核,核算产线废品损失 |
| QC-202611-06 | 驱动电机前置端盖 | 小鹏G6三电 | ⚠️ 单项超差待返工 | CNC加工尺寸 | 1 | 开具《单项返工单》,派发至责任工段 |
| QC-202611-07 | 后悬架双球节摆臂 | 小米SU7总成 | ✅ 全检合格 | 无 | 0 | 准予出厂放行,直接入库 |
| QC-202611-08 | 高精度转向节臂管 | 广汽埃安Hyper | 🚨 多重缺陷报废预警 | CNC加工尺寸、动平衡同心度、表面粗糙度 | 3 | 启动质量仲裁复核,核算产线废品损失 |
看!不需要人工逐个眼睛盯,每一批次究竟在哪些工序出问题、缺陷项目有几个,清清楚楚全部动态抓取出来,质量部和财务成本会计一眼就能定责定损!
六、 老汪从业多年总结的 2 个避坑指南
- 别用静态字符串硬编码列名:
– 很多同学图省事,在代码里写死
{"材料光谱", "CNC加工"...},结果下个月车间新增了“超声波探伤”列,整个自动化模型就漏掉了新列! – 善用Table.ColumnNames动态提取,以后不管车间增加 3 道还是 10 道质检工序,代码一行都不用动! - 处理表头前后空格的防崩小招:
– 车间文员手工输入的列名常带隐蔽空格(如
"CNC加工尺寸 "),导致后续匹配失误。老汪教大家一个小妙招:在提取出列名后,用List.Transform(Table.ColumnNames(源), Text.Trim)顺手把所有列名修剪干净,这是工业级 ETL 的看家本领!
大家赶紧在文末免费下载随堂实操课件包,打开 PQ 高级编辑器跟老汪同步动手操练起来!














暂无评论内容