性能优化

时间:2017-05-10 08:43:06

标签: excel vba performance excel-vba optimization

我有一些代码,占用了90%的运行时间。

大约有8000行,信息存储在A列中。这段代码将此信息拆分到其他列中。 运行大约需要15分钟(:O)。 关于如何提高绩效的任何建议?

For i = 2 To Row_Number ' Loop for each row

    If InStr(Cells(i, 1), "//") = 0 Then ' This means that if // appears somewhere in the text we delete all the rows (including this one) (see Else :) and stop the loop
        j = 1
        Do Until Mid(Cells(i, 1), j, 1) = ";"
            j = j + 1
        Loop
        LongVIN = Mid(Cells(i, 1), 1, j - 1)
        k = j
        j = j + 1
        Do Until Mid(Cells(i, 1), j, 1) = ";"
            j = j + 1
        Loop
        Cells(i, 3) = Mid(Cells(i, 1), k + 1, j - k - 1) ' Model
        k = j
        j = j + 1
        Do Until Mid(Cells(i, 1), j, 1) = ";"
            j = j + 1
        Loop
        Cells(i, 4) = Mid(Cells(i, 1), k + 1, j - k - 1) ' Dealer
        k = j
        j = j + 1
        Do Until Mid(Cells(i, 1), j, 1) = ";"
            j = j + 1
        Loop

        k = j
        j = j + 1
        Do Until Mid(Cells(i, 1), j, 1) = ";"
            j = j + 1
        Loop
        Cells(i, 6) = Mid(Cells(i, 1), k + 1, j - k - 1) ' Region

        k = j
        j = j + 1
        Do Until Mid(Cells(i, 1), j, 1) = ";"
            j = j + 1
        Loop
        Cells(i, 7) = CDate(Mid(Cells(i, 1), k + 1, j - k - 1)) ' Retail Date
        k = j

        Cells(i, 5) = Mid(Cells(i, 1), k + 1, Len(Cells(i, 1)) - k) '(Len - (k+1) +1) Dealer Name

        Cells(i, 1) = Mid(LongVIN, 1, 10)
        Cells(i, 2) = Mid(LongVIN, 11, 7)

    Else:
        Range("A" & i & ":A" & Row_Number).Delete 'ClearContents
        Exit For

    End If

Next i

1 个答案:

答案 0 :(得分:4)

通过将数据存储在数组中,对阵列进行操作以及将数据存储回电子表格,您应该会看到性能的显着提升。

类似的东西:

Dim data As Variant
Dim result As Variant

data = Range(Cells(2, 1), Cells(Row_Number, 1))
Redim result (1 To Row_Number, 1 To 7) As Variant

现在,您不是从Cells(i, 1)阅读,而是从data(i, 1)开始阅读而不是写信给Cells(i, n),而是写信给result(i, n)

在代码的最后:

Range(Cells(2, 1), Cells(Row_Number, 7)) = result