Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/30: Рейтинг темы: голосов - 30, средняя оценка - 4.97
SaNo
Excel

Поиск уникальных строк

17.08.2011, 19:19. Показов 6257. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано
Таблица с N колонок и сколько-то строк (много)
Нужен скрипт, который бы определял все ли ячейки в указанной колонке уникальны. Если есть неуникальные ячейки надо это пометить (я так думаю, что надо создать рядом колонку и пронумеровать дублирующиеся ячейки)
Может кто-нибудь подскажет алгоритм дейстивий, чтобы это сделать через VBA?
Можно выложить схожий скриптик, если не затруднит.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.08.2011, 19:19
Ответы с готовыми решениями:

Конкатенация и последующее копирование уникальных строк по условию
В файле есть 2 рабочих листа. Требуется с одного листа(List1), начиная с колонки С10,...

Выборка уникальных дат из строк листа "l1" и помещение их в лист "l3", Не получается. На листе "l3" вставляет
Запускаю с листа "l1" построчно работает, но мне нужно, чтобы заполнялись столбцы, начиная со...

Поиск уникальных значений по диапазону, суммирование количества и добавление суммы на сводный лист
Доброго времени, Есть количество уникальных значений на Листе1 , нужно найти эти значения на...

19
2 / 2 / 1
Регистрация: 10.04.2011
Сообщений: 415
18.08.2011, 11:02
Делал такое вручную, следовательно, можно и автоматизировать:
1.Добавляешь еще 2 колонки. В первую - номера по порядку, вторая пока пустая (далее служебная).
2.Сортируешь весь диапазон по колонке, в которой хочется найти дубли.
3.В служебную колонку во вторую строку данных пишешь формулу:
=если(X2=X1;'X','')
где Х1 и Х2 - в колонке с дублями (Х заменишь нужной буквой)
4.Заполняешь этой формулой вниз до конца простым копированием или Ctrl+D
5.Выделяешь всю служебную колонку и выполняешь над ней две операции: Правка/Копировать и Правка/Специальная вставка/Значения
6. Сортируешь все данные по колонке с порядковыми номерами (чтобы вернуть прежнее расположение.
7.Удаляешь колонку с порядковыми номерами (если она больше не нужна.
В итоге дублированные данные будут помечены в служебной колонке значком 'X'
0
1 / 1 / 0
Регистрация: 09.05.2011
Сообщений: 20
18.08.2011, 16:57
По быстрому
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub xxx() ' для A1
Dim Num, I, I1, Cel, Cel1
Num = Range('A1').SpecialCells(xlCellTypeLastCell).Row
For I = 1 To Num - 1
 Cel = Cells(I, 1)
 For I1 = I + 1 To Num
  Cel1 = Cells(I1, 1)
  If Cel1 = Cel Then
   Cells(I1, 1).Select
   With Selection.Interior
    .ColorIndex = 36
    .Pattern = xlSolid
   End With
  End If
 Next
Next I
End Sub
В колонке A1 отмечаются повторные неуникальные ячейки(первая не отмечается). При желании, первую тоже можно отметить (Cells(I, 1).Select)
0
2 / 2 / 1
Регистрация: 10.04.2011
Сообщений: 415
18.08.2011, 18:10
Гы, 2 вложенных цикла с доступом к ячейкам - по-быстрому при 1000 строк работать будет...
0
Messir
18.08.2011, 18:13
Уж лучше тогда коллекцию использовать, там, во-первых, хеширование какое-никакое, а во-вторых, уникальность значений обеспечивается автоматически...
Сумрак
19.08.2011, 07:27
Уникальные Ячейки.. что это значит? Может уникальные значения? если да то тип данных какой? Как их сравнивать?
Сумрак
19.08.2011, 07:40
ето будет работать, если тип(подтип варианта)Данных в ячейках одинаковый.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private sub Проверка()
Dim myDic As Dictionary
Set myDic = New Dictionary
Dim i As Integer
 
For each mV in ActiveSheet.UsedRange.cellse
   if mv.value<> empty then
      If myDic.Exists(mV.value) = False Then
         mV.interior.colorindex=3
      else
        myDic.Add mV.value,''
      End If
   End if
Next mV
 
Set myDic = Nothing
End sub
Сумрак
19.08.2011, 07:50
>> .UsedRange.columns(1).cellse
если по 1 столбцу нужно
SaNo
24.08.2011, 17:02
to Сумрак
Visual Basic
1
2
Dim myDic As DictionarySet
myDic = New Dictionary
почему это не работает?

или так надо:
Visual Basic
1
Set myDic = CreateObject('Scripting.Dictionary')
?
Сумрак
26.08.2011, 03:09
Это выглядит так
Dim myDic As NEW Dictionary
Сумрак
26.08.2011, 11:51
В ссылках голочка стоит напротив Scrrun.dll?
Сумрак
26.08.2011, 11:53
Set myDic = new... эквивалентно Dim myDic New...
Все должно работать если у Вас есть Вышеуказанная библиотека. и ссылка на ней стоит.
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 117
29.08.2011, 14:34
к Сумраку, а что в myDic.Exists(mV.Value) уже каким-то образом есть данные для сравнения? не понятно?
у меня помечаются вообще все данные на листе. Я так понимаю если сравниваем 2 столбца, то используем UsedRange.columns(1).cells Это один столбец, где второй? что сравниваем, подскажи плиз?
0
SaNo
29.08.2011, 17:21
поменяй в его коде строчку
Visual Basic
1
If myDic.Exists(mV.Value) = False Then
на
Visual Basic
1
If myDic.Exists(mV.Value) = True Then
тогда заработает

myDic объект, который состоит из пар 'ключ' - 'значение', как хэш.
заполняем его ключи - значениями из колонки.
Если ключ в myDic есть (myDic.Exists(mV.Value) = True)
, то это значит что значение уже встречалось в столбце - изменяем цвет этой ячейки.
Иначе (если ключа нет, то добавляем его)
myDic.Add mV.Value, ''
т.е. добавляет значение с ключем mV.Value и значением ''
SaNo
29.08.2011, 17:34
я попытался модифицировать скрипт, работает так:
устанавливаете кусор на то место откуда в колонке надо находить повторяющиеся значения, вызываете скрипт, создается рядом колонка, в которой проставляются номера - повторяющиеся ячейки имеют один и тот же номер, и соответсвенно помечаются цветом.

нам так удобнее для работы. Может есть какие-то лишние действия или что-то сделано через задницу - простите, я не программирую на VBA, но скрипт работает )
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
Sub НайтиПовторы()
  Set myDic = CreateObject('Scripting.Dictionary')
  Dim iNumUniq, iNumRep, iNumEmp As Integer
  iNumUniq = iNumRep = iNumEmp = 0
  firstRow = activecell.Row
  Column = activecell.Column
  Column2 = Column + 1
  Columns(Column + 1).Insert
  With Columns(Column2)
    .Interior.ColorIndex = 15
    .NumberFormat = 'General'
  End With
  For i = firstRow To ActiveSheet.UsedRange.Rows.Count
    With ActiveSheet.Cells(i, Column)
      If .Value <> Empty Then
        If myDic.Exists(.Value) = True Then
          iNumRep = iNumRep + 1
          ActiveSheet.Cells(i, Column2).Interior.ColorIndex = 3
          ActiveSheet.Cells(i, Column2).Value = myDic.Item(.Value)
        Else
          iNumUniq = iNumUniq + 1
          ActiveSheet.Cells(i, Column2).Value = iNumUniq
          myDic.Add .Value, iNumUniq
        End If
      Else
        iNumEmp = iNumEmp + 1
      End If
    End With
  Next i
  Set myDic = Nothing
  MsgBox 'Обработано ячеек:' + Str(i - firstRow) + Chr(13) + 'Найдено уникальных ячеек:' + Str(iNumUniq) + Chr(13) + 'Найдено повторяющихся ячеек:' + Str(iNumRep) + Chr(13) + 'Найдено пустых значений:' + Str(iNumEmp)
End Sub
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 117
29.08.2011, 18:34
Народ я может под конец дня совсем плохо соображаю, но:
имею колонку с текстом, копирую, вставляю рядом, в трех вставленных строках меняю значения запускаю код SaNo, результат все уникальные, нет повторов, нет пустых.
Этот пример с myDic работает что ли только если все даннные в одном столбце???. в таком коде:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Проверка()
Dim myDic As New Dictionary, i As Integer
For Each mV In ActiveSheet.UsedRange.Cells 'UsedRange.columns(1).cells
  If mV.Value <> Empty Then
   If myDic.Exists(mV.Value) = True Then
     mV.Interior.ColorIndex = 0
   Else
     myDic.Add mV.Value, ''
     mV.Interior.ColorIndex = 3
   End If
  End If
Next mV
 
Set myDic = Nothing
End Sub
в первом столбике пометил все, во втором строки отличные от первого.???
а если мне надо сравнить два столбца на разных листах???
Помогите пожалуйста разобраться, чую что это быстрее циклической проверки каждой ячейки
0
1 / 1 / 0
Регистрация: 09.05.2011
Сообщений: 20
30.08.2011, 10:38
1.Для одного листа - немного измени прогу Сумрака Дата: 11.06.2005 07:03
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Проверка()
 Dim myDic As Dictionary
 Set myDic = New Dictionary
 Dim i As Integer
 Worksheets('Лист1').Activate
 q = q
 For Each mV In ActiveSheet.UsedRange.Cells
  If mV.Value <> Empty Then
   If myDic.Exists(mV.Value) = False Then
    myDic.Add mV.Value, ''
   Else
    mV.Interior.ColorIndex = 3
   End If
  End If
  Next mV
  Set myDic = Nothing
End Sub
2.Для двух листов - перенеси(скопируй) необходимую инфу на один лист, а после сравнения удали
0
1 / 1 / 0
Регистрация: 09.05.2011
Сообщений: 20
30.08.2011, 10:47
q = q изъять.
0
Сумрак
31.08.2011, 13:54
>> Нужен скрипт, который бы определял все ли ячейки в указанной колонке уникальны. Если есть неуникальные ячейки надо это пометить...

Код для этого варианта вопроса работает...

если нужен код для сравнения значений одного столбца, со значением другого столбца в другой книге(листе). то это уже другой вопрос.

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

Просто код получается на другом принципе основанным.

В таком варианте я использую Find

set R=... find(...)
if not R is Nothing then
... тут код
else
... тут код
end if
Он тоже быстро работает... но он по сложнее и по капризнее...
Сумрак
31.08.2011, 14:01
to SaNo СПС
Я както проморгал. ошибся я тут. извините. просто я на живую код сюда вписываю. мог ошибится. SaNo правильно уточнил, если true, то найден ключ.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.08.2011, 14:01
Помогаю со студенческими работами здесь

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

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

Сравнение, поиск, и выделение уникальных значений
Здравствуйте уважаемые форумчане. Помогите с макросом. Сделал вот такой. С циклом мудрить не стал,...

Поиск уникальных значений в динамическом массиве с переносом их другой лист
Добрый день ГУРУ. Есть задачка, всю голову сломал. Без ВАС ни как не обойтись Есть лист &quot;Плейлист&quot;...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru