在索引/匹配中使用或()?

时间:2015-07-23 18:19:53

标签: excel excel-formula

我对Index / Match非常熟悉,但我正在尝试一些新的东西。我有一张描述,数量和日期表。我想使用索引/匹配。鉴于描述的一部分和查找量,我想返回日期。

这是我的表的样子(以及下面命名的范围名称):

enter image description here

所以,我想使用Index Match来查找日期: enter image description here

以下是Green Cell中的公式:

=INDEX(Dates,MATCH(F3&TRIM(MONTH($G3)&"/"&DAY($G3)),Amounts&TRIM(MID(Descriptions,SEARCH(" ",Descriptions),5)),0))

所以,你可以看到我正确查找了21.55和2015年1月15日并返回了日期。

问题:你会注意到在我的描述中,一些短日期使用“/”和其他“ - ”。我如何将其构建到我的公式中?如果我试图查找金额993.29和2015年6月3日,我收到错误。由于描述中包含“ - ”而不是“/”,因此索引/匹配失败。

我知道我可以做一个IfError()语句,如果上面的公式返回错误,那么请用“ - ”代替索引/匹配:

=IFERROR(INDEX(Dates,MATCH(F3&TRIM(MONTH($G3)&"/"&DAY($G3)),Amounts&TRIM(MID(Descriptions,SEARCH(" ",Descriptions),5)),0)),INDEX(Dates,MATCH(F3&TRIM(MONTH($G3)&"-"&DAY($G3)),Amounts&TRIM(MID(Descriptions,SEARCH(" ",Descriptions),5)),0)))

但我宁愿不这样做,因为这个查找是一个更大的公式的一部分,这只会使这复杂化。

我想知道是否有办法做这样的公式:

INDEX(Dates,MATCH(F3&TRIM(MONTH($G3)&Or("-","/")&DAY($G3)),Amounts&TRIM(MID(Descriptions,SEARCH(" ",Descriptions),5)),0))

(注意:我在第一次TRIM之后添加了“或()”。

如果那是不可能的,我是否不得不使用IF类型声明?或者是否有某种替代方法,以保持公式相对较短?

2 个答案:

答案 0 :(得分:3)

我会建议以下内容,而不是您的方法,也使用数组公式。请记住,数组公式通过在给定范围的距离上多次计算特定项目来工作。它提供了一个结果数组,而不是提供单个结果。在其核心形式中,Array公式的示例是:

=if(A1:A10=1,"asdf","")

将其键入单元格,然后按CTRL + SHIFT + ENTER确认,而不是按ENTER键。直观地,你可以看到在这个公式中,如果A1 = 1,它将给出“asdf”,如果A2 = 1,它将给出“asdf”,等等。假设A1 = 1,A3 = 1,所有其他细胞是一个不同的价值。该公式的结果将是一系列结果,如下所示:

={"asdf","","asdf","","","","","","",""}

它将在单元格中显示的是“asdf”,因为没有进一步的指令,它默认为您提供第一个响应。真正需要做的是将数组公式包装成一个自然接受数组作为参数的函数。例如,SUM获取一组值,并将它们一起添加。

在您的情况下,您要做的是拉出行号,其中任何行包含您的匹配日期的文本。为此,我们将创建自己的匹配公式,使用IF而不是MATCH。像这样[我假设日期搜索单元格在H1]。:

=IF(ISERROR(SEARCH(Day(H1)&"-"&Month(H1),B2:B5)),"",D2:D5)

如果单元格中有错误,那么它在搜索中找不到它,并且没有给出D中的值。如果它确实给出了D中的值,则表示日期是在B列现在你会注意到这只会检查日期和月份之间带“ - ”的日期。要找到它,如果日期和月份用“/”分隔,我们只需添加一个单独的术语,如果找不到“ - ”则运行。请记住,在数组公式中使用OR / AND函数很少能够达到您想要的效果,因为OR / AND函数可以将数组结果接受到它们的参数中,因此数组会折叠成单个值。

因此,我们使用IF语句的TRUE / FALSE选项手动创建“OR”,如下所示:

=IF(ISERROR(SEARCH(DAY(H1)&"-"&MONTH(H1),B2:B5)),IF(ISERROR(SEARCH(DAY(H1)&"-"&MONTH(H1),B2:B5)),""),D2:D5)

如果任何一个匹配,这将给我们D列的结果。记得用CTRL + SHIFT + ENTER确认,而不是只输入。它干净吗?不。如果你想要一个干净的公式,我建议你创建一个帮助列在E列,它试图在A列的文本中创建一个日期,然后让你的索引/匹配(不再需要是数组公式) ),看看那个精致的日期选项。

编辑

对我感到羞耻,我没有对此进行测试,但是没有用。我经过测试,意识到我忘记了一些事情。首先我要补充一点,如果您有一个数组公式,并且单击公式栏内部,请按F9,它将显示发生的结果数组(如果响应保留为数组)。这将很快帮助您找出解决阵列公式时是否存在“中间”问题。在这种情况下,如果你有上面的公式并按F9,根据你选择的日期,它会显示如下:

={"","",CORRECT RESULT,""}

为了找到正确的结果,我们确实需要使用某些东西来折叠数组,我在帖子的中途忘记了这是我正在做的事情。

因此,MIN是一个接受数组的函数,它为您提供该数组的最低值。因为RANK能够折叠数组,我们可以修改上面的内容,以便搜索“匹配选项”,并给出结果。类似的东西:

=INDEX(D2:D5,MATCH(MIN(IF(ISERROR(SEARCH(DAY(H1)&"-"&MONTH(H1),B2:B5)),IF(ISERROR(SEARCH(DAY(H1)&"-"&MONTH(H1),B2:B5)),"",C2:C5),C2:C5)),C2:C5,0))

因此,您可以看到,而不是从我们正在寻找的D返回实际值,现在数组函数返回与特定项目关联的美元值。然后,我们将该项与所有项匹配,并使用行号从索引列表中提取数字。

使这更复杂,需要最后一步的事情是,通常很难使用通过Array返回的字符串而不使用VBA。 excel中的大多数Array-collapsing函数都需要数字,我们可以轻松处理这些数字。这......非常难看。另一种方法是说“索引(复杂阵列,匹配(复杂阵列的关键结果,初始搜索阵列,0)”),但对我来说比上面做的更复杂。

对不起那里过早的结节。应该先测试一下。

答案 1 :(得分:2)

这个简洁的数组公式考虑了描述嵌入日期的两种变体:

=INDEX(Dates,MATCH(1,(F3=Amounts)*(G3=--MID(Descriptions,1+FIND(" ",Descriptions),5)),))