|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
25.03.2011, 00:06 | #11 |
Пользователь
Регистрация: 16.02.2011
Сообщений: 36
|
не не не, ночь не для сна у меня, ну по крайней мере, первая её полвоина...
я тут небольшую релаксацию провёл.. в общем не важно... IgorGo прав, я выбрал тот вариант, который прост мне для понимания... В придачу этот отчёт мой первый проект.. и то стал изучать VBA для облегчения своей работы.... плюс возникеат трудность, что на работе стоит опенофис, поэтому не все макросы вба там работают... а старбейсик начал изучать и понял, что там мне будет очень сложно изучить... с вба по проще, почитал Уокенбаха и начал делать... и для меня, что проще глазу воспринимается, то и проще... анализ будет происходить из положительных чисел... не буду вдоваться в подробности... но вероятность того, что число будет отрицательным равна 99 процентам... Hugo121, если тебе не нравиться громозкое или... какой вариант ты бы предпочёл? =) |
25.03.2011, 00:27 | #12 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Ну если возможны отричательные - тогда на сумму проверять нельзя, разве что абсолютные значения суммировать - но это только утяжелит код.
Делайте с OR, но с WITH - так чуть букв поменьше.
webmoney: E265281470651 Z422237915069 R418926282008
|
25.03.2011, 00:36 | #13 |
Пользователь
Регистрация: 16.02.2011
Сообщений: 36
|
оставляю как есть...
я не знаю как используют другие мой отчёт, может кто и вставляет туда отрицательные числа... но на вряд ли... сумма ускорит код? или будет это на столько не значительно, что не стоит заморачиваться? |
25.03.2011, 08:12 | #14 | |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
Цитата:
Если же Вы хотите ускорить процесс, то непосредственную работу с ячейками листа нужно минимизировать. Так, например, следующий макрос будет работать примерно в 250 раз быстрее (в зависимости от количества копируемых ячеек): Код:
Чем шире угол зрения, тем он тупее.
|
|
25.03.2011, 09:11 | #15 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
При таком небольшом количестве проверок особой разницы нет, как проверять.
Если замерить например 1000 прогонов этого цикла - тогда уже будет видна разница. Я тут на досуге тоже подобрал ещё два варианта - первый это перебор массива, как предложил SAS888 (только вместо And нужно Or), другой - проверять строку другим циклом For Each и при первом совпадении выходить из этого цикла. Так не будут всегда проверяться все 4 ячейки. Можно это совместить - перебор массива в массиве Но на 79*4 проверки заметной разницы не будет при любом способе. P.S. При выгрузке массива в [A9] [A9].Resize(UBound(b, 1)).Value = b затрутся все возможно находящиеся в этом диапазоне формулы. Так что такой способ не всегда подходит. Но всё равно можно комбинировать - проверять в массиве, а копировать ячейки. Это всё равно будет быстрее, чем всё делать на листе. PP.S. Я как-то раз замерял скорость перебора ячеек листа и этих же ячеек, перекинутых в массив. Разница по скорости получилась в 38 раз - вроде кажется немного, но если код с Cells(x,y) работает полчаса - значит на массиве отработает быстрее минуты. Но как-то на другом форуме один код ускорился с 40 минут до 5 секунд
webmoney: E265281470651 Z422237915069 R418926282008
Последний раз редактировалось Hugo121; 25.03.2011 в 09:21. |
25.03.2011, 10:25 | #16 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Потестил разные подходы - по 1000 циклов, без операции копирования, только сравнение.
Результаты: OR: 4.453125 - 11000 SUM: 3.34375 - 11000 SUM_Arr: 1 - 11000 OR_2Arr: 0.203125 - 11000 Итого - ускорилось в 22 раза. 11000 - это количество найденных строк, чтоб видеть, что отработало одинаково. Код:
webmoney: E265281470651 Z422237915069 R418926282008
Последний раз редактировалось Hugo121; 25.03.2011 в 10:29. |
25.03.2011, 11:27 | #17 | |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
Hugo121
1. То, что вместо AND нужно OR - естественно. Прошу прощения за "описку". 2. То, что копирование ячейки рабочего листа в цикле занимает в сотни раз больше времени, чем один раз сформировать массив и один раз его вставить на лист - это тоже не обсуждается. 3. По поводу "затирки" имеющихся значений на листе: во-первых, такой задачи не было, во-вторых, можно массив b (из моего кода) формировать не пустой, а из имеющихся значений на итоговом листе (естественно, предварительно определив предельное значение размерности), а затем, если соблюдаются условия сравнения, заменять текущее значение этого массива (нужно пример?). 4. Решение данной задачи с использованием массивов, даст выигрыш по скорости в сотни раз (ну, не Вам это объяснять). А по поводу того, как оптимизировать процедуру сравнения, то при Цитата:
Чем шире угол зрения, тем он тупее.
Последний раз редактировалось SAS888; 25.03.2011 в 11:30. |
|
25.03.2011, 11:42 | #18 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Да всё понятно, какие споры...
Вот только хочу уточнить для сторонних наблюдателей обсуждения (133 просмотра на сейчас) по поводу "затирки" имеющихся значений - можно взять в массив с листа, но возмутся значения, а не формулы, и выгрузятся назад тоже уже значения. Допустим, на листе чередуются ячейки под значения с ячейками с формулами. Нам нужно подтянуть/скопировать из другого листа значения на отведённые места - тогда одним массивом делать нельзя. Или копировать отдельные значения ячеек, или заводить столько массивов, сколько областей под значения, и выгружать именно на эти места, не трогая формулы. Такое бывает, делал...
webmoney: E265281470651 Z422237915069 R418926282008
|
25.03.2011, 11:52 | #19 | |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
Цитата:
Чем шире угол зрения, тем он тупее.
|
|
25.03.2011, 12:01 | #20 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Ну как - допустим на листе есть две таблицы с значениями (одна над другой, не рядом), ниже подбит по каждой итог формулой. Такое бывает?
Далее нужно в эти таблицы закинуть числа из другого листа по некоему признаку например столбца А. Такое бывает? Ну вот Вам и необходимость двух массивов... Или двух макросов. Или копировать поячеечно.
webmoney: E265281470651 Z422237915069 R418926282008
Последний раз редактировалось Hugo121; 25.03.2011 в 12:05. Причина: Добавил учточнение - (одна над другой, не рядом) |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Переход по нажатию ENTER в заданном порядке | Dog_DinGo | Microsoft Office Excel | 9 | 28.02.2011 12:18 |
Поиск значения в заданном диапазоне данных | Варвар | Microsoft Office Excel | 2 | 21.01.2011 11:23 |
Копирование и вставка данных как значение. | Shkoda | Microsoft Office Excel | 1 | 10.07.2010 13:51 |
Копирование и вставка текста | Lemo | Общие вопросы Delphi | 1 | 01.07.2010 21:13 |
Копирование и вставка значений | tae1980 | Microsoft Office Excel | 7 | 29.05.2009 09:15 |