按相邻单元格值合并或连接列
Merge or concatenate column by adjacent cell value
是否可以根据另一列中的值 (ID
) 连接一列中的单元格,然后输出为字符串(可能在另一个 sheet 中,因为这样会更干净)?
例如
ID Text
1234 a
1234 b
1234 c
4321 a
4321 b
4321 c
4321 d
输出:
1234 a b c
4321 a b c d
问题:
- 列 ID 未按顺序排列(但可以排序)。
- 每个ID的数量不同
这似乎是一个可能的 VBA
解决方案
来自 How to merge rows in a column into one cell in excel?
Function JoinXL(arr As Variant, Optional delimiter As String = " ")
'arr must be a one-dimensional array.
JoinXL = Join(arr, delimiter)
End Function
用法示例:
=JoinXL(TRANSPOSE(A1:A4)," ")
所以我想如果 INDEX
和 MATCH
等可以与 TRANSPOSE
结合使用,它可能会起作用。只是不知道该怎么做。
我可以在另一个 sheet 中有一列唯一 ID。
虽然没有像您引用的示例那样方便的功能,但请考虑使用 collections 的字典,并将 ID 列作为 键 。下面的宏假定数据从 A2(第一行的 headers 列)开始,结果输出在 D 和 E 中 列:
Sub TransposeValuesByID()
Dim i As Integer, lastrow As Integer
Dim valDict As Object
Dim innerColl As New Collection
Dim k As Variant, v As Variant
Set valDict = CreateObject("Scripting.Dictionary")
lastrow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lastrow
If Range("A" & i) = Range("A" & i + 1) Then
innerColl.Add Range("B" & i)
Else
innerColl.Add Range("B" & i)
valDict.Add CStr(Range("A" & i).Value), innerColl
Set innerColl = Nothing
End If
Next i
i = 2
For Each k In valDict.keys
Range("D" & i) = k
For Each v In valDict(k)
Range("E" & i) = Trim(Range("E" & i) & " " & v)
Next v
i = i + 1
Next k
End Sub
我想出了一个解决方法,虽然有点麻烦但效果很好。
Table必须按ID排序。
在另一个 sheet 中。
ID:(A 列)
1234
MIN REF:(B 列)
=ADDRESS(MATCH(A2,OCCRANGE,0)+1,6)
MAX REF:(C 列)
=ADDRESS(MATCH(A2,OCCRANGE)+1,6)
范围:(D 列)
=CONCATENATE("'OCCS COMBINED'!",B2,":",C2)
字符串:(E 列)
{=IF([@[MIN REF]]=[@[MAX REF]],INDIRECT(CONCATENATE("'OCCS COMBINED'!",[@[MIN REF]])),JoinXL(TRANSPOSE(INDIRECT(D2)), " "))}
因为你想要的只是 space 你可以使用你的代码进行一些更改。
如果您的数据是垂直的,您需要转置数组以使其成为一维数组:
Function JoinXL(arr As Variant, Optional delimiter As String = " ")
'arr must be a one-dimensional array.
arr = Application.Transpose(arr)
JoinXL = Join(arr, delimiter)
End Function
如果它是水平的,那么使用你现有的。
主要的变化是你如何称呼它。
使用下面的数组公式:
=TRIM(JoinXL(IF($A:$A=C2,$B:$B,"")," "))
作为一个数组,退出编辑模式时需要使用Ctrl-Shift-Enter而不是Enter来确认。如果操作正确,那么 Excel 将在公式周围放置 {}
。
If 传递一组值或空格,具体取决于单元格是否等于条件。
将其放在第一个单元格中按 Ctrl-Shift-Enter。然后drag/copy下
这个解决方案很好,因为即使在以下情况下它也能工作:
- 您要连接的文本包含 spaces。
- 您想使用 space 以外的定界符(即逗号)。
首先,将 "Transpose" 添加到您的自定义函数中
Function JoinXL(arr As Variant, Optional delimiter As String = " ")
'arr must be a one-dimensional array.
arr = Application.Transpose(arr)
JoinXL = Join(arr, delimiter)
End Function
对于 vertical arrays,使用此公式(将逗号+space 替换为您选择的分隔符,将“{}”替换为您选择的垃圾字符):
{=SUBSTITUTE(SUBSTITUTE(JoinXL(IF($A:$A=D3,$B:$B,"{}"),", "),"{}, ",""),", {}", "")}
对于horizontal arrays,使用这个公式:
{=SUBSTITUTE(SUBSTITUTE(JoinXL(IF(TRANSPOSE($E:$AH)=D12,TRANSPOSE($E:$AH),"{}"),", "),"{}, ",""),", {}", "")}
确保将公式作为数组公式输入(在单元格中键入公式后按 Ctrl+Shift+Enter)。
是否可以根据另一列中的值 (ID
) 连接一列中的单元格,然后输出为字符串(可能在另一个 sheet 中,因为这样会更干净)?
例如
ID Text
1234 a
1234 b
1234 c
4321 a
4321 b
4321 c
4321 d
输出:
1234 a b c
4321 a b c d
问题:
- 列 ID 未按顺序排列(但可以排序)。
- 每个ID的数量不同
这似乎是一个可能的 VBA
解决方案
来自 How to merge rows in a column into one cell in excel?
Function JoinXL(arr As Variant, Optional delimiter As String = " ")
'arr must be a one-dimensional array.
JoinXL = Join(arr, delimiter)
End Function
用法示例:
=JoinXL(TRANSPOSE(A1:A4)," ")
所以我想如果 INDEX
和 MATCH
等可以与 TRANSPOSE
结合使用,它可能会起作用。只是不知道该怎么做。
我可以在另一个 sheet 中有一列唯一 ID。
虽然没有像您引用的示例那样方便的功能,但请考虑使用 collections 的字典,并将 ID 列作为 键 。下面的宏假定数据从 A2(第一行的 headers 列)开始,结果输出在 D 和 E 中 列:
Sub TransposeValuesByID()
Dim i As Integer, lastrow As Integer
Dim valDict As Object
Dim innerColl As New Collection
Dim k As Variant, v As Variant
Set valDict = CreateObject("Scripting.Dictionary")
lastrow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lastrow
If Range("A" & i) = Range("A" & i + 1) Then
innerColl.Add Range("B" & i)
Else
innerColl.Add Range("B" & i)
valDict.Add CStr(Range("A" & i).Value), innerColl
Set innerColl = Nothing
End If
Next i
i = 2
For Each k In valDict.keys
Range("D" & i) = k
For Each v In valDict(k)
Range("E" & i) = Trim(Range("E" & i) & " " & v)
Next v
i = i + 1
Next k
End Sub
我想出了一个解决方法,虽然有点麻烦但效果很好。
Table必须按ID排序。
在另一个 sheet 中。 ID:(A 列)
1234
MIN REF:(B 列)
=ADDRESS(MATCH(A2,OCCRANGE,0)+1,6)
MAX REF:(C 列)
=ADDRESS(MATCH(A2,OCCRANGE)+1,6)
范围:(D 列)
=CONCATENATE("'OCCS COMBINED'!",B2,":",C2)
字符串:(E 列)
{=IF([@[MIN REF]]=[@[MAX REF]],INDIRECT(CONCATENATE("'OCCS COMBINED'!",[@[MIN REF]])),JoinXL(TRANSPOSE(INDIRECT(D2)), " "))}
因为你想要的只是 space 你可以使用你的代码进行一些更改。
如果您的数据是垂直的,您需要转置数组以使其成为一维数组:
Function JoinXL(arr As Variant, Optional delimiter As String = " ")
'arr must be a one-dimensional array.
arr = Application.Transpose(arr)
JoinXL = Join(arr, delimiter)
End Function
如果它是水平的,那么使用你现有的。
主要的变化是你如何称呼它。
使用下面的数组公式:
=TRIM(JoinXL(IF($A:$A=C2,$B:$B,"")," "))
作为一个数组,退出编辑模式时需要使用Ctrl-Shift-Enter而不是Enter来确认。如果操作正确,那么 Excel 将在公式周围放置 {}
。
If 传递一组值或空格,具体取决于单元格是否等于条件。
将其放在第一个单元格中按 Ctrl-Shift-Enter。然后drag/copy下
这个解决方案很好,因为即使在以下情况下它也能工作:
- 您要连接的文本包含 spaces。
- 您想使用 space 以外的定界符(即逗号)。
首先,将 "Transpose" 添加到您的自定义函数中
Function JoinXL(arr As Variant, Optional delimiter As String = " ")
'arr must be a one-dimensional array.
arr = Application.Transpose(arr)
JoinXL = Join(arr, delimiter)
End Function
对于 vertical arrays,使用此公式(将逗号+space 替换为您选择的分隔符,将“{}”替换为您选择的垃圾字符):
{=SUBSTITUTE(SUBSTITUTE(JoinXL(IF($A:$A=D3,$B:$B,"{}"),", "),"{}, ",""),", {}", "")}
对于horizontal arrays,使用这个公式:
{=SUBSTITUTE(SUBSTITUTE(JoinXL(IF(TRANSPOSE($E:$AH)=D12,TRANSPOSE($E:$AH),"{}"),", "),"{}, ",""),", {}", "")}
确保将公式作为数组公式输入(在单元格中键入公式后按 Ctrl+Shift+Enter)。