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

Pass of `ByVal` argument to Regex function leads to very slow code , although using Array

我正在使用此 Regex function 来(如果数字计数 >= 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

一般来说;使用正则表达式会减慢速度。 common string-operations 更快是正确的。那么,为什么不使用它们呢:

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

根据您的测试此功能:

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

Returns:


使用的技巧:

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

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