我为代码转储道歉,但经过两天的调试后,我想我开始失去它了,而且我变得绝望了。我开发了下面显示的代码
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:在显示的代码外部找到的解决方案,在调用子代码之前必须禁用事件,并在
之后重新启用答案 0 :(得分:1)
问题不存在于我的模块代码中,而是在事件代码中,通过在调用程序时禁用事件,问题得以解决。感谢barrowc提供解决方案。