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

Вход

Регистрация

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

 

= Мир MS Excel/Макрос "NoDups_in_Range" - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Мир MS Excel » Вопросы и решения » Готовые решения » Макрос "NoDups_in_Range" (Подсчёт и вывод уникальных значений в диапазоне)
Макрос "NoDups_in_Range"
Alex_ST Дата: Пятница, 27.08.2010, 12:21 | Сообщение № 1
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Макрос NoDups_in_Range производит подсчёт уникальных значений в видимых ячейках задаваемого в диалоге диапазона. Скрытые ячейки (автофильтром, шириной/высотой, группировкой) пропускаются.
Если диапазон для подсчёта не задан, то значения считаются в выбранном диапазоне (Selection).
При необходимости возможен вывод списка уникальных значений в задаваемый в диалоге диапазон.
К сообщению приложен файл: NoDups_in_Range.zip (25.4 Kb)



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеМакрос NoDups_in_Range производит подсчёт уникальных значений в видимых ячейках задаваемого в диалоге диапазона. Скрытые ячейки (автофильтром, шириной/высотой, группировкой) пропускаются.
Если диапазон для подсчёта не задан, то значения считаются в выбранном диапазоне (Selection).
При необходимости возможен вывод списка уникальных значений в задаваемый в диалоге диапазон.

Автор - Alex_ST
Дата добавления - 27.08.2010 в 12:21
Alex_ST Дата: Среда, 24.11.2010, 17:18 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Разбирался тут в своих старых макросах и по ходу дела упростил и улучшил макрос NoDups_in_Range, выложенный здесь ранее.
Теперь стало возможно рядом со столбцом уникальных значений выводить и количество их в указанном диапазоне.
К сообщению приложен файл: 2389484.zip (25.9 Kb)



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеРазбирался тут в своих старых макросах и по ходу дела упростил и улучшил макрос NoDups_in_Range, выложенный здесь ранее.
Теперь стало возможно рядом со столбцом уникальных значений выводить и количество их в указанном диапазоне.

Автор - Alex_ST
Дата добавления - 24.11.2010 в 17:18
Tviga Дата: Четверг, 23.02.2012, 14:11 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 20 ±
Замечаний: 0% ±

Супер!!!! я в культурном шоке))))
 
Ответить
СообщениеСупер!!!! я в культурном шоке))))

