2017-09-05 585 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,从而使其再次运行。

但要小心,因为它可以让您重新控制,您可以在一个单元格中意外输入数据,这将使您的代码停止。如果发生这种情况,您可能需要重新开始。

此外,这会使代码运行速度变慢。花费时间比已经花费的时间更长。