按照条件检索A列并获取对应的B列中的字符串,然后将这些字符串以分隔符连在一起,CONCATENATEIF能够实现这个功能。
看了excel的函数,没有能直接实现的,通过函数组合也基本不可能实现,至少我没想出来思路。
互联网上各种搜,也没有好的解决方案。
问了各个excel群里的高手,大家一致认为通过函数无法实现,必须请出vba这个终极利器。
好,思路有了,考虑到我们的命题和sumif这个按条件求和的函数很类似,只是sumif是数值相加求和,而我们需要字符串相连,于是我就去搜了sumif如何用vba写出来,结果还真的搜到了。
于是我修修改改,几番调试和完善,最终搞定,函数共享出来给用的着的同学:
Public Function CONCATENATEIF(R1 As Range, TJ, Optional R2, Optional Connector) Dim ARR1, ARR2, i As Long, j As Long, F As Boolean ARR1 = R1.Value If IsMissing(R2) Then ARR2 = R1.Value Else ARR2 = R2.Value End If S = "" If Not (TJ Like "[= ,< , <= ,> ,>= , <> ]" & "*") And IsNumeric(TJ) Then TJ = "=" & TJ End If For i = 1 To UBound(ARR1) For j = 1 To UBound(ARR1, 2) If Not (TJ Like "[= ,< , <= ,> ,>= , <> ]" & "*") Then If ARR1(i, j) = TJ Then S = S & Connector & ARR2(i, j) Else If Evaluate(Val(ARR1(i, j)) & TJ) Then S = S & Connector & ARR2(i, j) End If Next j Next i CONCATENATEIF = S End Function
在 excel 里按 alt+f11 就可以调出窗口,选择新建模块,复制粘贴进去保存,然后再要用的单元格里写入如下表达式即可,不过注意,必须保存为带宏的excel文件格式才行。
=CONCATENATEIF(D3:D14,"A",L3:L14,"-")
=CONCATENATEIF(条件区域,条件[[,获取字符串区域],分隔符也叫连接符号])
意思和参数解释下:从D3:D14范围内寻找所有值为”A”对应的L列中的所有值并以”-“作为分隔符连接。
和sumif用法一样,只是多了最后一个参数:分隔符。
以下为原作者原创代码,页尾还有原帖链接。
原帖标题:谁知道excel中sumif函数的vba写法???_百度知道
[原创] Public Function TJQH(R1 As Range, TJ, Optional R2) Dim ARR1, ARR2, i As Long, j As Long, S As Double, F As Boolean ARR1 = R1.Value If IsMissing(R2) Then ARR2 = R1.Value Else ARR2 = R2.Value End If S = 0 If Not (TJ Like "[= ,< , <= ,> ,>= , <> ]" & "*") And IsNumeric(TJ) Then TJ = "=" & TJ End If For i = 1 To UBound(ARR1) For j = 1 To UBound(ARR1, 2) If Not (TJ Like "[= ,< , <= ,> ,>= , <> ]" & "*") Then If ARR1(i, j) = TJ Then S = S + Val(CStr(ARR2(i, j))) Else If Evaluate(Val(ARR1(i, j)) & TJ) Then S = S + Val(CStr(ARR2(i, j))) End If Next j Next i TJQH = S End Function
把代码粘贴到模块中,然后在工作表中就可象输入SUMIF函数一样使用这个自定义的TJQH函数。
=TJQH(条件区域,条件[,求和区域])
- 追问
- 那的方法和原sumif 效率有天壤之别
- 回答
- 可以实现SUMIF函数功能,但计算效率肯定不如SUMIF函数了。只是在假设没有这个函数的情况写的替代品吧,不过写起来还是有些难度的。