2015-04-23 88 views
0

我有一行代码在调试时完美运行,但在完全执行时一直崩溃。实质上,它应该做的是组合两行数据。我这样做是因为我从数据库导入数据,在该数据库中,它将事务记录在两行中:事务的一侧在一行上,而另一侧在另一行上,前一列的所有数据都是位于这些行中的任何一行上。因此,例如:代码在调试时运行良好,但在完全执行期间崩溃

 
|trans 1 | 1/1/2015| $500.00| 0 

|trans 1 |---------| 0| 497.00| 

理想情况下,应该像

 
|trans 1|1/1/2015|500.00|497.00| 

第二排应予删除。

这是我的代码做到这一点:

Sub Collapse_Rows() 
    Dim ALLCS As Worksheet 

    Set ALLCS = Sheets("Asset LLC (Input)") 
    On Error Resume Next 
    Application.EnableEvents = False 

    For x = 66515 To 16 Step -1 
     If ALLCS.Cells(x, 2) = ALLCS.Cells(x + 1, 2) Then 
      If ALLCS.Cells(x, 28) <> Empty Then 
       ALLCS.Cells(x + 1, 28) = ALLCS.Cells(x, 28) 
      End If 
     End If 

     If ALLCS.Cells(x - 1, 2) = ALLCS.Cells(x, 2) Then 
      If ALLCS.Cells(x, 28) <> Empty Then 
       ALLCS.Cells(x - 1, 28) = ALLCS.Cells(x, 28) 
      End If 
     End If 

     If ALLCS.Cells(x, 5) <> Empty And ALLCS.Cells(x, 2) = Empty Then 
     ElseIf ALLCS.Cells(x, 24) = Empty Then 
      ALLCS.Cells(x, 24).EntireRow.Select 
      Selection.Delete 
     End If 
    Next 
End Sub 

我部分在调试运行这段代码和它工作得很好。当我完全运行代码时,excel崩溃了为什么/如何防止这种情况发生的任何想法?

+0

你应该尝试并添加调试语句(如debug.print)了解此时它崩溃 – Xarylem

+0

究竟会是做什么@Xarylem是 – dom176

+0

ELSEIF在这里纠正 - * ElseIf ALLCS.Cells(x,24)= Empty然后*或它应该是只有在? –

回答

2

乍一看,它似乎是问题的一个主要部分在于代码本身有点资源密集的事实。

首先,它从第66515行开始。是否有从这里开始的理由?这意味着在大多数情况下,将会有大约33,250行删除执行(从16 - > 66515的每隔一行)。这将需要很长时间,并且在很多情况下,Excel将无响应。

有几个选项。

确定您是否真的需要在第66515行开始循环。这是一个固定的起点吗?如果没有,使用代码来确定实际数据集的最后一行并从那里开始。

此外,在您的代码开始处,使用:Application.ScreenUpdating = False关闭SceenUpdating。 在你的代码的结束,重新打开它使用Application.ScreenUpdating = True

+0

要增加上述内容还有一件事是用'ALLCS.Cells(x,24).EntireRow.delete'替换'ALLCS.Cells(x,24).EntireRow.Select'并移除'Selection.delete'以获得摆脱不必要的选择步骤。 – Sobigen

+0

66515是一个固定的起点,我有这个建议,整个.select移动是一个尝试修复这个问题。 – dom176

相关问题