【问题标题】:Is it possible to have a dynamic sort range?是否可以有一个动态的排序范围?
【发布时间】:2020-05-03 11:26:23
【问题描述】:

我想知道是否可以创建一个宏来对我的工作表进行排序,其范围不断变化?最后一行不是不断变化,而是顶部行数会发生变化。 是否可以让我的 .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

【问题讨论】:

  • 当然。问题的逻辑是什么?细胞是否是绿色的?
  • 除了A5之外,范围内是否还有其他非绿色单元格被排除在排序之外?
  • @BigBen,如果单元格为白色(颜色索引 = -4142),则逻辑适用于列 E,那么这应该是要排序的范围的一部分。如果它们不是白色的,则应排除所有其他行。可能会有红色、绿色、黄色等的单元格。
  • @RonRosenfeld ^
  • 要排除的行是否都是连续的,从第一行数据开始?

标签: excel vba sorting range


【解决方案1】:

此 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。

【讨论】:

  • 感谢 Ron 的回复和代码。不幸的是,它没有用。它仍在对非白色的顶部行进行排序。我还尝试将调用从 'SortRange(activesheet.range("A3:O150"))' 更改为 'SortRange(activesheet.range("A5:O150"))' 最终根本没有排序。我还尝试将调用 firstcell 中的范围从 'after:=.Cells(1, 5)' 更改为不同的数字,这也导致没有排序。
  • @jawvis 我并没有仔细查看您的排序代码。仅针对您关于动态更改 SetRange 的问题。您可能还需要更改 Key 以反映您希望排序的范围。它应该反映要排序的数据的整个列(不包括标题行),而不是单个单元格。您可以使用 SortRange 函数返回的范围对象的列偏移量。
  • @jawvis 您可能还想将header 参数设置为xlNo。
  • 啊好吧,这很有道理。谢谢您的帮助!我让它工作。我保留了Key 范围,因为我的列有不同的日期,而 M 列是最终日期。我确实将 header 更改为 xlNo 和 .range("A5:O150")。
  • @jawvis 很高兴您可以使用它。由于我的回答似乎是您所需要的,请将其标记为已接受。见What should I do when someone answers my question。
猜你喜欢
  • 2018-01-18
  • 2012-05-07
  • 2022-11-15
  • 1970-01-01
  • 2021-08-15
  • 2011-07-26
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多