Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Подсчет количества дубликатов в столбце - Мир MS Excel

Старая форма входа
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Подсчет количества дубликатов в столбце (Макросы/Sub)
Подсчет количества дубликатов в столбце
rtv206 Дата: Четверг, 09.05.2019, 17:58 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Доброго времени суток!
Уважаемые форумчане помогите в решении задачки
Необходимо посчитать количество дубликатов в столбце, которые выделяются условным форматированием
и вывести количество в ячейку
К сообщению приложен файл: 123854.xlsx (9.1 Kb)
 
Ответить
СообщениеДоброго времени суток!
Уважаемые форумчане помогите в решении задачки
Необходимо посчитать количество дубликатов в столбце, которые выделяются условным форматированием
и вывести количество в ячейку

Автор - rtv206
Дата добавления - 09.05.2019 в 17:58
_Boroda_ Дата: Четверг, 09.05.2019, 18:31 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Так нужно?
Код
=СУММПРОИЗВ(Ч(СЧЁТЕСЛИ(A1:A99;A1:A99)>1))

А вообще - название темы не очень. Решения есть не только с СЧЁТЕСЛИ. Просто навскидку - ПОИСКПОЗ, ЧАСТОТА, ПРОСМОТР, ...
К сообщению приложен файл: 123854_1.xlsx (9.4 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеТак нужно?
Код
=СУММПРОИЗВ(Ч(СЧЁТЕСЛИ(A1:A99;A1:A99)>1))

А вообще - название темы не очень. Решения есть не только с СЧЁТЕСЛИ. Просто навскидку - ПОИСКПОЗ, ЧАСТОТА, ПРОСМОТР, ...

Автор - _Boroda_
Дата добавления - 09.05.2019 в 18:31
rtv206 Дата: Суббота, 11.05.2019, 21:23 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
_Boroda_, спасибо, буду тестировать
 
Ответить
Сообщение_Boroda_, спасибо, буду тестировать

Автор - rtv206
Дата добавления - 11.05.2019 в 21:23
rtv206 Дата: Среда, 12.06.2019, 18:58 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
_Boroda_, При очень больших количествах ячеек, которые необходимо проверять, начинает тормозить Excel.
Есть ли другие варианты? кроме
Код
=СУММПРОИЗВ(Ч(СЧЁТЕСЛИ(A1:A99;A1:A99)>1))


Сообщение отредактировал rtv206 - Среда, 12.06.2019, 18:59
 
Ответить
Сообщение_Boroda_, При очень больших количествах ячеек, которые необходимо проверять, начинает тормозить Excel.
Есть ли другие варианты? кроме
Код
=СУММПРОИЗВ(Ч(СЧЁТЕСЛИ(A1:A99;A1:A99)>1))

Автор - rtv206
Дата добавления - 12.06.2019 в 18:58
_Boroda_ Дата: Среда, 12.06.2019, 22:46 | Сообщение № 5
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Вариантов много. Но большинство из них тоже тормознутые
Попробуйте так
Кол-во различных неуникальных кодов
Код
=СУММ(--(ЧАСТОТА(A1:A99;A1:A99)>1))

Кол-во "лишних" кодов (в массиве 1,1,2,2,2,2 лишних 4 штуки)
Код
=СЧЁТ(A:A)+СУММ(-(ЧАСТОТА(A1:A99;A1:A99)>0))

Кол-во дубликатов вообще
Код
=СЧЁТ(A:A)+СУММ(-(ЧАСТОТА(A1:A99;A1:A99)>0))-СУММ(-(ЧАСТОТА(A1:A99;A1:A99)>1))

Или, что то же самое
Код
=СЧЁТ(A:A)+СУММ({-1;1}*(ЧАСТОТА(A1:A99;A1:A99)>{0;1}))
К сообщению приложен файл: 123854_5.xlsx (9.8 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеВариантов много. Но большинство из них тоже тормознутые
Попробуйте так
Кол-во различных неуникальных кодов
Код
=СУММ(--(ЧАСТОТА(A1:A99;A1:A99)>1))

Кол-во "лишних" кодов (в массиве 1,1,2,2,2,2 лишних 4 штуки)
Код
=СЧЁТ(A:A)+СУММ(-(ЧАСТОТА(A1:A99;A1:A99)>0))

Кол-во дубликатов вообще
Код
=СЧЁТ(A:A)+СУММ(-(ЧАСТОТА(A1:A99;A1:A99)>0))-СУММ(-(ЧАСТОТА(A1:A99;A1:A99)>1))

Или, что то же самое
Код
=СЧЁТ(A:A)+СУММ({-1;1}*(ЧАСТОТА(A1:A99;A1:A99)>{0;1}))

Автор - _Boroda_
Дата добавления - 12.06.2019 в 22:46
rtv206 Дата: Пятница, 14.06.2019, 11:42 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
_Boroda_, Спасибо, буду пробовать
 
Ответить
Сообщение_Boroda_, Спасибо, буду пробовать

Автор - rtv206
Дата добавления - 14.06.2019 в 11:42
rtv206 Дата: Четверг, 20.06.2019, 22:55 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Подскажите, пожалуйста, других способов нет? Очень сильно тормозит при большом количестве значений.
Макросом например считать количество ячеек с условным форматированием?
 
Ответить
СообщениеПодскажите, пожалуйста, других способов нет? Очень сильно тормозит при большом количестве значений.
Макросом например считать количество ячеек с условным форматированием?

Автор - rtv206
Дата добавления - 20.06.2019 в 22:55
sboy Дата: Пятница, 21.06.2019, 09:25 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
Кол-во "лишних" кодов

с помощью Power Query
[vba]
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content][Столбец1],
    dupl = Table.FromRecords({[Дубликаты =List.Count(Источник)-List.Count(List.Distinct(Источник))]})
in
    dupl
[/vba]
К сообщению приложен файл: 7192929.xlsx (18.1 Kb)


Яндекс: 410016850021169
 
Ответить
Сообщение
Кол-во "лишних" кодов

с помощью Power Query
[vba]
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content][Столбец1],
    dupl = Table.FromRecords({[Дубликаты =List.Count(Источник)-List.Count(List.Distinct(Источник))]})
