首页 > 解决方案 > 如何根据内容将列中的数据分组为行

问题描述

在 Excel 中,我有一列文件名。每个文件名作为唯一的前缀,我想将列中具有匹配前缀的所有单元格转换为唯一的行。没有固定数量的具有匹配前缀的条目,因为我已经看到了具有该条件的解决方案。

例如,我在这样的列中有数据:

col1 col2 col3
苹果_1
苹果_2
苹果_3
男孩_1
牛_1
牛_2

我想将它分组并转换成这样的行:

col1 col2 col3
苹果_1 苹果_2 苹果_3
男孩_1
牛_1 牛_2

我想我可以在 VBA 中做到这一点,但希望有一些方法可以在没有自定义编码的情况下做到这一点。

编辑 - 基本上,这是我需要在 VBA 宏中执行的操作:

FoundCnt = 0
CurrentCell = A1
Get the string of chars up until the _ and store in CurrentPrefix 
Do {
    NextCell = CurrentCell +1
    Get the chars in NextCell up until the _  
    store in NextPrefix
    If CurrentPrefix == NextPrefix {
        move content of NextCell up 1 and to the right to B FoundCnt + 1
        FoundCnt++
        delete Row containing NextCell
    } else {
        FoundCnt = 0
    }
    CurrentCell = NextCell
}  Until NextCell == ""

标签: exceltranspose

解决方案


请试试这个 - 它与将单列转换为具有固定列数的二维范围的公式没有太大区别,您只需将输出挂在行数等于唯一前缀数和数量的序列上列等于共享相同前缀的最大条目数。然后您必须检查当前输出列是否小于匹配当前前缀的条目数:

=LET(range,A2:INDEX(A:A,COUNTA(A:A)),
uniques,UNIQUE(LEFT(range,FIND("_",range))),
cols,MAX(COUNTIF(range,uniques&"*")),
seq,SEQUENCE(COUNTA(uniques),cols,0),
IF(MOD(seq,cols)<COUNTIF(range,uniques&"*"),INDEX(range,MATCH(INDEX(uniques,INT(seq/cols)+1)&"*",range,0)+MOD(seq,cols)),""))

在此处输入图像描述


推荐阅读