【问题标题】:Merge values of column B based on common values on column A根据 A 列的常用值合并 B 列的值
【发布时间】:2019-11-13 11:05:20
【问题描述】:

在 Excel 中,如何根据 Column A 上的常用值合并 Column B 的值?

基本上我需要的是这样的东西

【问题讨论】:

  • 你有什么版本的 Excel?
  • 你的实际数据有标题行吗?
  • 我正在使用 Excel Plus 2016
  • 请参见此处:stackoverflow.com/questions/54582741/… 以获得将返回串联的 UDF。
  • Mona:你很容易就知道在这里不鼓励未经研究的问题。

标签: excel vba


【解决方案1】:

你可以使用这个 UDF:

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

你可以这样称呼它:

=IF(MATCH(A1,A:A,0)=ROW(A1),TEXTJOINIFS(B:B,", ",A:A,A1),"")

现在无论数据是否排序都无关紧要,它只会将输出放在 C 列中,其中 A 列中的值首先出现。


【讨论】:

  • 感谢 Scot,但 =IF(MATCH(A1,A:A,0)=ROW(A1),TEXTJOINIFS(B:B,", ",A:A,A1),"") 它不起作用我收到 #NAME? 错误
  • 你必须把上面的代码放在一个模块中。然后它将像任何公式一样工作。
  • 我在模块中添加了代码,但同样的事情正在发生
  • 你是放在通用模块还是工作表代码?如果它在一般模块中,它应该可以工作。上面的示例使用的是未修改的代码。我将它放在一个模块中,然后按照描述使用公式。
【解决方案2】:

使用数组公式:

=TEXTJOIN(", ",TRUE,IF(A$1:A$15=A1,B$1:B$15,""))

(使用CTRL-SHIFT-ENTER代替ENTER输入公式)

【讨论】:

  • 我认为 Excel Plus 2016 没有 TEXTJOIN
  • 看起来 Scott 是对的,我在这里找不到 TEXTJOIN
  • @MonaCoder 我确实有一个模仿常规 TEXTJOIN 的 UDF。可以在这里找到:stackoverflow.com/questions/39532189/…
【解决方案3】:

当然,这是我未经测试的代码。 下面的代码使用 2 个循环来添加信息。

dim X as integer
dim X2 as integer

dim match as string

X = 1

do while sheets("sheet1").range("A" & X).value <> ""

    sheets("sheet1").range("C" & X).value = sheets("sheet1").range("B" & X).value
    match = sheets("sheet1").range("A" & X).value        
    X2 = X + 1

        do while sheets("sheet1").range("A" & X2).value = match

            sheets("sheet1").range("C" & X).value = sheets("sheet1").range("C" & X).value + ", " + sheets("sheet1").range("B" & X2).value 
            X2 = X2 + 1

        loop

    X = X2
    X = X + 1

Loop

【讨论】:

  • 如果你用适当的大小写和缩进来格式化它,那么 - 为什么不呢? ?
  • 好的,我明白你的意思了 - 这是一个懒惰的答案@JohnyL - 我已经进行了编辑并添加了变量声明:)
  • 好吧,努力赚了))
  • 感谢@JohnyL,您正式欢迎我加入社区,我的代表是 14 岁,这是我的第一个答案 :)
  • Jonathan:让新用户知道我们这里有投票/接受系统是可以的,但总的来说,我们宁愿人们不要求投票。如果你创造出好的材料,投票就会自然而然地到来。
猜你喜欢
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多