Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Ускорение работы макроса - Мир MS Excel

  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: китин, _Boroda_, DrMini  
Ускорение работы макроса
ZamoK Дата: Вторник, 21.07.2015, 11:57 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Есть работающий макрос, но при увеличении строк листа "Состав узлов" до 22 000 думать начинает до 15 минут, но работает исправно. Можно ли как-то уменьшить время ожидания результата.
Укороченный пример прилагается. Если что-то можно поколдовать в коде, то скину ссылку на файл оригинал, он весит 650 Kb.
К сообщению приложен файл: Obraz.xlsm (96.6 Kb)


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеЕсть работающий макрос, но при увеличении строк листа "Состав узлов" до 22 000 думать начинает до 15 минут, но работает исправно. Можно ли как-то уменьшить время ожидания результата.
Укороченный пример прилагается. Если что-то можно поколдовать в коде, то скину ссылку на файл оригинал, он весит 650 Kb.

Автор - ZamoK
Дата добавления - 21.07.2015 в 11:57
miver Дата: Вторник, 21.07.2015, 12:25 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 37 ±
Замечаний: 0% ±

Excel 2010
Думаю проблема в поиске
[vba]
Код
Set r = Sheets("Состав узлов").Columns(1).Find(t, LookIn:=xlValues, lookat:=xlWhole)
[/vba]
Можно попробывать при запуске файла перебрать весь лист "Состав узлов" и создать Dictionary по данным
Давайте, попробую с оригиналом
Для большей оптимизации немного опишите логику работы
[moder]Я не понял - кто что кому куда кидать собирается? Вы оба Правила форума хорошо читали? Что там говорится о переходе в личку и ссылках на посторонние ресурсы?
И вообще - объясните мне, непонятливому, чем принципиально отличается работа с маленьким и большим файлами?[/moder]

А как еще проверить скорость работы макроса?


Сообщение отредактировал miver - Вторник, 21.07.2015, 12:57
 
Ответить
СообщениеДумаю проблема в поиске
[vba]
Код
Set r = Sheets("Состав узлов").Columns(1).Find(t, LookIn:=xlValues, lookat:=xlWhole)
[/vba]
Можно попробывать при запуске файла перебрать весь лист "Состав узлов" и создать Dictionary по данным
Давайте, попробую с оригиналом
Для большей оптимизации немного опишите логику работы
[moder]Я не понял - кто что кому куда кидать собирается? Вы оба Правила форума хорошо читали? Что там говорится о переходе в личку и ссылках на посторонние ресурсы?
И вообще - объясните мне, непонятливому, чем принципиально отличается работа с маленьким и большим файлами?[/moder]

А как еще проверить скорость работы макроса?

Автор - miver
Дата добавления - 21.07.2015 в 12:25
ZamoK Дата: Вторник, 21.07.2015, 12:56 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Модератор: Я не понял - кто что кому куда кидать собирается? Вы оба Правила форума хорошо читали? Что там говорится о переходе в личку и ссылках на посторонние ресурсы? И вообще - объясните мне, непонятливому, чем принципиально отличается работа с маленьким и большим файлами?

чем принципиально отличается работа с маленьким и большим файлами?


[moder]Первый ответ - правилам на форуме можно представить аналогию в жизни - закон. Например, УК. Интересно, Вашу первую отмазку прокурору кто-нибудь пытался когда-то втюхать? Если да, что что прокурор ему на это ответил?
Второй - кто мешает в маленьком файле просто протянуть данные тыщ на 50 строк?.
В общем, Правила писал не я, все вопросы к автору. А я (и остальные модераторы) слежу за выполнением.
Хотите нарушить, есть 2 пути - нарушать в надежде, что прокатит или связаться с владельцем и попросить о разовом исключении.


Я не Гуру, но стремлюсь!

Сообщение отредактировал _Boroda_ - Вторник, 21.07.2015, 13:14
 
Ответить
Сообщение
Модератор: Я не понял - кто что кому куда кидать собирается? Вы оба Правила форума хорошо читали? Что там говорится о переходе в личку и ссылках на посторонние ресурсы? И вообще - объясните мне, непонятливому, чем принципиально отличается работа с маленьким и большим файлами?

чем принципиально отличается работа с маленьким и большим файлами?


[moder]Первый ответ - правилам на форуме можно представить аналогию в жизни - закон. Например, УК. Интересно, Вашу первую отмазку прокурору кто-нибудь пытался когда-то втюхать? Если да, что что прокурор ему на это ответил?
Второй - кто мешает в маленьком файле просто протянуть данные тыщ на 50 строк?.
В общем, Правила писал не я, все вопросы к автору. А я (и остальные модераторы) слежу за выполнением.
Хотите нарушить, есть 2 пути - нарушать в надежде, что прокатит или связаться с владельцем и попросить о разовом исключении.

