Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Подсчет уникальных текстовых значений
 
Добрый день.
Возникала проблема подсчета уникальных значений. Как одной формулой подсчитать количество уникальных имен для каждого подразделения?
Функция ВПР выдает имена в текстовой форме, а нужно чтобы рядом с каждым подразделением было написано количество уникальных.  
Изменено: victory17 - 4 Сен 2018 11:05:27
 
UDF
Код
Function СЧЁТУНИКЕСЛИ(rng1 As Range, rng2 As Range, kr As Variant) As Double
'аргументы:
'rng1 - диапазон отбора уникальных значений, обязательный
'rng2 - диапазон условий, обязательный
'kr - условие (критерий), обязательный
СЧЁТУНИКЕСЛИ = 0
On Error Resume Next
    With New Collection
        For Each cl In rng1
            If rng2.Parent.Cells(cl.Row, rng2.Column) Like kr Then
                .Add cl, CStr(cl)
                If Err = 0 Then
                    СЧЁТУНИКЕСЛИ = СЧЁТУНИКЕСЛИ + 1
                Else
                    Err.Clear
                End If
            End If
        Next
    End With
End Function
Согласие есть продукт при полном непротивлении сторон.
 
COUNTIF или обычная сводная
 
Хотелось бы избежать макросов. Нужно сделать как можно проще, в одно действие.
Функция счетесли не дает такого результата. Так как диапазон - это столбец А, а критерий, например Подразделение 1.
 
Доброе время суток.
Сводной на Power Pivot
 
Массивная
=SUM(IF($A$2:$A$12=$D2;1/COUNTIFS($A$2:$A$12;$D2;$B$2:$B$12;$B$2:$B$12);0))
Изменено: БМВ - 4 Сен 2018 21:33:41
 
в дополнение к UDF из #2 с использованием коллекции,вариант со словарем,кнопки test и очистка и UDF
Код
Function uuu&(r As Range, t$)
     Dim i&, z: z = r.Value
    With CreateObject("scripting.dictionary"): .CompareMode = 1
    .RemoveAll
      For i = 1 To UBound(z)
         If z(i, 1) = t And .exists(z(i, 2)) = False Then .Item(z(i, 2)) = .Item(z(i, 2)) + 1
      Next
   uuu = .Count
   End With
End Function 

 
Код
 Sub test()
     Dim i&, j&, z: z = Range("A2:B" & Range("A" & Rows.Count).End(xlUp).Row).Value
    With CreateObject("scripting.dictionary"): .CompareMode = 1
    For j = 2 To Range("D" & Rows.Count).End(xlUp).Row
      For i = 1 To UBound(z)
         If z(i, 1) = Range("D" & j).Value And .exists(z(i, 2)) = False Then .Item(z(i, 2)) = .Item(z(i, 2)) + 1
     Next
   Range("E" & j) = .Count: .RemoveAll
   Next
   End With
End Sub
Изменено: кузя1972 - 5 Сен 2018 08:11:57
 
Еще вариант формулой массива (вводится одновременным нажатием Контрл Шифт Ентер)
=СЧЁТ(1/(ПОИСКПОЗ(B$2:B$99&D2;B$2:B$99&A$2:A$99;)=СТРОКА(A$1:A$98)))
Изменено: _Boroda_ - 5 Сен 2018 12:49:41
Скажи мне, кудесник, любимец ба’гов...

 
Еще вариант.
=СУММПРОИЗВ((A$2:A$12=D2)/СЧЁТЕСЛИМН(B$2:B$12;B$2:B$12;A$2:A$12;A$2:A$12))
 
Цитата
AleksSid написал:
Еще вариант.
Коллеги, ТС с утра уже был и в одной из тем отписался. Вы уверены, что это ещё ему хоть как-нибудь нужно? Видимо сам всё сам решил ;)
 
Цитата
Андрей VG написал:
ТС с утра уже был и в одной из тем отписался.
Странно. У него в профиле 2 поста и одна тема. Или у него несколько профилей?
Цитата
Андрей VG написал:
Вы уверены, что это ещё ему хоть как-нибудь нужно?
А без разницы. Поупражняться лишний раз никогда не помешает. Тем более, что это занимает 1-2 минуты
Скажи мне, кудесник, любимец ба’гов...

 
Цитата
_Boroda_ написал:
А без разницы. Поупражняться лишний раз никогда не помешает.
Согласен
Цитата
_Boroda_ написал:
1-2 минуты
я вчера сперва в MMULT ушел :-) , так что заняло больше , пока от туда выбирался :-)
Страницы: 1
Читают тему (гостей: 1)
Наверх