Поиск повторяющихся значений (дубликатов) в одном из столбцов таблицы Excel и выделение их цветом заливки с помощью кода VBA.
Поиск дубликатов в столбце
Чаще всего повторяющиеся значения ищут в первом столбце таблицы, поэтому процедуру поиска дубликатов в VBA Excel рассмотрим именно на нем:
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 DuplicateSearch() Dim ps As Long, myRange As Range, i1 As Long, i2 As Long ‘Определяем номер последней строки таблицы ps = Cells(1, 1).CurrentRegion.Rows.Count ‘Нет смысла искать дубликаты в таблице, состоящей из одной строки If ps > 1 Then ‘Присваиваем объектной переменной ссылку на исследуемый столбец Set myRange = Range(Cells(1, 1), Cells(ps, 1)) With myRange ‘Очищаем ячейки столбца от предыдущих закрашиваний .Interior.Color = xlNone For i1 = 1 To ps — 1 For i2 = i1 + 1 To ps If .Cells(i1) = .Cells(i2) Then ‘Если значения сравниваемых ячеек совпадают, ‘обеим присваиваем новый цвет заливки .Cells(i1).Interior.Color = 6740479 .Cells(i2).Interior.Color = 6740479 End If Next Next End With End If End Sub |
После ручного исправления или удаления повторяющихся значений, запускаем процедуру DuplicateSearch вновь, чтобы очистить от заливки ячейки столбца с уникальными значениями и заново выделить оставшиеся дубликаты.
Чтобы найти повторы в другом столбце, замените номер столбца в параметрах свойства Cells (в трех местах процедуры DuplicateSearch).
Константы для заливки
Для указания цвета заливки для ячеек с повторяющимися значениями вместо числового значения цвета можно использовать предопределенные константы:
Предопределенная константа | Наименование цвета |
---|---|
vbBlack | Черный |
vbBlue | Голубой |
vbCyan | Бирюзовый |
vbGreen | Зеленый |
vbMagenta | Пурпурный |
vbRed | Красный |
vbWhite | Белый |
vbYellow | Желтый |
Skip to content
На чтение 3 мин. Просмотров 4.1k.
Что делает макрос: Всегда хотел выделить значения дубликатов в диапазоне. Макрос в этом разделе делает именно это. Есть много ручных способов найти и выделить дубликаты — способы, включающие формулы, условное форматирование, сортировку и т.д. Тем не менее, все эти методы требуют ручной настройки и определенного уровня обслуживания по мере изменения данных.
Этот макрос упрощает задачу, что позволяет найти и выделить дубликаты в ваших данных с помощью щелчка мыши.
Содержание
- Как макрос работает
- Код макроса
- Как этот код работает
- Как использовать
Как макрос работает
Этот макрос перечисляет ячейки в целевом диапазоне, используя оператор For Each, чтобы активировать каждую ячейку по одной за раз. Затем мы используем функцию СЧЕТЕСЛИ, чтобы подсчитать, сколько раз значение в активной ячейке находится в выбранном
диапазоне. Если это число больше единицы, то формат ячейки — желтого цвета.
Код макроса
Sub VidelitDublikati() 'Шаг 1: Объявляем переменные Dim MyRange As Range Dim MyCell As Range 'Шаг 2: определяем целевой диапазон Set MyRange = Selection 'Шаг 3: запускаем цикл через диапазон For Each MyCell In MyRange 'Шаг 4: Убедить, что ячейка имеет форматирование текста If WorksheetFunction.CountIf(MyRange, MyCell.Value) > 1 Then MyCell.Interior.ColorIndex = 36 End If 'Шаг 5: Получаем следующую ячейку в диапазоне Next MyCell End Sub
Как этот код работает
- На шаге 1 объявляются две переменные объекта Range, одна из которых называется MyRange для хранения всей цели диапазона, а другая называется MyCell для хранения каждой ячейки в диапазоне.
- Шаг 2 заполняет переменную MyRange целевым диапазоном. В этом примере мы используем выбранный диапазон — диапазон, который был выбран в электронной таблице. Вы можете легко установить переменную MyRange для определенного диапазона, например Range («A1: Z100»). Кроме того, если ваша цель — именованный диапазон, вы можете просто ввести его имя: Range («MyNamedRange»).
- Шаг 3 макрос начинает проходить по каждой ячейке в целевом диапазоне, активируя каждую ячейку.
- Объект WorksheetFunction позволяет нам запускать многие из Excel функции электронных таблиц в VBA. Шаг 4 использует объект WorksheetFunction для запуска Функция СЧЕТЕСЛИ в VBA.
В этом случае мы рассчитываем, сколько раз значение активной ячейки (MyCell.Value) найдено в заданном диапазоне (MyRange). Если выражение СЧЕТЕСЛИ оценивается больше 1, макрос изменяет цвет ячейки. - Шаг 5 возвращается к следующей ячейке. После активации всех ячеек в целевом диапазоне макрос заканчивается.
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код.
mtts54 Пользователь Сообщений: 164 |
Добрый день, уважаемые форумчане! В поиске есть аналогичные темы, но подходящего мне я не нашел. Суть проблемы: есть табличка ~200 тыс. строк на 60 столбцов. В столбце G — некий идентификатор id, он может быть уникальным, а может повторяться. Буду благодарен за помощь с помощью VBA найти и вырезать из данной таблицы строки с повторяющимися id и перенести их на другой лист. Excel непознаваем как атом. |
Возможно я не правильно понял задачу…. Но самый простой вариант |
|
Если нужен именно макрос, то делаем все тоже самое через макрорекодер (за исключением выделения ячеек отфильтрованных, для копирования). https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=47173 |
|
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
mtts54, здравствуйте! Изменено: Jack Famous — 15.08.2018 11:14:43 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
TheBestOfTheBest Пользователь Сообщений: 2366 Excel 2010 +PLEX +SaveToDB +PowerQuery |
С помощью доп.столбца. Файл положить в папку С:1, на таблице ПКМ-обновить. Неизлечимых болезней нет, есть неизлечимые люди. |
mtts54 Пользователь Сообщений: 164 |
Михаил Комиссаров
, автофильтр «видит» только 10 тыс. строк, поэтому этот прием не годится. Jack Famous , конечный результат в файле-примере таков: на Листе1 строк с подсвеченными id не должно быть — они должны появиться на другом, вставленном листе. В реальном файле из-за большого количества строк УФ неприменимо. Excel непознаваем как атом. |
mtts54 Пользователь Сообщений: 164 |
TheBestOfTheBest
, не совсем то, что необходимо: в Вашем решении одна из повторяющихся строк остается на исходном листе. Мне же нужно ВСЕ строки с повторяющимися id вырезать с исходного листа и вставить на другой лист. Честно говоря, я не понял, каким приемом Вы решили задачу. Спасибо за ответ. Excel непознаваем как атом. |
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#8 15.08.2018 13:19:11 mtts54, пробуйте
UPD (15:05): 14я строка кода Set rng = Cells(1, col).Resize(r+ 1, 1) исправлена на Set rng = Cells(2, col).Resize(r, 1). Файл заменён. Прикрепленные файлы
Изменено: Jack Famous — 15.08.2018 15:07:53 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
|
Ігор Гончаренко Пользователь Сообщений: 13746 |
#9 15.08.2018 14:30:52 выполните этот макрос
при активном листе с данными Изменено: Ігор Гончаренко — 15.08.2018 14:34:29 Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
TheBestOfTheBest Пользователь Сообщений: 2366 Excel 2010 +PLEX +SaveToDB +PowerQuery |
#10 15.08.2018 14:39:42
Внешний запрос (Данные-Получение внешних данных…). Измените формулу в столбце Ключ =СЧЁТЕСЛИ($G$2:$G$348;G2), обновите таблицы как указано выше. Изменено: TheBestOfTheBest — 15.08.2018 14:40:31 Неизлечимых болезней нет, есть неизлечимые люди. |
||
кузя1972 Пользователь Сообщений: 189 |
#11 15.08.2018 16:37:15 вариант макроса(не нашел как надо в исходном файл -примере),кнопки unic и очистка,лист1 добавлен вручную
Прикрепленные файлы
Изменено: кузя1972 — 15.08.2018 16:37:30 |
||
mtts54 Пользователь Сообщений: 164 |
Коллеги, спасибо за ответы. Сегодня тестировать некогда (комп занят расчетами), отпишусь завтра. Excel непознаваем как атом. |
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
mtts54, мы ждём (ну я точно жду фидбэк) Изменено: Jack Famous — 16.08.2018 10:15:51 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Nordheim Пользователь Сообщений: 3154 |
#14 16.08.2018 10:51:18 Вариант на массивах и словарях
«Все гениальное просто, а все простое гениально!!!» |
|
mtts54 Пользователь Сообщений: 164 |
Добрый день! Протестировал макрос от Ігор Гончаренко на реальном файле размером 31 колонка на 153 тыс.строк. В макросе в выражениях Offset(0, 9) заменил 9 на 25 и в Columns(16) заменил 16 на 32. Макрос работал ок. 10 минут, нашел все 7696 повторов. Хотелось бы побыстрее, но… размер имеет значение. Спасибо! Остальные решения протестирую завтра. Excel непознаваем как атом. |
mtts54 Пользователь Сообщений: 164 |
Попробовал на том же реальном файле макрос от Jack Famous . К сожалению, макрос где-то зациклился и после 20 минут ожидания я был вынужден остановить его выполнение Excel непознаваем как атом. |
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#17 17.08.2018 11:45:00 mtts54, немного изменил принцип удаления строк из исходника — пробуйте
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
|
mtts54 Пользователь Сообщений: 164 |
На том же реальном файле макрос Nordheim за 2 секунды нашел все повторы, вставил лист и скопировал повторы туда (правда, пару раз VBA ругнулся: не была объявлена переменная sht1 — это я поправил). Но с исходного листа макрос повторы не удалил . Тут я ничего поделать не смог . Очень надеюсь, что уважаемый Nordheim прочтет этот пост и подправит код Excel непознаваем как атом. |
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
mtts54, вы бы выложили ссылку на файл реального объёма, но без конфиденциальных данных — тестить проще было бы Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Nordheim Пользователь Сообщений: 3154 |
#20 17.08.2018 12:27:31 В данном коде есть нюанс, таблица должна начинаться со второй строки, шапка таблицы на первой
«Все гениальное просто, а все простое гениально!!!» |
||
Kuzmich Пользователь Сообщений: 7998 |
#21 17.08.2018 12:36:19 Nordheim,
при формировании листа Дубли я бы добавил первой строку
Изменено: Kuzmich — 17.08.2018 12:48:30 |
||||
mtts54 Пользователь Сообщений: 164 |
Excel непознаваем как атом. |
kryptonets Пользователь Сообщений: 5 |
Я вижу,что нужен макрос. Но предложу другое решение. Надстройка PowerQuery. Выделить таблицу Ctrl+T, с заголовками.PowerQuery—>Из таблицы,диапазона.Главная—>Сохранять строки—>Сохранять дубликаты.Выгрузить.Готово) |
Nordheim Пользователь Сообщений: 3154 |
#24 17.08.2018 13:03:43
sht1 в файле это название листа в VBAProject, поэтому лист не объявлен, на кириллице неудобно было писать, поэтому переименовал по ходу написания кода «Все гениальное просто, а все простое гениально!!!» |
||
Nordheim Пользователь Сообщений: 3154 |
#25 17.08.2018 13:05:09
С какой целью? «Все гениальное просто, а все простое гениально!!!» |
||
mtts54 Пользователь Сообщений: 164 |
Nordheim
, макрос (с учетом от Kuzmich ) отработал немного дольше (это абсолютно не критично), повторы с исходного листа удалил. Спасибо! kryptonets , нужен именно макрос, т.к. таблица обрабатывается макросом (моим) и прерывать его для ручной работы неудобно. Тем не менее попробую Вашу идею — лишних знаний ведь не бывает, когда-нибудь пригодится. Спасибо. Excel непознаваем как атом. |
Kuzmich Пользователь Сообщений: 7998 |
#27 17.08.2018 13:17:04 Nordheim, написал
Просто на листе Дубли в столбце К появляются ячейки с янв.92 вместо 1-92 Изменено: Kuzmich — 17.08.2018 13:17:18 |
||
Nordheim Пользователь Сообщений: 3154 |
#28 17.08.2018 13:18:40
А строка зачем? «Все гениальное просто, а все простое гениально!!!» |
||
Kuzmich Пользователь Сообщений: 7998 |
#29 17.08.2018 13:22:51 Я имел в виду этот кусок макроса
Чтобы не было преобразования в дату |
||
Nordheim Пользователь Сообщений: 3154 |
#30 17.08.2018 13:23:27 Наверно так более правильно.
Изменено: Nordheim — 17.08.2018 13:25:52 «Все гениальное просто, а все простое гениально!!!» |
||
VBA find duplicate values in a column
VBA find duplicate values in a column Excel Macros Examples Codes: to find all duplicate records in a column in MS Excel 2003, 2007, 2010, 2013. We will also see the practical VBA example for finding the duplicates in a Column.
VBA code to Remove Duplicates in ListBox
Here is the Example VBA syntax and Example VBA Macro code to find Duplicates in a Column in Excel. This will help you to know how to find duplicate records in a column using VBA.
VBA find Duplicates in Column: Procedure
Following is the VBA Syntax and sample VBA macro command to find duplicates in a Column of Worksheet using VBA. In this method we loop through all the records and identify the duplicates using VBA.
VBA Find Duplicates in a Column: Examples
The following Excel VBA macro code is to find duplicate values in a column. This VBA macro will loop through the all the items in the first column and identify the duplicates using Match Spreadsheet Function. Here the logic is, the number is unique if the match index equals to the current processing row number. Otherwise it will be duplicate, it will print the “duplicate” in the second column.
Sub sbFindDuplicatesInColumn() Dim lastRow As Long Dim matchFoundIndex As Long Dim iCntr As Long lastRow = Range("A65000").End(xlUp).Row For iCntr = 1 To lastRow If Cells(iCntr, 1) <> "" Then matchFoundIndex = WorksheetFunction.Match(Cells(iCntr, 1), Range("A1:A" & lastRow), 0) If iCntr <> matchFoundIndex Then Cells(iCntr, 2) = "Duplicate" End If End If Next End Sub
Instructions to run the VBA Macro code to find duplicates in a Column
Please follow the below steps to execute the VBA code to delete duplicates in Column.
- Step 1: Open any Excel workbook
- Step 2: Press Alt+F11 – This will open the VBA Editor
- Step 3: Insert a code module from then insert menu
- Step 4: Copy the above code and paste in the code module which have inserted in the above step
- Step 5: Enter some data values in Column 1. Make sure that you have some duplicate items in the data for testing purpose
- Now press F5 to Execute the macro and test the code
Now you can observe the code is loop thronging all the items in the column 1. And identifying the duplicates and printing the label as “Duplicate” in the Column B if the value is repeating.
Explained VBA Code to Find Duplicates in A Column
Starting Macro program and sub procedure to write VBA code to find duplicate records in a Worksheet Column.
- Declaring the lastRow variable as Long to store the last row value in the Column1
- Declaring the variable MatchFoundIndex is to store the match index values of the given value
- Declaring the variable iCntr is to loop through all the records in the column 1 using For loop
- Finding the last row in the Column 1
- looping through the column1
- Checking if the cell is having any item, skipping if it is blank.
- Getting match index number for the value of the cell
- If the match index is not equals to current row number, then it is a duplicate value
- Printing the label in the column B
Here is the commented VBA Macro code, explained the procedure by each statement.
Sub sbFindDuplicatesInColumn_C() 'Declaring the lastRow variable as Long to store the last row value in the Column1 Dim lastRow As Long 'matchFoundIndex is to store the match index values of the given value Dim matchFoundIndex As Long 'iCntr is to loop through all the records in the column 1 using For loop Dim iCntr As Long 'Finding the last row in the Column 1 lastRow = Range("A65000").End(xlUp).Row 'looping through the column1 For iCntr = 1 To lastRow 'checking if the cell is having any item, skipping if it is blank. If Cells(iCntr, 1) <> "" Then 'getting match index number for the value of the cell matchFoundIndex = WorksheetFunction.Match(Cells(iCntr, 1), Range("A1:A" & lastRow), 0) 'if the match index is not equals to current row number, then it is a duplicate value If iCntr <> matchFoundIndex Then 'Printing the label in the column B Cells(iCntr, 2) = "Duplicate" End If End If Next End Sub
A Powerful & Multi-purpose Templates for project management. Now seamlessly manage your projects, tasks, meetings, presentations, teams, customers, stakeholders and time. This page describes all the amazing new features and options that come with our premium templates.
Save Up to 85% LIMITED TIME OFFER
All-in-One Pack
120+ Project Management Templates
Essential Pack
50+ Project Management Templates
Excel Pack
50+ Excel PM Templates
PowerPoint Pack
50+ Excel PM Templates
MS Word Pack
25+ Word PM Templates
Ultimate Project Management Template
Ultimate Resource Management Template
Project Portfolio Management Templates
Related Posts
- VBA code to Remove Duplicates in ListBox
- VBA find Duplicates in Column: Procedure
- VBA Find Duplicates in a Column: Examples
- Instructions to run the VBA Macro code to find duplicates in a Column
- Explained VBA Code to Find Duplicates in A Column
VBA Reference
Effortlessly
Manage Your Projects
120+ Project Management Templates
Seamlessly manage your projects with our powerful & multi-purpose templates for project management.
120+ PM Templates Includes:
8 Comments
-
Sohail
May 16, 2015 at 3:49 PM — ReplyGreat explanation…. U People really God ‘s Own Creation
Thanks A Lot
Sohail Imran
-
Suresh
August 25, 2016 at 8:57 PM — ReplyHi Team,
I have a question : i have given the some count in one of excel cell, now i need to find that data input cell in vba coding. could you please advise how to write this coding.
Regards,
Suresh -
siamak mahdikar
February 1, 2017 at 2:51 AM — ReplyHi ,
Thanks a lot ,
I am from Iran , so I do not speak english very vell . excuse me .
I have one question .
How I can change column B to each coloumn ? Can I set this macro to any column ? for example run macro ic column E and F ?
please help me . -
iel
February 5, 2017 at 2:38 AM — Replywhat if i want only find duplicates for all the same that i input to the textbox in userform
i hope this problem have a solution
thank you in advance
-
Kurt N.
February 27, 2020 at 1:48 AM — ReplyTry this: (will highlight duplicates in yellow)
Sub FindDuplicateValuesInRange()
Dim cl, rng As RangeSet rng = Range(“A1:A” & Cells(Rows.Count, “A”).End(xlUp).Row)
For Each cl In rng
If WorksheetFunction.CountIf(rng, cl.Value) > 1 Then
cl.Interior.Color = vbYellow
End If
Next
End Sub -
Bhojraj Timsina
September 20, 2020 at 9:50 AM — ReplyHow to prevent dublicating values in this user entries form?
Private Sub CommandButton1_Click()
Dim y As Worksheet
Dim X As Long
Set y = Sheet1X = y.Range(“A” & Rows.Count).End(xlUp).Row
With y
.Cells(X + 1, “A”).Value = TextBox1.Value
.Cells(X + 1, “B”).Value = TextBox2.Value
.Cells(X + 1, “C”).Value = TextBox3.Value
.Cells(X + 1, “D”).Value = TextBox6.Value
.Cells(X + 1, “E”).Value = TextBox7.Value
.Cells(X + 1, “F”).Value = TextBox8.Value
.Cells(X + 1, “G”).Value = TextBox22.Value
.Cells(X + 1, “I”).Value = TextBox23.Value
.Cells(X + 1, “J”).Value = TextBox24.Value
.Cells(X + 1, “K”).Value = TextBox25.Value
.Cells(X + 1, “L”).Value = TextBox26.Value
.Cells(X + 1, “M”).Value = TextBox27.Value
.Cells(X + 1, “N”).Value = TextBox28.Value
.Cells(X + 1, “O”).Value = TextBox29.Value
.Cells(X + 1, “P”).Value = TextBox30.Value
.Cells(X + 1, “Q”).Value = TextBox31.Value
.Cells(X + 1, “R”).Value = TextBox32.Value
.Cells(X + 1, “S”).Value = TextBox33.Value
.Cells(X + 1, “T”).Value = TextBox34.Value
.Cells(X + 1, “H”).Value = TextBox36.ValueEnd With
‘clear tha data
TextBox1.Text = ”
TextBox2.Text = ”
TextBox3.Text = ”
TextBox6.Text = ”
TextBox7.Text = ”
TextBox8.Text = ”
TextBox23.Text = ”
TextBox24.Text = ”
TextBox25.Text = ”
TextBox26.Text = ”
TextBox27.Text = ”
TextBox28.Text = ”
TextBox29.Text = ”
TextBox30.Text = ”
TextBox31.Text = ”
TextBox32.Text = ”
TextBox33.Text = ”
TextBox34.Text = ”
TextBox22.Text = ”
TextBox36.Text = ”
Unload Me
UserForm2.Show
End Sub -
Marta
November 13, 2020 at 9:40 PM — ReplyHi, i have data set with name and few entries under one name, table will be populated vis user form but i will need have a code that will run checks under each name to see if have more then 3 entries in whole data base and notify user of this . Any ideas?
-
Subhash N
November 20, 2020 at 10:58 PM — ReplyHi
I have requirement where in column A I have list of names say
A
B
C
A
A
Here I need to change the duplicate names to
A
B
C
A_1
A_2
Like above can someone please help me
Effectively Manage Your
Projects and Resources
ANALYSISTABS.COM provides free and premium project management tools, templates and dashboards for effectively managing the projects and analyzing the data.
We’re a crew of professionals expertise in Excel VBA, Business Analysis, Project Management. We’re Sharing our map to Project success with innovative tools, templates, tutorials and tips.
Project Management
Excel VBA
Download Free Excel 2007, 2010, 2013 Add-in for Creating Innovative Dashboards, Tools for Data Mining, Analysis, Visualization. Learn VBA for MS Excel, Word, PowerPoint, Access, Outlook to develop applications for retail, insurance, banking, finance, telecom, healthcare domains.
Page load link
3 Realtime VBA Projects
with Source Code!
Go to Top
0 / 0 / 0 Регистрация: 24.05.2008 Сообщений: 4 |
|
1 |
|
19.01.2009, 15:57. Показов 40087. Ответов 8
Регистрация: 19.01.2009 появилась необходимость поиска повторяющихся улиц с номерами домов в таблице эксель с помощью макроса Итак есть столбец «улица», рядом столбец «дом». Есть еще другие Столбцы в которых есть информация. Как можно было бы организовать алгоритм обхода так, чтобы это работало максимально производительно(быстро) во вложении к посту
0 |
32 / 32 / 4 Регистрация: 29.12.2008 Сообщений: 75 |
|
19.01.2009, 20:01 |
2 |
Пока не шочу слишком глубоко вдаваться в идею самого макроса, но думаю, гораздо удобнее сначала отсортировать таблицу excell по улицам в алфавитном порядке (макрос для этого можно не писать в ручную, а воспользоваться командой «Запись макроса» и выбрать сортировку по возрастанию или убыванию). В отсортированной таблице поиск повторяющихся элементов не должен занять много времени, особенно если воспользоваться «бинарным поиском». Примечание:
0 |
loter 2 / 2 / 0 Регистрация: 16.01.2009 Сообщений: 11 |
||||
20.01.2009, 22:43 |
3 |
|||
я в макросах не сильна, но эту задачу можно решить еще вот так:
по такому алгоритму у меня расчет занял 22 минуты 12 секунд. не знаю быстрее это или медленее чем у Вас, но мало ли… м.б. пригодится. если доступна сотировка, то есть более быстрый и простой механизм, только он делается не макросом, а формулой. сортируем сначала по а, затем по б и в пустой столбец во вторую строку забиваем формулу «=если((A2=A3)*И(B2=B3);1;»»)». растягиваем формулу до конца.
0 |
32 / 32 / 4 Регистрация: 29.12.2008 Сообщений: 75 |
|
21.01.2009, 18:19 |
4 |
Loter. Ты прав на все 100%. Однако вся прелесть макросов — это автоматизация твоих действий. Представь, что тебе каждый раз после ввода новых данных необходимо будет сначала отсортировать таблицу, потом выбрать специальный столбец, куда можно будет ввести предложенную тобой формулу с ЕСЛИ, растянуть ее (на несколько тысяч записей). Потом найти все строки, в которых твоя формула дает 1 и, наконец, выделив их, залить красным цветом. У-Ф-Ф-Ф… Даже рука устала писать. Гораздо проще все это проделать одним кликом по кнопке, который присвоен специальный макрос. Кстати.
0 |
loter 2 / 2 / 0 Регистрация: 16.01.2009 Сообщений: 11 |
||||
22.01.2009, 18:01 |
5 |
|||
хм….
на базу в 6000 заняло меньше 5 секунд
0 |
maximus09 32 / 32 / 4 Регистрация: 29.12.2008 Сообщений: 75 |
||||
23.01.2009, 17:57 |
6 |
|||
Не знаю как bloogrox, а я результатом в общем и целом удовлетворен. Единственное, на что нужно обратить внимание — это то, что сейчас программа использует дополнительный столбец книги Excell для того чтобы ввести формулу
Это не всегда хорошо. Поиск можно осуществить простым перебором ячеек, не выводя никакой дополнительной информации на листы книги Excell.
0 |
2 / 2 / 0 Регистрация: 16.01.2009 Сообщений: 11 |
|
23.01.2009, 20:16 |
7 |
maximus09, а о каких встроенных механизмах сортировки ты говорил?
0 |
32 / 32 / 4 Регистрация: 29.12.2008 Сообщений: 75 |
|
23.01.2009, 20:39 |
8 |
Почитай мое первое сообщение. Там найдешь такие слова: (макрос для этого можно не писать в ручную, а воспользоваться командой «Запись макроса» и выбрать сортировку по возрастанию или убыванию). В отсортированной таблице поиск повторяющихся элементов не должен занять много времени, особенно если воспользоваться «бинарным поиском». Примечание: Если перед выбором команды Данные -> Сортировка выбрать команду Сервис ->Макрос->Начать запись, а после того, как сортировка выполнится вручную остановить запись макроса, то Excell автоматически сама создаст макрос сортировки. Программисту останется только его немножко подправить под свои нужды и включить то, что получится в итоге, в текст программы поиска повторяющихся элементов. Более подробно об описанном здесь механизме программирования можно прочитать в книге Кстати, там данный пример ручной с сортировкой описан в подробностях (что, какие опции в окне параметров сортировки нужно выбирать, зачем нужно выделять всю таблицу прежде чем производить сортировку и т.п.). Очень рекомендую книгу. Сам учился по ней. Но, стоит сказать, что она целиком посвящена VBA в Excell.
0 |
2 / 2 / 0 Регистрация: 16.01.2009 Сообщений: 11 |
|
24.01.2009, 07:03 |
9 |
спасибо. книжку посмотрю.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
24.01.2009, 07:03 |
9 |