Автор - ZamoK
Дата добавления - 21.07.2015 в 12:56
Manyasha Дата: Вторник, 21.07.2015, 13:04 | Сообщение № 4
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 902 ±
Замечаний: 0% ±

Excel 2010, 2016
miver, что мешает Вам заполнить образец файла тестовыми данными на несколько тысяч? Код не должен меняться при изменении кол-ва данный.
ZamoK, правила распространяются на всех одинаково, БЕЗ исключений.


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениеmiver, что мешает Вам заполнить образец файла тестовыми данными на несколько тысяч? Код не должен меняться при изменении кол-ва данный.
ZamoK, правила распространяются на всех одинаково, БЕЗ исключений.

Автор - Manyasha
Дата добавления - 21.07.2015 в 13:04
SLAVICK Дата: Вторник, 21.07.2015, 13:16 | Сообщение № 5
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Не нужно ничего бросать. :D
Вот:
так должно быть быстрее, можно конечно еще ускорить заменив обращение к листу :
[vba]
Код
x = r.CurrentRegion.Value
[/vba]
на обращение к большому массиву, но тогда есть что еще дописывать :p
К сообщению приложен файл: 5502477-1-.zip (68.1 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 21.07.2015, 13:25
 
Ответить
СообщениеНе нужно ничего бросать. :D
Вот:
так должно быть быстрее, можно конечно еще ускорить заменив обращение к листу :
[vba]
Код
x = r.CurrentRegion.Value
[/vba]
на обращение к большому массиву, но тогда есть что еще дописывать :p

Автор - SLAVICK
Дата добавления - 21.07.2015 в 13:16
ikki Дата: Вторник, 21.07.2015, 13:25 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
рекурсивный алгоритм.
перебор дерева состава.
имхо, сильно зависит от реальных данных.
откуда я знаю - может, в реале уровень вложенности узлов в разы или десятки раз больше?

кстати, по коду непонятно - зачем там каждый раз в процедуру передается ссылка на словарь?
конечно, это не создание локальной копии объекта, но и ссылку передать - тоже время надо, да и стек вызовов быстрее переполнится.
я бы сделал этот объект глобальным - как массив rez()
но, скорее всего, основную часть времени занимает, действительно, поиск на листе и, возможно, многократная обработка одних и тех же узлов.
это надо проверять - собирать статистику, искать узкое место, отнимающее основную часть времени и т.п.

без реального файла - оптимизировать почти нечего. имхо.
и еще одно имхо: думаю, что такая работа - хорошая кандидатура для одноименной ветки форума.

"протянуть" ?.. дерево?.. без комментариев.


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki


Сообщение отредактировал ikki - Вторник, 21.07.2015, 13:29
 
Ответить
Сообщениерекурсивный алгоритм.
перебор дерева состава.
имхо, сильно зависит от реальных данных.
откуда я знаю - может, в реале уровень вложенности узлов в разы или десятки раз больше?

кстати, по коду непонятно - зачем там каждый раз в процедуру передается ссылка на словарь?
конечно, это не создание локальной копии объекта, но и ссылку передать - тоже время надо, да и стек вызовов быстрее переполнится.
я бы сделал этот объект глобальным - как массив rez()
но, скорее всего, основную часть времени занимает, действительно, поиск на листе и, возможно, многократная обработка одних и тех же узлов.
это надо проверять - собирать статистику, искать узкое место, отнимающее основную часть времени и т.п.

без реального файла - оптимизировать почти нечего. имхо.
и еще одно имхо: думаю, что такая работа - хорошая кандидатура для одноименной ветки форума.

"протянуть" ?.. дерево?.. без комментариев.

Автор - ikki
Дата добавления - 21.07.2015 в 13:25
SLAVICK Дата: Вторник, 21.07.2015, 13:32 | Сообщение № 7
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
ткуда я знаю - может, в реале уровень вложенности узлов в разы или десятки раз больше?

ikki, на сколько я понял - это продолжение темы
Там действительно вложенность может быть бОльшой. :D


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 21.07.2015, 13:33
 
Ответить
Сообщение
ткуда я знаю - может, в реале уровень вложенности узлов в разы или десятки раз больше?

ikki, на сколько я понял - это продолжение темы
Там действительно вложенность может быть бОльшой. :D

Автор - SLAVICK
Дата добавления - 21.07.2015 в 13:32
ikki Дата: Вторник, 21.07.2015, 13:35 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
там еще отдельный вопрос по алгоритму - а так ли уж нужна рекурсия?


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениетам еще отдельный вопрос по алгоритму - а так ли уж нужна рекурсия?

Автор - ikki
Дата добавления - 21.07.2015 в 13:35
ZamoK Дата: Вторник, 21.07.2015, 13:37 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Логика работы:
С листа "Перечень" В3-В60 номера изделий, которые нужно разузловать подетально, ссумировать повторяищеся входящие в состав детали. Результат в виде списка на лист "Итог".
Подробно:
1) Берём номер из ячейки В3 лист "Перечень"
2) Ищем соответствие на листе "Состав узлов" в столбце А, копирует перечисленный состав из столбцов CDE до первой пустой ячейки на лист "Итог".
3) Затем находим из вновь добавленных позиций номера начинающиеся на 3 и 6 (это узлы и их нужно разобрать по деталям)
4) Берём найденый номер на 3(6) далее пункт 2,3,4 пока не закончатся в добавленных позициях номера на 3 и 6.
4.1) Если номера на листе "Состав узлов" в столбце А нет, то выдаём сообщение ... при нажатии ОК продолжаем 2,3,4
5) Затем следующая ячейка с листа "Перечень" - В4, и повторяются п.2,3,4,5 до пустой ячейки.

