Excel匹配索引多个条件和多个日期

时间:2019-07-11 14:57:43

标签: excel indexing excel-formula match formula

enter image description here

=INDEX(D1:D6;MATCH(1;(E1=A1:A6)*(E2=B2:B6)*(DATEVALUE(MID(E3;1;10))>=DATEVALUE(MID(C1:C6;1;10)));0))

我有一个excel文件,其中包含每个productId组合的价格(A列和B列)以及有效日期。 如您所见,它可能包含productId组合的重复项,并且仅在日期过后才有效。 这是我到目前为止想出的公式,但是只有在行按A B和C排序时才有效(特别是C应该降序排序)。 在示例中,我期望正确的结果价格为600.00,但它返回200.00。

我理解为什么会这样。但是我不知道如何修复它并使它正常工作。 正确的意思是:

提供产品ID: D318JV 00B6

如果有效日期> = 07/18/2019 00:00:00 => 600.00

如果有效日期在07/07/2019 00:00:00到07/18/2019 => 400.00

如果有效日期在06/01/2019 00:00:00和07/07/2019之间=> 200.00

如果有效日期为06/01/2019 00:00:00之前=> N / A

任何帮助使该公式生效的帮助都会受到赞赏

5 个答案:

答案 0 :(得分:2)

结合从问题和评论到@matro答案的方法:

  1. 使用E4单元格中的数组公式获取确切日期(符合条件的最高日期)
    =MAX(IF((E1=A1:A6)*(E2=B1:B6)*(E3>=C1:C6); C1:C6))
    (由Ctrl + Alt + Enter确认,而不只是Enter键)
  2. 将原始公式修改为
    =INDEX(D1:D6; MATCH(1; (E1=A1:A6)*(E2=B1:B6)*(E4=C1:C6); 0))

答案 1 :(得分:2)

仅使用 1个公式使用以下ARRAY公式:

=INDEX(D1:D6,MATCH(1,(E1=A1:A6)*(E2=B1:B6)*(C1:C6=MAX(IF(C1:C6<E3,C1:C6,0))),0))

确保使用CTRL + SHIFT + ENTER确认公式。查看示例工作的屏幕截图:

enter image description here

您可能必须将,的{​​{1}}更改。在这种情况下,公式将如下所示:

;

答案 2 :(得分:1)

我相信@Kaiser已经提供了正确的答案,但是如果他可以将 DATEVALUE 纳入其职能,那就更好了。看来,C列中的原始日期(可能还有查找日期)是文本。

所以最终公式可能看起来像这样:

{=INDEX(D1:D6,MATCH(1,(A1:A6=E1)*(B1:B6=E2)*(DATEVALUE(C1:C6)=MAX(IF(DATEVALUE(C1:C6)<DATEVALUE(E3),DATEVALUE(C1:C6),0))),0))}

或者在@isioutis的系统中这样:

{=INDEX(D1:D6;MATCH(1;(A1:A6=E1)*(B1:B6=E2)*(DATEVALUE(C1:C6)=MAX(IF(DATEVALUE(C1:C6)<DATEVALUE(E3);DATEVALUE(C1:C6);0)));0))}

我的习惯是给范围命名,以使我的公式更易于解释,因此,如果执行以下操作:

将列A命名为“ ProductId_A

将B列命名为“ ProductId_B

将列C命名为“ 日期列表

将列D命名为“ 价格列表

并将查找条件命名为

' Lookup_A '

' Lookup_B '

'查询日期'

您将看到一个公式如下:

{=INDEX(Price_List,MATCH(1,(ProductId_A=Lookup_A)*(ProductId_B=Lookup_B)*(DATEVALUE(Date_List)=MAX(IF(DATEVALUE(Date_List)<DATEVALUE(Lookup_Date),DATEVALUE(Date_List),0))),0))}

{=INDEX(Price_List;MATCH(1;(ProductId_A=Lookup_A)*(ProductId_B=Lookup_B)*(DATEVALUE(Date_List)=MAX(IF(DATEVALUE(Date_List)<DATEVALUE(Lookup_Date);DATEVALUE(Date_List);0)));0))}

请在下面查看一些测试结果(请注意,我系统中的日期格式为dd / mm / yyyy):

Test Results

要注意的一件事是,如果isioutis的以下语句有效,

  

只有在日期过去之后它们才有效

然后 2019年7月18日00:00:00 的查找价格应为 400美元,因为从技术上讲,这一天尚未过去,这意味着600美元不是该日期的有效价格。否则,在将查找日期与日期列表进行比较时,请在公式中使用“ <= ”(小于等于)。

干杯:)

答案 3 :(得分:0)

数据:具有以下字段的表格:产品,ID,生效日期,价格

要求:提取与给定日期范围相对应的产品ID的价格。

假设:该解决方案假定产品,ID,价格和日期组合是唯一的。

日期条件:下表显示了几种可用于根据生效日期检索产品ID价格的条件格式,还显示了将应用于每个条件的选择条件的结果包含多个项目时。

enter image description here

公式::由于该表包含产品,ID,价格和日期的唯一组合,并且预期输出为数字(即价格),因此使用SUMIFS函数似乎很合适

条件 1。等于
公式:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID, 
[Effective Date range], #Date )  

位置:
[价格范围] =价格列
[产品范围] =产品列
 #Product =我们需要找到的产品
[ID范围] = ID列
 #ID =我们需要找到的ID
[生效日期范围] =生效日期列
 #Date =我们需要找到的日期

其他条件:接下来的五个条件可能返回几个可能的Dates,因此我们将使用函数AGGREGATE选择所需的Date条件表。
公式:

