Excel 根据A列标签拆分为多个列数据

举例:如下图所示将AB列内容拆分为红色框内的格式方便绘制图表

cpp 复制代码
Sub SplitCategoriesToColumns()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim startRow As Long
    Dim dict As Object
    Dim keyOrder As New Collection
    Dim i As Long, j As Long
    Dim key As Variant
    Dim val As Variant
    Dim maxCount As Long
    Dim colCount As Long
    Dim colOffset As Long
    
    ' 设置工作表(当前活动表)
    Set ws = ActiveSheet
    
    ' ***** 请根据实际情况修改起始行 *****
    ' 如果数据没有标题行,设置为 1
    ' 如果第一行是标题(如"分类","数值"),设置为 2
    startRow = 1
    
    ' A 列最后非空行
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    If lastRow < startRow Then
        MsgBox "A 列没有数据!"
        Exit Sub
    End If
    
    ' 创建字典,存储每个类别对应的数值集合
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' 遍历 A/B 列数据,按类别收集 B 列数值
    For i = startRow To lastRow
        key = Trim(ws.Cells(i, "A").Value)
        If key <> "" Then
            val = ws.Cells(i, "B").Value
            If Not dict.exists(key) Then
                dict.Add key, New Collection
                keyOrder.Add key   ' 记录类别首次出现的顺序
            End If
            dict(key).Add val
        End If
    Next i
    
    If dict.Count = 0 Then
        MsgBox "没有找到有效的分类数据!"
        Exit Sub
    End If
    
    ' 计算所有类别中数据个数的最大值(用于确定输出行数)
    maxCount = 0
    For Each key In dict.Keys
        If dict(key).Count > maxCount Then maxCount = dict(key).Count
    Next key
    
    colCount = dict.Count          ' 类别个数(输出列数)
    colOffset = 3                  ' 从 C 列开始输出
    
    ' 清除旧的输出区域(C 列开始,向右 colCount 列,向下 maxCount+1 行)
    With ws
        .Range(.Cells(1, colOffset), .Cells(maxCount + 1, colOffset + colCount - 1)).ClearContents
    End With
    
    ' 将每个类别的数据写入对应的列
    For i = 1 To keyOrder.Count
        key = keyOrder(i)
        ' 第一行写入类别名称(表头)
        ws.Cells(1, colOffset + i - 1).Value = key
        ' 将数值依次填入该列的第2行开始
        For j = 1 To dict(key).Count
            ws.Cells(j + 1, colOffset + i - 1).Value = dict(key)(j)
        Next j
    Next i
    
    ' 自动调整输出列的列宽
    ws.Range(ws.Cells(1, colOffset), ws.Cells(1, colOffset + colCount - 1)).EntireColumn.AutoFit
    
    MsgBox "处理完成!共转换 " & dict.Count & " 个类别。"
End Sub
相关推荐
骆驼爱记录3 小时前
Word目录:标题加粗页码不加粗技巧
自动化·word·excel·wps·新人首发
城数派4 小时前
1985-2024年各省市县不同土地覆盖类型的土地面积(Excel)
数据库·arcgis·信息可视化·数据分析·excel
开开心心_Every4 小时前
轻松加密文件生成exe,无需原程序解密
运维·服务器·网络·电脑·excel·consul·memcache
fengyehongWorld1 天前
VBA 操作PowerQuery表格和带名字的表格
excel·vba
tangyal1 天前
Linux 核心操作合集(网络配置、XShell远程连接、vim文本编辑与操作、权限管理 实操手册)
excel
softbangong2 天前
815-批量Excel文件合并工具,批量excel文件、工作表合并软件
linux·windows·excel·文件合并·excel合并·数据整理
城数派2 天前
2000-2024年1km精度人口分布栅格数据(全球/全国/分省/分市)
arcgis·信息可视化·数据分析·excel
城数派2 天前
1984-2024年中国10米分辨率城市土地利用栅格数据(商业、公服、居住等9类)
arcgis·信息可视化·数据分析·excel
城数派2 天前
2015-2024年我国1km分辨率逐日地表温度(LST)栅格数据
数据库·arcgis·信息可视化·数据分析·excel