Количество деталей соответственно ссумируется при повторении и умножается на требуемое кол-во "Перечень" - $D

Вложенность узлов может достигать до 12 уровней
Деталей в одном узле около 30-35


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Вторник, 21.07.2015, 16:31
 
Ответить
СообщениеЛогика работы:
С листа "Перечень" В3-В60 номера изделий, которые нужно разузловать подетально, ссумировать повторяищеся входящие в состав детали. Результат в виде списка на лист "Итог".
Подробно:
1) Берём номер из ячейки В3 лист "Перечень"
2) Ищем соответствие на листе "Состав узлов" в столбце А, копирует перечисленный состав из столбцов CDE до первой пустой ячейки на лист "Итог".
3) Затем находим из вновь добавленных позиций номера начинающиеся на 3 и 6 (это узлы и их нужно разобрать по деталям)
4) Берём найденый номер на 3(6) далее пункт 2,3,4 пока не закончатся в добавленных позициях номера на 3 и 6.
4.1) Если номера на листе "Состав узлов" в столбце А нет, то выдаём сообщение ... при нажатии ОК продолжаем 2,3,4
5) Затем следующая ячейка с листа "Перечень" - В4, и повторяются п.2,3,4,5 до пустой ячейки.

Количество деталей соответственно ссумируется при повторении и умножается на требуемое кол-во "Перечень" - $D

Вложенность узлов может достигать до 12 уровней
Деталей в одном узле около 30-35

Автор - ZamoK
Дата добавления - 21.07.2015 в 13:37
ZamoK Дата: Вторник, 21.07.2015, 13:43 | Сообщение № 10
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
ikki, на сколько я понял - это продолжение темы

Ну да и Ярослав можно сказать родитель этого документа, а образец - это самый правильно работающий файл.


Я не Гуру, но стремлюсь!
 
Ответить
Сообщение
ikki, на сколько я понял - это продолжение темы

Ну да и Ярослав можно сказать родитель этого документа, а образец - это самый правильно работающий файл.

Автор - ZamoK
Дата добавления - 21.07.2015 в 13:43
ZamoK Дата: Вторник, 21.07.2015, 13:46 | Сообщение № 11
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Вот: так должно быть быстрее,


Чет ошибка тут: [vba]
Код
Set r = Sheets("Состав узлов").Cells(ro, 1)
[/vba]
К сообщению приложен файл: 5502477-1-.xlsm (96.4 Kb)


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Вторник, 21.07.2015, 13:50
 
Ответить
Сообщение
Вот: так должно быть быстрее,


Чет ошибка тут: [vba]
Код
Set r = Sheets("Состав узлов").Cells(ro, 1)
[/vba]

Автор - ZamoK
Дата добавления - 21.07.2015 в 13:46
ikki Дата: Вторник, 21.07.2015, 13:50 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
ZamoK, порядок деталей в итоговом списке важен или нет?


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
СообщениеZamoK, порядок деталей в итоговом списке важен или нет?

Автор - ikki
Дата добавления - 21.07.2015 в 13:50
ZamoK Дата: Вторник, 21.07.2015, 13:53 | Сообщение № 13
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
порядок деталей в итоговом списке важен или нет?

Если возможно, то столбец B по алфавиту (я его вруную поле 15 мин ожидания )


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Вторник, 21.07.2015, 13:54
 
