我在VBA中有以下代码,它在excel中翻译每个单词中的希伯来字母(省略英文数字,其余部分:
Sub reverseHebrewInSelection()
Application.Calculation = xlManual
Dim c As Range
For Each c In Selection
c.Value = reverseOrderHebrew(c.Value)
Next c
Application.Calculation = xlAutomatic
End Sub
Function reverseOrderHebrew(ByVal str As String) As String
Dim str2 As String
str2 = ""
Dim engLettersCount As Integer
engLettersCount = 0
For i = Len(str) To 1 Step -1
If engLetter(Mid(str, i, 1)) Then
Do While ((i - engLettersCount) <> 0)
If engLetter(Mid(str, i - engLettersCount, 1)) Then
engLettersCount = engLettersCount + 1
Else
Exit Do
End If
Loop
'not english letter or end of string
str2 = str2 + Mid(str, i - engLettersCount + 1, engLettersCount)
i = i - engLettersCount + 1
engLettersCount = 0
getOut = 0
Else
str2 = str2 + Mid(str, i, 1)
End If
Next i
reverseOrderHebrew = str2
End Function
Function engLetter(ByVal char As String) As Boolean
If char < "א" Or char > "ת" Then
engLetter = True
Else
engLetter = False
End If
End Function
当我在一个相当大的选择上运行此代码时,excel实例似乎陷入困境并且没有响应。代码在较小的选择上执行正常。电脑功率不错。
我知道我的算法的效率是O(n ^ 2),但它仍然不应该坚持整个运行过程。
我怀疑内存泄漏但无法找到它(vba中的垃圾收集器?) 有什么帮助吗?
谢谢!
答案 0 :(得分:1)
你可以尝试这个版本的算法 - 在我的测试中它有点(~2x)更快(但是我没有任何希伯来语文本可供测试,所以我使用了显示的截止值......)
Function reverseOrderHebrew2(str As String) As String
Dim i As Long, c As String, sOut As String
Dim tmp As String
i = Len(str)
sOut = ""
tmp = ""
Do While i >= 1
c = Mid(str, i, 1)
If c < "a" Or c > "l" Then
tmp = c & tmp
Else
If Len(tmp) > 0 Then
sOut = sOut & tmp
tmp = ""
End If
sOut = sOut & c
End If
i = i - 1
Loop
If Len(tmp) > 0 Then sOut = sOut & tmp
reverseOrderHebrew2 = sOut
End Function
其他评论也有很好的建议 - 根据您的单元格中有多少文本,读取/写入单元格值的过程可能或多或少是一个因素,使用变量数组可能会获得很多性能(只要您的选择中没有公式,如果使用该方法就会被覆盖)