VIP学员的问题,要将摘要和金额按各种费用拆分到后面。实际有几百行数据,为了方便说明只截图10几行。
摘要很乱,里面混合着很多无关的内容。比如电费一月500,一月这2个字就是无关的。停车费半年、停车费一年卡,半年、一年卡这些也是无关。还有租金之类后面还有日期2023.5.1,很容易把日期也提取进去。多种费用同时存在,等等。
一个字,乱!
理论上这种表格是宣布无解的,不过在我的老乡24小时的不断测试,改了无数次代码,最后终于解决了。
让我们来一起见证这个牛逼的公式。
=FeiyongGuilei_Split($B2,D$1,$C2)
最右边是我用公式验证结果,全部正确。
=IF(SUM(D2:I2)-C2=0,"正确","错误")
公式看起来挺简单的,因为这是VBA自定义函数,核心还是背后的VBA代码。
开发工具,VB,模块,就看到这段很长的代码,一个界面截图不完,后面还有。
完整代码:
Function FeiyongGuilei_Split(Rng As Range, Gjz As String, Sz_CurRng As Range) As Currency
Dim regEx As Object, CurRng As Range, Arr, Brr
Dim Str As String, Reg_mat As Object, Reg_matF As Object
Dim Sums As Currency, Sz_Cur As Currency
Set regEx = CreateObject("VBScript.RegExp")
Str = Rng.Value
For Each CurRng In Sz_CurRng
If CurRng <> 0 Then Sz_Cur = CurRng.Value
Next CurRng
With CreateObject("VBScript.RegExp")
Rem 替换日期区间
.Pattern = "(\d{4}\.\d{1,2}\.\d{1,2}-\d{4}\.\d{1,2}\.\d{1,2})"
Str = .Replace(Str, "")
Str = Replace(Str, "()", "")
End With
Arr = Split(Str, ",")
For Each Brr In Arr
If InStr(Brr, Gjz) > 0 Then
Str = Mid(Brr, InStr(Brr, Gjz))
If IsNumeric(Right(Str, 1)) Then
With regEx
'提取规则 "(.)+\d+(\.\d+)?"
.Pattern = "\d+(\.\d+)?"
.Global = True '匹配所有满足的数据
Str = .Execute(Str)(0)
Sums = Sums + NumRegex(Str)
End With
End If
End If
Next Brr
FeiyongGuilei_Split = IIf(Sums = 0 And Str Like "*" & Gjz & "*", Sz_Cur, Sums)
End Function
Function NumRegex(Str As String) As String
With CreateObject("VBScript.RegExp")
.Pattern = "\d+(\.\d+)?"
.Global = True
NumRegex = .Execute(Str)(0)
End With
End Function