来自日期列表的最新日期>从同一列表中的给定日期开始的180天

时间:2017-08-10 10:57:22

标签: excel vba excel-vba pivot-table frequency

我有一个“出现日期”栏A,旁边有一个“> 180”日期栏B.还有“CONCAT”栏C和“ATTR”栏D.

我想要做的是找出过去的最新日期180或更多,并在“出现日期”列中的每个日期写入“> 180”列,其中Concat列值相同。

> 180列中的日期应该超过过去“出现日期”列的180天,,但也应该是仅从“出现日期”列找到的最早日期。

基于此,我想检查某个特定产品是否先前有“ATTR”=“NEW”> 180,即180天或更久以前推出并最近再次出现?

  • 是否有excel公式可以从出现日期中选出最近的日期(> 180)并在“> 180”列中显示?
  • 是否涉及SMALL(),FREQUENCY(),MATCH(),INDEX()等的混合?
  • 或者需要VBA程序?

enter image description here

1 个答案:

答案 0 :(得分:1)

要使用公式有效地执行此操作,您可以使用称为“范围切片”的内容来减少要处理的数组的大小,方法是有效地截断它们,使它们只包含可能容纳的3,000到50,000行的子集。正确的答案,然后做实际的平等检查。 (与你的MAX / Array方法相比,它在所有行上执行计算上昂贵的数组操作,即使大多数行与你当前行没有任何关系寻求答案)。

这是我的方法。首先,这是我的表格布局: enter image description here

...这是我的公式:

180: =[@Appeared]-180
Start: =MATCH([@CONCAT],[CONCAT],0)
End: =MATCH([@CONCAT],[CONCAT],1)
LastRow: =MATCH(1,--(OFFSET([Appeared],[@Start],,[@End]-[@Start])>[@180]),0)+[@Start]-1
LastItem: =INDEX([Appeared],[@LastRow])
LastDate > 180: =IF([@Appeared]-[@LastItem]>180,[@LastItem],"")
Days: =IFERROR([@Appeared]-[@[LastDate > 180]],"")

即使使用这个小数据集,我的方法也是MAX方法的两倍。随着数据大小的增长,您的方法将逐渐变慢,因为越来越多的处理能力被浪费在不可能包含答案的运行行上。而我的线性方式会变慢。我们可能正在谈论几分钟的差异,或者甚至是极端的一小时左右。

请注意,虽然您可以使用单个超级公式进行我的方法,但您最好不要:它不会高效。将你的超级公式分成单独的单元格在任何情况下都是一个好主意,因为它可能有助于加速计算,因为这称为多线程。这是Microsoft Excel的前项目经理迭戈·奥本海默(Diego Oppenheimer)在2005年就此主题所说的话:

多线程使Excel能够找到可以同时计算的公式,然后同时在多个处理器上运行这些公式。实际效果是给定的电子表格可以在更短的时间内完成计算,从而提高Excel的整体计算性能。 Excel可以利用与机器上一样多的处理器(或核心,Excel显示为处理器) - 当Excel加载工作簿时,它会询问操作系统有多少处理器可用,并为每个处理器创建一个线程处理器。通常,处理器越多,性能提升越好。

Diego接着概述了电子表格设计如何对任何性能提升产生直接影响:

具有大量完全独立计算的电子表格应该会带来巨大的好处。关心性能的人可以调整他们的电子表格以利用此功能。

底线:将公式拆分为单独的单元格可增加并行计算公式的机会,Excel MVP和计算专家Charles Williams在以下链接中进一步概述:

Decision Models: Excel Calculation Process

Excel 2010 Performance: Performance and Limit Improvements