in
    dupl
[/vba]

Автор - sboy
Дата добавления - 21.06.2019 в 09:25
_Boroda_ Дата: Пятница, 21.06.2019, 11:46 | Сообщение № 9
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Ловите макросом с кнопки
[vba]
Код
Sub KolDub()
    c_ = 1
    r0_ = 1
    n_ = Cells(Rows.Count, c_).End(3).Row - r0_ + 1
    ar = Cells(r0_, c_).Resize(n_)
    Set slov1 = CreateObject("Scripting.Dictionary")
    Set slov2 = CreateObject("Scripting.Dictionary")
    With slov1
        For i = 1 To n_
            If .exists(ar(i, 1)) Then
                z_ = z_ + 1
                aaa = slov2.Item(ar(i, 1))
            Else
                aaa = .Item(ar(i, 1))
            End If
        Next i
    End With
    Cells(1, 6) = z_ + slov2.Count
End Sub
[/vba]
К сообщению приложен файл: 123854_6.xlsm (15.0 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеЛовите макросом с кнопки
[vba]
Код
Sub KolDub()
    c_ = 1
    r0_ = 1
    n_ = Cells(Rows.Count, c_).End(3).Row - r0_ + 1
    ar = Cells(r0_, c_).Resize(n_)
    Set slov1 = CreateObject("Scripting.Dictionary")
    Set slov2 = CreateObject("Scripting.Dictionary")
    With slov1
        For i = 1 To n_
            If .exists(ar(i, 1)) Then
                z_ = z_ + 1
                aaa = slov2.Item(ar(i, 1))
            Else
                aaa = .Item(ar(i, 1))
            End If
        Next i
    End With
    Cells(1, 6) = z_ + slov2.Count
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 21.06.2019 в 11:46
rtv206 Дата: Суббота, 22.06.2019, 13:10 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
_Boroda_, как прописать чтобы поиск дубликатов был в определенном диапазоне?
Например в столбцах c E по Z.
 
Ответить
Сообщение_Boroda_, как прописать чтобы поиск дубликатов был в определенном диапазоне?
Например в столбцах c E по Z.

Автор - rtv206
Дата добавления - 22.06.2019 в 13:10
_Boroda_ Дата: Вторник, 25.06.2019, 09:06 | Сообщение № 11
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Если ответов нет, то скорее всего что-то не так в вопросе.
В Вашем вопросе по крайней мере два нетака -
1, Нет файла-примера с данными в столбцах Е:Z
2. Не определено понятие дубликатов в разных столбцах - если в столбце Е значения а,в,в; в столбце F значения с,d,а, то понятно, что в - дубликат, но вот дубликат ли а?


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеЕсли ответов нет, то скорее всего что-то не так в вопросе.
В Вашем вопросе по крайней мере два нетака -
1, Нет файла-примера с данными в столбцах Е:Z
2. Не определено понятие дубликатов в разных столбцах - если в столбце Е значения а,в,в; в столбце F значения с,d,а, то понятно, что в - дубликат, но вот дубликат ли а?

Автор - _Boroda_
Дата добавления - 25.06.2019 в 09:06
rtv206 Дата: Вторник, 25.06.2019, 14:49 | Сообщение № 12
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Прикладываю файл примера)
К сообщению приложен файл: 5553643.xlsx (11.6 Kb)
 
