Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/91: Рейтинг темы: голосов - 91, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 27

Поиск и пометка повторяющихся значений

20.09.2006, 21:36. Показов 18462. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня, Господа !
Помогите мне, пожалуйста, определится с правильным подходом для реализации следующей задачи:
Есть столбец с данными в ячейках, например:
Столбец 1 Столбец 2
Иванов
Петров
Сидоров
Дармостук
Петров
Иванов
Необходимо при запуске макроса в столбце правее проставить метку напротив тех значений, которые повторяются, т. е.:
Столбец 1 Столбец 2
Иванов
Петров
Сидоров
Дармостук
Петров 1
Иванов 1
Другими словами, как только значение встречается второй раз, напротив него ставится метка.
Предвидя некоторые варианты ответов, скажу, что сортировка а потом применение формулы типа "=if(A1=A2,1,"")", как и применение сводной таблицы или других непрограммных методов, не подходит. Это необходимо реализовать программно.
Так вот, принимая во внимание все вышесказанное, я думаю реализовать это следующим способом:
1. Выделяю необходимую область
2. Создаю динамический массив
3. В цикле перебираю каждую ячейку, сравнивая ее содержимое со значениями в массиве. Если содержимое ячейки уже есть в массиве, то ставится метка, если нет, то заносится в массив.
Буду рад выслушать Ваши мысли, советы и комментарии по этому поводу
Александр
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.09.2006, 21:36
Ответы с готовыми решениями:

Сравнение повторяющихся значений
Добрый день, помогите решить задачу. Есть таблица с двумя столбцами, в перовом id, во втором данные для сравнения. Надо сравнить данные в...

Удаление повторяющихся значений из комбобокса
Добрый день. Как в VBA удалить из комбобокса данные которые повторяются, оставив только по одному значению... Спасибо.

Подсчет повторяющихся значений в ячейке
Всем здрасьте. Помогите, пожалуйста, реализовать макрос последовательного (с конца) подсчета нолей в активной ячейке и создания в этой...

31
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 27
22.09.2006, 17:16  [ТС]
Студворк — интернет-сервис помощи студентам
To игорий,
Ну я думаю что количество времени отрабатывания макроса не превышает количества времени, если это делать вручную. Хотя надо проверить
To rank1,
Очень интересно попробовать, вот только код спотыкается на строке "Dim h As New Scripting.dictionary".
Может галочку какую где поставить надо?
С уважением,
Александр
0
2 / 2 / 0
Регистрация: 16.04.2012
Сообщений: 24
22.09.2006, 17:23
у меня в варианте
Visual Basic
1
2
Dim h
Set h = CreateObject("Scripting.Dictionary")
заработало
и это вариант - у меня во всяком случае - принципиально быстрее отработал - сгенерированный мною столбец из 55 тыс строк обработался менее чем за 10 секунд (около 100 повторений было)
0
rank1
22.09.2006, 17:29
Всегда паджалуйста)
rank1
22.09.2006, 17:31
Надо подключить scrrun.dll
Tools->References...
0 / 0 / 0
Регистрация: 08.09.2011
Сообщений: 45
22.09.2006, 17:51
а ещё есть альтернативное решение, можно просто отфильтровать список
Visual Basic
1
Range("A1:A100").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1:B100"), Unique:=True
этот фильтр вставит в столбец В все уникальные (без повторяющихся) значения из столбца А
0
rank1
22.09.2006, 18:37
AdvancedFilter рулез!!!)))
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 27
22.09.2006, 21:56  [ТС]
<STRONG>То rank1</STRONG>,
И еще один вопросик на последок. Для полного и всепоглощающего счастья не хватает макроса, который выделяет <STRONG>все</STRONG> повторяющиеся записи:
Столбец 1 Столбец 2
Иванов 1
Петров 1
Сидоров
Дармостук
Иванов 1
Петров 1
Чувствую, что это можно сделать, подкрутив Ваш макрос, но уже в конце рабочей недели ничего соображаю.
Заранее спасибо.
С уважением,
Александр
0
rank1
23.09.2006, 01:19
Это с выделением цветом
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
Sub getTheSame()
 On Error GoTo errh: 'Óñòàíàâëèâàåì õåíäëåð îøèáîê
 Dim h As New Scripting.dictionary 'Ñîçäàåì õåø - ìíîæåñòâî ïàð "êëþ÷" -> çíà÷åíèå
 Dim rg As Range
 Set rg = Columns(2).Cells.SpecialCells(xlCellTypeConstants) 'Áåðåì òîëüêî êîíñòàíòû èç êîëîíêè 2
 Dim c As Range
 Dim i As Long
 For Each c In rg.Cells 'Ïåðåáèðàåì âñå ÿ÷åéêè èç ìíîæåñòâà
 DoEvents 'Äàåì Ýêñåëþ âîçìîæíîñòü îòðèñîâàòüñÿ
 ActiveWindow.Caption = c.Address 'Ìîæíî åùå àäðåñ ÿ÷åéêè ïîêàçûâàòü - ÷òîá áûë âèäåí ïðîãðåññ
 h(c.Value) = h(c.Value) + 1 ' Åñëè êëþ÷ íå ñóùåñòâîâàë, õåø åãî àâòîìàòè÷åñêè äîáàâèò, èíà÷å óâåëè÷èò ê-âî ïîâòîðåíèé êëþ÷à
  If h(c.Value) > 1 Then 'Åñëè êëþ÷ âñòðå÷àëñÿ áîëåå 1 ðàçà
   c.Offset(0, 1).Value = "Exists" 'Ñòàâèì â ñîñåäíåé ÿ÷åéêå Exists
   c.Interior.ColorIndex = Array(38, 40, 36, 35, 34, 37, 39, 7, 44, 6, 4, 8, 33, 3, 45, 42)(i Mod 15)
   c.Offset(0, 1).Interior.ColorIndex = c.Interior.ColorIndex
   i = i + 1
  End If
 Next c
 Set h = Nothing 'Îñâîáîæäàåì ïàìÿòü èç ïîä õåøà
 MsgBox "Done", vbInformation ' Íó è äëÿ íàãëÿäíîñòè ïëàêàò îá îêîí÷àíèè
 '=============================
 If 0 Then 'Ñþäà ïîïàäåì òîëüêî â ñëó÷àå îøèáêè