= AGGREGATE( #Sel, 6, [Effective Date range] /
( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] #ƒ #Date) ), 1 )

位置:
 #Sel =根据条件表(即14 =最晚日期和15 =最早日期)
 #ƒ=根据所需条件进行比较

然后,我们将使用SUMIFS函数中AGGREGATE函数产生的日期来获取所需的价格:
公式:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID,
[Effective Date range], #AGGREGATE )

位置:
 #AGGREGATE = AGGREGATE函数的结果日期

对于最后五个条件,基本公式为:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID, [Effective Date range],
AGGREGATE( #Sel, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID)
* ( [Effective Date range] #ƒ #Date ) ), 1 ) )

,我们只需将#Sel替换如下:

条件: 2。之前
 #Sel = 14
 #ƒ= <

条件: 3。之前或等于
 #Sel = 14
 #ƒ= <=

条件: 4.Between
 #Sel = 15
 #ƒ= >=<=
 #Date1 =日期
 #Date2 =日期
公式:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID, [Effective Date range],
AGGREGATE( 15, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID)
* ([Effective Date range] >= #Date1) * ([Effective Date range] <= #Date2) ), 1 ) )

条件: 5。之后或等于
 #Sel = 15
 #ƒ= >=

条件: 6。之后
 #Sel = 15
 #ƒ= >

解决方案::为了对每个标准应用所需的公式,我们需要将所有标准组合为一个公式。尽管可以通过一系列嵌套的IF实现,但是我们将使用函数CHOOSE

公式:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID, [Effective Date range],
CHOOSE( #Criteria, #Date,
AGGREGATE( 14, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] < #Date) ), 1 ),
AGGREGATE( 14, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] <= #Date) ), 1 ),
AGGREGATE( 15, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] >= #Date1) * ([Effective Date range] <= #Date2) ), 1 ),
AGGREGATE( 15, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] >= #Date) ), 1 ),
AGGREGATE( 15, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] > #Date) ), 1 ) ) )

位置:
 #Criteria =根据条件表(即1到6)
应用的条件  #ƒ=根据所需条件进行比较

可以使用公式数组来进一步减少公式的长度
公式数组:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID, [Effective Date range],
IF( #Criteria = 1, #Date,
AGGREGATE( LOOKUP( #Criteria, {1,"N/A";2,14;4,15} ), 6, [Effective Date range] /
( ( [Product range] = #Product ) * ( [ID range] = #ID )
* CHOOSE( #CRITERIA, "N/A",
[Effective Date range] < #Date, [Effective Date range] <= #Date,
([Effective Date range] >= #Date1) * ([Effective Date range] <= #Date2),
[Effective Date range] >= #Date,[Effective Date range] > #Date ) ), 1 ) ) )

实施: 假设数据表位于B2:E8

在单元格L6中输入此公式,然后复制到L7:L9

= SUMIFS( $E$6:$E$11, $B$6:$B$11, $H$6, $C$6:$C$11, $H$7, $D$6:$D$11,
CHOOSE( LEFT( $I6 ), $J6,
AGGREGATE( 14, 6, $D$6:$D$11 / ( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 ) 
* ( $D$6:$D$11 < $J6 ) ), 1 ),
AGGREGATE( 14, 6, $D$6:$D$11 / ( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 )
* ( $D$6:$D$11 <= $J6 ) ), 1 ),
AGGREGATE( 15, 6, $D$6:$D$11 / ( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 )
* ( $D$6:$D$11 >= $J6 ) * ( $D$6:$D$11 <= $K6 ) ), 1 ),
AGGREGATE( 15, 6, $D$6:$D$11 / ( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 )
* ( $D$6:$D$11 >= $J6 ) ), 1 ),
AGGREGATE( 15, 6, $D$6:$D$11 / ( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 )
* ( $D$6:$D$11 > $J6 ) ), 1 ) ) )

enter image description here

在单元格M6中输入此公式数组,然后复制到M7:M9

FormulaArrays 按下 CTRL + SHIFT + ENTER 进入如果输入正确,公式将包含在{}中。

= SUMIFS( $E$6:$E$11, $B$6:$B$11, $H$6, $C$6:$C$11, $H$7, $D$6:$D$11,
IF( --LEFT( $I6 ) = 1, $J6,
AGGREGATE( LOOKUP( --LEFT( $I6 ), {1,"N/A";2,14;4,15} ), 6, $D$6:$D$11 /
( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 )
* CHOOSE( LEFT( $I6 ), "N/A",
$D$6:$D$11 < $J6, $D$6:$D$11 <= $J6,
( $D$6:$D$11 >= $J6 ) * ( $D$6:$D$11 <= $K6 ),
$D$6:$D$11 >= $J6, $D$6:$D$11 > $J6 ) ), 1 ) ) )

enter image description here

下图显示了另一种格式:

enter image description here

建议阅读有关使用的资源:
AGGREGATE functionCHOOSE functionSUMIFS function

答案 4 :(得分:-1)

如果我正确理解了您的问题,则希望在给定的时间(=输入变量)找到给定产品的相关价格(=输出变量)。

我尝试仅使用简单的productID(1和2)以及问题中所述的有效日期和价格来重构您的用例。我想我找到了解决方案,并使用this site进行了解决。

通常,解决方案可能是结合了MAXIF函数的数组公式。还需要对您的需求进行一些分析,如下所示:

  1. 我们要查找确切的产品ID -if语句中的第一个条件
  2. 我们要查找在给定日期应用的最新(或最高)价格-if语句中的第二个条件(生效日期必须小于或等于给定日期)以及{ {1}}函数应用于价格列。

如果我对源页面的解释不够清楚,请告诉我。

如果是这种情况,here是我的示例Excel文件,其中包含建议的解决方案。

感谢和问候。

Matej