Ответить
Сообщение
порядок деталей в итоговом списке важен или нет?

Если возможно, то столбец B по алфавиту (я его вруную поле 15 мин ожидания )

Автор - ZamoK
Дата добавления - 21.07.2015 в 13:53
SLAVICK Дата: Вторник, 21.07.2015, 14:02 | Сообщение № 14
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Чет ошибка тут:

Вас не смущает ?:
[vba]
Код
t =  "301314.413-02"
[/vba]

Где он на листе "Состав узлов" ? :o


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
Чет ошибка тут:

Вас не смущает ?:
[vba]
Код
t =  "301314.413-02"
[/vba]

Где он на листе "Состав узлов" ? :o

Автор - SLAVICK
Дата добавления - 21.07.2015 в 14:02
ZamoK Дата: Вторник, 21.07.2015, 14:10 | Сообщение № 15
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Вас не смущает ?:
t =  "301314.413-02"

Ну вообще-то именно для этого случая в коде [vba]
Код
If r Is Nothing Then MsgBox "Не разузлован: " & t, 48, "ВНИМАНИЕ": Exit Sub
[/vba]
т.е появляется сообщение с этим номером - жму ОК и процесс продолжается . Как-то так :)


Я не Гуру, но стремлюсь!
 
Ответить
Сообщение
Вас не смущает ?:
t =  "301314.413-02"

Ну вообще-то именно для этого случая в коде [vba]
Код
If r Is Nothing Then MsgBox "Не разузлован: " & t, 48, "ВНИМАНИЕ": Exit Sub
[/vba]
т.е появляется сообщение с этим номером - жму ОК и процесс продолжается . Как-то так :)

Автор - ZamoK
Дата добавления - 21.07.2015 в 14:10
SLAVICK Дата: Вторник, 21.07.2015, 14:18 | Сообщение № 16
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Ну тогда вот:
К сообщению приложен файл: 0623162.xlsm (96.8 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеНу тогда вот:

Автор - SLAVICK
Дата добавления - 21.07.2015 в 14:18
ZamoK Дата: Вторник, 21.07.2015, 15:00 | Сообщение № 17
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Работает как молния hands можно ли как-то сразу на листе "Итог" сортировку прикрутить по столбцу В


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеРаботает как молния hands можно ли как-то сразу на листе "Итог" сортировку прикрутить по столбцу В

Автор - ZamoK
Дата добавления - 21.07.2015 в 15:00
SLAVICK Дата: Вторник, 21.07.2015, 15:16 | Сообщение № 18
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Вот:
[vba]
Код
With Worksheets("Итог")
         With .Range("A3:D3")
            .CurrentRegion.Offset(2).ClearContents
            .Resize(n).Value = rez()
            .Parent.Activate
         End With
     With ActiveWorkbook.Worksheets("Итог").Sort
         .SortFields.Clear
         .SortFields.Add Key:=Range("B3:B" & n), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
         .SetRange Range("b2:D" & n)
         .Header = xlYes
         .MatchCase = False
         .Orientation = xlTopToBottom
         .SortMethod = xlPinYin
         .Apply
     End With
End With
[/vba]
К сообщению приложен файл: 0623162-2-.xlsm (98.5 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеВот:
[vba]
Код
With Worksheets("Итог")
         With .Range("A3:D3")
            .CurrentRegion.Offset(2).ClearContents
            .Resize(n).Value = rez()
            .Parent.Activate
         End With
     With ActiveWorkbook.Worksheets("Итог").Sort
         .SortFields.Clear
         .SortFields.Add Key:=Range("B3:B" & n), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
         .SetRange Range("b2:D" & n)
         .Header = xlYes
         .MatchCase = False
         .Orientation = xlTopToBottom
         .SortMethod = xlPinYin
         .Apply
     End With
End With
[/vba]

Автор - SLAVICK
Дата добавления - 21.07.2015 в 15:16
miver Дата: Вторник, 21.07.2015, 15:32 | Сообщение № 19
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 37 ±
Замечаний: 0% ±

Excel 2010
Добавлю пример без рекурсии
К сообщению приложен файл: Obraz_m.zip (70.0 Kb)
 
Ответить
СообщениеДобавлю пример без рекурсии

Автор - miver
Дата добавления - 21.07.2015 в 15:32
ZamoK Дата: Вторник, 21.07.2015, 15:52 | Сообщение № 20
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Все отлично, красиво. Спасибо!


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеВсе отлично, красиво. Спасибо!

Автор - ZamoK
Дата добавления - 21.07.2015 в 15:52
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!