将 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。请参阅我对您上一个问题的回答。
我正在使用此 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。请参阅我对您上一个问题的回答。