是否可以在列中连接依赖于另一列中的值(ID
)的单元格,然后作为字符串输出(可能在另一个表格中,因为它更干净)?
E.g。
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
的问题:
这似乎是一种可能的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
结合使用,它可能会起作用。只是不确定如何去做。
我可以在另一张表中找到一列唯一ID。
答案 0 :(得分:1)
虽然没有像您引用的示例那样方便的功能,但请考虑使用带有ID列的集合字典作为键。下面的宏假设数据从 A2 (第一行中的列标题)开始,结果输出在 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
答案 1 :(得分:1)
由于你想要的只是空格,你可以使用你的代码进行一些更改。
如果您的数据是垂直的,则需要转置数组以使其成为一维数组:
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$2:$A$8=C2,$B$2:$B$8,"")," "))
作为一个数组,需要在退出编辑模式时使用Ctrl-Shift-Enter而不是Enter来确认。如果操作正确,那么Excel会将{}
放在公式周围。
If传递一组值或空格,具体取决于单元格是否等于条件。
将它放在第一个单元格中按Ctrl-Shift-Enter。然后拖动/复制
答案 2 :(得分:1)
这个解决方案很不错,因为即使在以下情况下它也能正常工作:
首先,添加" Transpose"到您的自定义功能
CanActivate
对于vertical arrays,请使用此公式(将逗号+空格替换为您选择的分隔符,使用" {}"替换为您选择的垃圾字符):
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
对于horizontal arrays,请使用以下公式:
{=SUBSTITUTE(SUBSTITUTE(JoinXL(IF($A$2:$A$31=D3,$B$2:$B$31,"{}"),", "),"{}, ",""),", {}", "")}
确保将公式输入为数组公式(在单元格中键入公式后按Ctrl + Shift + Enter)。
答案 3 :(得分:0)
我已经想出了一个解决方案,虽然有点麻烦但效果很好。
表必须按ID排序。
在另一张纸上。 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)
STRING :( E栏)
{=IF([@[MIN REF]]=[@[MAX REF]],INDIRECT(CONCATENATE("'OCCS COMBINED'!",[@[MIN REF]])),JoinXL(TRANSPOSE(INDIRECT(D2)), " "))}