按相邻单元格值

时间:2016-10-17 22:27:46

标签: excel vba excel-vba concatenation transpose

是否可以在列中连接依赖于另一列中的值(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

的问题:

  • 列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)," ") 

所以我想如果INDEXMATCH等可以与TRANSPOSE结合使用,它可能会起作用。只是不确定如何去做。

我可以在另一张表中找到一列唯一ID。

4 个答案:

答案 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。然后拖动/复制

enter image description here

答案 2 :(得分:1)

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

  1. 您要连接的文字包含空格。
  2. 您想使用空格以外的分隔符(即逗号)。
  3. 首先,添加" 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)), " "))}