Ответить
СообщениеПрикладываю файл примера)

Автор - rtv206
Дата добавления - 25.06.2019 в 14:49
rtv206 Дата: Вторник, 25.06.2019, 14:50 | Сообщение № 13
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
2. Не определено понятие дубликатов в разных столбцах - если в столбце Е значения а,в,в; в столбце F значения с,d,а, то понятно, что в - дубликат, но вот дубликат ли а?


Да, а тоже является дубликатом.
 
Ответить
Сообщение
2. Не определено понятие дубликатов в разных столбцах - если в столбце Е значения а,в,в; в столбце F значения с,d,а, то понятно, что в - дубликат, но вот дубликат ли а?


Да, а тоже является дубликатом.

Автор - rtv206
Дата добавления - 25.06.2019 в 14:50
_Boroda_ Дата: Вторник, 25.06.2019, 15:20 | Сообщение № 14
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Во, другое дело!
Так хотели?
[vba]
Код
Sub KolDub()
    c0_ = 5
    nc_ = Cells(1).SpecialCells(xlLastCell).Column - c0_ + 1
    If nc_ < 1 Then Exit Sub
    r0_ = 1
    nr_ = Cells(1).SpecialCells(xlLastCell).Row - r0_ + 1
    If nr_ < 1 Then Exit Sub
    ar = Cells(r0_, c0_).Resize(nr_, nc_)
    Set slov1 = CreateObject("Scripting.Dictionary")
    Set slov2 = CreateObject("Scripting.Dictionary")
    With slov1
        For i = 1 To nr_
            For j = 1 To nc_
                If Not IsEmpty(ar(i, j)) Then
                    If .exists(ar(i, j)) Then
                        z_ = z_ + 1
                        aaa = slov2.Item(ar(i, j))
                    Else
                        aaa = .Item(ar(i, j))
                    End If
                End If
            Next j
        Next i
    End With
    Cells(1, 2) = z_ + slov2.Count
