|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - [решено] Сравнение списка VBA |
|
|
VBA - [решено] Сравнение списка VBA
|
Новый участник Сообщения: 19 |
Профиль | Отправить PM | Цитировать Всем доброго времени суток.
Стоит задача для сравнения большого списка в Excel. Алгоритм понимаю, как это выразить в VBA не представляю понятия. Так вот. Имеется столбец с фамилиями А и три столбца с фамилиями B, С, D. Необходимо все фамилии из столбца А сравнить со столбцами фамилий B C D, если фамилия из А не встречается ни в одном из столбцов B C D, то записать эту фамилию в столбец E. Формулами я знаю как это сделать, но хочется сделать это именно через VBA, т.к. список огромный. |
|
Отправлено: 15:10, 19-06-2013 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Не вполне понятен Ваш алгоритм. Приложите образец рабочей книги.
|
Отправлено: 15:46, 19-06-2013 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 19
|
Профиль | Отправить PM | Цитировать Грубо говоря, есть таблица
Иванов Петров Сидоров Берем Иванова, сравниваем с первым столбцом других фамилий, если там его нет, то начинаем сравнивать с следующим столбцом, если и там его нет, то сравниваем с третьим столбцом, если там его нет, то записываем Иванов в четвертый столбец. В противном случае начинаем перебирать следующую фамилию - Петров. И так проверяем все фамилии столбца: Иванов Петров Сидоров Формулой в Excel я это делаю так. Считаю количество вхождений ячейки А2 в первый диапазон.(лист Апрель от A2:A42734) =(СЧЁТЕСЛИ(Апрель!A2:A42734;Январь!A2)) Затем =(СЧЁТЕСЛИ(Март!A2:A42734;Январь!A2)) Затем =(СЧЁТЕСЛИ(Февраль!A2:A42734;Январь!A2)) Ну а потом просто, фильтрую по 0 все три столбца, вот они мои люди, которые не входят ни в один диапазон. Но мне надо это делать например нажатием кнопки. |
Отправлено: 16:06, 19-06-2013 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать includer-test, Вам сложно приложить образец рабочей книги? Мне гораздо больше времени потребуется, чтобы воссоздать её вид вручную. И это не гарантирует её точного вида, такого же, как у Вас.
|
Отправлено: 19:34, 19-06-2013 | #4 |
Новый участник Сообщения: 19
|
Профиль | Отправить PM | Цитировать Приношу извинения.
Не стал грузить весь файл, т.к. там личная информация, да и строк там более 48 т. Поэтому подготовил свой пример, в котором все понятно. Sample.rar |
|
Отправлено: 22:39, 19-06-2013 | #5 |
Старожил Сообщения: 369
|
Профиль | Отправить PM | Цитировать includer-test,
А если у Вас в столбце А - Иванов Иван Иваныч, а в столбце B - Иванов Иван Ильич, а в столбце C - Иванов Иван Кузьмич. Фамилии одинаковые, а Имена и Отчества могут быть разные... и как сравнивать: подряд, перебирая все 3 столбца по строке, или поочереди - сравнивая со вторым столбцом, потом с третьим и потом с четвертым столбцами. ps: пример сохранили бы в более раннем формате - не открывается он у меня. |
Отправлено: 02:13, 20-06-2013 | #6 |
Новый участник Сообщения: 19
|
Профиль | Отправить PM | Цитировать Если имя и/или отчество не совпадает со всеми тремя столбцами, то записать в столбец с результатом, это мы как раз и ищем.
Сравнивать думаю лучше перебирая ФИО из первого столбца поочереди с каждым столбцом. Если будет четкое совпадение, то выходить из перебора и брать следующую ФИО. Пересохранил...Sample.rar |
Отправлено: 07:49, 20-06-2013 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать includer-test, для формата *.xls (97/2003) работает в лучшем виде такой код (запрос исключения из запроса на объединение):
Option Explicit Sub SelectFIOFromListNotInTables() Const adOpenStatic = 3 Const adLockOptimistic = 3 Const adCmdText = 1 Dim objConnection As Object Dim objRecordset As Object Dim intRow As Integer Set objConnection = CreateObject("ADODB.Connection") Set objRecordset = CreateObject("ADODB.Recordset") objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""" & ThisWorkbook.FullName & """;Extended Properties=""Excel 8.0;HDR=Yes;"";" objRecordset.Open _ "SELECT FIO FROM [Эталон$] " & _ "WHERE FIO NOT IN (" & _ "SELECT FIO FROM (" & _ "SELECT FIO FROM [Февраль$] UNION SELECT FIO FROM [Март$] UNION SELECT FIO FROM [Апрель$]" & _ ")" & _ ")" & _ ";", objConnection, adOpenStatic, adLockOptimistic, adCmdText intRow = 1 Do Until objRecordset.EOF intRow = intRow + 1 ThisWorkbook.Worksheets.Item("Эталон").Cells.Item(intRow, 7).Value = objRecordset.Fields.Item("FIO").Value objRecordset.MoveNext Loop objRecordset.Close Set objRecordset = Nothing objConnection.Close Set objConnection = Nothing End Sub К сожалению, мне никак не удалось из-под Microsoft Excel 2003 добиться корректной работы непосредственно с форматом *.xlsx/*.xlsm (2007/2010) — аналогичный запрос там попросту не срабатывал. Если хотите попробовать сами поиграться — вот Вам ссылки на строку подключения для нового провайдера и на самого провайдера (если у Вас новый Microsoft Office — то сей провайдер должен был устанавливаться в комплекте): Excel 2007 Connection String Samples - ConnectionStrings.com Download Microsoft Access Database Engine 2010 Redistributable from Official Microsoft Download Center |
Отправлено: 20:10, 20-06-2013 | #8 |
Ветеран Сообщения: 5624
|
Профиль | Отправить PM | Цитировать Цитата includer-test:
Включаем запись, вбиваем формулу в нужный столбец и дважды жмем на правый нижний угол ячейки с формулой. Сделается автозаполнение по всем данным, пусть их хоть сотни тысяч. Жмем остановить запись макроса и получаем готовый код. |
|
------- Отправлено: 15:37, 22-06-2013 | #9 |
Новый участник Сообщения: 19
|
Профиль | Отправить PM | Цитировать Цитата Delirium:
Цитата Iska:
|
||
Отправлено: 11:43, 24-06-2013 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Любой язык - Сравнение списка файлов и каталога с файлами с копированием файлов из каталога | jastreb83 | Скриптовые языки администрирования Windows | 0 | 10-04-2013 09:56 | |
CMD/BAT - [решено] сравнение списка файлов! | Kobzar | Скриптовые языки администрирования Windows | 7 | 06-07-2012 19:30 | |
VBA - VBA | BOLT | Программирование и базы данных | 2 | 08-09-2003 10:56 | |
VBA - Timer в VBA | Witaleey | Программирование и базы данных | 1 | 29-08-2003 15:26 |
|