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

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

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

在这里输入图像说明

所以,我想使用索引匹配来查找date: 在这里输入图像说明

绿色单元中的公式如下:

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

所以,你可以看到,我已经正确地查了21.55,1-15-2015,并返回date。

问题:您会注意到,在我的描述中,一些短date使用“/”和其他“ – ”。 我怎样才能把这个成为我的公式? 如果我试图查找金额993.29,并且date6/3/2015,我得到一个错误。 由于描述具有“ – ”而不是“/”,因此索引/匹配失败。

我知道我可以做一个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之后添加了一个“或()”。

如果这是不可能的,我坚持不得不使用IFtypes的声明? 还是有其他的办法,保持公式相对较短?

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

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

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

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

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

在你的情况下,你想要做的是拉行号,其中任何行包含您的匹配date的文本。 要做到这一点,我们要创build自己的匹配公式,使用IF,而不是MATCH。 像这样[我假定datesearch单元格在H1]:

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

如果单元格中有错误,那么它在search中没有find它,并且在D中没有给出值。如果确实给出了D中的值,那意味着在B列中find了date。现在你会注意到,这只能检查date和月份之间的“ – ”。 要find它,如果date和月份之间用“/”分隔,我们只是添加一个单独的术语,如果没有find“ – ”就运行。 请记住,在数组公式中使用OR / AND函数很less做你想要的,因为OR / AND函数可以接受数组结果到它们的参数中,因此数组会变成一个单一的值。

因此,我们通过使用IF语句的TRUE / FALSE选项手动创build一个“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确认,而不是只input。 它干净吗? 不。如果你想要一个干净的公式,我build议你创build一个帮助列在列E,它试图创build一个date列A中的文本,然后有你的索引/匹配(不需要是数组公式),看看那个改进的date选项。

编辑

对我感到羞耻,我没有testing这个,它不起作用。 我testing过之后,意识到我忘记了一些东西。 首先,我将添加如果您有一个数组公式,并且您单击公式栏内,请按F9,它会显示您发生的结果数组(如果响应保留为数组)。 这将很快帮助您找出在parsing数组公式时是否存在“中介”问题。 在这种情况下,如果你有上面的公式,并按F9,取决于你select的date,它会告诉你如下所示:

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

为了find正确的结果,实际上我们确实需要使用某些东西来折叠数组,而这个数组在我的文章的中途被忘记了,正是我所领导的。

所以,MIN是一个函数,它接受一个数组,并为您提供该数组的最小值。 因为RANK可以折叠数组,所以我们可以修改上面的内容,以便search“匹配的选项”,并给出结果。 就像是:

 =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返回实际值,现在数组函数返回与特定项目相关联的美元值。 然后,我们将该项目与所有项目进行匹配,并使用行号从索引列表中提取数字。

这使得这个更复杂的事情,需要最后一步,是通常很难使用通过数组返回的string,而不使用VBA。 Excel中的大多数数组崩溃函数都需要数字,我们可以很容易地处理这些数字。 这是…相当丑陋。 另一种方法是“索引(复数arrays,匹配(来自复数arrays的关键结果,初始searcharrays,0)),但对我来说比上面的要复杂得多。

对不起,过早结瘤那里。 应该先testing一下。

这个简洁的数组公式说明了embeddeddate的两种变体:

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