Я бы разбил это на несколько функций, чтобы составить это вместе.
Сначала я бы хотел, чтобы функция находила верхний диапазон по его строке. Для этого нам просто нужен простой цикл и назначить диапазон, если он меньше, чем в предыдущей ячейке.
Private Function getTopRange(ByRef source As Range) As Range
Dim cell As Range
For Each cell In source
If getTopRange Is Nothing Then
Set getTopRange = cell
End If
If cell.Row < getTopRange.Row Then
Set getTopRange = cell
End If
Next cell
End Function
Тогда я бы создал функцию, которая бы возвращала диапазон, исключая верхний.
Опять же, для этого нам просто нужен простой цикл. Если это не верхняя ячейка, объедините ее с нашим значением диапазона возврата.
Private Function excludeTopRange(ByRef source As Range) As Range
Dim topRange As Range
Set topRange = getTopRange(source)
Dim cell As Range
For Each cell In source
' Only add if not the top cell
If cell.Address <> topRange.Address Then
If excludeTopRange Is Nothing Then
Set excludeTopRange = cell
Else
Set excludeTopRange = Union(excludeTopRange, cell)
End If
End If
Next cell
End Function
Собрав все это, вы просто вызываете нашу новую функцию!
Private Sub test()
Dim source As Range
Set source = Application.Selection
Dim excluded As Range
Set excluded = excludeTopRange(source)
MsgBox excluded.Address
End Sub
Это хороший дизайн , чтобы ваши функции были небольшими и многоразовыми. Его легче читать, отлаживать, тестировать и использовать повторно!