VBA代码效率/潜在内存泄漏?

时间:2014-05-11 06:17:38

标签: excel vba performance

我在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中的垃圾收集器?) 有什么帮助吗?

谢谢!

1 个答案:

答案 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

其他评论也有很好的建议 - 根据您的单元格中有多少文本,读取/写入单元格值的过程可能或多或少是一个因素,使用变量数组可能会获得很多性能(只要您的选择中没有公式,如果使用该方法就会被覆盖)