End Sub
[/vba]
К сообщению приложен файл: 5553643_1.xlsm (19.1 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеВо, другое дело!
Так хотели?
[vba]
Код
Sub KolDub()
    c0_ = 5
    nc_ = Cells(1).SpecialCells(xlLastCell).Column - c0_ + 1
    If nc_ < 1 Then Exit Sub
    r0_ = 1
    nr_ = Cells(1).SpecialCells(xlLastCell).Row - r0_ + 1
    If nr_ < 1 Then Exit Sub
    ar = Cells(r0_, c0_).Resize(nr_, nc_)
    Set slov1 = CreateObject("Scripting.Dictionary")
    Set slov2 = CreateObject("Scripting.Dictionary")
    With slov1
        For i = 1 To nr_
            For j = 1 To nc_
                If Not IsEmpty(ar(i, j)) Then
                    If .exists(ar(i, j)) Then
                        z_ = z_ + 1
                        aaa = slov2.Item(ar(i, j))
                    Else
                        aaa = .Item(ar(i, j))
                    End If
                End If
            Next j
        Next i
    End With
    Cells(1, 2) = z_ + slov2.Count
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 25.06.2019 в 15:20
rtv206 Дата: Четверг, 27.06.2019, 01:08 | Сообщение № 15
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
_Boroda_, Спасибо огромное!
Буду тестировать))))
 
Ответить
Сообщение_Boroda_, Спасибо огромное!
Буду тестировать))))