errh:       ' îáû÷íûõ óñëîâèÿõ if 0 íèêîãäà íå ñðàáîòàåò
  Set h = Nothing 'Åñëè âîçíè
rank1
23.09.2006, 01:50
А если select то вот так
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
Option Explicit
Sub getTheSame()
 On Error GoTo errh:
 Dim h As New Scripting.dictionary
 Dim rg As Range
 Set rg = Columns(2).Cells.SpecialCells(xlCellTypeConstants)
 Dim c As Range
 Dim i As Long, tc As Long
 Dim un As Range: Set un = Nothing
 For Each c In rg.Cells
 DoEvents
 ActiveWindow.Caption = c.Address
 h(c.Value) = h(c.Value) + 1
  If h(c.Value) > 1 Then
   c.Offset(0, 1).Value = "Exists"
    tc = Array(38, 40, 36, 35, 34, 37, 39, 7, 44, 6, 4, 8, 33, 3, 45, 42)(i Mod 15)
   c.Interior.ColorIndex = tc
   c.Offset(0, 1).Interior.ColorIndex = tc
   i = i + 1
     If un Is Nothing Then
        Set un = c
     Else
        Set un = Union(un, c)
     End If
   End If
 Next c
 Set h = Nothing
 MsgBox "Done", vbInformation
 un.Select
 '=============================
 If 0 Then
errh:
  Set h = Nothing
  MsgBox Err.Description
 End If
'==============================
End Sub
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
23.09.2006, 02:52
Как вариант, можно использовать ХМЛ/АДО для достижения этой цели. Его исполнение наверно самое быстрое, но я не сравнивал.
1. Поставьте на лист кнопку и макро для нее:
Visual Basic
1
2
3
4
Private Sub CommandButton1_Click()
    BuildXMLRecordset
    ReadXMLData
End Sub
2. Поставьте референс на Microsoft ActiveX Data Objects X.X Library
3. В модуль скопируйте:
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
53
54
Option Explicit
Sub BuildXMLRecordset()
    Dim objMyRcrdst As ADODB.Recordset
    Dim objMyStream As ADODB.Stream
    Dim strCnctn As String
    Dim strSQL As String
    strSQL = "SELECT F1, COUNT(F1)  FROM [Report] GROUP BY F1;" 'Report - это имя ранга, в котором все данные, подразумевается в одном столбце
    strCnctn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & ThisWorkbook.FullName & ";" & _
    "Extended Properties=""Excel 8.0;HDR=No"";"
     
    Set objMyRcrdst = New ADODB.Recordset
    Set objMyStream = New ADODB.Stream
     
    With objMyRcrdst
        
        .CursorLocation = adUseClient
        .Open strSQL, strCnctn, adOpenStatic, adLockReadOnly, adCmdText
         'Save the recordset into the stream.
        .Save objMyStream, adPersistXML
        .Close
        With objMyStream
            .SaveToFile "C:Report.xml", adSaveCreateOverWrite
            .Close
        End With
    End With
     
    Set objMyStream = Nothing
    Set objMyRcrdst = Nothing
     
