Вы можете использовать пользовательский список сортировки (например, closed,*
) и программно установить аргумент xlDescending, чтобы closed всегда заканчивался в нижней части списка. Однако это также отсортирует оставшиеся строки в порядке xlDescending. Это может или не может быть желательным.
Вариант 1: пользовательский порядок сортировки
В личном кодовом листе рабочего листа:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D:D")) Is Nothing Then
On Error GoTo end_safe
Application.EnableEvents = False
With Sort
With .SortFields
.Clear
.Add2 Key:=Range(Cells(2, "D"), Cells(Rows.Count, "D").End(xlUp)), _
SortOn:=xlSortOnValues, Order:=xlDescending, _
CustomOrder:="closed,*", DataOption:=xlSortNormal
End With
.SetRange Intersect(Range("A:Z"), UsedRange)
.Header = xlYes
.Orientation = xlTopToBottom
.Apply
End With
End If
end_safe:
Application.EnableEvents = True
End Sub
Вы хотите, чтобы был закрыт внизу списка, поэтому одной из альтернатив может быть установка правила условного форматирования для изменения шрифта или фоновой заливки для closed , а затем использование этого DisplayFormat для сортировки по цвету с xlDescending. Это подтолкнет все закрытые к нижней части блока данных без изменения исходного порядка оставшихся (т. Е. незамкнутых ) строк.
Вариант 2: сортировка по условному форматированию DisplayFormat
В личном кодовом листе рабочего листа:
Option Explicit
'manually run this once to quickly add a CFR for 'closed' cells
Private Sub addClosedCFR()
With Range("D:D")
.FormatConditions.Delete
With .FormatConditions.Add(Type:=xlExpression, Formula1:="=$D1=""closed""")
.Font.Color = vbRed 'vbBlack
End With
End With
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D:D")) Is Nothing Then
On Error GoTo end_safe
Application.EnableEvents = False
With Sort
With .SortFields
.Clear
.Add(Range(Cells(2, "D"), Cells(Rows.Count, "D").End(xlUp)), _
SortOn:=xlSortOnFontColor, Order:=xlDescending, _
DataOption:=xlSortNormal).SortOnValue.Color = vbRed 'vbBlack
End With
.SetRange Intersect(Range("A:Z"), UsedRange)
.Header = xlYes
.Orientation = xlTopToBottom
.Apply
End With
End If
end_safe:
Application.EnableEvents = True
End Sub
Если вы не хотите, чтобы закрывался , отображая красный цвет в столбце D, измените цвет шрифта на более подходящий. Я оставил vbBlack в комментариях, который не совпадает с цветом шрифта xlAutomatic по умолчанию, поэтому он будет отображаться без изменений, но при этом будет разрешена операция сортировки.
Ваша операция сортировки почти наверняка внесет изменения в столбец D вместе с остальной частью блока данных, поэтому временное отключение событий не позволит Worksheet_Change попытаться запустить поверх себя.