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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2011, 22:27   #1
Dog_DinGo
Пользователь
 
Аватар для Dog_DinGo
 
Регистрация: 16.02.2011
Сообщений: 36
Смущение ПОиск эффективного варианта

Есть более оптимальный вариант для вот этого:
Sub Marsh()
For j = 2 To 100
For i = 1 To 50
If Worksheets("М").Cells(i, 1) = Worksheets("БЕЗ_НАКЛАДНЫХ").Cells(3 , j) _
Then Worksheets("М").Cells(i, 1).Delete
Next i
Next j
Worksheets("М").Select
End Sub

Ибо при использовании конструкции For To она весит компьютер, на котором выполняется процедура на длительное время.

есть варианты упрощения данной процедуры?
Dog_DinGo вне форума Ответить с цитированием
Старый 12.03.2011, 22:34   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Чтоб постоянно не обращаться к ячейкам (да и ещё на разных листах), можно взять оба диапазона одним (т.е. двумя на два диапазона) действием в массивы и затем сравнивать массивы. Это ускорит процесс раз в 40.
Затем можно и изменения делать в массиве и потом выгрузить назад на лист одним движением - это если в диапазоне нет формул, которые в этом случае погибнут.
Ещё вариант - одним проходом по массиву ("БЕЗ_НАКЛАДНЫХ") взять уникальные значения в словарь. Затем сравнивать массив листа ("М") с этим словарём. Получится два прохода по данным листов, а не 4900.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 12.03.2011, 22:40   #3
Dog_DinGo
Пользователь
 
Аватар для Dog_DinGo
 
Регистрация: 16.02.2011
Сообщений: 36
По умолчанию

Спасибо.. второй вариант валялся у меня где-то как пример... если я думаю о том, что надо, то сейчас попробую...

Последний раз редактировалось Dog_DinGo; 12.03.2011 в 22:43.
Dog_DinGo вне форума Ответить с цитированием
Старый 12.03.2011, 23:20   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Примеры кода тут на форуме можно найти - и с массивами, и с словарями.
Если сравнивать два массива - можно и цикл в цикле, т.к. массивы перебираются быстро. А получив значение i массива, можно удалить значение ячейки Cells(i, 1) листа.
Но быстрее всего с словарём - как я понял, Вам ведь нужно просто удалить все значения в диапазоне листа, если они есть в диапазоне другого листа. Тогда в словаре будем иметь список всех значений, сверившись потом с которым, удаляем проверяемое значение.
А в Вашем коде ещё можно добавить выход из второго цикла после удаления - немного, но ускорит.
А чтоб всё не останавливалось при работе - добавьте DoEvents на каждом шаге первого цикла.
Но это конечно полумеры - чтоб всё не переписывать.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 12.03.2011, 23:24   #5
Dog_DinGo
Пользователь
 
Аватар для Dog_DinGo
 
Регистрация: 16.02.2011
Сообщений: 36
По умолчанию

Спасибо большое
Dog_DinGo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выбор варианта из Select qwerty55 JavaScript, Ajax 2 17.01.2011 14:53
Перечислимые типами и оператор варианта! flintovich Помощь студентам 0 29.05.2010 19:39
Турбо Паскаль. Оператор варианта lilia2121 Помощь студентам 2 28.04.2010 17:22
Программа для подсчета полного и эффективного кол-ва информации wandering Помощь студентам 5 04.04.2010 19:56
оператор варианта Кирилл17 Помощь студентам 2 21.12.2008 22:55