如何将列数据转换为行,并按标识符分组

如何将列数据转换为行,并按标识符分组

我有如下所示的两列数据,我需要为每一列水平排列成一行。

Baker   17                              
Baker   37                              
Baker   28                              
Baker   49                              
Baker   27                              
Baker   44                              
Baker   47                              
Baker   32                              
Baker   29                              
Boley   13                              
Boley   46                              
Boley   10                              
Boley   35                              
Boley   32                              
Boley   49                              
Boley   18                              
Boley   47                              
Boley   22                              

Baker   17  37  28  49  27  44  47  32  29
Boley   13  46  10  35  32  49  18  47  22

我怎样才能做到这一点?

答案1

  1. 列出列中所有唯一条目A。在此示例中,只需输入两个名称即可。对于较大的数据集,您可以将该列复制到目标位置,然后只需使用“删除重复项”工具来缩减列表即可。

  2. 在新列表中第一个名称的右侧(我的列表从 开始F1,因此在 中有以下内容),按+ +G1输入以下公式作为数组公式:CtrlShiftEnter

    =IFERROR(INDEX($B$1:$B$18,SMALL(IF($A$1:$A$18=$F1,ROW($B$1:$B$18),""),COLUMN()-COLUMN($F1))),"")
    

作为参考,A1:A18是您原来的姓名列表,B1:B18是其对应的数字,F1是新表格中的名称“Baker”。 将其向右填充到您想要的范围内。 然后,向下填充以完成您的表格。

注意:如果您的原始数据不是从 Row 开始1,则使用以下公式,其中A1是原始数据的左上角单元格:

=IFERROR(INDEX($B$1:$B$18,SMALL(IF($A$1:$A$18=$F1,ROW($B$1:$B$18)-ROW($A$1)+1,""),COLUMN()-COLUMN($F1))),"")

答案2

如果只有几个名字,您可以通过键盘执行以下操作:

  1. 如果尚未排序,则对列表进行排序。
  2. 选择与名字对应的数字。
  3. 移至姓名第一行的 C 列
  4. 选择“编辑”、“选择性粘贴”、“转置值”,然后确定
  5. 删除除第一行之外的所有行
  6. 对所有其他名称重复步骤 2 至 5
  7. 删除 B 列。

如果您有很多名称,那么您将需要一个 VBA 解决方案:

Option Explicit
Sub TransposeColB()

  Dim ColCrntNext As Integer       ' The next cell on the current row
  Dim ColNextLast As Integer       ' The last cell on the next row
  Dim Offset As Integer            ' Offset from first number on row to last
  Dim RowCrnt As Integer           ' Current row

  With Sheets("Sheet1")     ' !!!! Replace "Sheet1" with name of your sheet !!!!

    ' Sort entire sheet in case a partial tranpose has occurred.
    .Cells.Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlNo, _
            OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
    RowCrnt = 1
    ' Identify first blank cell on row.  This ensures nothing is overwritten.
    ColCrntNext = .Cells(RowCrnt, Columns.Count).End(xlToLeft).Column + 1
    Do While True
      ' Check name on next row
      Select Case .Cells(RowCrnt + 1, "a").Value
        Case ""
          ' The next row has no name.  The transpose is complete.
          Exit Do
        Case .Cells(RowCrnt, "a").Value
          ' The next row has the same name as the current row.  Move its
          ' numbers to the current row.
          ' Find last used column on the next row
          ColNextLast = .Cells(RowCrnt + 1, _
                                          Columns.Count).End(xlToLeft).Column
          Offset = ColNextLast - 2        ' Offset from first number to last.
                                          ' Normally zero.
          ' Move numbers from next row to current
          .Range(.Cells(RowCrnt, ColCrntNext), _
                 .Cells(RowCrnt, ColCrntNext + Offset)).Value = _
          .Range(.Cells(RowCrnt + 1, 2), _
                 .Cells(RowCrnt + 1, 2 + Offset)).Value
          .Rows(RowCrnt + 1).EntireRow.Delete     ' Delete next row
          ColCrntNext = ColCrntNext + Offset + 1  ' Advance to first blank cell
        Case Else
          ' The next row is for a new name
          RowCrnt = RowCrnt + 1
          ' Identify first blank cell on row. This ensures
          ' nothing is overwritten.
          ColCrntNext = .Cells(RowCrnt, _
                                   Columns.Count).End(xlToLeft).Column + 1
      End Select
    Loop
  End With

End Sub

答案3

作为一个一直在寻找简单解决方案的人,特别是如果每​​个计数不规则时,我偶然发现了这个视频,它终于满足了我的需要。

https://www.youtube.com/watch?time_continue=1&v=FKlLIyGEXWo

相关内容