问题描述
我有下表
Id Letter
1001 A
1001 H
1001 H
1001 H
1001 B
1001 H
1001 H
1001 H
1001 H
1001 H
1001 H
1001 A
1001 H
1001 H
1001 H
1001 B
1001 A
1001 H
1001 H
1001 H
1001 B
1001 B
1001 H
1001 H
1001 H
1001 B
1001 H
1001 A
1001 G
1001 H
1001 H
1001 A
1001 B
1002 B
1002 H
1002 H
1002 B
1002 G
1002 H
1002 B
1002 G
1002 G
1002 H
1002 B
1002 G
1002 H
1002 H
1002 G
1002 H
1002 H
1002 H
1002 H
1002 H
1002 M
1002 N
1002 G
1002 H
1002 H
1002 M
1002 M
1002 A
1002 H
1002 H
1002 H
1002 A
1002 B
1002 B
1002 H
1002 H
1002 H
1002 B
1002 H
1002 H
1002 H
1002 A
1002 A
1002 A
1002 H
1002 H
1002 H
1002 H
1002 B
1002 H
1003 G
1003 H
1003 H
1003 N
1003 M
并且我试图将它转置以使第一列中的每个不同 id 和第二列中的所有字母与原始表格中的每个空白行一个空格:
And I'm trying to transpose it to make each different id in the first column and all the letters in the second column with one blank space for each blank row in the original table:
1001 AHHH BHHH HHH AHHHB AHHHB BHHHB H AGHHAB
1002 BHHB GH BGGH BGHH GHH HHHMN GHHMM AHHHAB BHHH BHHHAA AHHHHB H
1003 GHHNM
我有大约 100 个不同的 ID.我尝试使用 TRANSPOSE 和 TRIM 来处理公式.我也尝试过使用宏,VLOOKUP 似乎是最简单的方法,但不知道如何
I have about 100 different id. I tried to do with a formula using TRANSPOSE and TRIM. I also tried with a macro and VLOOKUP seems to be the easiest way but can't find out how
推荐答案
如果事先不知道范围,则无法使用本机工作表函数连接一系列单元格(又名 Letters).由于您将字符串集合成组具有随机数量的元素,因此 VBA 循环方法似乎是解决该问题的最佳(如果不是唯一的)方法.循环可以确定工作表功能根本无法执行的过程.
You cannot concatenate a range of cells (aka Letters) using native worksheet functions without knowing the scope beforehand. As your collection of strings into groups has random numbers of elements, a VBA loop approach seems the best (if not the only) way to address the issue. The loop can make determinations along the way that a worksheet function is simply incapable of performing.
点击 +,当 Visual Basic 编辑器(又名 VBE)打开时,立即使用下拉菜单插入 ► 模块 (+,).将以下一项或两项粘贴到名为 Book1 - Module1 (Code) 之类的新窗格中.
Tap + and when the Visual Basic Editor (aka VBE) opens, immediately use the pull-down menus to Insert ► Module (+,). Paste one or both of the following into the new pane titled something like Book1 - Module1 (Code).
连接以空格分隔的字符串组:
Sub concatenate_and_transpose_to_delim_string()
Dim rw As Long, lr As Long, pid As Long, str As String
Dim bPutInColumns As Boolean
With ActiveSheet
lr = .Cells(Rows.Count, 1).End(xlUp).row
.Cells(1, 4).Resize(1, 2) = Array("Id", "Letters")
pid = .Cells(2, 1).Value
For rw = 2 To lr
If IsEmpty(.Cells(rw, 1)) Then
str = str & Chr(32)
If pid <> .Cells(rw + 1, 1).Value Then
.Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = pid
.Cells(Rows.Count, 4).End(xlUp).Offset(0, 1) = str
End If
ElseIf pid <> .Cells(rw, 1).Value Then
pid = .Cells(rw, 1).Value
str = .Cells(rw, 2).Value
Else
str = str & .Cells(rw, 2).Value
End If
Next rw
.Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = pid
.Cells(Rows.Count, 4).End(xlUp).Offset(0, 1) = str
End With
End Sub
要将字符串组拆分为列:
Sub concatenate_and_transpose_into_columns()
Dim rw As Long, lr As Long, nr As Long, pid As Long, str As String
With ActiveSheet
lr = .Cells(Rows.Count, 1).End(xlUp).row
.Cells(1, 4).Resize(1, 2) = Array("Id", "Letters")
For rw = 2 To lr
If IsEmpty(.Cells(rw, 1)) Then
.Cells(nr, Columns.Count).End(xlToLeft).Offset(0, 1) = str
str = vbNullString
ElseIf pid <> .Cells(rw, 1).Value Then
pid = .Cells(rw, 1).Value
nr = .Cells(Rows.Count, 4).End(xlUp).Offset(1, 0).row
.Cells(nr, 4) = pid
str = .Cells(rw, 2).Value
Else
str = str & .Cells(rw, 2).Value
End If
Next rw
.Cells(nr, Columns.Count).End(xlToLeft).Offset(0, 1) = str
End With
End Sub
点击 + 返回到您的工作表.使用 A1 中以 Id
开头的活动工作表上的示例数据,点击 + 以打开 宏对话框并运行宏.
Tap + to return to your worksheet. With your sample data on the active worksheet starting with Id
in A1, tap + to open the Macros dialog and Run the macro.
concatenate_and_transpose_to_delim_string 的结果:
concatenate_and_transpose_into_columns 的结果:
结果将写入从 D2 开始的单元格中.如果事先没有什么重要的东西会被覆盖,那可能是最好的.
The results will be written into the cells starting at D2. Probably best if there was nothing important there beforehand that would be overwritten.
附录:
我最初误解了您的请求并将字符串组拆分为单独的列.我已经通过补充例程纠正了这个问题,该例程更接近您对需求的描述,但保留了两种变化供其他人参考.
I original misinterpreted your request and split the string groups into separate columns. I've rectified that with a supplemental routine that more closely follows your description of requirements but kept both variations for others to reference.
这篇关于将行聚合、整理和转置为列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!