VBA错误:为什么我的代码会继续跳回来?

时间:2015-01-12 22:24:15

标签: excel vba excel-vba

我为代码转储道歉,但经过两天的调试后,我想我开始失去它了,而且我变得绝望了。我开发了下面显示的代码

intColumnCount = wsStaff.Cells(1, Columns.Count).End(xlToLeft).Column  
intColumnLoop = 2  
intStaffCount = 0  
wsDisplay.Range("A2").EntireRow.UnMerge  
wsDisplay.Range("A2").EntireRow.Value = ""  
Do  
  intRowCount = wsStaff.Cells(Rows.Count, intColumnLoop).End(xlUp).Row  
  intRowLoop = 2  
  Do  
    If IsEmpty(wsStaff.Cells(intRowLoop, intColumnLoop)) And intRowLoop <> 2 Then  
      wsStaff.Range(wsStaff.Cells(intRowLoop, intColumnLoop).Address).Delete Shift:=xlUp  
      intRowCount = wsStaff.Cells(Rows.Count, intColumnLoop).End(xlUp).Row  
    Else  
      intStaffCount = intStaffCount + 1  
      If wsDisplay.Cells(1, intStaffCount + 2).Value <> wsStaff.Cells(intRowLoop, intColumnLoop).Value And wsDisplay.Cells(1, intStaffCount + 2).Value <> wsStaff.Cells(intRowLoop + 1, intColumnLoop).Value And wsDisplay.Cells(1, intStaffCount + 2).Value <> wsStaff.Cells(2, intColumnLoop + 1).Value And wsDisplay.Cells(1, intStaffCount + 2).Value <> "" Then  
        wsDisplay.Range(wsDisplay.Cells(1, intStaffCount + 2).Address).EntireColumn.Delete Shift:=xlToLeft  
        intRowCount = wsStaff.Cells(Rows.Count, intColumnLoop).End(xlUp).Row  
        intStaffCount = intStaffCount - 1  
      ElseIf wsDisplay.Cells(1, intStaffCount + 2).Value = wsStaff.Cells(intRowLoop + 1, intColumnLoop).Value Or wsDisplay.Cells(1, intStaffCount + 2).Value = wsStaff.Cells(2, intColumnLoop + 1).Value Or wsDisplay.Cells(1, intStaffCount + 2).Value = "" Then  
        wsDisplay.Range(wsDisplay.Cells(1, intStaffCount + 2).Address).EntireColumn.Insert Shift:=xlToRight  
        wsDisplay.Cells(1, intStaffCount + 2).Value = wsStaff.Cells(intRowLoop, intColumnLoop).Value  
        intRowLoop = intRowLoop + 1  
      Else  
        intRowLoop = intRowLoop + 1  
      End If  
      If wsDisplay.Cells(1, intStaffCount + 2).Value = wsDisplay.Cells(1, intStaffCount + 1).Value Then  
        wsDisplay.Range(wsDisplay.Cells(1, intStaffCount + 2).Address).EntireColumn.Delete Shift:=xlToLeft  
        intRowCount = wsStaff.Cells(Rows.Count, intColumnLoop).End(xlUp).Row  
        intStaffCount = intStaffCount - 1  
      End If  
      wsDisplay.Cells(1, intStaffCount + 2).Interior.Color = RGB(255 - (0.1 * (255 - intColourPalette(intColumnLoop Mod 6 + 1, 1))), 255 - (0.1 * (255 - intColourPalette(intColumnLoop Mod 6 + 1, 2))), 255 - (0.1 * (255 - intColourPalette(intColumnLoop Mod 6 + 1, 3))))  
    End If  
  Loop While Not intRowLoop > intRowCount  
  wsDisplay.Range(wsDisplay.Cells(2, 4 + intStaffCount - intRowCount).Address, wsDisplay.Cells(2, 2 + intStaffCount).Address).Merge  
  wsDisplay.Range(wsDisplay.Cells(2, 4 + intStaffCount - intRowCount).Address).Interior.Color = RGB(intColourPalette(intColumnLoop Mod 6 + 1, 1), intColourPalette(intColumnLoop Mod 6 + 1, 2), intColourPalette(intColumnLoop Mod 6 + 1, 3))  
  wsDisplay.Cells(2, 4 + intStaffCount - intRowCount).Value = wsStaff.Cells(1, intColumnLoop).Value  
  wsDisplay.Cells(2, 4 + intStaffCount - intRowCount).Font.Bold = True  
  wsDisplay.Cells(2, 4 + intStaffCount - intRowCount).Font.Color = RGB(255, 255, 255)  
  intColumnLoop = intColumnLoop + 1  
Loop While Not intColumnLoop > intColumnCount  
wsDisplay.Cells(1, 1).EntireRow.Orientation = -45  
wsDisplay.Cells(1, 1).EntireRow.HorizontalAlignment = xlRight  
wsDisplay.Range(wsDisplay.Cells(1, 3), wsDisplay.Cells(2, intStaffCount + 2)).Borders.LineStyle = xlContinuous  
intDisplayRowLength = wsDisplay.Cells(1, Columns.Count).End(xlToLeft).Column  
intEraser = intStaffCount + 3  
wsDisplay.Range(wsDisplay.Cells(1, intEraser), wsDisplay.Cells(1, intDisplayRowLength)).EntireColumn.Delete Shift:=xlToLeft  
End Sub

所以我有两个问题,都涉及代码跳回行和重新执行代码。我通过在不同的变量条件下使用断点上的几乎所有代码逐步执行代码数百次来解决这个问题。

每当重新定义intRowCount时,代码经常会跳回到开始,此错误对输出无害,但它会大大增加计算时间。我知道这可能是内置于Do循环中,因此不方便,但不是最大的问题。

最大的问题是倒数第二行,在删除所有不必要的列之后,代码将跳转到最后一个if语句,该语句位于嵌套的do循环中。我不知道它为什么会跳回来,最重要的是,似乎intRowCount,intRowLoop,intColumnCount和intColumnLoop变量改变为允许重复的代码循环。

这是如此灾难性的原因是因为intStaffCount没有改变,意味着数据被添加两次。

如果有人能提供任何见解,我们将不胜感激。

编辑:它跳转到代码中添加新项目的位置,并选择无限制地执行,只要它到达第二个最后一行。

编辑2:它实际上是到达结束子线,它只是没有结束

编辑3:在显示的代码外部找到的解决方案,在调用子代码之前必须禁用事件,并在

之后重新启用

1 个答案:

答案 0 :(得分:1)

问题不存在于我的模块代码中,而是在事件代码中,通过在调用程序时禁用事件,问题得以解决。感谢barrowc提供解决方案。