You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:36:05