为什么我的循环这么慢?

时间:2013-10-24 01:46:53

标签: vba

这是因为这不是编写这段代码的有效方法,或者只是这样在excel上工作的速度很慢吗?我在Windows 8 64位中使用excel 2007。我的办公室笔记本是一个非常新的笔记本电脑,里面有最新的I5 cpu。这是代码:

Private Sub CommandButton1_Click()

Sheets("data").Select


For rcounter = 2 To 45752

For xcounter = 26 To 50
For ycounter = 2 To 414

If (Cells(1, xcounter) = Cells(rcounter, 4)) Then
If (CInt(Cells(ycounter, 25)) = CInt(Cells(rcounter, 10))) Then

Cells(ycounter, xcounter).Value = Cells(ycounter, xcounter).Value + 1


End If
End If

Next ycounter
Next xcounter

Next rcounter


End Sub

3 个答案:

答案 0 :(得分:2)

问题是你的嵌套循环,这可以分解:

你的第一个循环运行45,751次。

每次第一次循环运行时,它将运行第二次循环25次,导致第二次循环运行1,143,775次。

每次第二次循环运行时,它将运行第三次循环413次。你的第三个循环总计将达到472,379,075次。

我不知道你用这个脚本想要实现什么,但效率不高。

答案 1 :(得分:2)

正如here中所解释的,提高excel-vba计算性能的最重要步骤是使用范围数组复制而不是逐个单元浏览。

以下是您如何为您的示例执行此操作:

Private Sub CommandButton1_Click()

Sheets("data").Select

Dim cels() as Variant
cels = Range("A1", "AA45752")

For rcounter = 2 To 45752

    For xcounter = 26 To 50
        For ycounter = 2 To 414

            If (cels(1, xcounter) = cels(rcounter, 4)) Then
                If (CInt(cels(ycounter, 25)) = CInt(cels(rcounter, 10))) Then

                    cels(ycounter, xcounter).Value = cels(ycounter, xcounter).Value + 1

                End If
            End If

        Next ycounter
    Next xcounter

Next rcounter

Range("A1", "AA45752") = cels

End Sub

这应该快得多。当然,虽然你仍在循环(45752-1)*(50-25)*(414-1)或472,379,075次,所以它可能还需要一段时间。您可能想要考虑是否确实需要多次检查所有这些单元格。

答案 2 :(得分:1)

不知道这是否有助于改善这种情况。您可以尝试移动以下行

If (Cells(1, xcounter) = Cells(rcounter, 4)) Then

之前

For ycounter = 2 To 414

减少不必要的比较