代码运行速度比其他文件/日期慢

时间:2018-03-27 13:48:16

标签: performance excel-vba runtime vba excel

我运行下面的代码,循环查看6.5万个标准单元格,这些标准是根据" LISTS"中包含的范围查找的。标签提到。这个范围大约是2万行。

我昨天在测试文件中多次运行代码并且运行得非常快。也许2分钟:如果那样。

今天,在决定我对代码感到满意之后,我已经把它贴上了(因为我想知道这是否与它有关)在我的主项目中。 现在,当我运行代码时,需要2个小时的时间!

除了工作表名称之外,我没有更改任何代码。

有没有人知道我遗失的任何原因?

我是VBA的新手,所以我怀疑某个新手的错误!

Dim x As Long
x = WorksheetFunction.CountA(Columns(1))

'define string length for CELL loop
Dim char As Integer
char = Len(ActiveCell)

'define cell loop name
Dim counter As Integer

'Begin RANGE loop
For Each cell In Range("b1:b" & x)
    cell.Activate

    'Incorporate CELL loop
    For counter = 1 To char
        'Determine if numeric value present in cell = TRUE or FALSE
        If IsNumeric(Right(Mid(ActiveCell, 1, counter), 1)) = True Then
            ActiveCell.Offset(0, 1).Value = Right(ActiveCell.Offset(0, 0), Len(ActiveCell.Offset(0, 0)) - counter + 1)
            Exit For
        Else
            ActiveCell.Offset(0, 1).Value = ActiveCell.Offset(0, 0)
        End If
    Next
Next

3 个答案:

答案 0 :(得分:2)

尝试下面的代码,代码注释中的解释:

Dim x As Long
Dim char As Long 'define string length for CELL loop
Dim counter As Long 'define cell loop name

x = WorksheetFunction.CountA(Columns(1))

Application.ScreenUpdating = False ' will make your code run faster
Application.EnableEvents = False


'Begin RANGE loop
For Each cell In Range("b1:b" & x)
    'cell.Activate ' <--- no need to Activate, realy slows down your code

    'Incorporate CELL loop
    For counter = 1 To char

        'Determine if numeric value present in cell = TRUE or FALSE
        If IsNumeric(Right(Mid(cell.Value, 1, counter), 1)) = True Then
            cell.Offset(0, 1).Value = Right(cell.Value, Len(cell.Value) - counter + 1)
            Exit For
        Else
            cell.Offset(0, 1).Value = cell.Value
        End If
    Next counter
Next cell

Application.ScreenUpdating = True
Application.EnableEvents = True

答案 1 :(得分:1)

您需要避免使用ActiveCell,只要它减慢您的代码速度。您正在使用for-each进行循环,因此您可以像这样使用循环中的变量:

For Each cell In Range("b1:b" & x)
    For counter = 1 To char
        If IsNumeric(Right(Mid(cell, 1, counter), 1)) = True Then
            cell.Offset(0, 1).Value = Right(cell, Len(cell) - counter + 1)
            Exit For

        Else
            cell.Offset(0, 1) = cell.Offset(0, 0)

        End If
    Next
Next

此外,像cell.Offset(0, 0)这样的东西有点无用。如果您不需要Offset,请不要编写它。总的来说:

答案 2 :(得分:0)

感谢所有花时间发帖的人。 原来我是一个IDIOT !!!

我第一次运行代码时,我认为自动计算,而且当我重新运行代码时,我一直在评论它。

我是VBA的新手,但没有任何借口!哎!

所以,修复(由线程上的其他人建议):

在宏的主体之前输入:

Application.Calculation = xlCalculationManual

然后在宏之后输入:

Application.Calculation = xlCalculationAutomatic