Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/112: Рейтинг темы: голосов - 112, средняя оценка - 4.87
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11

Количество уникальных значений по условию

16.04.2013, 12:14. Показов 21777. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, всем!
Столкнулся со следующей проблемой: требуется подсчитать кол-во уникальных значений в одном столбце, если в соседнем столбце значение удовлетворяет определенному требованию. Желательно решить задачу стандартными средствами эксель (так как оно может и не проще , но быстрее точно).
Написал функцию для этой задачи, но 6000 строк она глотает 30 секунд ..=(
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Public Enum MTD
    [КОЛИЧЕСТВО_УНИ] = 0
    [МАССИВ_УНИ] = 1
End Enum
Public Function СВОД_УСЛ(Диапазон As Range, Условие As Variant, _
     Диапазон_условия As Range, metod As MTD)
Dim IC As Range
Dim RC As Range
Dim icv As Variant
Dim rcv As Variant
Dim x As Long
Dim y As Long
Dim USL() As Variant
Dim SHT As Boolean
Application.Volatile
x = Диапазон.Row + Диапазон.Rows.Count - 1
y = Диапазон.Parent.UsedRange.Rows.Count
If x > y Then x = y - Диапазон.Row + 1
Set Диапазон = Range(Диапазон.Cells(1), Диапазон.Rows(x).Cells(1))
Set Диапазон_условия = Диапазон.Offset(0, Диапазон_условия.Column - Диапазон.Column)
 
ReDim USL(1 To 1)
For Each IC In Диапазон_условия
    icv = IC.Value
    If LCase(icv) = LCase(Условие) Then
        For Each RC In Диапазон
            rcv = RC.Value
            If rcv <> "" And rcv <> 0 Then
                If RC.Row = IC.Row Then
                    SHT = True
                    For x = 1 To UBound(USL)
                        If USL(x) = rcv Then
                            SHT = False
                        End If
                    Next
                    If SHT Then
                        USL(UBound(USL)) = rcv
                        ReDim Preserve USL(1 To UBound(USL) + 1)
                    End If
                End If
            End If
        Next
    End If
Next
ReDim Preserve USL(1 To UBound(USL) - 1)
Select Case metod
    Case КОЛИЧЕСТВО_УНИ
    СВОД_УСЛ = UBound(USL)
    Case МАССИВ_УНИ
    СВОД_УСЛ = USL()
End Select
End Function
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.04.2013, 12:14
Ответы с готовыми решениями:

Получить количество уникальных значений
Нужно получить количество уникальных значений в видимых ячейках столбца(отфильтрованных). Помогите пожалуйста

Количество уникальных значений с применением автофильтра
Есть таблица. В ней первый столбец номер документа, второй - дополнительный параметр. Моя задача посчитать количество одинаковых...

Посчитать количество уникальных значений в каждой строке, игнорируя текст, 0 и пустые значения
Помогите написать макрос (или формулу) который бы подсчитывал кол-во уникальных значений в каждой строке, игнорируя текст, 0 и пустые...

39
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
18.04.2013, 12:58
Студворк — интернет-сервис помощи студентам
Смотрите. Моя функция в ст. Е, там включено условное форматирование на разницу со ст. С, и подсчитывается число различающихся ячеек (пока я не добавил .CompareMode=vbTextCompare, т.е. не различать регистр букв, отличия были).
Вложения
Тип файла: zip Пример задачи.zip (465.4 Кб, 23 просмотров)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
18.04.2013, 19:40
Цитата Сообщение от Bati4eli Посмотреть сообщение
Hugo121,
Как можно не работать с ячейками?
Ну в общем тут уже рассказали - берём весь диапазон в массив, работаем с массивом, на лист выгружаем сразу весь результат (тоже массив значений).
Скорость на своих тысячах можете замерить сами.
0
 Аватар для Bati4eli
617 / 17 / 8
Регистрация: 05.05.2012
Сообщений: 221
Записей в блоге: 11
19.04.2013, 17:56  [ТС]
#ЗНАЧ! - единственное что выдала функция СЧЕТ_УСЛ..
Но это уже неважно поскольку вчера начальник сказал, что одной разбивки по профессиям недостаточно и нужно также разбивать по организациям.
Я не стал делать по этому случаю функцию специальную а сделал универсальную.
Т.е. один из её аргументов это массив с диапазонами, а второй это метод вывода результата.
Один метод выводит просто из этих массив уникальные строки (подобно сводной таблице), а второй немного пересчитывает итог первого результата и вместо последнего столбца (диапазон с табелями) в массиве проставляет численность и убирает повторяющиеся строки.

Единственный и надеюсь уже последний вопрос:
Результат я вывожу с помощью макроса, т.к. я не знаю как на экселевском "языке" передать в виде аргумента массив диапазонов array(iCell1,iCell2...) ?
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 164
25.11.2017, 23:01
У меня при использовании указанной функции СВОД_УСЛ2 надолго зависает подсчет...может я как-то неправильно указала диапазоны? Посмотрите, пожалуйста, если не трудно.
Вложения
Тип файла: rar пример.rar (25.3 Кб, 11 просмотров)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
25.11.2017, 23:05
Цитата Сообщение от Bati4eli Посмотреть сообщение
но 6000 строк она глотает 30 секунд ..=(
- Вы это читали?
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 164
25.11.2017, 23:09
так у меня в примере всего 20 строк...тем более я использовала не изначальную функцию предложившего тему, а ту что предложил другой пользователь...там еще указано было что расчет занимает 0,02 секунды...вот у меня и возникло подозрение, что я что-то не так вставила...или идет конфликт с остальным кодом...
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
25.11.2017, 23:12
UsedRange там на 355... И вызывается эта функция 1048575 раз.
Вы лучше скажите по каким критериям нужно делать отбор - я по коду слёту не понял...
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 164
25.11.2017, 23:16
надо подсчитать количество уникальных значений в листе Таблица в столбике Договор(С) при одинаковом значении в столбике Метка(В).
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
25.11.2017, 23:16
Просто нужно количество уникальных договоров по индексу? Это формулисты стандартными формулами вычисляют, я правда больше по макросам...
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 164
25.11.2017, 23:18
Не могу нормальную формулу найти...мне хоть макросом хоть формулой....все равно потом как значение пересохраняю
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
25.11.2017, 23:25
Мне проще UDF сообразить:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Function uniqdogcountbyindex(rind, ind As String, rdog)
    Dim i As Long
    rind = Intersect(rind.Parent.UsedRange, rind).Value
    rdog = Intersect(rdog.Parent.UsedRange, rdog).Value
    On Error Resume Next
    With New Collection
        For i = 1 To UBound(rind)
            If rind(i, 1) = ind Then .Add rdog(i, 1), Trim(rdog(i, 1))
        Next
        uniqdogcountbyindex = .Count
    End With
    On Error GoTo 0
End Function
Протянуть на листе (можно кодом, или в коде использовать):
Visual Basic
1
=uniqdogcountbyindex(Таблица!B:B;A2;Таблица!C:C)
Разделители ставьте свои!!!
1
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 164
25.11.2017, 23:42
Показывает везде ноль(

Добавлено через 4 минуты
Простите, не туда поставила....спасибо все работает)))
0
0 / 0 / 0
Регистрация: 12.09.2020
Сообщений: 15
07.01.2021, 18:07
Доброго всем здоровья и с праздником!!!
Пользуюсь данным макросом. Помогите добавить в него суммирование данных полученных уникальных значений из столбцов "Е" и "G:K"
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub Данные()
    Dim i As Long, N As Long, c As Collection, m As Long
    Dim j As Long, vd As String, va As String
 
    Columns("C:C").Copy Range("L1")
 
    ActiveSheet.Range("L:L").RemoveDuplicates Columns:=1, Header:=xlYes
 
    Range("L1").Value = "Данные"
 
    N = Cells(Rows.Count, "L").End(xlUp).Row
    m = Cells(Rows.Count, "A").End(xlUp).Row
 
    For i = 2 To N
        Set c = Nothing
        Set c = New Collection
        vd = Cells(i, "L").Value
        For j = 2 To m
            va = Cells(j, "C").Value
            If va = vd Then
                On Error Resume Next
                    c.Add Cells(j, "A").Value, CStr(Cells(j, "A").Value)
                On Error GoTo 0
            End If
        Next j
        Cells(i, "M").Value = c.Count
    Next i
