Excel 2013高级date范围查找使用sumproduct

我是新来的Stackoverflow,所以请让我知道,如果没有足够的信息。 过去我使用过StackOverflow已经有了很多有用的见解,但是我找不到任何有用的线程,所以我希望你能帮助我。

我一直在研究一个excel(2013)的问题。 我正试图build立一个营销议程来存储和跟踪我们的邮件营销活动。 活动本身是通过另一个系统发送的,但是我们错过了提前计划邮件活动的能力。 由于我们活跃在欧洲的不同市场,因此我们决定为所有地区提供一般邮件和特定地区的邮寄活动(两者都在同一议程中)。 除此之外,我们还希望显示邮件的重点(不同品牌)。 这是我的想法尽可能返回这个视图(使其可用于所有用户)。 我添加了一个小图片来显示我想要的最终结果(但是此时没有任何数据)。

此时,用户将使用(Google)表单input活动信息,并将该数据下载到工作表(通过这样做,所有用户都可以添加新的活动,并且每个人都可以访问最新的数据)。 这部分运作良好。

我使用助手工作表来检查date是否属于广告系列范围,如果属于广告系列范围,则应返回邮寄ID(也是行号)。 我有另一种forms,使用这些数据来search正确的品牌,并可视化显示(有很多条件格式)。

问题出现在帮手表(当我检查一个date是否属于一个活动范围)。 我已经能够使用下面的公式工作(或多或less):

=IF(SUMPRODUCT(--(CountryHelper!$C$2:$C$100<=$B4);--(CountryHelper!$D$2:$D$100>=$B4);RIJ(CountryHelper!$C$2:$C$100))=0;"";INDEX(CountryHelper!$A$2:$A$100;SOMPRODUCT(--(CountryHelper!$C$2:$C$100<=$B4);--(CountryHelper!$D$2:$D$100>=$B4);ROW(CountryHelper!$A$2:$A$100)))) 

在这个公式中,CountryHelper!C:C引用了邮件策略的StartDate。 D:D将引用EndDates的列,并且A:A具有邮寄ID。 单元格B4是需要检查的date。

起初它看起来很完美。 如果一个date落在一个date范围内,那么它将返回该ID。 经过一番玩弄,这个问题就暴露出来了。 它只适用于不重叠的date,一旦date重叠excel会一起添加行号,它不会再工作。

是否有可能获得sumproduct公式工作,并返回只有第一个ID。 我知道我必须做另外两个公式返回第二个和第三个ID(我确定我们没有超过3个重叠的date)。 这也是我迷路的部分。 我尝试过使用下面这个sumproduct公式的MIN和MAX变体:

 =SUMPRODUCT(--(CountryHelper!$C$2:$C$100<=$B4);--(CountryHelper_RSEU!$D$1:$D$100>=$B4);ROW(CountryHelper!$C$1:$C$100)) 

这将返回一个0(MIN)或100(MAX)。 我认为这是由公式引起的(现在它只search前99行)。 我也冒险进入VBA / UDF来完成这个任务,但据我所知,这是不可能的。

无论如何,我为这个漫长的故事感到抱歉,希望我的问题是清楚的,你可以帮助我。 如果你需要更多的信息。

谢谢!

空的营销议程概述

SUMPRODUCT是一种瑞士军刀Excelfunction。 但是这里是错误的,因为正如你已经看到的那样,它真的会在最后计算一个SUM。 大多数情况下,它的工作原理是首先将0或1的条件与行号相乘,因此只有满足条件的行号进入总和。 但是,如果两个或更多的行号满足条件,那么他们加在一起。

你熟悉数组公式吗? 下面的数组公式应该是你想要的:

 {=INDEX(CountryHelper!$A$2:$A$100;MIN(IF((CountryHelper!$C$2:$C$100<=$B4)*(CountryHelper!$D$2:$D$100>=$B4);ROW(CountryHelper!$A$2:$A$100)-1)))} 

要创build数组公式,请将公式放入没有大括号的单元格中,然后按[Ctrl] + [Shift] + [Enter]。 然后大括号应该自动出现。

怎么运行的:

 {IF((CountryHelper!$C$2:$C$100<=$B4)*(CountryHelper!$D$2:$D$100>=$B4);ROW(CountryHelper!$A$2:$A$100)-1)} 

获取一行数字或FALSE {FALSE,rowNumber,FALSE,…}。 如果两个条件都满足,则得到行号-1,否则得到FALSE。 MIN函数然后从这个数组中获得最小的(行号 – 1)。 INDEX表示这个满足条件的最小(行号-1)。

它从行号中减去1,因为INDEX范围从第2行开始。如果第2行满足条件,那么它是在该范围内的索引1,如果第3行满足条件,则是索引2等等。

为什么它只能作为数组公式? 因为IF函数默认不会创build一个数组,即使它们的“Value_if_true”是一个范围。 在数组上下文中,确实如此。