Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2011, 14:54   #1
Bur
 
Регистрация: 12.01.2011
Сообщений: 9
По умолчанию Процедура поиска значений

Имеется таблица с большим объемом данных (~66K строк), и ~10 столбцов. Например: Один из столбцов имеет статус индикатора (т. е. по нему нужно понимать с какой строкой работать) "New" (столбец 7). Задача стоит в том, чтобы для каждой строки с "New" выполнить поиск подобных строк, и в случае обнаружения подобной строки, у которой во 2 и 3 столбце в названии отсутствуют вопросы "??". Проблема заключается в том, что если подходить к решению задачи в лоб, то из-за большого объема данных, время выполнения макроса очень велико.
Код:
Sheets(1).Select
For i=1 to 10
If Cells(i,7)="New" Then
For j=2 to 10
If Cells(i,5)=Cells(j,5) Then
If Cells(i,7)<>"New" and Instr(Cells(j,2),"??")=0 Then
cells(j,2)=Cells(i,2)
Cells(i,3)=Cells(j,3)
End if
End if
Next j 
Next i
Как можно оптимизировать процесс, с учетом того что объем данных довольно большой ~66K строк?
Вложения
Тип файла: rar Test.rar (8.4 Кб, 15 просмотров)

Последний раз редактировалось Bur; 05.05.2011 в 15:24.
Bur вне форума Ответить с цитированием
Старый 05.05.2011, 15:28   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Оптимизировать несложно.
Выложите пример файла (хватит 10-100 строк с данными)

Обязательно макрос? или, может, формула в дополнительном столбце подойдёт?

Столбцы 5 и 7, по которым производится поиск, а также столбцы 2 и 3, где вносятся изменения, не могут оказаться в другом месте? (порядок столбцов не меняется?)

Цитата:
и в случае обнаружения подобной строки, у которой во 2 и 3 столбце в названии отсутствуют вопросы "??"
А если таких подходящих строк окажется несколько?
Брать данные из первой попавшейся?
EducatedFool вне форума Ответить с цитированием
Старый 05.05.2011, 15:29   #3
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Файл оригинал какого расширения xls или xlsx
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 05.05.2011, 15:42   #4
Bur
 
Регистрация: 12.01.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Оптимизировать несложно.
Выложите пример файла (хватит 10-100 строк с данными)
Выложил в первом сообщении
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Обязательно макрос? или, может, формула в дополнительном столбце подойдёт?
Нужен именно макрос, потому как, возможно будет часть другого макроса, который выполняем сторонние функции
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Столбцы 5 и 7, по которым производится поиск, а также столбцы 2 и 3, где вносятся изменения, не могут оказаться в другом месте? (порядок столбцов не меняется?)
Нет, порядок не меняется
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
А если таких подходящих строк окажется несколько?
Брать данные из первой попавшейся?
Берется первое значение, потому как предполагается что все остальные уже редактированные и идентичны.
Bur вне форума Ответить с цитированием
Старый 05.05.2011, 15:42   #5
Bur
 
Регистрация: 12.01.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
Файл оригинал какого расширения xls или xlsx
Оригинал xlsx, потому как строк >66K
Bur вне форума Ответить с цитированием
Старый 05.05.2011, 15:43   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub test()
    Dim ra As Range: Set ra = Range("a1").CurrentRegion
    arr = ra.Value    ' считываем диапазон в массив
    For i = LBound(arr) To UBound(arr)
        If arr(i, 7) = "New" Then
            For j = LBound(arr) To UBound(arr)
                If arr(i, 5) = arr(j, 5) Then
                    If arr(j, 7) <> "New" Then
                        If InStr(1, arr(j, 2) & arr(j, 3), "??") = 0 Then
                            arr(j, 2) = arr(i, 2)
                            arr(j, 3) = arr(i, 3)
                        End If
                    End If
                End If
            Next j
        End If
    Next i
    ra.Value = arr    ' заносим результаты обратно на лист
End Sub
Пример в файле: http://excelvba.ru/XL_Files/Sample__...__17-46-42.zip

Последний раз редактировалось EducatedFool; 05.05.2011 в 15:46.
EducatedFool вне форума Ответить с цитированием
Старый 06.05.2011, 15:27   #7
Bur
 
Регистрация: 12.01.2011
Сообщений: 9
По умолчанию

EducatedFool, Спасибо!
Есть-ли эффективный способ по подкрашиванию ячеек?
Я сделал так:
Код:
For i = 2 To UBound(arr)
    If Cells(i, 7) = "New" Then
        Cells(i, 2).Font.ColorIndex = 3
        Cells(i, 3).Font.ColorIndex = 3
    End If
Next i
Не нравится время выполнения (((
Bur вне форума Ответить с цитированием
Старый 06.05.2011, 15:56   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Если у Вас "New" в >50% значений - то вероятно можно и так.
Ну а если иначе - то анализировать всё же следует значения массива, а уж как быстрее подкрасить на листе - это нужно подумать... может Union подключить, или в строку адреса собирать...

P.S. В 3 раза ускоряет отключение обновления экрана и пересчёта, и закрашивание диапазона:
Код:
        Range(Cells(i, 2), Cells(i, 3)).Font.ColorIndex = 3
Да, ещё проверил - сокращение количества диапазонов пропорционально ускоряет код, переход на массив особого эффекта не дал: 0.390625 vs 0.3125
Из 15000 строк 2515 New.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 06.05.2011 в 16:13.
Hugo121 вне форума Ответить с цитированием
Старый 10.05.2011, 18:53   #9
Bur
 
Регистрация: 12.01.2011
Сообщений: 9
По умолчанию

Появилась еще одна задача поиска значений.
Помимо данных, которые были в файле выше, добавляется еще один столбец Band. Так вот, нужно найти те строки, которые имеют идентичные значения во 2 и 3 столбце, но различаются по полю Band. Причем, нужно найти именно те позиции, которые выделяются на фоне аналогичных, т. е. их меньшенство.
Вложения
Тип файла: rar Test.rar (8.5 Кб, 11 просмотров)
Bur вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивная процедура поиска значений элементов массива кот Бегемот Помощь студентам 0 18.11.2010 11:38
Вопрос по решению (процедура поиска) dex92 Паскаль, Turbo Pascal, PascalABC.NET 5 18.05.2010 21:29
процедура поиска PlayHard Помощь студентам 0 15.05.2010 10:46
Процедура поиска и копирования frodor999 Помощь студентам 1 06.12.2009 15:29
Процедура поиска нескольких файлов одновременно GvR Общие вопросы Delphi 3 15.11.2009 02:43