End Sub
0
0 / 0 / 0
Регистрация: 12.01.2023
Сообщений: 8
12.01.2023, 18:08
Цитата Сообщение от Hugo121 Посмотреть сообщение
Function uniqdogcountbyindex(rind, ind As String, rdog)
    Dim i As Long
    rind = Intersect(rind.Parent.UsedRange, rind).Value
    rdog = Intersect(rdog.Parent.UsedRange, rdog).Value
    On Error Resume Next
    With New Collection
        For i = 1 To UBound(rind)
            If rind(i, 1) = ind Then .Add rdog(i, 1), Trim(rdog(i, 1))
        Next
        uniqdogcountbyindex = .Count
    End With
    On Error GoTo 0
End Function
Добрый день! Помогите мне пожалуйста сделать эту функцию для счета значений по двум условиям. Пытаюсь разобраться как работает счет в функции, но не получается
0
1412 / 876 / 93
Регистрация: 08.02.2017
Сообщений: 3,731
Записей в блоге: 2
12.01.2023, 18:26
alexshem22, функция ищет количество уникальных сочетаний заданной строки (ind) в одном столбце (rind) с соответствующим значением в другом столбце (rdog)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
12.01.2023, 18:30
Цитата Сообщение от alexshem22 Посмотреть сообщение
Пытаюсь разобраться как работает счет в функции,
- выводится количество собранных в коллекцию значений.
Что за два условия? Тут без примера много может быть вариантов...
0
0 / 0 / 0
Регистрация: 12.01.2023
Сообщений: 8
12.01.2023, 19:23
Цитата Сообщение от Hugo121 Посмотреть сообщение
- выводится количество собранных в коллекцию значений.
Что за два условия? Тут без примера много может быть вариантов...
Ваша функция работает отлично, значение выдает)) Но мне нужно ее немного усложнить. На текущий момент функция считает уникальные значения если выполнено одно из условий (в моем примере это значения графы "Канал"), но мне также необходимо учитывать второе условие "Месяц".

