gpt4 book ai didi

arrays - 将 `ByVal` 参数传递给 Regex 函数会导致代码非常慢,尽管使用 Array

转载 作者:行者123 更新时间:2023-12-04 21:42:37 24 4
gpt4 key购买 nike

我正在使用这个 Regex function to(如果数字计数> = 9,则从字符串末尾删除数字字符),

Function Remove_Number_Regex(Text As String) As String
'Remove numbers from end of string if count of numbers(characters) >= 9
With CreateObject("VBScript.RegExp")
.Global = True
.Pattern = "\d{9,}(?=\.\w+$)"
Remove_Number_Regex = .Replace(Text, "")
End With
End Function
我尝试了excel(作为公式),它可以正常工作,没有任何错误。
然后我使用 Array 在 vba 中使用它,但出现此错误

Compile error: ByRef argument type mismatch


我通过传递 修复了该错误ByVal 参数 到 Regex 函数的声明
Function Remove_Number_Regex(ByVal Text As String) As String
这导致在(10K 行)上完成 18 秒的代码非常慢,尽管在同一数组中使用任何其他文本函数需要 0.4 秒才能完成。
提前感谢任何有用的评论和答案。
Sub Use_Function_Remove_Number_Regex()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim arg As Range, arr

With ActiveSheet
Set arg = .Range("O1", .Cells(.Rows.Count, "R").End(xlUp)) '10k rows
End With

arr = arg.value

Dim r As Long, j As Long

For j = 1 To 4
For r = 1 To UBound(arr)
arr(r, j) = Remove_Number_Regex(arr(r, j))
Next r
Next j

arg.value = arr

Application.Calculation = xlCalculationAutomatic
End Sub

最佳答案

通常来说,一般来说;使用正则表达式会减慢速度。您是正确的,常见的字符串操作更快。那么,为什么不使用它们:

Function Remove_Number(Text As String) As String

Dim nr As String: nr = CStr(Val("1" & StrReverse(Split(Text, ".")(0))))

If Len(nr) > 9 Then
Remove_Number = Replace(Text, StrReverse(Mid(nr, 2)) & ".", ".")
Else
Remove_Number = Text
End If

End Function
根据您的 previous question 测试此功能:
Sub Test()

Dim arr As Variant: arr = Array("Anomaly - allhelipads1335023398818.doc", "Anomaly - oilpipingW8.doc")

For Each el In arr
Debug.Print Remove_Number(CStr(el))
Next

End Sub
返回:
enter image description here

使用的技巧:
  • 根据点拆分输入,并返回数组中的第一个元素(从零开始);
  • 反转字符串;
  • 与“1”连接时提取数值(以防止尾随零消失);
  • 检查长度是否大于 9(占“1”),如果是,则相应地替换该值。

  • 注:根据您的 Excel 版本,您可以完全远离 VBA。请参阅我对您上一个问题的回答。

    关于arrays - 将 `ByVal` 参数传递给 Regex 函数会导致代码非常慢,尽管使用 Array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72186916/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com