|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.04.2010, 21:59 | #1 |
Пользователь
Регистрация: 04.03.2010
Сообщений: 14
|
Сравнение дат и удаление невыделенных строк
Здравствуйте уважаемые участники форума!
Помогите, пожалуйста, решить проблему: Имеется две книги Excel 2003 TestP.xls и TestSM.xls. Проводится поиск по столбцам A,B,C,E TestSM.xls и J,K,L,N TestP.xls. Если все совпадает, то строка выделяется цветом. Это у меня работает при помощи макроса со следующим кодом (используется файл .xla): Sub Main1() Dim i As Long, j As Long, x As Range, a(), b() Application.ScreenUpdating = False: Workbooks("TestP.xls").Sheets(1).Ac tivate With Workbooks("TestSM.xls").Sheets(1) Cells.Interior.ColorIndex = xlNone: .Cells.Interior.ColorIndex = xlNone j = .Cells(1, Columns.Count).End(xlToLeft).Column + 1 a = .Range(.[A2], .Cells(Rows.Count, "E").End(xlUp)).Value ReDim b(1 To UBound(a, 1), 1 To 1) For i = 1 To UBound(a, 1) b(i, 1) = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 5) Next .Range(.Cells(2, j), .Cells(UBound(b, 1) + 1, j)).Value = b a = Range([J2], Cells(Rows.Count, "N").End(xlUp)).Value For i = 1 To UBound(a, 1) Set x = .Columns(j).Find(what:=a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 5), LookAt:=xlWhole) If Not x Is Nothing Then 'Эта проверка не работает 'If Cells(i + 1, "I") > .Cells(x.Row, "L") Then Rows(i + 1).Interior.ColorIndex = 6: .Rows(x.Row).Interior.ColorIndex = 6 'End If End If Next End With End Sub Но мне необходимо, чтобы еще производилась проверка найденных данных по датам: Если дата в столбце „I“ книги TestP.xls больше, чем дата в столбце „L“ книги TestSM.xls, то строка выделяется, в противном случае – нет. То, что у меня в коде закомментировано – не работает. Не могу понять, где ошибка? Хотелось бы также в этот код интегрировать алгоритм удаления невыделенных строк, который бы начинал работать после выполнения основного алгоритма: все строки, которые выделяются цветом при поиске и сравнении - остаются, остальные –удаляются. Все мои попытки решить эти задачи не увенчались успехом. Буду очень благодарен за помощь. Файлы TestP.xls и TestSM.xls приложены. С уважением, Александр |
12.04.2010, 23:34 | #2 |
Форумчанин
Регистрация: 06.08.2009
Сообщений: 472
|
Добрый вечер, проблема в значениях в столбце "L" файла "TestSM.xls" - это не даты, если перевести в даты, все в порядке
|
12.04.2010, 23:49 | #3 |
Старожил
Регистрация: 02.05.2009
Сообщений: 3,907
|
Код:
Анализ,обработка данных Недорого
|
13.04.2010, 23:18 | #4 |
Пользователь
Регистрация: 04.03.2010
Сообщений: 14
|
Спасибо!
Спасибо огромное за оперативное решение моей проблемы!
Особенно doober!!!! Все работает. Проверил на файле из 17 000 строк - время обработки 3-4 минуты. С уважением, Александр |
14.04.2010, 06:18 | #5 | |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
Цитата:
Код:
Чем шире угол зрения, тем он тупее.
|
|
14.04.2010, 15:12 | #6 | |
Пользователь
Регистрация: 04.03.2010
Сообщений: 14
|
Спасибо SAS888!
Действительно, этот макрос работает значительно быстрее! Логика для меня, конечно, сложновата... Но выделения строк хотелось бы оставить, чтобы легче было сравнивать со второй книгой. Или удалять "лишние" данные из второй книги тоже? Цитата:
Огромное спасибо еще раз! С уважением, Александр |
|
15.04.2010, 07:43 | #7 |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
Так пойдет?
Код:
2. При сравнении времени, сравнивается не ячейка с ячейкой, а ячейка с элементом массива, что также, чуть быстрее. 3. Добавлена подсветка совпавших строк во 2-м файле. 4. Устранена возможная ошибка при отсутствии совпадений. Пример во вложении.
Чем шире угол зрения, тем он тупее.
Последний раз редактировалось SAS888; 15.04.2010 в 09:11. |
16.04.2010, 01:51 | #8 | ||
Пользователь
Регистрация: 04.03.2010
Сообщений: 14
|
Огромное спасибо SAS888!
Да, действительно, эта программа работает просто эамечательно! Проверил на файле в 17 000 строк (TestP.xls - второй поменьше) - время обработки меньше минуты, секунд 15-20. Просто супер! Как я уже говорил, что логика для меня сложновата. Знаю и понимаю, что у вас нет ни времени ни желания "пускаться" в объяснения. Но у меня возникла необходимость в небольшой доработке (не знал заранее): Цитата:
Я пытался доработать ваш код по этому вопросу, но у меня не получается. Повторюсь - не до конца понимаю логику сравнения... Если не трудно, подскажите, как добавить вышеописанное условие. С уваженеим, Александр P.S. Кажется, у меня получилось - сравнение без "=": Цитата:
Последний раз редактировалось alegu; 16.04.2010 в 02:21. |
||
16.04.2010, 06:00 | #9 |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
Попробую пояснить.
1. В книге "TestSM.xls" создаем временный дополнительный столбец из сцепленных значений интересующих нас столбцов ("A:E"), используя массивы a и b. Располагаем этот столбец правее, после последнего использованного. 2. Из книги "TestP.xls" формируем массив a, содержащий все строки и столбцы для сравнения ("J:N"), а также столбец с временем ("I"). 3. Организуем цикл по строкам массива a. Для каждой строки выполняем поиск сцепленных значений в сформированном нами доп. столбце. 4. Если совпадений нет (If x Is Nothing), то формируем диапазон y, содержащий не совпавшие строки для последующего удаления. 5. Если находим совпадение, то сравниваем элемент массива текущей строки, содержащий время с ячейкой столбца "L" найденной строки, которая также содержит время, предварительно переводя значения в формат "дата/время" (If CDate(a(i, 1)) <= CDate(.Cells(x.Row, "L")) Then...). И если время совпавшей строки из книги "TestP.xls" (a(i, 1)) меньши или равно времени совпавшей строки из книги "TestSM.xls" (.Cells(x.Row, "L")), то добавляем эту строку к диапазону y, т.е. такая строка тоже будет удалена. Иначе, формируем диапазон z из совпавших строк книги "TestSM.xls", которые удовлетворяют условию сравнения по времени. 6. После выхода из цикла, удаляем сформированный доп. столбец в книге "TestSM.xls" (.Columns(j).Delete), если диапазон z содержит хотя бы 1 значение, то окрашиваем все в желтый цвет (If Not z Is Nothing Then z.Interior.ColorIndex = 6), и если диапазон y содержит значения, то удаляем их (If Not y Is Nothing Then y.EntireRow.Delete). Такие проверки необходимы для того, чтобы в случае отсутствия совпадений не возникало ошибки. Теперь, думаю, что Вы без труда, при необходимости, сможете самостоятельно изменять код макроса под свои нужды.
Чем шире угол зрения, тем он тупее.
Последний раз редактировалось SAS888; 16.04.2010 в 06:03. |
16.04.2010, 22:15 | #10 | |
Пользователь
Регистрация: 04.03.2010
Сообщений: 14
|
Здравствуйте SAS888!
Цитата:
Огромное вам спасибо! Вы настоящий профессионал! С уважением, Александр |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
сравнение дат | Алёна | Microsoft Office Excel | 8 | 03.07.2009 10:47 |
C#: Сравнение дат | Veiron | Общие вопросы .NET | 1 | 08.06.2009 23:32 |
Сравнение дат в IBExpert | SlavaSH | SQL, базы данных | 1 | 09.02.2009 16:53 |
Сравнение дат | for_regist1 | БД в Delphi | 21 | 26.01.2009 01:29 |
сравнение дат | Geddar | Общие вопросы Delphi | 2 | 04.06.2008 19:09 |