编程技术分享平台

网站首页 > 技术教程 正文

SUMIF函数支持正则了?!(sumifs的条件能否用函数)

xnh888 2024-10-17 17:32:59 技术教程 21 ℃ 0 评论

前两天,在网上搜索SUMIF,无意中看到了这个SUMIF用法,支持正则,自己看了看,苹果的,再看看好像也不是MAC版本的,好吧!其他表格软件的,那么Excel能否支持呢?能,睡不着,要不我们一起也写一个吧!

实现这样的一个自定义函数,并没有什么难度,只要引入正则,加循环判断即可!我们随手写一下即可!

5分钟左右写完收工,我们做一些测试看看效果


▍案例1:对姓名3个字的人员数据求和

这里的“.” 就是正则中的非换行符之外的任意单个字符,{3}表示3个

=EJSUMIF(A1:A16,".{3}",B1:B16)

这或许普通函数也能搞定,并没有什么难的,因为SUMIF本身也是支持通配符,我们加点难度!


▍案例2:对特定项目求和

?需求说明:对项目编码是2位大写字母+4或者5位数字组成的对应的数据求和

=EJSUMIF(A1:A11,"[A-Z]{2}\d{4,5}(?!\d)",B1:B11)


▍案例3:杂乱日期汇总

这个稍微复杂点,说白了第二参数就专门为正则打造的!

=EJSUMIF(A1:A5,".*?[./年\-](6|06)[./月\-].+?",B1:B5)


今天半夜失眠,写的比较随意没有做优化,后面还可以改改,把SUMIF本身的功能也加上,再做一些速度优化,因为就比较完美了!

▍原码分享

随手写可用,尚可优化完善!

Option Explicit


'功能:正则版本-SUMIF
'作者:E精精
'时间:20230524
'-------------------------------
Function EJSUMIF(cr_range, _
    reStr As String, rs_range)
    Dim re As Object, rs As Long, i As LongSUM    cr_range = Application.Intersect(cr_range, _
        cr_range.Parent.UsedRange).Value
    rs_range = Application.Intersect(rs_range, _
        rs_range.Parent.UsedRange).Value
    Set re = CreateObject("vbscript.regexp")


    With re
        .Global = True
        .Pattern = reStr
        For i = 1 To UBound(cr_range)
            If .test(cr_range(i, 1)) Then
                rs = rs + rs_range(i, 1)
            End If
        Next
    End With
    EJSUMIF = rs
End Function


目前,其实已经写了好几个比较好用的多功能增强函数,未来可能会发布EJ函数库,考虑智能提示问题,需要使用ExcelDNA重写,由于最近在更新学习圈的系列教程,一直没时间……

关于正则的学习,欢迎加入学习圈,系列教程以比较完善且有答疑!

今天的内容就到这里,快去试试吧,任何函数加上正则表达式就有无尽可能!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表