Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Условное форматирование. Ускорение кода. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Условное форматирование. Ускорение кода.
pentium1024 Дата: Четверг, 09.12.2021, 12:40 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 20% ±

2016
Здравствуйте!
Есть файл с 10к+ строк и полусотней столбцов. Нужно выделить повторяющиеся ячч.
Средствами Условного форматирования Экселя получается медленно ворочающийся файл.
Мысль покрасить ячч. средствами VBA родила код:
[vba]
Код

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

For Each Cll ячёйки в диапазоне от первой до яч. в последнем ряду и последнем имеющим непустую ячейку столбце
If яч. Cll не пустая
For номер ряда rw от начала до последнего
For номер столбца col от начала до последнего имеющего непустую ячейку
If Cll.Value = Cells(rw, col) And Not Cll.Address = Cells(rw, col).Address Then Cells(rw, col).Interior.ColorIndex = 22
Next: Next: End If: Next
[/vba]

И это выполняется часы.
Совпадений не много, нужно покрасить <1к на 500к ячеек.
Прошу помощи у того, кто видит, как изменить код для ускорения.


Сообщение отредактировал pentium1024 - Четверг, 09.12.2021, 13:44
 
Ответить
СообщениеЗдравствуйте!
Есть файл с 10к+ строк и полусотней столбцов. Нужно выделить повторяющиеся ячч.
Средствами Условного форматирования Экселя получается медленно ворочающийся файл.
Мысль покрасить ячч. средствами VBA родила код:
[vba]
Код

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

For Each Cll ячёйки в диапазоне от первой до яч. в последнем ряду и последнем имеющим непустую ячейку столбце
If яч. Cll не пустая
For номер ряда rw от начала до последнего
For номер столбца col от начала до последнего имеющего непустую ячейку
If Cll.Value = Cells(rw, col) And Not Cll.Address = Cells(rw, col).Address Then Cells(rw, col).Interior.ColorIndex = 22
Next: Next: End If: Next
[/vba]

И это выполняется часы.
Совпадений не много, нужно покрасить <1к на 500к ячеек.
Прошу помощи у того, кто видит, как изменить код для ускорения.

Автор - pentium1024
Дата добавления - 09.12.2021 в 12:40
Апострофф Дата: Четверг, 09.12.2021, 13:06 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 458
Репутация: 126 ±
Замечаний: 0% ±

Excel 1997
[vba]
Код

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

For Each Cll ячёйки в диапазоне от первой до яч. в последнем ряду и последнем имеющим непустую ячейку столбце
  If яч. Cll не пустая
    For номер ряда rw от начала до последнего
      For номер столбца col от начала до последнего имеющего непустую ячейку
        IF CLL.Interior.ColorIndex = 22 THEN GOTO 1 'ЕСЛИ УЖЕ ПОКРАШЕНО-ЗАЧЕМ ПРОВЕРЯТЬ ДАЛЬШЕ?
        If Cll.Value = Cells(rw, col) And Not Cll.Address = Cells(rw, col).Address Then Cells(rw, col).Interior.ColorIndex = 22
      Next
    Next
  End If
1
Next
[/vba]
 
Ответить
Сообщение[vba]
Код

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

For Each Cll ячёйки в диапазоне от первой до яч. в последнем ряду и последнем имеющим непустую ячейку столбце
  If яч. Cll не пустая
    For номер ряда rw от начала до последнего
      For номер столбца col от начала до последнего имеющего непустую ячейку
        IF CLL.Interior.ColorIndex = 22 THEN GOTO 1 'ЕСЛИ УЖЕ ПОКРАШЕНО-ЗАЧЕМ ПРОВЕРЯТЬ ДАЛЬШЕ?
        If Cll.Value = Cells(rw, col) And Not Cll.Address = Cells(rw, col).Address Then Cells(rw, col).Interior.ColorIndex = 22
      Next
    Next
  End If
1
Next
[/vba]

Автор - Апострофф
Дата добавления - 09.12.2021 в 13:06
pentium1024 Дата: Четверг, 09.12.2021, 13:34 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 20% ±

