能否使用VBA或Power Query将宽格式数据转换为长格式?
实现方案
完全可以通过Power Query或VBA实现你需要的宽表转堆叠长表需求,两种方案操作如下:
方案1:Power Query(推荐,无代码门槛,支持自动刷新)
- 选中源数据任意单元格,点击「数据」选项卡→「从表格/范围」,确认数据包含表头后进入Power Query编辑器
- 选中
Dates列,右键选择「逆透视其他列」 - 调整列顺序:将自动生成的「属性」列(对应Rates/3-MoBill/9-MoBill的指标名称)拖到第一列,按需修改列名后点击「关闭并上载」即可导出结果,后续源数据更新后右键刷新结果就能自动同步。
方案2:VBA方案
以下代码可直接运行,可按需修改工作表配置:
Sub 宽表转堆叠长表() Dim srcArr, resArr Dim srcSht As Worksheet, resSht As Worksheet Dim i As Long, j As Long, k As Long ' 可修改下方工作表名称,默认源数据在Sheet1,结果输出到Sheet2 Set srcSht = ThisWorkbook.Worksheets("Sheet1") Set resSht = ThisWorkbook.Worksheets("Sheet2") ' 读取源数据到数组 srcArr = srcSht.Range("A1").CurrentRegion.Value ' 定义结果数组大小 ReDim resArr(1 To (UBound(srcArr, 1) - 1) * (UBound(srcArr, 2) - 1), 1 To 3) k = 1 ' 遍历指标列和日期行堆叠数据 For j = 2 To UBound(srcArr, 2) For i = 2 To UBound(srcArr, 1) resArr(k, 1) = srcArr(1, j) resArr(k, 2) = srcArr(i, 1) resArr(k, 3) = srcArr(i, j) k = k + 1 Next i Next j ' 输出结果到目标工作表 resSht.Range("A1").Resize(UBound(resArr, 1), 3).Value = resArr End Sub
运行前请确认配置的源工作表和结果工作表存在,避免报错
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

