2017-09-05 583 views
-2

每當我運行下面的代碼時,excel和VBA都會凍結,然後在執行幾秒鐘後崩潰。我試圖找出原因並嘗試解決它。相關的代碼如下:爲什麼在運行以下vba代碼時,excel會一直崩潰?

  Dim ws As Worksheet, ws2 As Worksheet 
      Dim i As Long, j As Long 
      Application.ScreenUpdating = False 
      Application.Calculation = xlCalculationManual 
      Application.EnableEvents = False 
      Set ws = ThisWorkbook.Sheets("SomeSheet") 
      Set ws2 = ThisWorkbook.Sheets("SomeSheet2") 

      i = 2 
      j = 4 
      For Each rw In ws2.Rows 

        While Not IsEmpty(ws2.Cells(1, j)) 
         ws2.Cells(i, j).Value = (Application.WorksheetFunction.SumIfs(ws.Range("P:P"), ws.Range("A:A"), "=" & ws2.Cells(i, 1).Value, ws.Range("C:C"), "=" & ws2.Cells(i, 2), ws.Range("E:E"), "=" & ws2.Cells(i, 3), ws.Range("J:J"), "=" & ws2.Cells(1, j)))/8 
         Debug.Print i 
         Debug.Print j 
         j = j + 1 
        Wend 
        j = 4 
        i = i + 1 
      Next rw 

「SomeSheet」是一個約50k行的數據表。 「SomeSheet2」是一個表格,基於「SomeSheet2」的行和列,以編程方式填充「SomeSheet」中數據的sumifs結果。代碼在第3行和第25列(i = 3,j = 25)後大致開始凍結,然後完全崩潰。儘管如此,它絕不會處於同一個位置。這使我認爲問題不在於數據。我認爲這個問題可能涉及到 「SUMIFS」 呼叫,但如果我替換此行:

ws2.Cells(i, j).Value = 1 

ws2.Cells(i, j).Value = (Application.WorksheetFunction.SumIfs(ws.Range("P:P"), ws.Range("A:A"), "=" & ws2.Cells(i, 1).Value, ws.Range("C:C"), "=" & ws2.Cells(i, 2), ws.Range("E:E"), "=" & ws2.Cells(i, 3), ws.Range("J:J"), "=" & ws2.Cells(1, j)))/8 

它仍然崩潰,但後來(I =〜50,J =〜 60)。我認爲這是相關的Excel內存被填補某種程度上,但不知道的限制,我不知道如何編碼周圍,並完成我想要做的事情...

+1

它實際上是否崩潰或它得到「沒有響應」? – Moacir

+0

它得到「沒有迴應」。我沒有任何錯誤信息或任何東西。我試圖讓它運行1小時,看看它是否會再次開始響應,但它沒有。 – user2997154

+1

在'For Each rw在ws2.Rows'中,在下一行之後,插入'DoEvents'。當他沒有響應時,這將解鎖excel。但是它會使計算速度變慢。如果你做了任何輸入,或者嘗試使用另一個工作表,你的代碼可能會產生不希望的影響 – Moacir

回答

1

什麼是發生的事情是,Excel也有需要處理大量數據。由於它需要很長時間,所以看起來像它不起作用,但它實際上正在運行。它最終會解凍。

但是,您可以添加DoEvents,這樣,每次代碼執行此操作時,它都會讓您重新控制excel,從而使其再次運行。

但要小心,因爲它可以讓您重新控制,您可以在一個單元格中意外輸入數據,這將使您的代碼停止。如果發生這種情況,您可能需要重新開始。

此外,這會使代碼運行速度變慢。花費時間比已經花費的時間更長。