2016
Апострофф, спасибо.
Можно также безусловно на 1 после покраски.
Только вряд ли это даст в моём случае заметное ускорение, т.к. совпадений на 10к*50=0,5М ячч. не много, <1000. Не догадался об этом, малом количестве совпадений, написать сразу.


Сообщение отредактировал pentium1024 - Четверг, 09.12.2021, 13:43
 
Ответить
СообщениеАпострофф, спасибо.
Можно также безусловно на 1 после покраски.
Только вряд ли это даст в моём случае заметное ускорение, т.к. совпадений на 10к*50=0,5М ячч. не много, <1000. Не догадался об этом, малом количестве совпадений, написать сразу.

Автор - pentium1024
Дата добавления - 09.12.2021 в 13:34
Апострофф Дата: Четверг, 09.12.2021, 13:44 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 458
Репутация: 126 ±
Замечаний: 0% ±

Excel 1997
Можно также безусловно на 1 после покраски.

Не факт. Ведь дальше может ещё встретиться это же значение CLL ...
 
Ответить
Сообщение
Можно также безусловно на 1 после покраски.

Не факт. Ведь дальше может ещё встретиться это же значение CLL ...

Автор - Апострофф
Дата добавления - 09.12.2021 в 13:44
pentium1024 Дата: Четверг, 09.12.2021, 13:53 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 20% ±

2016
Апострофф, но ведь Cll уже покрашена, так что встретится ещё раз ей равенство, нет ли, уже не имеет значения.
Но Вы натолкнули меня на важную мысль – проверять не с начала, т.е., если бегать по рядам, то для проверки брать только то, что ниже. Это д. дать результат. Снова спасибо.


Сообщение отредактировал pentium1024 - Четверг, 09.12.2021, 13:53
 
Ответить
СообщениеАпострофф, но ведь Cll уже покрашена, так что встретится ещё раз ей равенство, нет ли, уже не имеет значения.
Но Вы натолкнули меня на важную мысль – проверять не с начала, т.е., если бегать по рядам, то для проверки брать только то, что ниже. Это д. дать результат. Снова спасибо.

Автор - pentium1024
Дата добавления - 09.12.2021 в 13:53
bmv98rus Дата: Четверг, 09.12.2021, 18:43 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4115
Репутация: 769 ±
Замечаний: 0% ±

Excel 2013/2016
1 все забираем в массив и бежим по нему, а не по ячейкам
2. если значение в массиве не пустое, то обрабатываем
3 помечаем дубли цветом, сразу или сперва накапливая диапазон через Merge, зависит от количества повторов
4 в массиве стираем значение обработанное
5 повторяем с 2 со следующей непустой ячейкой.

но лучше всего скрестить со словарем, не мгновенно но 25 сек, на массиве 10000x50 заполненный произвольными от 1 до 10000

Чето поперли идее 15 сек на тех же данных

Еще вариант, использовать Replace с использованием формата (Selection для примера) но это не самый быстрый, так просто для демонстрации техники


Замечательный Временно просто медведь , процентов на 20.

Сообщение отредактировал bmv98rus - Четверг, 09.12.2021, 21:08
 
Ответить
Сообщение1 все забираем в массив и бежим по нему, а не по ячейкам
2. если значение в массиве не пустое, то обрабатываем
3 помечаем дубли цветом, сразу или сперва накапливая диапазон через Merge, зависит от количества повторов
4 в массиве стираем значение обработанное
5 повторяем с 2 со следующей непустой ячейкой.

но лучше всего скрестить со словарем, не мгновенно но 25 сек, на массиве 10000x50 заполненный произвольными от 1 до 10000

Чето поперли идее 15 сек на тех же данных

Еще вариант, использовать Replace с использованием формата (Selection для примера) но это не самый быстрый, так просто для демонстрации техники

Автор - bmv98rus
Дата добавления - 09.12.2021 в 18:43
pentium1024 Дата: Суббота, 11.12.2021, 08:43 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 20% ±

2016
bmv98rus, большое спасибо! Не мог даже представить, что м. работать так быстро.
Как много предстоит узнать :-)
 
Ответить
Сообщениеbmv98rus, большое спасибо! Не мог даже представить, что м. работать так быстро.
Как много предстоит узнать :-)

Автор - pentium1024
Дата добавления - 11.12.2021 в 08:43
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!