Excel找差异如捞针?M语言秒定位
一句话核心价值点:
用Excel365内置PowerQuery的M语言,把“大海捞针”式的差异比对,变成几行代码就搞定,让零基础也能在2026年的日常办公里省时省力、少熬几个夜。
目录
两表比对慢到心焦?一行筛出异值
办公室常遇到:两张表几百行,要找出某列不一样的值,手动肉眼扫到眼酸还怕错。
用M语言先合并再筛,轻松拎出“不一样”。
M代码示例
let
源1= Table.FromRows({{"A",100},{"B",200},{"C",300}},{"编号","金额"}),
源2= Table.FromRows({{"A",100},{"B",250},{"D",400}},{"编号","金额"}),
合并 = Table.NestedJoin(源1,"编号",源2,"编号","匹配"),
展开 = Table.ExpandTableColumn(合并, "匹配", {"金额"}, {"金额_比对"}),
差异 = Table.SelectRows(展开, each [金额] <> [金额_比对])
in
差异
关键点拆解
- • NestedJoin按“编号”做嵌套关联,像给两表牵线
- • ExpandTableColumn把匹配表的金额拉过来对比列
- • SelectRows用“<>”挑出两边值不同的行
2026年处理月度销售核对,这种比法比透视表快且准,手不抖眼不花。
金句:比对的难点不在找不同,而在让不同自己跳出来。
列多行乱难聚焦?只盯关键字段比
有时表有七八列,全比反而乱,其实只要盯几个关键字段就能定位问题。
比如订单表只比“客户+产品+数量”,忽略备注类信息。
M代码示例
let
原表 = Table.FromRows({
{"华北","鼠标",50,"急单"},
{"华东","键盘",30,"常规"},
{"华北","鼠标",60,"加急"}
},{"区域","品名","数量","备注"}),
去重键 = Table.Distinct(原表,{"区域","品名","数量"}),
还原明细 = Table.Join(原表,{"区域","品名","数量"},去重键,{"区域","品名","数量"},JoinKind.FullOuter),
差异行 = Table.SelectRows(还原明细, each List.NonNullCount(Record.ToList(_))<>List.NonNullCount(Record.ToList(Table.FirstN(原表,1))))
in
差异行
关键点拆解
- • FullOuterJoin把原表和去重结果拼一起,空值显差异
- • Record.ToList把行变列表,NonNullCount数非空值个数
- • 若某行在原表与去重表结构不同,就是重复或缺失信号
2026年库存盘点只盯SKU+库位+批次,三列比完真相立现。
金句:多列比对像拍照,对焦关键才能照清问题。
多列同时查不同?一次抓全不漏项
一张表自己和自己历史版本比,多个字段可能同时变动,单列比会漏掉组合变化。
M代码示例
let
旧表 = Table.FromRows({{"P1","白",20},{"P2","黑",15}},{"编码","色号","库存"}),
新表 = Table.FromRows({{"P1","灰",20},{"P2","黑",18}},{"编码","色号","库存"}),
合并 = Table.Join(旧表,"编码",新表,"编码","新"),
差异 = Table.AddColumn(合并, "是否不同", each [色号]<>[新.色号] or [库存]<>[新.库存]),
筛选 = Table.SelectRows(差异, each [是否不同] =true)
in
筛选
关键点拆解
- • Join按编码关联新旧表,把新表字段挂到旧表旁
- • AddColumn造个布尔列,任一字段不同就标记true
- • SelectRows只留标记为真的行,一次看全多列变化
2026年价格策略调整,颜色与库存同时变也能一次揪出
不用来回切表,眼睛负担少一半。
金句:一次比多列,就像用广角镜,视野宽了漏的自然少。
新旧数据谁变了?增删改一秒现形
月底汇总发现数据源多了新记录或少了几行,靠人工翻很难发现。
M代码示例
let
上月 = Table.FromRows({{"X1",500},{"X2",600}},{"ID","销量"}),
本月 = Table.FromRows({{"X1",500},{"X2",650},{"X3",700}},{"ID","销量"}),
增 = Table.SelectRows(本月, each not List.Contains(List.Transform(上月[ID], Text.From), [ID])),
删 = Table.SelectRows(上月, each not List.Contains(List.Transform(本月[ID], Text.From), [ID])),
改 = Table.SelectRows(Table.Join(上月,"ID",本月,"ID","新"), each [销量]<>[新.销量])
in
Table.Combine({增,删,改})
关键点拆解
- • List.Transform把ID列转文本方便比对
- • List.Contains判断是否存在,不存在就是新增或删除
- • Combine把三类结果拼一起,增删改一次呈现
2026年客户名单月度更新,新老变化一目了然。
金句:数据的生命在于流动,抓住流动的方向就抓住了变化的根。
分组差异一眼明?部门产品全看清
领导要看各部门各产品的差异,普通透视表分组后还得二次加工。
M代码示例
let
源 = Table.FromRows({
{"销售部","笔",120},{"销售部","本",80},
{"市场部","笔",150},{"市场部","本",60}
},{"部门","产品","业绩"}),
分组 = Table.Group(源, {"部门","产品"}, {{"业绩", each List.Sum([业绩]), type number}}),
排序 = Table.Sort(分组,{{"部门", Order.Ascending},{"业绩", Order.Descending}})
in
排序
关键点拆解
2026年季度汇报,领导扫一眼就知哪部门哪产品拔尖
分组逻辑藏在代码里,不怕透视表字段拖错。
金句:分组不是简单归类,是把差异摆成看得懂的风景。
动态差异随时跟?刷新即得新结果
每次数据更新都要重新比对很烦,M语言能连外部文件,刷新就出新差异。
M代码示例
let
路径 ="C:\2026数据\本月.csv",
表 = Csv.Document(File.Contents(路径),[Delimiter=",", Columns=3, Encoding=65001]),
改名 = Table.RenameColumns(表,{{"Column1","编号"},{"Column2","数值"},{"Column3","类别"}}),
旧 = Excel.CurrentWorkbook(){[Name="旧数据"]}[Content],
差异 = Table.SelectRows(Table.Join(改名,"编号",旧,"编号","旧"), each [数值]<>[旧.数值])
in
差异
关键点拆解
- • File.Contents读外部CSV,不怕换文件位置
- • RenameColumns统一列名,避免字段对不上
2026年跨月监控指标,点一下刷新胜过十次手工。
金句:让比对跟着数据跑,才是真正的省心省力。
总结金句
- • M语言的妙,是把重复劳动压成几行可复用的逻辑。
- • 会写比会点更重要,因为机器懂你的规矩就不出错。
- • 体系化的技能,让你从“做完”走向“做好”再走向“轻松做”。
更多干货点我头像进主页,每天更新