I am new to VBA and I am trying to find the number of times the same values are repeated in particular column.
Then I need to paste the value and the count of the repeated value in column A and B of another sheet.
I need to count the number of times repeated values:
PSV_Cust_1
PSV_Cust_1
PSV_Cust_1
PSV_Cust_1
PSV_Cust_1
PSV_Cust_2
PSV_Cust_2
PSV_Cust_2
PSV_Cust_2
PSV_Cust_3
PSV_Cust_3
PSV_Cust_3
PSV_Cust_3
PSV_Cust_4
PSV_Cust_4
PSV_Cust_4
PSV_Cust_5
PSV_Cust_5
PSV_Cust_5
PSV_Cust_5
PSV_Cust_5
PSV_Cust_5
PSV_Cust_5
PSV_Cust_5
Result should be:
Value Count
PSV_Cust_1 5
PSV_Cust_2 4
PSV_Cust_3 4
PSV_Cust_4 3
PSV_Cust_5 7
Please any one help to get the outpu using VBA code.
Chris Pfohl
17.8k9 gold badges67 silver badges110 bronze badges
asked Feb 15, 2013 at 13:49
2
As others have suggested, a Pivot Table
would be the simplest way to accomplish this. Here’s how:
1) Select the rows you want to count
2) Choose
Insert -> PivotTable
from the ribbon3) A window will appear, click
Ok
to create your pivot
table:
4) On the right under «PivotTable Field List: Choose fields to add to report:» click the checkbox next:
5) Now drag the checkbox field you just clicked down to the «Values» list and let go:
6) That’s it! You will now have what you asked for:
answered Feb 15, 2013 at 19:49
StoriKnowStoriKnow
5,6686 gold badges37 silver badges46 bronze badges
3
This macro will do what you need:
Sub Summarize(rngSource As Range, rngTarget As Range)
Dim d As New Scripting.Dictionary
Dim rng As Range
Dim var As Variant
For Each rng In rngSource
If rng <> "" Then
If d.Exists(rng.Value) Then
d(rng.Value) = d(rng.Value) + 1
Else
d.Add rng.Value, 1
End If
End If
Next rng
rngTarget = "Value"
rngTarget.Offset(, 1) = "Count"
Set rng = rngTarget.Offset(1)
For Each var In d.Keys
rng = var
rng.Offset(, 1) = d(var)
Set rng = rng.Offset(1)
Next
End Sub
You need to add a reference to the Microsoft Scripting Library in the Visual Basic Editor (Tools->References). You can call it like this:
Summarize Sheet1.Range("A1:A24"), Sheet1.Range("C1")
answered Feb 15, 2013 at 14:31
Peter AlbertPeter Albert
16.8k4 gold badges66 silver badges88 bronze badges
1
The COUNTIF(range, value) function will do what you want — it has the advantage that you can more easily constrain the values you want to search for (compared to a pivot table). Imagine your data is in range «Sheet1!A1:A25» which you have named «customers» (you do this by selecting the range and typing customers
in the address box to the left of the formula bar).and contains «customer 1, customer 2… through customer 10», and you only want to know how many times customers 1 and 5 appear, you can create the following on sheet2
col A col B
Value count
customer 1 =COUNTIF(customers, A1)
customer 5 =COUNTIF(customers, A2)
Of course you can just drag the formula down from cell B1 — you don’t need to type it in again.
This will count the customers, update automatically, … I think it’s easier than a pivot table in this example.
answered Feb 15, 2013 at 14:33
FlorisFloris
45.7k6 gold badges70 silver badges122 bronze badges
2
Очень часто при работе c таблицами Excel возникают ситуации, в которых необходимо сравнить несколько списков, найти в них повторяющиеся значения и что-то с ними сделать. Оптимальный способ поиска и обработки дубликатов должен быть выбран в зависимости от типа исходных данных и желаемого результата. Цель данной статьи — разобрать все возможные варианты обработки дубликатов в Excel в одной статье для того, чтобы читатель мог выбрать оптимальный вариант для любой ситуации.
Оглавление:
- Выделение
- Поиск и выделение повторяющихся значений ячеек в одном списке — условное форматирование
- Поиск и выделение повторяющихся значений ячеек в нескольких списках — условное форматирование
- Поиск и выделение повторяющихся значений ячеек — макрос Excel-VBA
- Поиск и выделение повторяющегося текста внутри ячеек — макрос Excel VBA
- Замена
- Замена дублирующихся значений ячеек с помощью макроса Excel-VBA
- Подстановка в другие таблицы
- Функция ВПР (VLOOKUP)
- Комбинация функций ИНДЕКС + ПОИСКПОЗ (INDEX+MATCH)+СЧЁТ()+ЕСЛИ()
- Подсчёт
- Посчитать количество повторений в одном списке
- Сравнение двух списков используя формулу подсчёта повторений
- Подсчёт количества повторений значений в строках с помощью макросов Excel-VBA
- Функция СЧЁТЕСЛИ (COUNTIF)
- Поиск
- Поиск повторений значений в ячейках с помощью макроса Excel-VBA
- Скрытие
- Сортировка и фильтр
- Скрытие строк с помощью макроса Excel-VBA
- Удаление
- Данные -> удалить дубликаты
- Умные таблицы. Форматировать как таблицу -> удалить дубликаты
Функции в каждом разделе описаны в порядке возрастания их сложности и трудоемкости использования.
Выделение
Поиск и выделение повторяющихся значений ячеек в одном списке — условное форматирование
1. Выделить все значения в списке
2. Вкладка «Главная» -> Условное форматирование -> Правила выделения ячеек -> Повторяющиеся значения
3. Выбрать необходимый формат (в данном случае выбран красный шрифт на светло-красном фоне)
Результат:
Если применить данное условное форматирование ко всему столбцу A, то все новые дубликаты, добавленные после строки 10 также будут отформатированы по заданному правилу.
Поиск и выделение повторяющихся значений ячеек в нескольких списках — условное форматирование
Сначала необходимо выделить столбцы (диапазоны ячеек) с дубликатами. Далее необходимо проделать действия, описанные в предидушем разделе начиная с шага 2.
Недостаток данного способа выделения дубликатов — визуально не определить, продублированы ли значения внутри каждого из списков, или между списками. В данном примере «малина» дублируется внутри списка 1, а «банан» и «груша» выделены потому что они продублированы между списками.
Для того, чтобы дублирование внутри списков воспринималось отдельно от дублирования между списков можно повторно использовать другое условное форматирование для каждого из столбцов по отдельности.
1. Выделяем первый столбец:
2. Вкладка «Главная» -> Условное форматирование -> Правила выделения ячеек -> Повторяющиеся значения
3. Пользовательский формат
4. Выбираем, например, одинарное подчеркивание, жирный шрифт и фиолетовый цвет.
5. Повторяем операцию с шага 2 для столбца B и получаем:
Поиск и выделение повторяющихся значений ячеек — макрос Excel-VBA
Скачать пример в Excel
Sub search_highlight_duplicates()
Dim Arr(16, 1) As String 'сравниваем значения как текст
'массив двухмерный
'16 на 2
'элементы 1-16,0 содержат значения ячеек
'элементы 1-16,1 - является ли соответсвующее значение дубликатом
For i = 1 To 16
Arr(i, 0) = ThisWorkbook.Sheets("Sheet1").Cells(i, 1).Value 'записываем в массив
Next i
For k = 1 To UBound(Arr, 1)
CurrentItem = Arr(k, 0) 'достаём по одному элементы из массива 1-16,0
For i = 1 To UBound(Arr, 1)
If CurrentItem = Arr(i, 0) And i <> k Then Arr(i, 1) = "COPY"
'сравниваем с другими элементами массива (за исключением себя самого)
'для копий записываем в 1-16,0 "COPY"
Next i
Next k
For i = 1 To UBound(Arr, 1)
ThisWorkbook.Sheets("Sheet1").Cells(i, 2).Value = Arr(i, 1)
'запишем результат обратно в таблицу в колонку 2
'либо здесь можно прописать особенное форматирование для каждого элемента исходного массива
Next i
End Sub
То же самое, но через форматирование ячеек:
Скачать пример в Excel
Sub search_highlight_duplicates()
Dim Arr(16, 1) As String
For i = 1 To 16
Arr(i, 0) = ThisWorkbook.Sheets("Sheet1").Cells(i, 1).Value
Next i
For k = 1 To UBound(Arr, 1)
CurrentItem = Arr(k, 0)
For i = 1 To UBound(Arr, 1)
If CurrentItem = Arr(i, 0) And i <> k Then Arr(i, 1) = "COPY"
Next i
Next k
For i = 1 To UBound(Arr, 1)
If Arr(i, 1) = "COPY" Then
With ThisWorkbook.Sheets("Sheet1").Cells(i, 1)
With .Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With .Font
.Color = -16776961
.TintAndShade = 0
End With
End With
End If
Next i
End Sub
Поиск и выделение повторяющегося текста внутри ячеек — макрос Excel VBA
Возможно существуют и другие более эффективные способы выделения копий слов внутри ячеек, но здесь будет описан только простейший способ, на который натолкнёт запись действий макрорекордером. Если мы напишем длинный текст в ячейке, включим запись макроса и отформатируем часть текста в ячейке, то получим примерно следующее:
Таким образом, для выделения отдельных слов в ячейке нам нужно предварительно найти, где расположен нужный нам набор символов, а также его длину для каждого повторения.
Замена
Замена дублирующихся значений ячеек с помощью макроса Excel-VBA
Подстановка в другие таблицы
Функция ВПР (VLOOKUP)
Об использовании функции ВПР пошагово.
Комбинация функций ИНДЕКС + ПОИСКПОЗ (INDEX+MATCH)+СЧЁТ()+ЕСЛИ()
Если таблица, из которой мы хотим доставать значения для подстановки содержит дубликаты, то использование функции ВПР может не дать нужного результата, так как ВПР использует первое попавшееся совпадение и результат будет зависит от сортировки.
Подсчёт
Посчитать количество повторений в одном списке
Сравнение двух списков используя формулу подсчёта повторений
Подсчёт количества повторений значений в строках с помощью макросов Excel-VBA
Функция СЧЁТЕСЛИ (COUNTIF)
Поиск
Поиск повторений значений в ячейках с помощью макроса Excel-VBA
Скрытие
Сортировка и фильтр
Скрытие строк с помощью макроса Excel-VBA
Удаление
Данные -> удалить дубликаты
Умные таблицы. Форматировать как таблицу -> удалить дубликаты
1 / 1 / 0 Регистрация: 23.11.2014 Сообщений: 18 |
|
1 |
|
Подсчет количества повторений в столбце16.06.2015, 16:00. Показов 4575. Ответов 3
Имеется столбец: Сверху название улицы, а снизу идут улицы, некоторые из которых повторяются. Нужно написать макрос подсчета количества повторений улиц, если 1 раз то 1 если 2 раза то 2 и тд… Результат должен быть в виде таблицы на том же листе следующего вида: Название улицы Кол-во Пушкина 1
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
16.06.2015, 16:00 |
Ответы с готовыми решениями: Подсчет суммы в столбце до первой пустой строки и новый подсчет Подсчёт количества повторений символов в строке Подсчет количества повторений по нескольким условиям Подсчет количества повторений в виде функций 3 |
Чорумфанин 346 / 346 / 320 Регистрация: 06.03.2014 Сообщений: 899 |
|
16.06.2015, 16:19 |
2 |
Нужен ли макрос?
0 |
kalbasiatka 414 / 262 / 82 Регистрация: 27.10.2012 Сообщений: 860 |
||||
16.06.2015, 16:37 |
3 |
|||
0 |
5942 / 3154 / 698 Регистрация: 23.11.2010 Сообщений: 10,524 |
|
16.06.2015, 18:40 |
4 |
СЧЕТЕСЛИ(), СУММПРОИЗВ()
0 |
Доброго времени суток, уважаемые форумчане!
Не могли бы вы подсказать, направить меня в нужном направлении.
Имеется таблица, с данным, в ячейках A1-An хранятся разные имена, некоторые из них повторяются. Подскажите пожалуйста, каким образом можно организовать подсчет каждого повторяющегося имени в таблице?
Тоесть сколько раз повторилось каждое имя.
Заранее спасибо за ответ.
8 ответов
13K
12 января 2007 года
Ser Artur
5 / / 06.10.2005
=COUNTIF(A1:A6,»Artur»)
405
12 января 2007 года
Dmitrii
554 / / 16.12.2004
Имеется таблица, с данным, в ячейках A1-An хранятся разные имена, некоторые из них повторяются. Подскажите пожалуйста, каким образом можно организовать подсчет каждого повторяющегося имени в таблице?
Тоесть сколько раз повторилось каждое имя.
Если инструментом решения должен служить макрос, а не функции рабочего листа, то алгоритм может быть таким:
— заводим массив для регистрации уникальных вариантов имён и массив счётчиков для них;
— организуем цикл по заданному диапазону ячеек для перебора всех значений;
— для каждого значения выполняем проверку наличия его в массиве уникальных имён (опять же в цикле); если проверяемое имя уже встречается в массиве, то увеличиваем значение соответствующего счётчика, если — не встречается, то добавляем его в массив и создаём очередной счётчик;
— нужным образом организуем вывод результатов (в окно сообщений, в файл, на лист и т.п.).
Если задача не учебная, то рекомендую использовать возможности объекта Dictionary из состава WSH. Вот пример:
Код:
Sub Example()
Dim dictNames As Object, arrKeys
Dim curCell As Range, curName As String
Set dictNames = CreateObject(«Scripting.Dictionary»)
dictNames.CompareMode = 1
For Each curCell In Range(«a1:a6»)
curName = curCell.Value
If dictNames.Exists(curName) Then
dictNames.Item(curName) = dictNames.Item(curName) + 1
Else
dictNames.Add curName, 1
End If
Next curCell
arrKeys = dictNames.Keys
For i = 0 To dictNames.Count — 1
MsgBox arrKeys(i) & «: » & dictNames.Item(arrKeys(i))
Next
End Sub
267
12 января 2007 года
Cutty Sark
1.2K / / 17.10.2002
Доброго времени суток, уважаемые форумчане!
Не могли бы вы подсказать, направить меня в нужном направлении.
Имеется таблица, с данным, в ячейках A1-An хранятся разные имена, некоторые из них повторяются. Подскажите пожалуйста, каким образом можно организовать подсчет каждого повторяющегося имени в таблице?
Тоесть сколько раз повторилось каждое имя.
Заранее спасибо за ответ.
Прекрасным средством для этого (и для много другого) является Сводная таблица (Pivot Table). Объяснения нужны?
2.1K
12 января 2007 года
Ariman
102 / / 20.10.2005
Pivot Table
Можно по подробней в общих чертах, если вас не затруднит?
По-поводу WSH, насколько я понимаю, это не ходит в состав Excel, все нужно реализовать в макросе.
Вопрос по-поводу алгоритма поиска имени. Вначале считваем первую ячейку, потом проверяем вторую, если не идентично, то пишем в массив второе имя, не пойму каким образом реализовать вот этот сам алгоритм сравнения всех данных.
267
13 января 2007 года
Cutty Sark
1.2K / / 17.10.2002
Так тебе обязательно это делать макросом? Макрос-то здесь необязателен. Можно с ним, можно без него…
И ещё скажи, какая у тебя версия Экселя, я имею в виду год и язык, чтобы мне не дублировать объяснения.
2.1K
13 января 2007 года
Ariman
102 / / 20.10.2005
Нужно макросом… 2003 офис, англ.вер
Объясните плз как на коде будет выглядеть, а то я никак не могу понять этот алгоритм.
405
16 января 2007 года
Dmitrii
554 / / 16.12.2004
Объясните плз как на коде будет выглядеть, а то я никак не могу понять этот алгоритм.
Вот один из вариантов:
Код:
Sub Example()
Dim curCell As Range
Dim arrNames() As String, arrNumNames() As Long
Dim resFind As Boolean
Dim curName As String
ReDim arrNames(1 To 1)
ReDim arrNumNames(1 To 1)
arrNames(1) = Range(«a1»).Value
arrNumNames(1) = 1
For Each curCell In Range(«a2:a6»)
curName = curCell.Value
i = LBound(arrNames)
Do
If StrComp(curName, arrNames(i), vbTextCompare) = 0 Then
arrNumNames(i) = arrNumNames(i) + 1
resFind = True
Else
i = i + 1
End If
Loop While resFind = False And i <= UBound(arrNames)
If resFind = False Then
ReDim Preserve arrNames(1 To i)
ReDim Preserve arrNumNames(1 To i)
arrNames(i) = curName
arrNumNames(i) = 1
Else
resFind = False
End If
Next curCell
For i = LBound(arrNames) To UBound(arrNames)
MsgBox arrNames(i) & «: » & arrNumNames(i)
Next i
End Sub
2.1K
17 января 2007 года
Ariman
102 / / 20.10.2005
Спасибо громное,щас будем пробовать.
Подсчет количества одинаковых значений, вывод на другой лист |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |