按相邻单元格值合并或连接列

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

问题:

这似乎是一个可能的 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)," ") 

所以我想如果 INDEXMATCH 等可以与 TRANSPOSE 结合使用,它可能会起作用。只是不知道该怎么做。

我可以在另一个 sheet 中有一列唯一 ID。

虽然没有像您引用的示例那样方便的功能,但请考虑使用 collections 的字典,并将 ID 列作为 。下面的宏假定数据从 A2(第一行的 headers 列)开始,结果输出在 DE 中 列:

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下

这个解决方案很好,因为即使在以下情况下它也能工作:

  1. 您要连接的文本包含 spaces。
  2. 您想使用 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)。