Автор - Tviga
Дата добавления - 23.02.2012 в 14:11
Alex_ST Дата: Воскресенье, 09.09.2012, 20:26 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
А потом, оказывается, ещё улучшил - без всяких UserForm вполне можно обойтись:[vba]
Код
Private Sub NoDups_in_Range()
'---------------------------------------------------------------------------------------
' Procedure    : NoDups_in_Range
' Author       : Alex_ST
' Purpose      : вывод списка уникальных значений из ВИДИМЫХ ячеек задаваемого диапазона с возможностью подсчёта числа повторов
'---------------------------------------------------------------------------------------
       Dim Addr, rRng As Range, rCell As Range
       On Error Resume Next
       '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
       ' замена Application.InputBox("...", "...", Type:=8), не работающего на других листах и листах с УФ формулой
       Addr = Application.InputBox("Где брать список?", "Выбор диапазона данных", "=" & Selection.Address, Type:=0)
       If TypeName(Addr) = "Boolean" Then Exit Sub    ' если нажали "Отмена", то Addr = False
       Addr = Range(Trim(Mid(Application.ConvertFormula(Addr, xlR1C1, xlA1, True), 2))).AddressLocal(0, 0, 1, 1)
       '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       Set rRng = Intersect(Range(Addr).Parent.UsedRange.SpecialCells(xlCellTypeVisible), Range(Addr)): If Err Then Exit Sub
       With CreateObject("Scripting.Dictionary"): .CompareMode = vbTextCompare   ' создаем временный словарь
          For Each rCell In rRng
             If Trim(rCell) <> "" Then .Item(Trim(rCell)) = .Item(Trim(rCell)) + 1   ' попытка записи значения по отсутствующему ключу добавит ключ в словарь
          Next
          If MsgBox("Видимые ячейки указанного диапазона содержат " & vbCrLf & .Count & " уникальных значений." & vbCrLf & _
                    "Вывести список на лист?", vbYesNo Or vbInformation, "Параметры списка") = vbNo Then Exit Sub
          '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
          ' замена Application.InputBox("...", "...", Type:=8), не работающего на других листах и листах с УФ формулой
          Addr = Application.InputBox("Куда выводить список?", "Выбор диапазона данных", "=" & Selection(1).Address, Type:=0)
          If TypeName(Addr) = "Boolean" Then Exit Sub   ' если нажали "Отмена", то Addr = False
          Addr = Range(Trim(Mid(Application.ConvertFormula(Addr, xlR1C1, xlA1, True), 2))).AddressLocal(0, 0, 1, 1)
          '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
          Range(Range(Addr)(1, 1), Range(Addr)(.Count, 1)).Value = Application.WorksheetFunction.Transpose(.keys)
          Range(Addr).Parent.Activate  ' перейти к листу, куда выводятся данные
          If MsgBox("Вывести количества в соседний столбец?", vbQuestion + vbYesNo, "Вывод данных") = vbYes Then
             Range(Range(Addr)(1, 2), Range(Addr)(.Count, 2)).NumberFormat = "General"
             Range(Range(Addr)(1, 2), Range(Addr)(.Count, 2)).Value = Application.WorksheetFunction.Transpose(.Items)
             Range(Range(Addr)(1, 1), Range(Addr)(.Count, 2)).Activate  ' выделить диапазон выведенных данных
          Else
             Range(Range(Addr)(1, 1), Range(Addr)(.Count, 1)).Activate  ' выделить диапазон выведенных данных
          End If
       End With
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Понедельник, 10.09.2012, 12:34
 
Ответить
СообщениеА потом, оказывается, ещё улучшил - без всяких UserForm вполне можно обойтись:[vba]
Код
Private Sub NoDups_in_Range()
'---------------------------------------------------------------------------------------
' Procedure    : NoDups_in_Range
' Author       : Alex_ST
' Purpose      : вывод списка уникальных значений из ВИДИМЫХ ячеек задаваемого диапазона с возможностью подсчёта числа повторов
'---------------------------------------------------------------------------------------
       Dim Addr, rRng As Range, rCell As Range
       On Error Resume Next
       '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
       ' замена Application.InputBox("...", "...", Type:=8), не работающего на других листах и листах с УФ формулой
       Addr = Application.InputBox("Где брать список?", "Выбор диапазона данных", "=" & Selection.Address, Type:=0)
       If TypeName(Addr) = "Boolean" Then Exit Sub    ' если нажали "Отмена", то Addr = False
       Addr = Range(Trim(Mid(Application.ConvertFormula(Addr, xlR1C1, xlA1, True), 2))).AddressLocal(0, 0, 1, 1)
       '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
       Set rRng = Intersect(Range(Addr).Parent.UsedRange.SpecialCells(xlCellTypeVisible), Range(Addr)): If Err Then Exit Sub
       With CreateObject("Scripting.Dictionary"): .CompareMode = vbTextCompare   ' создаем временный словарь
          For Each rCell In rRng
             If Trim(rCell) <> "" Then .Item(Trim(rCell)) = .Item(Trim(rCell)) + 1   ' попытка записи значения по отсутствующему ключу добавит ключ в словарь
          Next
          If MsgBox("Видимые ячейки указанного диапазона содержат " & vbCrLf & .Count & " уникальных значений." & vbCrLf & _
                    "Вывести список на лист?", vbYesNo Or vbInformation, "Параметры списка") = vbNo Then Exit Sub
          '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
          ' замена Application.InputBox("...", "...", Type:=8), не работающего на других листах и листах с УФ формулой
          Addr = Application.InputBox("Куда выводить список?", "Выбор диапазона данных", "=" & Selection(1).Address, Type:=0)
          If TypeName(Addr) = "Boolean" Then Exit Sub   ' если нажали "Отмена", то Addr = False
          Addr = Range(Trim(Mid(Application.ConvertFormula(Addr, xlR1C1, xlA1, True), 2))).AddressLocal(0, 0, 1, 1)
          '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
          Range(Range(Addr)(1, 1), Range(Addr)(.Count, 1)).Value = Application.WorksheetFunction.Transpose(.keys)
          Range(Addr).Parent.Activate  ' перейти к листу, куда выводятся данные
          If MsgBox("Вывести количества в соседний столбец?", vbQuestion + vbYesNo, "Вывод данных") = vbYes Then
             Range(Range(Addr)(1, 2), Range(Addr)(.Count, 2)).NumberFormat = "General"
             Range(Range(Addr)(1, 2), Range(Addr)(.Count, 2)).Value = Application.WorksheetFunction.Transpose(.Items)
             Range(Range(Addr)(1, 1), Range(Addr)(.Count, 2)).Activate  ' выделить диапазон выведенных данных
          Else
             Range(Range(Addr)(1, 1), Range(Addr)(.Count, 1)).Activate  ' выделить диапазон выведенных данных
          End If
       End With
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 09.09.2012 в 20:26
DJ_Marker_MC Дата: Среда, 19.09.2012, 21:50 | Сообщение № 5
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Алексей, добрый вечер.
Использую Вашу очень полезную разработку, но вот столкнулся ситуацией где нужно диапазоны сделать по умолчанию, другими словами, ответить на все заданные в ЮзерФормс вопросы так:

Где брать данные?: Отгрузка!$F:$F
Вывести список на лист?: ДА
Куда выводить список?: Распределение!$A$2
Вывести количества в соседний столбец?: НЕТ

Можете сказать где и что указать в коде или подправить код по мою ситуацию? Заранее благодарен.

Просто нужно чтоб это выполнялось без лишних вопросов в одном документе по нажатию кнопки.
 
Ответить
СообщениеАлексей, добрый вечер.
Использую Вашу очень полезную разработку, но вот столкнулся ситуацией где нужно диапазоны сделать по умолчанию, другими словами, ответить на все заданные в ЮзерФормс вопросы так:

Где брать данные?: Отгрузка!$F:$F
Вывести список на лист?: ДА
Куда выводить список?: Распределение!$A$2
Вывести количества в соседний столбец?: НЕТ

Можете сказать где и что указать в коде или подправить код по мою ситуацию? Заранее благодарен.

Просто нужно чтоб это выполнялось без лишних вопросов в одном документе по нажатию кнопки.

Автор - DJ_Marker_MC
Дата добавления - 19.09.2012 в 21:50
Alex_ST Дата: Четверг, 20.09.2012, 13:24 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Завал на работе...
Но раз уж обещал, то ловите (предупреждаю: не тестировал, некогда).
Вариант 1: прямо в коде прописаны требуемые Вам адреса:
Недостаток: если Вы переименуете листы, вставите или удалите столбцы или строки выше или левее диапазонов ввода-вывода, то работать будет не правильно
Вариант 2 : диапазоны ввода-вывода задаются именованными диапазонами "RangeIn" и "CellOut" соответственно:
Здесь можно свободно работать с листами, строками и столбцами книги (естественно, кроме удаления диапазонов ввода-вывода)



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Четверг, 20.09.2012, 13:31
 