Т.е. требуется добавлять в коллекцию значение графы "Заказ", отвечающее конкретному "Каналу" и "Месяцу"

Прикрепляю пример.
Вложения
Тип файла: zip Пример.xlsm.zip (14.6 Кб, 6 просмотров)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
12.01.2023, 19:32
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
На лист в ячейку G7 =uniqdogcountbyindex($C:$C;$B:$B;$F7;G$6;$A:$A) и протянуть.
 
 
Function uniqdogcountbyindex(rind, rind2, ind As String, ind2 As String, rdog)
    Dim i As Long
    rind = Intersect(rind.Parent.UsedRange, rind).Value
    rind2 = Intersect(rind2.Parent.UsedRange, rind2).Value
    rdog = Intersect(rdog.Parent.UsedRange, rdog).Value
    On Error Resume Next
    With New Collection
        For i = 1 To UBound(rind)
            If rind(i, 1) & "|" & rind2(i, 1) = ind & "|" & ind2 Then .Add rdog(i, 1), Trim(rdog(i, 1))
        Next
        uniqdogcountbyindex = .Count
    End With
    On Error GoTo 0
End Function
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
12.01.2023, 19:35
В файле. Но блох не выискивал, перепроверьте на бОльших данных.
В коде intersect для того, чтоб можно было указывать столбцы целиком, но сработает конечно и с явным указанием диапазонов.
Вложения
Тип файла: zip Пример.xlsm.zip (14.6 Кб, 8 просмотров)
1
0 / 0 / 0
Регистрация: 12.01.2023
Сообщений: 8
12.01.2023, 21:13
Цитата Сообщение от Hugo121 Посмотреть сообщение
В файле. Но блох не выискивал, перепроверьте на бОльших данных.
В коде intersect для того, чтоб можно было указывать столбцы целиком, но сработает конечно и с явным указанием диапазонов.
То что надо! На больших данных проверил.
Большое спасибо! Реквизиты в профиле актуальные? )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.01.2023, 21:13

Количество уникальных значений в Excel
Здравствуйте всем! у меня есть таблица с повторяющими данными. Как мне подсчитать количество уникальных значений при включенном...

Подсчитать количество уникальных значений в List
Уже 40 минут туплю над этим вопросом, все найденные примеры на Lynq не помогают. Вот в чем суть. Имеется класс: public class AppInfo ...

Подсчитать количество уникальных значений в массиве
есть список, в нем надо подсчитать количество повторяющихся значений. То есть например : 4, 5, 4, 1, 3, 2 В результате: 4 - 2...

Количество уникальных значений из таблицы mysql
Добрый день! Помогите пожалуйста решить задачу: Есть таблица &quot;table&quot; с полями &quot;name&quot; и &quot;city&quot; Вася / Москва ...

Количество уникальных значений в групповом запросе
Добрый день. Помогите, пожалуйста решить вот такую задачу: Требуется посчитать количество уникальных значений в запросе с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru