2013-10-24 104 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次,所以它可能還需要一段時間。您可能想要考慮是否真的需要多次檢查所有這些單元格。