【问题标题】:sorting excel data formulaicly公式化地对excel数据进行排序
【发布时间】:2015-03-17 02:43:01
【问题描述】:

由于我的组织的组策略设置强制用户显式单击以启用 office 文件中的宏,我想要一种解决方法来使用 vba 来实现相同的结果(并且无需单击任何东西作为额外的奖励)。数据透视表也是不可能的。

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

事件数据:

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

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

输出:

但是,事件按照它们出现在主工作表中的方式列出,而不是按我喜欢的时间顺序列出。我在每个事件旁边添加了一个日期列,但这不可排序,因为数组公式使所有内容保持动态。

所需的输出摘录:

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

【问题讨论】:

  • 嗨。您希望将数组公式保留在那里的事实似乎表明您认为有人将编辑源单元格并且您希望它自动传播。真的吗?如果没有,那么我可能只是使用数组公式来生成新工作表,对所有内容进行排序,然后将其作为“只读”分发给数据的所有“消费者”。但我可能不了解情况。
  • 如果您从来没有在同一日期举办过两次活动,那会相对简单——是这样吗?
  • ......如果你从来没有在同一日期有两个或更多事件同一个城市,我的意思是
  • @ButtleButkus 有点像。然而,唯一真正的消费者是编辑源数据的人,在我的组织中,这是一个流动率很高的职位。但大多数情况下,我只是想在我的编程工具箱中获得一个额外的工具。我以前用某人的 d&d 工作表做过一次,虽然是在 vba 中。
  • 当我遇到 Excel 的逻辑限制时,我转向了 Access。几个星期都很棒,然后我遇到了它的极限。然后我把脚趾伸进了 PHP/MySQL 的深渊,很快就潜入其中。我认为,从 excel 公式中获得的系统有多复杂是有限度的,但对我来说,下限是我的大脑可以记录的公式。如果您有任何尝试 MySQL 数据库的方法,我强烈建议您尝试一下。

标签: excel sorting array-formulas


【解决方案1】:

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

如果需要,您可以将 A1 的格式自定义为“mmmm”以仅显示 January 或“mmmm-yy”以显示 January-15

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

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

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

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

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

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

如果您可能有重复的日期,请使用此“数组公式”代替描述

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

【讨论】:

  • 日期和描述公式非常适合我描述的情况。如果我想进一步修改它,在三列(日期、描述、位置)中按日期显示所有事件怎么办?这里还是新的,所以我不确定 stackexchange 的礼仪。如果允许,将编辑原始问题。
  • INDEX函数的第一个参数是返回数据的范围,所以在上面的公式中=INDEX(Master!$A$6:$A$15,......,所以你可以把那部分换到另一列,而剩下的部分保留公式不变,您将从另一列但同一行获取数据。如果您想要的列是连续的,您甚至可以拖动公式,使所有其他引用成为绝对引用,除了那些。
  • 我可能对这个后续问题的措辞有误。目标是将所有数据放入一个列表中,实质上是将矩阵解构为形式 (key1,key2,value) (或在本例中为位置、事件、日期)的二维映射,但按日期/事件排序除外/位置按此顺序。我对here提出了一个新问题@
猜你喜欢
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2020-09-11
  • 2020-03-03
  • 2021-08-12
相关资源
最近更新 更多