Возможно ли иметь динамический диапазон сортировки c? - PullRequest
0 голосов
/ 16 января 2020

Мне было интересно, смогу ли я создать макрос, который сортирует мой лист с диапазоном, который постоянно меняется? Вместо того, чтобы последний ряд постоянно менялся, будет изменяться счетчик верхнего ряда. Возможно ли, чтобы мой .setrange был переменной, которая обновляется новым диапазоном на основе аргументов? Например, текущий код, который у меня есть, устанавливает мой диапазон, начиная с A5, но если строки 6 - 10 имеют зеленый цвет внутри, я хочу, чтобы они оставляли их сверху и сортировали только начиная с A11.

activesheet.Sort.SortFields.Clear
activesheet.Sort.SortFields.Add Key:=Range("M6"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With activesheet.Sort
    .SetRange Range("A5:O150") ' I want this range to change constantly without me manually changing, for example it would be from ("A10:0150") now
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

1 Ответ

0 голосов
/ 17 января 2020

Этот UDF вернет объект диапазона, представляющий диапазон сортировки, определенный первой строкой данных в пятом столбце, содержащем «белое» внутреннее пространство (не включая первую строку, если только это не ЕДИНСТВЕННАЯ строка с белым внутренним пространством) :

Option Explicit
Private Function SortRange(baseRange As Range) As Range
    Dim firstCell As Range, lastCell As Range, C As Range

With baseRange
    Set lastCell = .Worksheet.Cells(.Row + .Rows.Count - 1, .Column + .Columns.Count - 1)
End With

With Application.FindFormat
    .Clear
    .Interior.Color = vbWhite
End With

'find the first cell in fifth column that is white
'As implemented, this should be column E, but if you move the range, it will adjust to the 5th column
'after the first row in baseRange
With baseRange
    Set firstCell = .Columns(5).Find(what:="*", after:=.Cells(1, 5), searchorder:=xlByRows, searchdirection:=xlNext, searchformat:=True)

    If Not firstCell Is Nothing Then
        With .Worksheet
            Set SortRange = .Range(.Cells(firstCell.Row, 1), lastCell)
        End With
    Else
        MsgBox "no cells to sort"
        Exit Function
    End If
End With

End Function

Вы можете использовать его следующим образом:

.SetRange SortRange(activesheet.range("A3:O150"))

, но я бы предложил заменить activesheet на фактический лист.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...