|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.03.2011, 22:27 | #1 |
Пользователь
Регистрация: 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 она весит компьютер, на котором выполняется процедура на длительное время. есть варианты упрощения данной процедуры? |
12.03.2011, 22:34 | #2 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Чтоб постоянно не обращаться к ячейкам (да и ещё на разных листах), можно взять оба диапазона одним (т.е. двумя на два диапазона) действием в массивы и затем сравнивать массивы. Это ускорит процесс раз в 40.
Затем можно и изменения делать в массиве и потом выгрузить назад на лист одним движением - это если в диапазоне нет формул, которые в этом случае погибнут. Ещё вариант - одним проходом по массиву ("БЕЗ_НАКЛАДНЫХ") взять уникальные значения в словарь. Затем сравнивать массив листа ("М") с этим словарём. Получится два прохода по данным листов, а не 4900.
webmoney: E265281470651 Z422237915069 R418926282008
|
12.03.2011, 22:40 | #3 |
Пользователь
Регистрация: 16.02.2011
Сообщений: 36
|
Спасибо.. второй вариант валялся у меня где-то как пример... если я думаю о том, что надо, то сейчас попробую...
Последний раз редактировалось Dog_DinGo; 12.03.2011 в 22:43. |
12.03.2011, 23:20 | #4 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Примеры кода тут на форуме можно найти - и с массивами, и с словарями.
Если сравнивать два массива - можно и цикл в цикле, т.к. массивы перебираются быстро. А получив значение i массива, можно удалить значение ячейки Cells(i, 1) листа. Но быстрее всего с словарём - как я понял, Вам ведь нужно просто удалить все значения в диапазоне листа, если они есть в диапазоне другого листа. Тогда в словаре будем иметь список всех значений, сверившись потом с которым, удаляем проверяемое значение. А в Вашем коде ещё можно добавить выход из второго цикла после удаления - немного, но ускорит. А чтоб всё не останавливалось при работе - добавьте DoEvents на каждом шаге первого цикла. Но это конечно полумеры - чтоб всё не переписывать.
webmoney: E265281470651 Z422237915069 R418926282008
|
12.03.2011, 23:24 | #5 |
Пользователь
Регистрация: 16.02.2011
Сообщений: 36
|
Спасибо большое
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выбор варианта из 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 |