|
楼主 |
发表于 2023-12-11 17:30
|
显示全部楼层
本帖最后由 ggmmlol 于 2023-12-27 19:25 编辑
更新:
现在,可以在WPS中加载使用了!
更新:添加 “多栏排版” 和 “逆透视”两个新功能。
更新:添加“填充合并”功能(合并单元格区域内的空值补全,而且保留合并格式不变,方便用公式统计查询。)
更新定义函数REGMATCHES,增加两个参数,以支持对匹配项,按顺序或倒序截取指定的第n项或前n项。
- Function REGMATCHES(ByVal Pttn$, ByVal Icase, ByVal id, ByVal Slice, ParamArray Text1())
- '/参数说明:
- '/ (Pttn) 正则表达式。字符串值。必须。
- '/ (Icase) 是否区分大小写。布尔值。可省略(但必须用半角逗号","占位,取False)。
- '/ (id) 取匹配项的第n项(或 前n项)。长整数。可省略(但必须用半角逗号","占位,取0)。id =0 时,提取所有匹配项;id >0 时,按顺序取。id为负数时,按逆序取
- '/ (Slice) 是否截取id之前的所有项。布尔值。可省略(但必须用半角逗号","占位,取True)
- '/ (Text1)
- '/ 返回值:REGMATCHES。无匹配,返回空字符串。取到1个或多个匹配项时,返回字符串或字符串数组。
- '/ 功能特点:自动判断是否存在捕获分组。当存在时,只取捕获分组的内容(如有多个捕获分组,则合并),忽略捕获分组外的内容。当不存在捕获分组时,取匹配到的整个内容。
- '/ 这样,可以解决VBScript.RegExp不支持逆序零宽断言的问题。比如要取美元金额(即美元货币符号"$"的数值)时,可以用"$(\d+(?:\.\d+))"。
- '/ 当要提取人民币金额(字符“元”之前的数值),可以用"\d+(?:\.\d+)?(?=元)",也可以用"(\d+(?:\.\d+)?)元"
- Dim ar, i, j, tmp$(), n&, ma As Match, sma, itm, HasSubMatches As Boolean, mav As String
- If IsMissing(Icase) Then Icase = 0 Else Icase = Val(Icase)
- If IsMissing(id) Then id = 0 Else id = CLng(id)
- If id = 0 Then Slice = True Else If IsMissing(Slice) Then Slice = True Else Slice = CBool(Slice)
- With CreateObject("VBScript.RegExp")
- .Global = True
- .IgnoreCase = CBool(Icase)
- .Pattern = Pttn & "|[\d\D]+"
- HasSubMatches = CBool(.Execute("a")(0).SubMatches.Count)
- .Pattern = Pttn
- ReDim tmp(1 To 1): tmp(1) = ""
- For Each itm In Text1
- If TypeName(itm) = "Range" Then ar = itm.Value Else ar = itm
- If Not IsArray(ar) Then ReDim ar(1 To 1, 1 To 1): ar(1, 1) = itm
- For i = 1 To UBound(ar)
- For j = 1 To UBound(ar, 2)
- For Each ma In .Execute(ar(i, j))
- If HasSubMatches Then
- mav = ""
- For Each sma In ma.SubMatches
- If Len(sma) > 0 Then mav = mav & sma
- Next
- mav = Mid(mav, 2)
- Else
- mav = ma.Value
- End If
- If Len(mav) > 0 Then
- n = n + 1
- If Slice Or id <= 0 Then
- ReDim Preserve tmp(1 To n)
- tmp(n) = mav
- Else
- tmp(1) = mav
- End If
- If n = id Then GoTo ret
- End If
- Next
- Next
- Next
- Next
- End With
- ret:
- If n = 0 Or id >= 0 Then
- REGMATCHES = tmp
- ElseIf Slice Then
- If -id > n Then id = -n
- For i = 1 To id
- tmp(i) = tmp(n + id + i)
- Next
- ReDim Preserve tmp(1 To -id)
- REGMATCHES = tmp
- Else
- REGMATCHES = tmp(n + id + 1)
- End If
- End Function
复制代码
小妖工具.rar
(125.6 KB, 下载次数: 76)
|
|