每當我運行下面的代碼時,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內存被填補某種程度上,但不知道的限制,我不知道如何編碼周圍,並完成我想要做的事情...
它實際上是否崩潰或它得到「沒有響應」? – Moacir
它得到「沒有迴應」。我沒有任何錯誤信息或任何東西。我試圖讓它運行1小時,看看它是否會再次開始響應,但它沒有。 – user2997154
在'For Each rw在ws2.Rows'中,在下一行之後,插入'DoEvents'。當他沒有響應時,這將解鎖excel。但是它會使計算速度變慢。如果你做了任何輸入,或者嘗試使用另一個工作表,你的代碼可能會產生不希望的影響 – Moacir