【问题标题】:Excel SUMPRODUCT Substring MatchExcel SUMPRODUCT 子字符串匹配
【发布时间】:2019-02-05 16:43:31
【问题描述】:

我正在使用 SUMPRODUCT 来匹配一个等于多个事物之一的单元格。 使用下面的公式,我试图将值 2147(来自许多值的列中的单个值)与数字 2147 的以下变体匹配:

=SUMPRODUCT( -- ("2147"=Table6[data])) > 0

 Table6[data]   Return Value
1 2147          TRUE
2 2147, 500     FALSE
3 2146-2148     FALSE
4 21475         FALSE

第一个 TRUE 和最后一个 FALSE 值符合预期(成功),但我需要中间两个来匹配 TRUE(确定 , 500 旁边的 2147 和范围 2146-2148 之间。

【问题讨论】:

  • 例如 2,您是否尝试匹配任意长度的逗号分隔列表中的任何元素?例如。你想让 "16, 79, 2147, 3348" 匹配 2147 吗?
  • 不是答案,但您会考虑为这些数据设置两列吗?此外,这个给定示例的解决方案可能不适用于其他行,除非它们确实公平地代表了所有情况。
  • @xidgel 是的!那将是一个正确的匹配。
  • @MrDogme 值 2147 是从包含许多数字变化(包括范围)的表列中获得的。
  • 您的示例是否涵盖了所有可能性,即单个值、用逗号分隔的多个值以及用连字符表示的范围?

标签: excel match formula


【解决方案1】:

这使用了一个自定义函数。如果你使用它,我建议你给它一个更有意义的名字。

所以你要把这个公式放在 B1 中并复制下来

=Match2(2147,A1)

总的来说,该函数检查是否存在连字符(使用拆分),如果存在,则根据下限和上限检查所需的值。

如果不是,再次使用 Split,我们用逗号分割,如果结果数组的任何元素等于我们想要的值,我们返回 TRUE。

Function Match2(d As Double, r As Range) As Boolean

Dim v As Variant, i As Long

v = Split(r, "-")
If UBound(v) = 1 Then
    If Val(v(0)) <= d And Val(v(1)) >= d Then
        Match2 = True
    Else
        Match2 = False
    End If
    'we could shorten the five lines above to
    'Match2 = (Val(v(0)) <= d And Val(v(1)) >= d)
Else
    v = Split(r, ",")
    For i = LBound(v) To UBound(v)
        If Val(v(i)) = d Then
            Match2 = True
            Exit Function
        End If
    Next i
    Match2 = False
End If

End Function

【讨论】:

  • 非常好!这解决了我所有的用例,谢谢!
【解决方案2】:

仅供参考,这是公式:

=SUM(IF(ISNUMBER(SEARCH("-",TRIM(MID(SUBSTITUTE(A2,",",REPT(" ",99)),(ROW(INDEX(XFD:XFD,1):INDEX(XFD:XFD,LEN(A2)-LEN(SUBSTITUTE(A2,",",""))+1))-1)*99+1,99)))),(2147 >= --LEFT(TRIM(MID(SUBSTITUTE(A2,",",REPT(" ",99)),(ROW(INDEX(XFD:XFD,1):INDEX(XFD:XFD,LEN(A2)-LEN(SUBSTITUTE(A2,",",""))+1))-1)*99+1,99)),FIND("-",TRIM(MID(SUBSTITUTE(A2,",",REPT(" ",99)),(ROW(INDEX(XFD:XFD,1):INDEX(XFD:XFD,LEN(A2)-LEN(SUBSTITUTE(A2,",",""))+1))-1)*99+1,99)))-1))*(2147<=--MID(TRIM(MID(SUBSTITUTE(A2,",",REPT(" ",99)),(ROW(INDEX(XFD:XFD,1):INDEX(XFD:XFD,LEN(A2)-LEN(SUBSTITUTE(A2,",",""))+1))-1)*99+1,99)),FIND("-",TRIM(MID(SUBSTITUTE(A2,",",REPT(" ",99)),(ROW(INDEX(XFD:XFD,1):INDEX(XFD:XFD,LEN(A2)-LEN(SUBSTITUTE(A2,",",""))+1))-1)*99+1,99)))+1,99)),--(2147 = --TRIM(MID(SUBSTITUTE(A2,",",REPT(" ",99)),(ROW(INDEX(XFD:XFD,1):INDEX(XFD:XFD,LEN(A2)-LEN(SUBSTITUTE(A2,",",""))+1))-1)*99+1,99)))))>0

这是一个数组公式,退出编辑模式时需要用Ctrl-Shift-Enter确认,而不是Enter。

【讨论】:

  • 哇,我就知道你能做到!
  • @SJR 是的,这是一个不错的谜题,可以肯定的是,但不是我认为可用的。甚至我也会为此切换到 vba。
  • 出于兴趣,您是从内部构建这些公式还是可以将它们串在一起?
  • @SJR 通常我边走边把它们串起来,我从 mid() 开始在 , 上拆分字符串,然后围绕它进行逻辑处理。当我尝试失败的方法时,我进行了很多次迭代。当公式出错时,我使用 Evaluate Formula 来提供帮助。大多数时候,我的公式直接输入答案框中,无需测试。这是我测试过的。
猜你喜欢
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2021-08-25
相关资源
最近更新 更多