Ответить
СообщениеЗавал на работе...
Но раз уж обещал, то ловите (предупреждаю: не тестировал, некогда).
Вариант 1: прямо в коде прописаны требуемые Вам адреса:
Недостаток: если Вы переименуете листы, вставите или удалите столбцы или строки выше или левее диапазонов ввода-вывода, то работать будет не правильно
Вариант 2 : диапазоны ввода-вывода задаются именованными диапазонами "RangeIn" и "CellOut" соответственно:
Здесь можно свободно работать с листами, строками и столбцами книги (естественно, кроме удаления диапазонов ввода-вывода)

Автор - Alex_ST
Дата добавления - 20.09.2012 в 13:24
DJ_Marker_MC Дата: Четверг, 20.09.2012, 13:49 | Сообщение № 7
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
большое спасибо. Буду юзать.
 
Ответить
Сообщениебольшое спасибо. Буду юзать.

Автор - DJ_Marker_MC
Дата добавления - 20.09.2012 в 13:49
Alex_ST Дата: Пятница, 21.09.2012, 09:34 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Пожалуйста.
К стати, вчера спешил и не заметил, что если Вам не нужно считать количество повторов, то вполне можно записать не [vba]
Code
If Trim(rCell) <> "" Then .Item(Trim(rCell)) = .Item(Trim(rCell)) + 1
[/vba] а [vba]
Code
If Trim(rCell) <> "" Then .Item(Trim(rCell)) = 0&
[/vba]тогда будет чуть-чуть быстрее работать, но это будет заметно только на огромных массивах.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Пятница, 21.09.2012, 09:35
 
Ответить
СообщениеПожалуйста.
К стати, вчера спешил и не заметил, что если Вам не нужно считать количество повторов, то вполне можно записать не [vba]
Code
If Trim(rCell) <> "" Then .Item(Trim(rCell)) = .Item(Trim(rCell)) + 1
[/vba] а [vba]
Code
If Trim(rCell) <> "" Then .Item(Trim(rCell)) = 0&
[/vba]тогда будет чуть-чуть быстрее работать, но это будет заметно только на огромных массивах.

Автор - Alex_ST
Дата добавления - 21.09.2012 в 09:34
KuklP Дата: Вторник, 25.09.2012, 05:44 | Сообщение № 9
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Леш, Trim$ работает чуть быстрей, чем Trim cool


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеЛеш, Trim$ работает чуть быстрей, чем Trim cool

Автор - KuklP
Дата добавления - 25.09.2012 в 05:44
Сержик Дата: Воскресенье, 06.04.2014, 01:29 | Сообщение № 10
Группа: Гости
Alex_ST, скажите пож-та, а как нужно видоизменить код, чтобы выявлялись несколько диапазонов и чтобы результат также выводился в разные места. Второй вариант с именованными диапазонами. мне больше подходит.
 
Ответить
СообщениеAlex_ST, скажите пож-та, а как нужно видоизменить код, чтобы выявлялись несколько диапазонов и чтобы результат также выводился в разные места. Второй вариант с именованными диапазонами. мне больше подходит.

Автор - Сержик
Дата добавления - 06.04.2014 в 01:29
Alex_ST Дата: Воскресенье, 06.04.2014, 10:43 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Завал на работе у меня стал практически перманентным и отвлечься на посторонние программы там некогда, а дома я занимаюсь домашними делами (а уж их-то всегда выше крыши :) )
Поэтому, к сожалению, готовый код написать для Вас я не смогу.
Но вообще-то проблема для тех, кто хоть чуть-чуть умеет писать процедуры VBA, совсем не большая:
1. Подпилите мой код так, чтобы ему диапазоны ввода-вывода задавались как параметры
2. Сделайте процедуру с циклом по Вашим именам диапазонов ввода-вывода, запускающую модернизированный код с передачей ему параметров

