我有一个电子表格,下面是它的摘录:
理想情况下,当我向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)...
答案 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
重新打开。