Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - [решено] Сравнение списка VBA

Ответить
Настройки темы
VBA - [решено] Сравнение списка VBA

Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем доброго времени суток.

Стоит задача для сравнения большого списка в Excel. Алгоритм понимаю, как это выразить в VBA не представляю понятия.
Так вот. Имеется столбец с фамилиями А и три столбца с фамилиями B, С, D.
Необходимо все фамилии из столбца А сравнить со столбцами фамилий B C D, если фамилия из А не встречается ни в одном из столбцов B C D, то записать эту фамилию в столбец E.

Формулами я знаю как это сделать, но хочется сделать это именно через VBA, т.к. список огромный.

Отправлено: 15:10, 19-06-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Не вполне понятен Ваш алгоритм. Приложите образец рабочей книги.

Отправлено: 15:46, 19-06-2013 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Грубо говоря, есть таблица

Иванов
Петров
Сидоров

Берем Иванова, сравниваем с первым столбцом других фамилий, если там его нет, то начинаем сравнивать с следующим столбцом, если и там его нет, то сравниваем с третьим столбцом, если там его нет, то записываем Иванов в четвертый столбец. В противном случае начинаем перебирать следующую фамилию - Петров. И так проверяем все фамилии столбца:

Иванов
Петров
Сидоров

Формулой в Excel я это делаю так. Считаю количество вхождений ячейки А2 в первый диапазон.(лист Апрель от A2:A42734)
=(СЧЁТЕСЛИ(Апрель!A2:A42734;Январь!A2))
Затем
=(СЧЁТЕСЛИ(Март!A2:A42734;Январь!A2))
Затем
=(СЧЁТЕСЛИ(Февраль!A2:A42734;Январь!A2))

Ну а потом просто, фильтрую по 0 все три столбца, вот они мои люди, которые не входят ни в один диапазон.

Но мне надо это делать например нажатием кнопки.

Отправлено: 16:06, 19-06-2013 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


includer-test, Вам сложно приложить образец рабочей книги? Мне гораздо больше времени потребуется, чтобы воссоздать её вид вручную. И это не гарантирует её точного вида, такого же, как у Вас.

Отправлено: 19:34, 19-06-2013 | #4


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать



Приношу извинения.
Не стал грузить весь файл, т.к. там личная информация, да и строк там более 48 т. Поэтому подготовил свой пример, в котором все понятно.

Sample.rar

Отправлено: 22:39, 19-06-2013 | #5


Старожил


Сообщения: 369
Благодарности: 49

Профиль | Отправить PM | Цитировать


includer-test,
А если у Вас в столбце А - Иванов Иван Иваныч, а в столбце B - Иванов Иван Ильич, а в столбце C - Иванов Иван Кузьмич. Фамилии одинаковые, а Имена и Отчества могут быть разные...

и как сравнивать: подряд, перебирая все 3 столбца по строке, или поочереди - сравнивая со вторым столбцом, потом с третьим и потом с четвертым столбцами.

ps: пример сохранили бы в более раннем формате - не открывается он у меня.

Отправлено: 02:13, 20-06-2013 | #6


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать



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

Отправлено: 07:49, 20-06-2013 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить 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
(файл рабочей книги прилагается: Sample.7z; обратите внимание, что для корректной работы я убрал лишние строки [с объяснениями] из листа «Эталон»).

К сожалению, мне никак не удалось из-под 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


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Цитата includer-test:
Формулами я знаю как это сделать, но хочется сделать это именно через VBA, т.к. список огромный. »
не вижу связи. И запись макросов еще никто не отменял.
Включаем запись, вбиваем формулу в нужный столбец и дважды жмем на правый нижний угол ячейки с формулой. Сделается автозаполнение по всем данным, пусть их хоть сотни тысяч. Жмем остановить запись макроса и получаем готовый код.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 15:37, 22-06-2013 | #9


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Delirium:
не вижу связи. И запись макросов еще никто не отменял.
Включаем запись, вбиваем формулу в нужный столбец и дважды жмем на правый нижний угол ячейки с формулой. Сделается автозаполнение по всем данным, пусть их хоть сотни тысяч. Жмем остановить запись макроса и получаем готовый код. »
Автоматическое заполнение делается, но сдвигается диапазон сравнения на один шаг. Как зафиксировать диапазон я не разобрался. Если Вы знаете как обойти это, то буду признателен за подсказку.

Цитата Iska:
К сожалению, мне никак не удалось из-под 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 »
Спасибо за помощь. Но что-то дома у меня этот макрос на Office 2010 никак не запустился. Сейчас еще на работе попробую, руки еще не дошли просто.

Отправлено: 11:43, 24-06-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - [решено] Сравнение списка VBA

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - Сравнение списка файлов и каталога с файлами с копированием файлов из каталога 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




 
Переход