公式化排序 excel 数据

sorting excel data formulaicly

由于我的组织的组策略设置强制用户明确单击以启用 office 文件中的宏,我想要一种解决方法来使用 vba 来获得相同的结果(并且无需单击任何内容作为额外奖励)。数据透视表也不在考虑范围内。

我有一个 sheet,其中位置作为列标题 (A1:E1),事件作为行标题 (A2:A50)。其余单元格 (B2:E50) 填充了表示每个位置的下一个事件举行时间的日期。并非所有地点都服务于每个事件,因此 "N/A" 是可能的。活动可能会在同一天的同一地点举行。

事件数据:

我的目标是提供数据的辅助视图,显示每个位置(列标题)下方的当前和下个月即将发生的事件(作为行条目)。这(相对)简单,只需上下复制一个数组公式。

公式:=IFERROR(INDEX(Master!$A:$A,SMALL(IF(Master!B:B<>"N/A",IF((Master!B:B<DATE(YEAR(TODAY()),MONTH(TODAY())+1,1))*(Master!B:B>=DATE(YEAR(TODAY()),MONTH(TODAY()),1)),ROW(Master!B:B)-5)),ROWS(A:A3))),"")

输出:

然而,这些事件是按照它们在母版 sheet 中出现的顺序列出的,而不是像我希望的那样按时间顺序排列。我在每个事件旁边添加了一个日期列,但这是不可排序的,因为数组公式使所有内容保持动态。

所需的输出摘录:

Tampa   
19-Jan-15   Intermediate I
24-Jan-15   Introduction
26-Jan-15   Beginner I

Upcoming 工作表中,如果 A1 中的 January 实际上是一个日期,即相关月份的 1 日,那么在本例中为 2015 年 1 月 1 日,这样会更容易。

如果需要,您可以自定义格式 A1,如 "mmmm" 仅显示 January 或 "mmmm-yy" 显示 January-15

现在在 A3 中使用此公式按顺序获取相关月份和城市的日期(无论是否重复都有效):

=IFERROR(SMALL(IF(Master!B:B>=$A,IF(Master!B:B<=EOMONTH($A,0),Master!B:B)),ROWS(A:A3)),"")

使用 CTRL+SHIFT+ENTER 确认并向下复制列

注意:您不必在公式中明确排除 "N/A" 文本值 - 这些值无论如何都会被忽略

现在,在复制下来的 B3 中,如果您没有特定城市的重复日期,则可以使用此非数组公式:

=IF(A3="","",INDEX(Master!$A:$A,MATCH(A3,Master!B:B,0)))

如果您可能有重复的日期,请使用此 "array formula" 代替描述

=IF(A3="","",INDEX(Master!$A:$A,SMALL(IF(A3=Master!B:B,ROW(Master!$A:$A)-ROW(Master!$A)+1),COUNTIF(A:A3,A3))))