End Sub
Sub ReadXMLData()
    Dim objMyRcrdst As ADODB.Recordset
    Dim strCnctn As String
    Dim strFile As String
     
    Set objMyRcrdst = New ADODB.Recordset
     
    strFile = "C:Report.xml"
    strCnctn = "Provider=MSPersist;"
    With objMyRcrdst
        .CursorLocation = adUseClient
        .Open strFile, strCnctn, adOpenStatic, adLockReadOnly, adCmdFile
        Set .ActiveConnection = Nothing
    End With
     
    With ActiveSheet
         'Copy the data from the recordset.
        .Range("B2").CopyFromRecordset objMyRcrdst
    End With
    objMyRcrdst.Close
    Set objMyRcrdst = Nothing
     
End Sub
Результатом будет во второй колонке список данных, а в третьей - их количество. Этот код можно дальше дописать, это легко. Скажем, затереть единицы (что можно, наверно и через strSQL), растиражировать обратно дупликаты и т.п. легкая добавочная деятельность, если очень хочется.
Одно слово предупреждения: по-моему, код работает с однотипными данными, или только со строками, или только с числами. Сильно не проверял
0
0 / 0 / 0
Регистрация: 25.05.2011
Сообщений: 27
25.09.2006, 15:44  [ТС]
To VladConn,
To rank1,
Спасибо большое, сейчас буду разбираться.
С уважением,
Александр
0
2 / 2 / 1
Регистрация: 10.04.2011
Сообщений: 415
28.09.2006, 14:41
Я не аудитор, но с 1997 года занимаюсь анализом ОС в целях оценки/переоценки. Так вот, ВСЕ проблемы с большими массивами решаются мною так:

1. Отключить автоматическое вычисление формул

2. Вставить колонку слева от всех данных и просто пронумеровать строки по порядку. Это позволит после любых манипуляций вернуть документу первоначальный вид

3. Для выделения дублирующихся ОС при отсутствии уникальных инвентарных номеров выполняю сортировку одновременно по 3-м критериям: шифр нормы амортизации, дата постановки на баланс, первоначальная (балансовая) стоимость.

После сортировки повторы оказываются рядом.

4. Далее по выбору - либо макросом, либо просто на отдельном листе формулу"=если('данные'!A1='данные'!A2,1, "")", и "Сервис/Параметры/Вычисления/Пересчет листа" (чтобы не пересчитывать основной с кучей формул).

5. Копировать полученные 1 и пустоты и выполнить"вставка значений" на листе данных.

6. Сортировка по вновь вставленному столбцу - все повторы оказутся внизу. Там их можно выделить цветом, например.

7. Сортировка по самому левому столбцу для возврата в исходный вид

8. Удаление первого и последнего столбцов и включение автоматического пересчета.

ВСЁ - мы получили исходные данные, как они были, но все повторы выделены нужным образом!

При желании несложно описанный алгоритм оформить макросом, но это только если действительно часто приходится такое делать, и столбцы с определенными данными (балансовая, шифр, дата) находятся на фиксированных позициях
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2006, 14:41

Изменение значений у повторяющихся элементов
Доброй ночи. Начну с того, что в VBA и программировании в целом я неофит, так что, пожалуйста, не пинайте меня слишком сильно за столь...

Выбор повторяющихся значений из массива
&lt;TABLE style=&quot;WIDTH: 121pt; BORDER-COLLAPSE: collapse&quot; cellSpacing=0 cellPadding=0 width=161 border=0 x:str&gt;&lt;COLGROUP&gt;&lt;COL style=&quot;WIDTH:...

Удаление повторяющихся (дубликаты) значений. VBA
Добрый день Уважаемые форумчане, Хочу спросить у вас помощи, возможно ли каким-либо образом упростить мой код. Что мне нужно...

Некорректное суммирование повторяющихся значений. (scripting.dictionary)
Привет друзья! Много интересного и нужного почерпнул с Вашего форума, и видимо пришло время задать свой вопрос знатокам. Итак ближе к делу....

Объединить таблицы в exel для повторяющихся значений
Добрый день. Нужна помощь. Есть файл exel, где в столбце повторяются значения. Под этим значением есть таблица, которая не дублируется. Мне...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru