每当我运行下面的代码时,excel和VBA都会冻结,然后在执行几秒后崩溃。我试图找出原因并尝试修复它。相关代码如下:
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"是一个大约有5万行的数据表。 " SomeSheet2"是一个以编程方式填充sumifs结果的表,这些结果来自" SomeSheet"基于" SomeSheet2"的行和列。代码在第3行和第25列(i = 3,j = 25)之后大致开始冻结,然后完全崩溃。但它永远不会在同一个地方。这让我觉得问题不在于数据。我认为问题可能与" sumifs"如果我更换这一行,请致电:
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
带
ws2.Cells(i, j).Value = 1
它仍然崩溃但后来(i = ~50,j = ~60)。我认为这与以某种方式填写的Excel内存有关,但不知道其局限性,我不知道如何编写代码并完成我想做的事情......
答案 0 :(得分:1)
正在发生的事情是excel有太多数据无法使用。由于它需要很长时间,看起来像它不起作用,但它实际上正在运行。它最终将解冻。
但是,您可以添加DoEvents
,这样,每次代码执行此操作时,它都会让您重新控制excel,使其再次运行。
但要注意,因为它会让你恢复控制,你可能会意外地在一个单元格上输入数据,这将使你的代码停止。如果发生这种情况,您可能需要重新开始。
此外,这将使代码运行速度变慢。花费的时间比现在花费的时间要长。