【问题标题】:Using or() within Index/Match?在索引/匹配中使用 or()?
【发布时间】:2015-07-23 18:19:52
【问题描述】:

我对索引/匹配非常熟悉,但我正在尝试一些新的东西。我有一张描述、金额和日期的表格。我想使用索引/匹配。给定部分描述和查找量,我想返回日期。

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

所以,我想使用索引匹配来查找日期:

这是绿色单元格中的公式:

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

因此,您可以看到我正确查找了 21.55 和 1-15-2015 并返回了日期。

问题:您会注意到,在我的描述中,一些短日期使用“/”,而另一些则使用“-”。如何将其构建到我的公式中?如果我尝试查找金额 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 之后添加了一个“or()”。

如果这不可能,我是否不得不使用 IF 类型语句?或者有什么替代方法可以让公式相对较短?

【问题讨论】:

  • 简短的回答是 - 如果您的数据不统一,则需要进行大量数据操作才能将其转换为可搜索的格式。
  • @Grade'Eh'Bacon - 哈哈,我害怕那个。修复表格的信息可能更容易(想到查找/替换)。
  • 我建议在下面使用我的替代 Array 方法,或者只创建一个辅助列 E 来执行类似“查找 '-' 的操作。如果有一个 '-',那么前一天是什么 - ',以及'-'之后的月份。用它做一个日期。如果没有'-',是否有'/'?然后找到日期和月份,然后用它做一天。”

标签: excel excel-formula


【解决方案1】:

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

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

使这更复杂的事情,需要最后一步,是通常很难在不使用 VBA 的情况下处理通过 Array 返回的字符串。 excel 中的大多数数组折叠函数都需要数字,我们可以轻松处理。这……太丑了。另一种方法是说“索引(复杂数组,匹配(复杂数组的关键结果,初始搜索数组,0)),但对我来说,这比上述操作更复杂。

抱歉,这里的过早编码。应该先测试一下。

【讨论】:

  • 非常感谢您 - 我已经使用数组公式有一段时间了,但从来没有如此清晰地分解过它。这与对我的 OP 的评论相结合,就是答案。非常感谢@Grade'Eh'Bacon!
  • @BruceWayne 没问题,很乐意提供帮助。
  • @BruceWayne 抱歉 - 我最初做的方式存在一些问题,因为它没有正确地将我们创建的初始数组折叠成单个值,所以会给出一些不正确的值。检查我的新编辑是否需要进一步的工作。
  • 我为你花时间分享这个而鼓掌。虽然有一些不准确之处,但您在教学时应该注意。一开始你声明数组公式提供了一个结果数组,而不是一个单一的答案。虽然这可能是真的,但有许多数组公式返回单个值。
  • 接下来您提供一个简单的示例并声明结果将如下所示: ={"asdf","","... 但所有这些逗号实际上都是分号,因为数组是行,而不是列。
【解决方案2】:

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

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

【讨论】:

  • 这有一些好处 - 我一直认为你需要设置新的有限匹配数组两次,但正如你指出的那样,你不需要 - 你实际上可以只使用简单的INDEX 函数第一项的 DATES 数组,因为它与创建的数组的顺序和长度相同。
猜你喜欢
  • 2021-09-20
  • 2016-05-11
  • 1970-01-01
  • 2015-03-18
  • 2020-11-22
  • 2021-10-29
  • 2019-07-25
  • 2017-01-09
  • 1970-01-01
相关资源
最近更新 更多