|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.06.2011, 07:07 | #11 |
Пользователь
Регистрация: 09.03.2011
Сообщений: 33
|
Hugo121!
Вот спасибо! Лепота! - Все бы это осилить еще... Буду погружаться на выходных: вижу, все искушенные кодировщики используют искомые объекты, а сам, хоть и стремлюсь достичь вашего уровня, но по сей день никак не долезу - учителей просветленных да терпеливых не было... ну ничего..., не так все безнадежно, думаю. ...на правах офтопика... |
04.09.2011, 18:54 | #12 |
Форумчанин
Регистрация: 24.01.2011
Сообщений: 136
|
Уважаемые знатоки Экселя, извините что пишу в этой теме а не открываю новую . Возникла новая , но очень похожая задача. В книге три листа. На лист 2 есть список: код (столбец А) и цена ( столбец С). Используя код уважаемого Hugo121, я создал с помощью Словаря, список уникальных значений с суммой цены по каждому уникальному коду. Дальше необходимо номер из листа 3 ( столбец 1), проверить, и если этот номер есть в списке уникальных значений вывести его и сумму по нему на лист 1 . Я это сделал так, во вложенном файле: список уникальных вывел на лист 1, и далее проверяю наличие номера из листа 3 в Словаре и если такой номер есть - через функцию Selection.Find нахожу его и сумму. Но функции Selection.Find , Activate работают медленно и вероятно есть более быстрые способы решения этой задачи. В этом собственно и заключается мой вопрос: "Как это сделать быстрее ?" Спасибо за ответ.
|
04.09.2011, 19:22 | #13 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Первым делом в глаза резануло CDbl:
oDict.Add temp, CDbl(ii) У меня было Cstr(ii) Зачем вообще Cdbl, если там целые числа? "проверяю наличие номера из листа 3 в Словаре и если такой номер есть" - так сразу и берите из массива данные по Item словаря. Вот, в 5 раз быстрее - убрал селекшены и активации, лишние выгрузки и поиск: Код:
webmoney: E265281470651 Z422237915069 R418926282008
Последний раз редактировалось Hugo121; 04.09.2011 в 19:42. |
04.09.2011, 20:28 | #14 |
Форумчанин
Регистрация: 24.01.2011
Сообщений: 136
|
Спасибо. Всё очень быстро и здорово. Я пробовал делать
x = oDict.Item(temp) но выдавало число, и я видимо не разобрался что это за число. Непонятно почему два минуса в строке b(x, 2) = --(b(x, 2)) + (a(i, ind)) и не понял почему в x = oDict.Item(temp) c(ii, 1) = b(x, 1) c(ii, 2) = b(x, 2) найденный х x = oDict.Item(temp) означает номер искомого элемента в массиве переменных b() ??? Ещё вопрос: В Коллекции можно искать oDict.Item(temp) и по значению и по ключу ?? Т.е. если в temp ввести ключ - найдёт значение соответствующие этому ключу, а если в temp ввести значение- найдет соответствующий ключ ??? Спасибо за ответ. |
04.09.2011, 20:49 | #15 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Два минуса - это бинарный минус, переводим строку в число.
Если убрать этот бинарный минус, то "1" + 1 = "11" x = oDict.Item(temp) означает номер искомого элемента в массиве переменных b() - именно так и выходит, потому что в массив b мы и заносим по значению из oDict.Item(temp) В словаре хранится слово и его Item. Как Item мы кладём значение счётчика, и по этому счётчику заносим значения в параллельный массив, который со словарём никак в общем не связан. Общее только то, что в словаре имеем слово и Item, который является "адресом" этого слова в массиве - в строке с этим номером мы собираем все данные по этому слову. Как-то так, надеюсь понятно объяснил
webmoney: E265281470651 Z422237915069 R418926282008
Последний раз редактировалось Hugo121; 04.09.2011 в 20:54. |
04.09.2011, 21:10 | #16 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
И кстати, тут можно ещё на пару миллисекунд убыстрится, если вообще упразднить массив b за ненадобностью - суммы можно прямо в словаре собирать:
Код:
webmoney: E265281470651 Z422237915069 R418926282008
|
06.09.2011, 01:03 | #17 | |
Форумчанин
Регистрация: 24.01.2011
Сообщений: 136
|
Спасибо за ответ. Предложенный алгоритм работает очень быстро, скорость обработки сопоставима со скоростью обработки встроенными функциями Excel.
Нашёл, на мой взгляд, одну лишнюю строку в коде: Цитата:
|
|
06.09.2011, 01:22 | #18 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Да, эабыл эту строку убрать - это осталось от работы с массивом.
Но с х там действительно неувязка - у меня в первоначальном коде не было For i = 1 To x... Неуследил...
webmoney: E265281470651 Z422237915069 R418926282008
Последний раз редактировалось Hugo121; 06.09.2011 в 09:14. |
06.09.2011, 10:06 | #19 |
Форумчанин
Регистрация: 24.01.2011
Сообщений: 136
|
Это я туда "втулил" переменную Х, мне и отвечать..
А Вам ещё раз спасибо за помошь !!! Чесно говоря не ожидал такой скорости обработки.. Удачи. |
06.09.2011, 10:10 | #20 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Нет, это я втулил по образцу сверху - не заметил, что х уже в цикле используется...
webmoney: E265281470651 Z422237915069 R418926282008
|
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
убрать дубликаты | Nasten'ka7 | Microsoft Office Excel | 1 | 21.03.2011 18:49 |
подсчёт суммы, если меняется количество слагаемых | kaa1977 | Microsoft Office Excel | 1 | 17.03.2011 17:52 |
окрасить дубликаты | Romuald | Microsoft Office Excel | 5 | 07.03.2011 16:33 |