我有如下所示的两列数据,我需要为每一列水平排列成一行。
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
列出列中所有唯一条目
A
。在此示例中,只需输入两个名称即可。对于较大的数据集,您可以将该列复制到目标位置,然后只需使用“删除重复项”工具来缩减列表即可。在新列表中第一个名称的右侧(我的列表从 开始
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
如果只有几个名字,您可以通过键盘执行以下操作:
- 如果尚未排序,则对列表进行排序。
- 选择与名字对应的数字。
- 移至姓名第一行的 C 列
- 选择“编辑”、“选择性粘贴”、“转置值”,然后确定
- 删除除第一行之外的所有行
- 对所有其他名称重复步骤 2 至 5
- 删除 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
作为一个一直在寻找简单解决方案的人,特别是如果每个计数不规则时,我偶然发现了这个视频,它终于满足了我的需要。