5个最具价值的Excel数据分析M函数,终结复制粘贴苦
一句话核心价值点:用Excel365自带的PowerQuery的M语言,把日常反复做的表格搬运、合并、清洗活儿,变成几行代码自动跑完,让你在2026年告别手贴数据到深夜,轻巧接住效率红利。
目录
批量合并文件,省掉逐个打开
办公室常遇到:每月生产报表存成单独Excel,要汇总得一个个打开复制粘贴。2026年还这么干,等于给加班递枕头。
M代码示例
let 源 = Folder.Files("C:\2026月度生产\"), 筛选Excel = Table.SelectRows(源, each [Extension] = ".xlsx"), 读取数据 = Table.AddColumn(筛选Excel, "数据", each Excel.Workbook(File.Contents([Folder Path] & [Name]))), 展开表格 = Table.ExpandTableColumn(读取数据, "数据", {"Data"}, {"Data"}), 合并所有 = Table.Combine(展开表格[Data])in 合并所有
先用Folder.Files抓指定文件夹里所有文件信息Table.SelectRows筛出扩展名是.xlsx的文件,避免混入别的格式Excel.Workbook读取每个文件的表格集合,File.Contents负责把文件内容送进去Table.ExpandTableColumn把嵌套的表格拆出来成列Table.Combine一键摞起所有表的Data,生成一张大表这样不管30份还是300份,运行一次全收进,不用盯屏幕点粘贴。
智能提列名,不怕表头乱跑
有时拿到的表第一行不是列名,或者隔几行才出现真正标题,手动改累又易错。
M代码示例
let 源 = Excel.CurrentWorkbook(){[Name="原始表"]}[Content], 跳行定位 = Table.Skip(源, each List.NonNullCount(Record.ToList(_)) < 3), 设列名 = Table.PromoteHeaders(跳行定位, [PromoteAllScalars=true]), 空名列处理 = Table.RemoveColumns(设列名, List.Select(Table.ColumnNames(设列名), each List.IsEmpty(Table.Column(设列名, _))))in 空名列处理
Table.Skip跳过前面那些有效数据少于3行的记录,直奔真标题区Table.PromoteHeaders把找到的那行直接扶正为列名,PromoteAllScalars保证纯文本也能当列名Record.ToList把每行转成列表,检查非空字段数判断是不是标题行List.Select找出完全空白的列,用Table.RemoveColumns清掉2026年碰到“标题潜水”的表,这串代码帮你秒捞正主,列名干净利落。
去重留最新,跟进记录一条线
客户或订单表常有同一编号多条记录,只想留最近更新的那行,手工筛像淘沙。
M代码示例
let 源 = Excel.CurrentWorkbook(){[Name="跟进记录"]}[Content], 转日期 = Table.TransformColumnTypes(源, {{"更新时间", type datetime}}), 添序号 = Table.AddIndexColumn(转日期, "序号", 0, 1, Int64.Type), 分组去重 = Table.Group(添序号, {"编号"}, {{"保留行", each Table.FirstN(Table.Sort(_,{{"更新时间", Order.Descending}}),1)}}), 展开结果 = Table.ExpandTableColumn(分组去重, "保留行", Table.ColumnNames(源))in 展开结果
Table.TransformColumnTypes先把“更新时间”明确成日期时间格式,方便排序Table.AddIndexColumn加个序号,万一需要回溯可查原始顺序Table.Group按编号聚合,每组内用Table.Sort按时间倒排Table.FirstN(...,1)取排序后的首行,就是最新那条Table.ExpandTableColumn把嵌套表还原成平铺结构这样不论多少重复编号,都能一次锁定最新动态,跟进不迷路。
条件拆列值,复杂分组一次成
有的列里塞了“地区|产品|渠道”这种复合信息,要拆成独立列做分析,手拆像剥洋葱。
M代码示例
let 源 = Excel.CurrentWorkbook(){[Name="混合列"]}[Content], 拆分文本 = Table.SplitColumn(源, "信息列", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), {"地区", "产品", "渠道"}), 去空格 = Table.TransformColumns(拆分文本, List.Transform(Table.ColumnNames(拆分文本), each {_, Text.Trim})), 填缺失 = Table.FillDown(去空格, {"地区"})in 填缺失
Table.SplitColumn按竖线分割“信息列”,一次生成多列Splitter.SplitTextByDelimiter指定分隔符,QuoteStyle.Csv防止引号干扰List.Transform搭配Table.TransformColumns批量去掉各列首尾空格Table.FillDown把地区列的空白用上一行值补齐,适合层级结构数据原本要分三步粘贴分列再清理,现在一次过,2026年照样稳准快。
日期顺年切,时序分析不卡壳
分析跨年销售时,需要把日期统一切成“2026-Q1”“2026-W05”这种区间,透视表自带功能不够细。
M代码示例
let 源 = Excel.CurrentWorkbook(){[Name="销售流水"]}[Content], 转日期 = Table.TransformColumnTypes(源, {{"交易日期", type date}}), 加季度 = Table.AddColumn(转日期, "季度", each "2026-Q" & Number.ToText(Date.QuarterOfYear([交易日期]))), 加周次 = Table.AddColumn(加季度, "周次", each "2026-W" & Number.ToText(Number.RoundUp(Date.DayOfYear([交易日期]) / 7, 0))), 合标签 = Table.AddColumn(加周次, "周期标签", each [季度] & "/" & [周次])in 合标签
Date.QuarterOfYear取日期所在季度,Number.ToText转文本拼前缀Date.DayOfYear算年内第几天,除以7并向上取整得周次编号Number.RoundUp确保不足一周也算一整周,方便对齐业务习惯最终“周期标签”让跨年数据按季周双维度排排坐,时序对比一目了然这套切法比手工改透视表字段灵活,分析节奏自己掌控。
金句小结
会搬砖的人加班,会写码的人喝茶。重复的事让M替你跑,你只管想下一步怎么赢。表格的乱是没梳透,代码一梳就见条理。方法串成线,苦活变趣探,效率是自己给的。2026年的办公力,不在手速,在脑里的自动化。
更多干货点我头像进主页,每天更新