2013-10-24 75 views
0

这是因为这不是写这段代码的有效方法,或者它只是在像这样的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 

回答

2

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

你的第一个循环运行45751次。

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

每次你的第二次循环运行时,它会运行你的第三次循环413次。你的第三回合将总共运行472,379,075次。

我不知道你用这个脚本试图实现什么,但它不是非常有效。

+0

基本上在同一张表中,列A和列B有45,751条记录(对于rcounter = 2到45752)。列A具有这些可能的值(对于xcounter = 26到50)并且列B具有这些可能的值(对于ycounter = 2到414),则这个x轴xcounter和y asix ycounter表,用这一行一行一行地搜索I每当它出现时都需要加1。 – Teemo

1

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

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

For ycounter = 2 To 414 

之前,以减少不必要的比较

+0

是的,我认为这有帮助,thx! – Teemo

+0

这可以显着缩短执行时间吗? – sam092

+0

我刚试过,速度如此之快,就像1分钟一样。即使我认为它没有什么帮助,因为A列和B列数据总是在最终的x轴和y轴上,所以我认为这将无助于忽略很多数学:)。 – Teemo

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次,所以它可能还需要一段时间。您可能想要考虑是否真的需要多次检查所有这些单元格。