【问题标题】:Excel Formula to display multiple values using Index-MatchExcel 公式使用索引匹配显示多个值
【发布时间】:2016-02-22 16:52:34
【问题描述】:

我有大量的数据(大约 50x2000)数据,它们基本上采用以下形式,尽管数据集如前所述更大。

DistrictNo    LocationA    LocationB    LocationC   
-----------   ---------    ---------    ---------
0001          L1           L2            L3
0002          L1           L4
0003          L1           L5            L6
0004          L2

每个区可以有任意数量的位置,同一个位置可以在任意数量的区中,但 DistrictNo 永远是唯一的。

我需要一个公式(或 VBA),例如,当“L1”输入到单元格时,返回一个包含 0001、0002、0003 和 0004 的列表,当输入“L2”时返回 0001 和0004,当输入“L5”或“L6”时只返回0003。位置在哪一列无关紧要,我只需要行。

目前我对每列使用多个 MATCH 公式,然后在 MATCH 公式返回的行上使用 VLOOKUP,但问题是在上述数据集上,如果输入 L1,它仅返回 0001,因为 MATCH 仅处理第一个值,但如果输入 L2,它将返回 0001 和 0004,因为它们位于不同的列中。

【问题讨论】:

  • 也请分享你的公式
  • 任何公式都会让人望而生畏。因为它需要将 50 列添加到:($B$2:$B$2000 = "L1") + ($C$2:$C$2000 = "L1") + ... 以及使用 Small() 的数组公式来获取完整列表。 vba 是要走的路。

标签: excel excel-formula


【解决方案1】:

下面的 UDF 会做到这一点。 :

Public Function DistNo(Rng As Range, crit As String, k As Long) As String
    Dim rngArr() As Variant
    Dim i As Long, j As Long, h As Long

    h = 1

    rngArr = Rng

    For i = LBound(rngArr, 1) To UBound(rngArr, 1)
        For j = LBound(rngArr, 2) + 1 To UBound(rngArr, 2)
            If rngArr(i, j) = crit Then
                If h = k Then
                    DistNo = rngArr(i, 1)
                    Exit Function
                Else
                    h = h + 1
                    Exit For
                End If
            End If
        Next j
    Next i

    DistNo = CVErr(xlErrNA)


End Function

将它放在附加到工作簿的模块中。请勿输入 Worksheet 代码或 ThisWorkbook 代码:

然后你可以像普通公式一样调用它:

=IFERROR(DistNo($A$2:$D$5,$F$2,ROW(1:1)),"")

并根据需要向下复制。

这将使用第一列作为返回值。

【讨论】:

  • @baelaelael 这对你有用吗?如果是,请标记为正确。这是只有你能做的事情。如果没有,请告诉我哪里出了问题,以便我修复它。
  • 对不起,我昨天下班时发布了这个,今天早上才进来。您发布的内容非常有用,非常感谢!可以进行的一个小改进是,如果它可以删除重复项,它将很有用 - 例如,在我的数据集中,L4 可能在同一行中出现两次,而列表显示 0002 两次。我可以简单地编辑我的数据集,但我想知道在代码中是否有更简单的方法?
  • @baelaelael 查看编辑,我添加了一个 Exit For 来处理重复项。请点击答案左上角的灰绿色复选标记标记为正确。这是只有你才能做的事情。
猜你喜欢
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 2017-10-04
  • 2019-09-16
  • 2020-06-23
  • 2019-08-12
  • 1970-01-01
  • 2018-06-08
相关资源
最近更新 更多