![Excel 2010 筛选动态](https://linux22.com/image/1364938/Excel%202010%20%E7%AD%9B%E9%80%89%E5%8A%A8%E6%80%81.png)
我有一张大型数据表,顶部有日期。此表已启用过滤器。我需要根据用户定义字段中输入的日期对这些数据进行排序(从大到小)。但我不知道如何使其动态化。
假设我有 12 列,每列顶部是月份,下面是一组数字。如果我在特定单元格中输入 Feb,我希望 excel 按 Feb 列从大到小排序。如果我将 Feb 单元格更改为 May,我希望它按 5 月数据排序
请帮忙
答案1
据我了解,您有一组月度数据,我假设该数据跨越 1 月至 12 月,每个月的数据列在单独的列中,并带有标题单元格。您希望能够根据特定月份的最大值到最小值对该数据集进行排序,并通过在工作表中的单元格中输入内容来选择月份。
虽然可以使用工作表公式对数据集中的值进行排序显示,但数据集本身不会被排序,因此需要取消过滤。
使用 VBA 将允许一种相当简单的方法,并且还具有能够处理过滤数据的额外好处。
我假设要排序的月份条目位于单元格 中A1
,该单元格已被命名为sort_month
。数据(包括月份名称的标题)位于列B
-中M
。数据范围被命名为filtered_data
;在我的示例数据中,这是范围B1:M25
。
进行排序的 VBA 代码非常短:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not (Intersect(Target, Range("sort_month")) Is Nothing) Then
Dim theMonth As Long
theMonth = month(DateValue("01-" & Range("sort_month").Value & "-1900"))
Range("filtered_data").Sort Key1:=Cells(1, theMonth + 1), _
Order1:=xlDescending, header:=xlYes
End If
End Sub
sort_month
每当(即单元格)发生更改时,此子程序都会自动运行A1
。在此单元格上设置数据验证是有意义的,以确保只有有效的月份名称(“Jan”、“Feb”等)才能输入到此单元格中。
代码不应放在标准 VBA 模块中,而应附加到工作表中。右键单击工作表的选项卡并选择“查看代码”即可访问工作表的代码窗格。然后可以将代码粘贴到窗格中。
虽然它可能超出您的需求,但可排序表可以轻松设置为一般用途(即非开发人员)。下面显示的版本具有月份条目的下拉数据验证、为提高可读性而添加的表格格式以及用于突出显示排序列的条件格式。