【问题标题】:Create a comma separated string in cell based on unique values in 2 columns根据 2 列中的唯一值在单元格中创建逗号分隔的字符串
【发布时间】:2021-10-08 17:04:59
【问题描述】:

我不确定这是否可行,但我想使用 Excel 公式或 VBA 代码将数据合并到一行中。我正在使用 Excel 2010。

在下图中,连接 ColD 中的结果输出的唯一数据由 ColA 中的唯一事件 ID 和 ColB 中的 ID 分隔,因此如果 EventID 和 ID(ColA 和 B)相同 - 中的数据C 列,需要在 ColD 中作为逗号分隔的字符串连接。

所以D列的数据是我想实现的,不知道怎么实现的。

【问题讨论】:

  • 几乎是的。正如我认为的那样,这看起来很复杂。该示例使用 1 列作为唯一值。我需要使用 2 列,但我不知道从哪里开始更改该代码!
  • 你不会改变代码,只改变它的调用方式:=IF(OR(A2<>A3,B2<>B3),TEXTJOINIFS(C:C,", ",A:A,A2,B:B,B2),"")
  • 天哪,太棒了!这是一种享受。非常感谢。

标签: excel vba


【解决方案1】:

将以下代码放入常规模块中:

Function TEXTJOINIFS(rng As Range, delim As String, ParamArray arr() As Variant)
    Dim rngarr As Variant
    rngarr = Intersect(rng, rng.Parent.UsedRange).Value

    Dim condArr() As Boolean
    ReDim condArr(1 To Intersect(rng, rng.Parent.UsedRange).Rows.Count) As Boolean


    Dim i As Long
    For i = LBound(arr) To UBound(arr) Step 2
        Dim colArr() As Variant
        colArr = Intersect(arr(i), arr(i).Parent.UsedRange).Value
        Dim j As Long
        For j = LBound(colArr, 1) To UBound(colArr, 1)

            If Not condArr(j) Then
                Dim charind As Long
                charind = Application.Max(InStr(arr(i + 1), ">"), InStr(arr(i + 1), "<"), InStr(arr(i + 1), "="))
                Dim opprnd As String
                If charind = 0 Then
                    opprnd = "="
                Else
                    opprnd = Left(arr(i + 1), charind)
                End If
                Dim t As String
                t = """" & colArr(j, 1) & """" & opprnd & """" & Mid(arr(i + 1), charind + 1) & """"
                If Not Application.Evaluate(t) Then condArr(j) = True
            End If
        Next j
    Next i

    For i = LBound(rngarr, 1) To UBound(rngarr, 1)
        If Not condArr(i) Then
            TEXTJOINIFS = TEXTJOINIFS & rngarr(i, 1) & delim
        End If
    Next i

    TEXTJOINIFS = Left(TEXTJOINIFS, Len(TEXTJOINIFS) - Len(delim))

End Function

然后在 D2 中放入:

=IF(OR(A2<>A3,B2<>B3),TEXTJOINIFS(C:C,", ",A:A,A2,B:B,B2),"")

【讨论】:

    【解决方案2】:

    如果您的 Excel 版本支持 TEXTJOIN,则无需依赖 VBA。

    在这种情况下,您可以在 D2 中使用以下公式,然后向下复制以加入匹配项:

    TEXTJOIN(",",TRUE,IF(A2&"#"&B2=A$2:A$13&"#"&B$2:B$13,C$2:C$13,""))
    

    如果您随后将其包装在 IF 语句中以计算当前匹配出现次数与总体匹配次数,您可以添加过滤以给出:

    =IF(COUNTIFS(A$2:A2,A2,B$2:B2,B2)=COUNTIFS(A:A,A2,B:B,B2),TEXTJOIN(",",TRUE,IF(A2&"#"&B2=A$2:A$13&"#"&B$2:B$13,C$2:C$13,"")),"")
    

    这些公式还使用分隔符来避免列值之间的溢出。

    例如AB & CD = A & BCD,但 AB & # & CD /= A & # & BCD

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-22
      • 2017-03-24
      • 2011-06-20
      • 2020-08-12
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多