如何将按月分栏的财务数据转换为Excel规范表格(求公式或Power Query/M查询方案)
如何将按月分栏的财务数据转换为Excel规范表格(求公式或Power Query/M查询方案)
嗨,我帮你整理了两种实用方案,不管是用Excel公式还是Power Query都能实现你要的表格转换,咱们一步步来:
先明确需求场景
- 原始表格:左侧有10列固定参考信息(如ID、客户名称等),右侧按月份划分区块,每个月份下包含4列数据指标(如收入、支出等),属于典型的宽表结构。
- 目标表格:转换为长表格式,每一行对应一条明细记录——保留10列参考信息,新增「月份」「指标类型」「数值」三列,每个月份的4列数据拆分为4行,对应相同的参考信息。
方案一:Excel公式法(适合临时处理小数据量)
假设你的原始数据从A1单元格开始,参考列为A-J列,数据列从K列起,每个月占4列(比如K-N是1月、O-R是2月,共3个月),原始数据总行数为10行(A2-A11)。
在新工作表中按以下步骤输入公式(记得根据你的实际数据调整参数):
填充重复的参考信息:
新表A2单元格输入公式,横向拖动到J列,再纵向拖动到所有行:=INDEX($A$2:$A$11,ROUNDUP(ROW(A1)/(4*3),0))(参数说明:
4是每个月的列数,3是总月份数,$A$2:$A$11是原始参考列的数据源)填充月份:
新表K2单元格输入公式,纵向拖动:=CHOOSE(ROUNDUP(ROW(A1)/4,0),"1月","2月","3月")(参数说明:
"1月","2月","3月"替换为你实际的月份名称,顺序要和原始表格一致)填充指标类型:
新表L2单元格输入公式,纵向拖动:=CHOOSE(MOD(ROW(A1)-1,4)+1,"收入","支出","利润","税费")(参数说明:
"收入","支出","利润","税费"替换为你原始表格中每个月4列的指标名称)填充对应数值:
新表M2单元格输入公式,纵向拖动:=INDEX($K$2:$V$11,ROUNDUP(ROW(A1)/(4*3),0),MOD(ROW(A1)-1,4)+1+(ROUNDUP(ROW(A1)/4,0)-1)*4)(参数说明:
$K$2:$V$11是原始数据列的区域,其他参数和前面保持一致)
方案二:Power Query/M查询法(适合批量/重复处理,更稳定)
这个方法可视化操作,还能一键刷新更新数据,推荐优先使用:
可视化操作步骤
- 选中原始数据的任意单元格,点击「数据」选项卡 → 「从表格/区域」,勾选「我的表格有标题」,进入Power Query编辑器。
- 选中左侧10列参考信息(比如A-J列),点击「转换」选项卡 → 「逆透视列」 → 「逆透视其他列」。这一步会把所有月份的指标列转成「属性」和「值」两列。
- 选中「属性」列(内容类似「1月-收入」),点击「转换」选项卡 → 「拆分列」 → 「按分隔符」,选择你实际的分隔符(比如「-」),拆分为「月份」和「指标类型」两列。
- 重命名拆分后的列,调整列的顺序(把「月份」「指标类型」「值」放到合适位置),最后点击「关闭并上载」,就能得到你要的规范表格了。
对应的M查询代码(可直接粘贴到Power Query高级编辑器)
记得把代码中的列名替换成你实际的参考列名称:
let 源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content], // 逆透视非参考列,生成属性和值列 逆透视其他列 = Table.UnpivotOtherColumns(源, {"ID", "客户名称", "列3", "列4", "列5", "列6", "列7", "列8", "列9", "列10"}, "属性", "值"), // 拆分属性列为月份和指标类型 拆分列按分隔符 = Table.SplitColumn(逆透视其他列, "属性", Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv), {"月份", "指标类型"}), // 调整列的数据类型(比如数值设为货币型) 更改类型 = Table.TransformColumnTypes(拆分列按分隔符,{{"月份", type text}, {"指标类型", type text}, {"值", Currency.Type}}), // 重新排列列的顺序 重新排列列 = Table.ReorderColumns(更改类型,{"ID", "客户名称", "列3", "列4", "列5", "列6", "列7", "列8", "列9", "列10", "月份", "指标类型", "值"}) in 重新排列列
要是你后续数据更新了,只需要右键点击转换后的表格,选择「刷新」就能自动更新结果,非常方便~
备注:内容来源于stack exchange,提问作者user1605665




