每当我运行下面的代码时,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