为什么excel在运行以下vba代码时会继续崩溃?

时间:2017-09-05 18:31:37

标签: excel vba excel-vba

每当我运行下面的代码时,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内存有关,但不知道其局限性,我不知道如何编写代码并完成我想做的事情......

1 个答案:

答案 0 :(得分:1)

正在发生的事情是excel有太多数据无法使用。由于它需要很长时间,看起来像它不起作用,但它实际上正在运行。它最终将解冻。

但是,您可以添加DoEvents,这样,每次代码执行此操作时,它都会让您重新控制excel,使其再次运行。

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

此外,这将使代码运行速度变慢。花费的时间比现在花费的时间要长。