use*_*823 1 arrays excel vba transpose excel-vba
我有下表
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
Run Code Online (Sandbox Code Playgroud)
我试图转置它以使第一列中的每个不同的id和第二列中的所有字母为原始表中的每个空行创建一个空格:
1001 AHHH BHHH HHH AHHHB AHHHB BHHHB H AGHHAB
1002 BHHB GH BGGH BGHH GHH HHHMN GHHMM AHHHAB BHHH BHHHAA AHHHHB H
1003 GHHNM
Run Code Online (Sandbox Code Playgroud)
我有大约100个不同的身份证.我尝试使用TRANSPOSE和TRIM进行配方.我也试过一个宏,VLOOKUP似乎是最简单的方法,但无法弄清楚如何
小智 6
您无法在不事先了解范围的情况下使用本机工作表函数连接一系列单元格(也称为字母).由于您的字符串集合具有随机数量的元素,因此VBA循环方法似乎是解决该问题的最佳方法(如果不是唯一的方法).循环可以在工作表函数根本无法执行的过程中进行确定.
点击Alt+ F11,当Visual Basic编辑器(又名VBE)打开时,立即使用下拉菜单插入►模块(Alt+ I,M).将以下一项或两项粘贴到标题为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
Run Code Online (Sandbox Code Playgroud)
要将字符串组拆分为列:
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
Run Code Online (Sandbox Code Playgroud)
点按Alt+ Q返回工作表.将活动工作表上的示例数据从IdA1 开始,点击Alt+ F8打开" 宏"对话框并运行宏.
concatenate_and_transpose_to_delim_string的结果:

concatenate_and_transpose_into_columns的结果:

结果将写入从D2开始的单元格.如果事先没有任何重要的东西会被覆盖,那可能是最好的.
附录:
我原来误解了您的请求并将字符串组拆分为单独的列.我已经用补充程序纠正了这个问题,这个程序更贴切地遵循您对要求的描述,但保留了其他参考的变化.