А уж как называть диапазоны и как их на основании придуманного Вами признака выделять их из всех имён книги - это уж Вам лично и карты в руки. Никто это за Вас без примера придумать не сможет.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеЗавал на работе у меня стал практически перманентным и отвлечься на посторонние программы там некогда, а дома я занимаюсь домашними делами (а уж их-то всегда выше крыши :) )
Поэтому, к сожалению, готовый код написать для Вас я не смогу.
Но вообще-то проблема для тех, кто хоть чуть-чуть умеет писать процедуры VBA, совсем не большая:
1. Подпилите мой код так, чтобы ему диапазоны ввода-вывода задавались как параметры
2. Сделайте процедуру с циклом по Вашим именам диапазонов ввода-вывода, запускающую модернизированный код с передачей ему параметров

А уж как называть диапазоны и как их на основании придуманного Вами признака выделять их из всех имён книги - это уж Вам лично и карты в руки. Никто это за Вас без примера придумать не сможет.

Автор - Alex_ST
Дата добавления - 06.04.2014 в 10:43
owand Дата: Понедельник, 30.03.2015, 17:22 | Сообщение № 12
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Алексей, ты лучший hands hands hands Огромное спасибо!
 
Ответить
СообщениеАлексей, ты лучший hands hands hands Огромное спасибо!

Автор - owand
Дата добавления - 30.03.2015 в 17:22
Arseniy_K Дата: Четверг, 14.01.2016, 14:45 | Сообщение № 13
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Alex_ST, спасибо за отличный макрос! А есть возможность сделать вывод уникальных значений по нескольким столбцам с последующей выдачей значений из одного столбца. Например:
В столбцах А,B,C, соответственно:

Миша/5/10
Даша/15/20
Миша/4/15
Даша/15/20
Даша/15/25

Должно вывести Миша 2, Даша 2 в 2 столбца.
 
Ответить
СообщениеAlex_ST, спасибо за отличный макрос! А есть возможность сделать вывод уникальных значений по нескольким столбцам с последующей выдачей значений из одного столбца. Например:
В столбцах А,B,C, соответственно:

Миша/5/10
Даша/15/20
Миша/4/15
Даша/15/20
Даша/15/25

Должно вывести Миша 2, Даша 2 в 2 столбца.

Автор - Arseniy_K
Дата добавления - 14.01.2016 в 14:45
Alex_ST Дата: Суббота, 16.01.2016, 19:48 | Сообщение № 14
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Arseniy_K,
придерживайтесь правил, пожалуйста.
Если Вам нужна какая-то доработка выложенного УНИВЕРСАЛЬНОГО макроса под Ваши СПЕЦИФИЧЕСКИЕ нужды, то вопрос нужно задавать не в Готовых решениях, а в Вопросах по VBA.
Но в любом случае - нужен Ваш пример - таблица Excel с образцом исходных данных и желаемым результатом их обработки, а не текстовое описание.
А из Вашего описания, к стати, следует, что никакой доработки моего макроса не требуется просто выделяете данные в столбце А, запускаете его и указываете, куда Вам нужно выводить результаты - уникальные значения, а рядом с ними - количество повторов. :)



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеArseniy_K,
придерживайтесь правил, пожалуйста.
Если Вам нужна какая-то доработка выложенного УНИВЕРСАЛЬНОГО макроса под Ваши СПЕЦИФИЧЕСКИЕ нужды, то вопрос нужно задавать не в Готовых решениях, а в Вопросах по VBA.
Но в любом случае - нужен Ваш пример - таблица Excel с образцом исходных данных и желаемым результатом их обработки, а не текстовое описание.
А из Вашего описания, к стати, следует, что никакой доработки моего макроса не требуется просто выделяете данные в столбце А, запускаете его и указываете, куда Вам нужно выводить результаты - уникальные значения, а рядом с ними - количество повторов. :)

Автор - Alex_ST
Дата добавления - 16.01.2016 в 19:48
Мир MS Excel » Вопросы и решения » Готовые решения » Макрос "NoDups_in_Range" (Подсчёт и вывод уникальных значений в диапазоне)
  • Страница 1 из 1
  • 1
Поиск:

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