【问题标题】:Array formula to return contents of adjacent cells based on multiple criteria基于多个条件返回相邻单元格内容的数组公式
【发布时间】:2017-05-24 17:18:08
【问题描述】:

我需要一个公式,该公式将首先根据与表格上的列标题匹配的指定单元格的内容来确定要在表格的哪一列中搜索。因此,假设具有所需单词的单元格位于 Tab 1 的单元格 A1 中,并且包含单词 Task。该公式需要搜索选项卡 2 的第 1 行中的列标题,以找到具有标题任务的列。

然后它需要向下搜索该列以找到会出现多次的单词mandatory,并返回B列中相邻单元格的内容。

我在以下网站上查看了数组公式:

http://www.get-digital-help.com/2012/03/28/search-for-a-text-string-and-return-multiple-adjacent-values/

下面的公式让我了解了其中的一部分,但它不满足我的初始要求,因为它已修复并且正在为我的搜索词搜索列 A。

{INDEX($B$1:$B$5,SMALL(IF(ISNUMBER(SEARCH($E$1,$A$1:$A$5)),MATCH(ROW($A$1:$A$5),ROW($A$1:$A$5))),ROW(A1)))}

我还查看了此页面Get column by finding value in the row。 Barry 的 INDEX 公式似乎是我所追求的,但我无法将这两个公式整合在一起。

任何帮助将不胜感激。

【问题讨论】:

  • 因此,如果在标记为task 的列中有多个单词mandatory 匹配,您想返回每个匹配的相邻单元格吗?就像在逗号分隔的列表中一样?
  • 可能是我对相邻这个词的使用不当。如果标记为task的列是F列,并且在单元格F2,F5等中找到强制项,我想返回单元格B2,B5等的值。

标签: arrays excel excel-formula


【解决方案1】:

B1Sheet1

=COUNTIF(INDEX(Sheet2!$1:$1048576,,MATCH(A$1,Sheet2!$1:$1,0)),"mandatory")

Sheet1C1 中,数组公式**

=IF(ROWS($1:1)>B$1,"",INDEX(Sheet2!B:B,SMALL(IF(INDEX(Sheet2!$1:$100,,MATCH(A$1,Sheet2!$1:$1,0))="mandatory",ROW(Sheet2!A$2:A$100)-MIN(ROW(Sheet2!A$2:A$100))+1),ROWS($1:1))))

C1 中的公式复制下来(尽管B1 中的公式不是这样,它用于简单地计算预期返回次数),直到您开始得到结果的空白。

请参阅 here 以了解为什么在此类结构中最好引用一个额外的计数单元 (B1) 而不是诉诸 IFERROR

编辑:这里的关键构造是部分

INDEX(Sheet2!$1:$100,,MATCH(A$1,Sheet2!$1:$1,0))

它利用了这样一个事实,即如果传递给INDEX 的行或列参数中的一个(或两者)为零(或等效地省略)并且INDEX 被正确强制(例如,形成更大的公式),生成对整个指定列或行的引用。

因此,假设A1 中的值出现在Sheet2column D 中,以上将解析为:

INDEX(Sheet2!$1:$100,,4)

这是

Sheet2!$D1:$D100

有关INDEX 的此属性的更多信息,请参阅here

问候

**数组公式的输入方式与“标准”公式不同。不是只按 ENTER,而是先按住 CTRL 和 SHIFT,然后再按 ENTER。如果操作正确,您会注意到 Excel 在公式周围放置了大括号 {}(尽管不要尝试自己手动插入)。

【讨论】:

  • 嗨 - 我喜欢这个解决方案。你介意为我的学习提供一些关于函数机制的解释吗?
【解决方案2】:

我不能 100% 确定您是否能够仅使用数组公式来做您想做的事情。虽然,有些人在数组公式方面比我更擅长 SO。

如果您不介意使用 UDF 路线,您可以通过将该 UDF 粘贴到工作簿中的新模块中来使用它:

Function getList(headerValue As String, rowValue As String, lookupRange As Range, returnOffset As Integer) As String
    Dim lookupCol As Range, lookupCell As Range
    Dim getListOut As String

    'find the column to lookup into
    For Each lookupCol In lookupRange.Columns
        If lookupCol.Cells(1, 1).Value = headerValue Then Exit For
    Next lookupCol

    'search each cell in the column (for the lookupRange) for matchValue
    For Each lookupCell In Intersect(lookupCol, lookupRange).Cells

        'See if we have a match
        If lookupCell.Value = rowValue Then

            'Concatenate if necessary to the output
            If getListOut = "" Then
                getListOut = lookupCell.Offset(, returnOffset).Value
            Else
                getListOut = getListOut & "," & lookupCell.Offset(, returnOffset).Value
            End If
        End If
    Next lookupCell

    'return
    getList = getListOut
End Function

并在您的单元格中使用它(例如您的第一个选项卡“sheet1”上的 B1):

=getList(A1,"mandatory", Sheet2!A1:G6, -3)

这里A1 是要搜索的标题值,"mandatory" 是要在该标题列中找到的单元格值,Sheet2!A1:G6 是要搜索的表,-4 是要获取的列偏移量从我们找到的带有“强制”的任何行中获取值。

我在 A1 和 Sheet2 的表头(F 列)中为该表添加了“任务”一词。我将三行与“强制”一词放在一起,并在 B 列中为每个 mandatory 放置“d”、“e”和“f”。这按预期返回了d,e,f

这有点像 vlookup 中的 hlookup,它在逗号分隔的列表中返回多个命中,也允许负偏移量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2020-04-13
    • 2013-04-17
    • 2017-08-13
    • 2018-06-04
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多