为什么.autoFill导致Excel崩溃?

时间:2019-06-10 23:46:06

标签: excel vba

我有一个电子表格,下面是它的摘录:

enter image description here

理想情况下,当我向colC添加日期时,各列会自动用截止日期将日期向下填充到最后一行。这是我的代码(其中也包含一些排序内容,工作正常);我认为,lastDrag定义后的部分是问题所在:

Private Sub Worksheet_Change(ByVal Target As Range)
'On Error Resume Next

Dim firstRow As Long
Dim insRow As Long
Dim lastRow As Long

If Not Intersect(Target, Range("A:AC")) Is Nothing Then

    With ActiveWorkbook.ActiveSheet

        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        .Sort.SortFields.Clear

        .Sort.SortFields.Add(Range("AC1:AC" & lastRow), _
            xlSortOnCellColor, xlDescending, , xlSortNormal).SortOnValue.Color = RGB(191, 191, 191)

        ' ^^ sorts the "gray" (closed) exchanges at the bottom)

        .Sort.SortFields.Add Key:=.Range("AC1:AC" & lastRow), _
            SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

        ' ^^ sorts closed files by file close date

        .Sort.SortFields.Add Key:=.Range("C1:C" & lastRow), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

        ' ^^ sorts open files by RQ close date
        ' THIS IS WHERE CONDITIONS SHOULD BE
        ' IF no id has been entered, sort by...
        ' IF id has been entered, sort by...

        .Sort.SortFields.Add(Range("K1:K" & lastRow), _
            SortOn:=xlSortOnCellColor, Order:=xlDescending, DataOption:=xlSortNormal).SortOnValue.Color = xlNone

        ' ^^ makes sure that the non-colored rows are sorted??

        With .Sort
            .SetRange Range("A1:AC" & lastRow)
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With

        lastDrag = .Cells(.Rows.Count, "C").End(xlUp).Row

        Range("D2").Select
        Selection.AutoFill Destination:=Range("D2:D" & lastDrag), Type:=xlFillDefault
'        ^^ this seems to work but it loops forever...


    End With

End If

End Sub

当前,似乎Excel会一遍又一遍地自动填充,直到崩溃为止。为什么?

有没有一种方法可以自动填充D,E,H,J等列(即一堆不相邻的列)?我有类似Range("D2,E2,H2..." & lastDrag)...

的东西

2 个答案:

答案 0 :(得分:2)

Private Sub Worksheet_Change(ByVal Target As Range)

每次更改工作表时都会触发此工作表事件,无论是由用户触发还是由您自己的代码触发。您需要将EnableEvents设置为False以防止再次输入,并在完成后返回True-是否引发错误:

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo ErrHandler
    Application.EnableEvents = False

    '...code...

CleanExit:
    Application.EnableEvents = True
    Exit Sub
ErrHandler:
    Stop 'debug me
    Resume CleanExit
End Sub

当您从另一个调用过程时,新过程被推入调用堆栈中;当该过程退出时,它会从调用堆栈中被弹出 /移除。通常这不是问题,但是,如果事情变得递归且失去控制,最终调用堆栈将无法更深入,并且VBA运行时会崩溃。.在这种情况下,将宿主应用程序(Excel)删除

答案 1 :(得分:1)

考虑一下您的代码在做什么-一旦在A:AC列中检测到更改,您的代码就会被触发以执行某项操作。当它执行某项操作时,将在A:AC列中执行该操作,从而创建一个连续循环,最终将导致崩溃。一旦检测到工作表事件并开始数据操作,就必须告诉Excel在代码完成之前停止检测新事件。

您需要在Application.EnableEvents = False语句后立即添加IF,并在退出子程序之前再次将其Application.EnableEvents = True重新打开。