Страницы: 1
RSS
Поиск значений (без дублирования), попадающих под условие
 
Добрый день!

Задача такая: найти такие ID, которые использовали подарки (Действие использовал подарок)  в местах, где у них не было Трат (Действие потратил)
Думаю, что можно собрать в одной ячейке значения по условию, как ВПР, но не первое значение, а все значения совпадающие условию.

Желательно: при повторении значений, он не вставлял это значение в ячейки (без дубликатов). Если в ячейке Подарки нет места из Покупки, то выдавало бы результат - Есть.
Результат, который бы хотелось сделать. Прикрепляю файл примера
Код
  ID     Покупки (места)   Подарки (Места)  Есть (да, нет)

  1      1                  3, 4            есть

Понимаю, что сумбурно. Если есть вопросы задавайте.
 
1. На втором листе убрать ошибки!
2. Теперь можно применить UDF из копилки -
в B1
Код
=IF(Таблица1[Действие]="Потратил";VLOOKUPCOUPLE(Таблица1;1;A2;3;", ");"")

в C1
Код
=IF(Таблица1[Действие]="Использовал подарок";VLOOKUPCOUPLE(Таблица1;1;A2;3;", ");"")

Есть? (да, нет) похоже нужно другую UDF писать... Впрочем таких случаев нет, а на нет и суда нет :)
Изменено: Hugo - 28.11.2019 16:20:38
 
Цитата
Hugo написал: На втором листе убрать ошибки!
Подскажите, какие ошибки нужно убрать, не вижу их.
 
Ошибки в первом столбце- #VALUE, они мешают работать UDF. В фильтре в самом низу.
Строки 6234, 9702, 9926.
Изменено: Hugo - 28.11.2019 13:47:57
 
Убрал ошибки.
Я ведь правильно понял принцип работы формулы - она считает все уникальные места с определенным действием? Если это так, то на примере первого ID 22417260 - в колонке Потратил считает верно, но в "Подарках" нет.

Скриншот прикрепляю.
 
Да, что-то так не работает, но в любом случае этот параметр можно добавить непосредственно в код UDF.
 
Вот скорректированный под эту задачу код:
Код
Function VLOOKUPCOUPLE(Table As Variant, _
                       SearchColumnNum As Integer, _
                       SearchValue As Variant, _
                        SearchColumnNum2 As Integer, _
                        SearchValue2 As Variant, _
                        RezultColumnNum As Integer, _
                       Separator_ As String, _
                       Optional BezPovtorov As Boolean = True)
 
'Table - таблица, где ищем
'SearchColumnNum - столбец, где ищем
'SearchValue - данные, которые ищем
'RezultColumnNum - колонка, откуда берём результат
'Separator_ - разделитель, желательно вводить с пробелом в конце
'BezPovtorov - если поставить 0, то будут выведены все повторяющиеся совпадения
 
    Dim i As Long, tmp As String, vlk
 
    If TypeName(Table) = "Range" Then Table = Intersect(Table.Parent.UsedRange, Table).Value
    If BezPovtorov Then
        With CreateObject("Scripting.Dictionary")
            For i = 1 To UBound(Table)
                If Table(i, SearchColumnNum) = SearchValue Then
                If Table(i, SearchColumnNum2) = SearchValue2 Then
                    tmp = Table(i, RezultColumnNum)
                    If tmp <> "" Then
                        If Not .exists(tmp) Then
                            .Add tmp, 0&
                            vlk = vlk & Separator_ & Table(i, RezultColumnNum)
                        End If
                    End If
                    End If
                End If
            Next i
        End With
    Else
        For i = 1 To UBound(Table)
            If Table(i, SearchColumnNum) = SearchValue Then
                vlk = vlk & Separator_ & Table(i, RezultColumnNum)
            End If
        Next i
    End If
    If vlk > 0 Then vlk = Mid(vlk, Len(Separator_) + 1) Else vlk = ""
    VLOOKUPCOUPLE = vlk
End Function


В ячйку С1 писать теперь так:
Код
=VLOOKUPCOUPLE(Таблица1;1;A2;2;"Использовал подарок";3;", ")

Ну и в B1 аналогично.
 
Для коллекции
Улучшаем функцию ВПР (VLOOKUP
Многоразовый ВПР (VLOOKUP)
Левый ВПР (Индекс + ПоискПоз)
 
Для D1. Можно конечно переменные a1 и a2 сократить, но так понятнее.
Код
=TrataPodarkov([@[Потратил (места)]];[@[Подарки (Места)]];", ")

Function TrataPodarkov(s1$, s2$, sep$) As Boolean
Dim a1, a2, el1, el2
    a1 = Split(s1, sep)
    a2 = Split(s2, sep)

    For Each el1 In a1
        For Each el2 In a2
            If el1 = el2 Then TrataPodarkov = True: Exit Function
        Next
    Next

End Function
Изменено: Hugo - 28.11.2019 14:53:51
 
Hugo,Спасибо. Выручили.
Страницы: 1
Наверх