0 / 0 / 0
Регистрация: 16.10.2012
Сообщений: 16
|
||||||
1 | ||||||
Сравнение диапазона ячеек с множеством условий20.12.2012, 16:40. Показов 2972. Ответов 15
Метки нет (Все метки)
Здравствуйте! Прилагаю код, работает долго, поскольку обработка идет по диапазону 300 000 строк и 32 столбца, как можно оптимизировать быстроту сравнения с множеством условий? и как можно эти условия не прописывать в коде и где нить на отдельном листе книги? какие операторы могут ускорить работу? Помогите, не могу оптимизировать, работа макроса занимает 30-40 минут
0
|
20.12.2012, 16:40 | |
Ответы с готовыми решениями:
15
Как из диапазона вывести число, которое первое удовлетворит одному из условий При совпадении 4 условий значения ячеек суммировать из листа №1 в лист №2 Запись диапазона ячеек Копирование диапазона ячеек |
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
|
||||||
20.12.2012, 17:16 | 2 | |||||
Однозначно не работать с данными на листах: самы медленные операци - чтение и запись.
Считывать всё в массив.
Добавлено через 5 минут
0
|
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
|
|
20.12.2012, 18:10 | 3 |
Словарь с LIKE не дружит - придётся всё равно циклом перебирать.
А вот всю эту кучу OR я бы заменил на select case true - так хоть не придётся проверять каждый раз все условия. Или вообще RegExp привлечь нужно. Ну и конечно всё нужно делать в массивах, а не на листе - я как-то мерил, массив в 47 раз был быстрее. На одном форуме давно удалось подобный код ускорить с 40 мин. до 5,5 сек - и это ещё без использования словаря (давно было, ещё не освоил никто... ) Добавлено через 2 минуты А все AND заменил на вложенные IF-THEN-END IF
0
|
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
|
|
20.12.2012, 18:29 | 4 |
То что словарь не дружит с Like, не может однозначно служить основанием отказа от него.
Мы же не видим файла, не знаем формата записей. Разные бывают случаи. Возможно от Like можно(и нужно) будет отказаться
0
|
0 / 0 / 0
Регистрация: 16.10.2012
Сообщений: 16
|
||||||
20.12.2012, 20:41 [ТС] | 5 | |||||
То есть мне надо всю информацию с исходника считать в массив, и далее обрабатывать уже массив, и далее записать результат в расчет?. Будьте добры небольшой какой нибудь пример со словарем написать пожалуйста. Дело в том что цель, что те критерия (условия) бывают динамичными, то есть постоянно что то меняется, добавляется и удаляется, поэтому хотелось бы не в коде добавлять и удалять, а допустим на листе с названием "справочник", хотя не имеет разницы, но можно уже не править внутри кода)).
Добавлено через 10 минут Да там порядком до 6 фамилий, причем склонение может быть разное, порою где то одну букву пропустили, или нету букву забили, приходится середину брать, хоть она везде одинакова, просто эту базу забивают каждый раз разный работник Добавлено через 3 минуты Просветите неразборчивого, что за словарь??
0
|
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
|
|||||||||||
20.12.2012, 22:11 | 6 | ||||||||||
Дело в том, что и примеров в сети достаточчно и надо понимать, что, в основном, всё зависит от формата данных.
И не видя ваших данных трудно понять, что надо. Если вы хотите иметь более-менее подходяще решение выложите образец файла-источника и образец желаемого полученного результата. Добавлено через 2 минуты Объект Dictionary входит в не подключаемую по умолчанию библиотеку Microsoft Scripting Runtime поэтому для его использования, необходимо: — либо заранее ("раннее связывание") устанавливать ссылку на эту библиотеку в References проекта, тогда словарь объявляется как:
0
|
0 / 0 / 0
Регистрация: 16.10.2012
Сообщений: 16
|
|
21.12.2012, 07:51 [ТС] | 7 |
Прикрепляю исходник и желаемый результат (в последнем имеется и сам код)
0
|
0 / 0 / 0
Регистрация: 16.10.2012
Сообщений: 16
|
|
21.12.2012, 10:03 [ТС] | 8 |
0
|
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
|
|
21.12.2012, 10:43 | 9 |
Словарь тут точно можно использовать вместо поиска по Worksheets("Виды") - уже будет экономия.
В общем, думаю тут тоже можно до 5 секунд сократить Хотя может и нет - сейчас импорт этих "$A$1:$AD$262323" уже занимает 2 секунды.
0
|
0 / 0 / 0
Регистрация: 16.10.2012
Сообщений: 16
|
|
21.12.2012, 11:02 [ТС] | 10 |
[QUOTE=Hugo121;3894020]Словарь тут точно можно использовать вместо поиска по Worksheets("Виды") - уже будет экономия.
В общем, думаю тут тоже можно до 5 секунд сократить Хотя может и нет - сейчас импорт этих "$A$1:$AD$262323" уже занимает 2 секунды.[/ К сожалению я не имею пока представления об использовании словарей...., не подскажите как это сделать хотя бы на примере, с массивами тоже не сталкивался поскольку данные не были такими громадными для обработки, предыдущие пользовались фильтрами и сводными таблицами Excel, но опять же ручной труд перед "пишущей машинкой" хотелось бы конечно избежать практикуемого навыка. Сейчас перечитываю форум в поисках решения... пока учусь
0
|
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
|
|
21.12.2012, 11:29 | 11 |
У Вас массив уже используется при импорте данных
Писать рабочий код на этом примере влом - слишком уж там всего много... Но я тут рядом давал пару кодов на словаре: Как создать массив массивов Смысл в чём - в начале кода из данных листа "Вид" заполняем словарь, затем когда нужно не ищем файндом на листе, а смотрим, есть ли такое в словаре. Быстро и код простой.
0
|
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
|
||||||
21.12.2012, 13:24 | 12 | |||||
в массив по любому считать надо.
Примерно так:
1
|
0 / 0 / 0
Регистрация: 16.10.2012
Сообщений: 16
|
||||||
21.12.2012, 14:36 [ТС] | 13 | |||||
[QUOTE=Alex77755;3894653]в массив по любому считать надо.
Примерно так:
а как решить вопрос с типами данных??))
0
|
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
|
|
21.12.2012, 16:03 | 14 |
А что? вызывает ошибку что-то?
Тип не объявлен - значит вариант - принимает любые значения
0
|
0 / 0 / 0
Регистрация: 16.10.2012
Сообщений: 16
|
||||||
21.12.2012, 16:29 [ТС] | 15 | |||||
по умолчанию при объявления массива принято как вариант, и пробовал объявить, дает ошибку несоотвествия типа данных
0
|
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
21.12.2012, 17:28 | 16 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
на какой строке? С Like? попробуй Instr
Добавлено через 57 минут со списком замен(на листе "Замены" таблица: Номер столбца Что искать Что вставлять
1
|
21.12.2012, 17:28 | |
21.12.2012, 17:28 | |
Помогаю со студенческими работами здесь
16
Заполнение диапазона ячеек Выбор диапазона ячеек Выделение диапазона ячеек Выделение диапазона ячеек Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |