Совпадение подстроки Excel SUMPRODUCT - PullRequest
0 голосов
/ 05 февраля 2019

Я использую 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

Первое ИСТИНА ипоследние значения FALSE соответствуют ожидаемым (успех), но мне нужно, чтобы средние два соответствовали TRUE (Определите 2147 рядом с , 500 и в диапазоне 2146-2148.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Просто для FYI это формула:

=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 при выходе из режима редактирования.

enter image description here

0 голосов
/ 05 февраля 2019

Используется пользовательская функция.Если вы используете его, я предлагаю вам дать ему более осмысленное имя.

Таким образом, вы поместите эту формулу в B1 и скопируете

=Match2(2147,A1)

В общих чертах, функция проверяет, является лидефис существует (с использованием Split) и, если это так, проверяет требуемое значение по нижнему и верхнему пределам.

Если нет, снова используя Split, мы разделяем запятые, и если какой-либо элемент результирующего массива равен нашему желаемомувозвращаемое значение ИСТИНА.

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

enter image description here

...