Автор - rtv206
Дата добавления - 27.06.2019 в 01:08
rtv206 Дата: Суббота, 07.12.2019, 17:26 | Сообщение № 16
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
_Boroda_, при количестве заполненных ячеек 200 тыс, много времени уходит на проверку((
Не подскажете есть ли другой способ, гораздо быстрее?
 
Ответить
Сообщение_Boroda_, при количестве заполненных ячеек 200 тыс, много времени уходит на проверку((
Не подскажете есть ли другой способ, гораздо быстрее?

Автор - rtv206
Дата добавления - 07.12.2019 в 17:26
_Boroda_ Дата: Суббота, 07.12.2019, 20:35 | Сообщение № 17
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Много - это сколько? У меня далеко не самая мощная машина, но 10 столбцов по 20 000 ячеек в каждом считает 0,84 секунды

Да, если у Вас в файле есть Условное форматирование на проверку задвоений этих 200 000 ячеек, то уберите его, это как раз причина тормозов


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеМного - это сколько? У меня далеко не самая мощная машина, но 10 столбцов по 20 000 ячеек в каждом считает 0,84 секунды

Да, если у Вас в файле есть Условное форматирование на проверку задвоений этих 200 000 ячеек, то уберите его, это как раз причина тормозов

Автор - _Boroda_
Дата добавления - 07.12.2019 в 20:35
rtv206 Дата: Воскресенье, 08.12.2019, 15:53 | Сообщение № 18
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
_Boroda_, пончо, спасибо, попробую)
 
Ответить
Сообщение_Boroda_, пончо, спасибо, попробую)

Автор - rtv206
Дата добавления - 08.12.2019 в 15:53
rtv206 Дата: Воскресенье, 08.12.2019, 18:27 | Сообщение № 19
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 131
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
_Boroda_, используя макрос из Сообщение № 14
Количество значений 110236 подсчет дубликатов идет 3,5 минуты.
Все условное форматирование отключено.
Вес файла 600 кБ. Прикладываю ссылку на ГуглДиск
My WebPage
 
Ответить
Сообщение_Boroda_, используя макрос из Сообщение № 14
Количество значений 110236 подсчет дубликатов идет 3,5 минуты.
Все условное форматирование отключено.
Вес файла 600 кБ. Прикладываю ссылку на ГуглДиск
My WebPage

Автор - rtv206
Дата добавления - 08.12.2019 в 18:27
RAN Дата: Воскресенье, 08.12.2019, 22:12 | Сообщение № 20
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Поменял порядок циклов, и погонял. Результат не утешительный.
[vba]
Код
Sub KolDub()
    Dim t!, tt!
    t = Timer
    c0_ = 5
    nc_ = Cells(1).SpecialCells(xlLastCell).Column - c0_ + 1
    If nc_ < 1 Then Exit Sub
    r0_ = 1
    nr_ = Cells(1).SpecialCells(xlLastCell).Row - r0_ + 1
    If nr_ < 1 Then Exit Sub
    ar = Cells(r0_, c0_).Resize(nr_, nc_)
    Set slov1 = CreateObject("Scripting.Dictionary")
    Set slov2 = CreateObject("Scripting.Dictionary")
    tt = Timer
    With slov1
        For j = 1 To nc_
            For i = 1 To nr_
                If Not IsEmpty(ar(i, j)) Then
                    If .exists(ar(i, j)) Then
                        z_ = z_ + 1
                        aaa = slov2.Item(ar(i, j))
                    Else
                        aaa = .Item(ar(i, j))
                    End If
                End If
            Next
            Debug.Print j & "j    " & Format(Timer - tt, "0.00")
            tt = Timer
            DoEvents
        Next

End With
Debug.Print "end    " & Format(Timer - t, "0.00")
Cells(1, 2) = z_ + slov2.Count
End Sub
[/vba]
1j 0,40
2j 1,16
3j 1,88
4j 2,65
5j 3,53
6j 4,60
7j 5,66
8j 6,51
9j 7,34
10j 8,14
11j 8,98
12j 9,80
13j 10,63
14j 11,53
15j 12,31
16j 13,20
17j 13,98
18j 14,82
19j 15,73
20j 16,47
21j 17,27
22j 18,11
23j 18,92
24j 20,02
25j 22,44
26j 21,63
27j 22,48
28j 19,68
29j 20,22
30j 20,85
31j 21,53
end 392,59
При этом, волею судеб _Boroda_, последние 4 столбца пустые, и время на их обработку меня вообще ставит в тупик.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПоменял порядок циклов, и погонял. Результат не утешительный.
[vba]
Код
Sub KolDub()
    Dim t!, tt!
    t = Timer
    c0_ = 5
    nc_ = Cells(1).SpecialCells(xlLastCell).Column - c0_ + 1
    If nc_ < 1 Then Exit Sub
    r0_ = 1
    nr_ = Cells(1).SpecialCells(xlLastCell).Row - r0_ + 1
    If nr_ < 1 Then Exit Sub
    ar = Cells(r0_, c0_).Resize(nr_, nc_)
    Set slov1 = CreateObject("Scripting.Dictionary")
    Set slov2 = CreateObject("Scripting.Dictionary")
    tt = Timer
    With slov1
        For j = 1 To nc_
            For i = 1 To nr_
                If Not IsEmpty(ar(i, j)) Then
                    If .exists(ar(i, j)) Then
                        z_ = z_ + 1
                        aaa = slov2.Item(ar(i, j))
                    Else
                        aaa = .Item(ar(i, j))
                    End If
                End If
            Next
            Debug.Print j & "j    " & Format(Timer - tt, "0.00")
            tt = Timer
            DoEvents
        Next

End With
Debug.Print "end    " & Format(Timer - t, "0.00")
Cells(1, 2) = z_ + slov2.Count
End Sub
[/vba]
1j 0,40
2j 1,16
3j 1,88
4j 2,65
5j 3,53
6j 4,60
7j 5,66
8j 6,51
9j 7,34
10j 8,14
11j 8,98
12j 9,80
13j 10,63
14j 11,53
15j 12,31
16j 13,20
17j 13,98
18j 14,82
19j 15,73
20j 16,47
21j 17,27
22j 18,11
23j 18,92
24j 20,02
25j 22,44
26j 21,63
27j 22,48
28j 19,68
29j 20,22
30j 20,85
31j 21,53
end 392,59
При этом, волею судеб _Boroda_, последние 4 столбца пустые, и время на их обработку меня вообще ставит в тупик.

Автор - RAN
Дата добавления - 08.12.2019 в 22:12
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Подсчет количества дубликатов в столбце (Макросы/Sub)
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!