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

Вход

Регистрация

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

 

= Мир MS Excel/Зависает цикл по небольшому словарю - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Зависает цикл по небольшому словарю
Unforcer Дата: Среда, 02.08.2023, 14:44 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Всем добрый день. Помогите, пожалуйста, разобраться. Есть макрос, который ищет связанные детали по их идентификатору (1 столбец) через идентификатор соединения (2 столбец). На начальном этапе создается словарь, где ключ это идентификатор соединения (2 столбец), а значение строка с идентификаторами деталей, которые имеют это соединение. В качестве значений пробовал использовать массивы, но с ними вообще провал (упираюсь в память). Далее через двойной цикл по этому словарю происходит поиск всех деталей, которые связаны между собой. В словаре 4000 записей. Максимальное кол-во итераций чуть меньше 4000*4000, но за 3 часа на более менее шустрой машине макрос не завершает работу. Пример файла прилагаю. Буду признателен за конструктивную помощь.
К сообщению приложен файл: 4748454.xlsm (229.7 Kb)
 
Ответить
СообщениеВсем добрый день. Помогите, пожалуйста, разобраться. Есть макрос, который ищет связанные детали по их идентификатору (1 столбец) через идентификатор соединения (2 столбец). На начальном этапе создается словарь, где ключ это идентификатор соединения (2 столбец), а значение строка с идентификаторами деталей, которые имеют это соединение. В качестве значений пробовал использовать массивы, но с ними вообще провал (упираюсь в память). Далее через двойной цикл по этому словарю происходит поиск всех деталей, которые связаны между собой. В словаре 4000 записей. Максимальное кол-во итераций чуть меньше 4000*4000, но за 3 часа на более менее шустрой машине макрос не завершает работу. Пример файла прилагаю. Буду признателен за конструктивную помощь.

Автор - Unforcer
Дата добавления - 02.08.2023 в 14:44
Pelena Дата: Среда, 02.08.2023, 15:17 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 19404
Репутация: 4555 ±
Замечаний: ±

Excel 365 & Mac Excel
Здравствуйте.
Настоятельно рекомендую в словарь писать не ячейки целиком, а .Value.
И второе: этот оператор GoTo next_loop зацикливает макрос. Объясните словами на одном примере, что надо сделать


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЗдравствуйте.
Настоятельно рекомендую в словарь писать не ячейки целиком, а .Value.
И второе: этот оператор GoTo next_loop зацикливает макрос. Объясните словами на одном примере, что надо сделать

Автор - Pelena
Дата добавления - 02.08.2023 в 15:17
Unforcer Дата: Среда, 02.08.2023, 15:31 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Pelena, смысл макроса в следующем: допустим две детали А и Б имеют общий идентификатор соединения - это значит что они соединены между собой с одной стороны. С другой стороны есть идентификатор соединения, которые показывает что деталь А соединена с деталью В. В свою очередь деталь В соединена с деталью Г. Результатом работы макроса должен быть словарь, где его значения полноценная цепочка деталей, в случае примера, который я привел - А;Б;В;Г. Таких деталей в таблице тысячи и нужно найти соединенные между собой.
Оператор GoTo next_loop зацикливает макрос только тогда, когда была обнаружена связка. Как только связок больше не будет обнаружено flag= False не позволит зациклить макрос.
 
Ответить
СообщениеPelena, смысл макроса в следующем: допустим две детали А и Б имеют общий идентификатор соединения - это значит что они соединены между собой с одной стороны. С другой стороны есть идентификатор соединения, которые показывает что деталь А соединена с деталью В. В свою очередь деталь В соединена с деталью Г. Результатом работы макроса должен быть словарь, где его значения полноценная цепочка деталей, в случае примера, который я привел - А;Б;В;Г. Таких деталей в таблице тысячи и нужно найти соединенные между собой.
Оператор GoTo next_loop зацикливает макрос только тогда, когда была обнаружена связка. Как только связок больше не будет обнаружено flag= False не позволит зациклить макрос.

Автор - Unforcer
Дата добавления - 02.08.2023 в 15:31
Unforcer Дата: Среда, 02.08.2023, 15:39 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Pelena, я уже создавал тему с вопросом как найти связанные элементы http://www.excelworld.ru/forum/10-51990-1
 
Ответить
СообщениеPelena, я уже создавал тему с вопросом как найти связанные элементы http://www.excelworld.ru/forum/10-51990-1

Автор - Unforcer
Дата добавления - 02.08.2023 в 15:39
Pelena Дата: Среда, 02.08.2023, 15:49 | Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 19404
Репутация: 4555 ±
Замечаний: ±

Excel 365 & Mac Excel
две детали А и Б имеют общий идентификатор соединения

деталь А соединена с деталью В

это откуда видно. Смотрим, чтобы были одинаковые последние части после - (71B824614504)? На другие не смотрим?


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
две детали А и Б имеют общий идентификатор соединения

деталь А соединена с деталью В

это откуда видно. Смотрим, чтобы были одинаковые последние части после - (71B824614504)? На другие не смотрим?

Автор - Pelena
Дата добавления - 02.08.2023 в 15:49
Unforcer Дата: Среда, 02.08.2023, 16:01 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

это откуда видно. Смотрим, чтобы были одинаковые последние части после - (71B824614504)? На другие не смотрим?

Ну смотрите, у первой пары деталей общий идентификатор соединения {00013887-0000-0000-8204-71B824614504}. Используем этот идентификатор как ключ для создания первой пары деталей (в примере выделено желтым). И так создаем на первом этапе словарь с соединенными деталями. А далее начинаем искать циклом в цикле совпадения по идентификаторам деталей - если какая-то деталь уже была в каком-то соединении, то всю связку добавляем к той связке где деталь присутствовала, удаляем из словаря связку которую скопировали, чтобы больше ее не проверять.
 
Ответить
Сообщение
это откуда видно. Смотрим, чтобы были одинаковые последние части после - (71B824614504)? На другие не смотрим?

Ну смотрите, у первой пары деталей общий идентификатор соединения {00013887-0000-0000-8204-71B824614504}. Используем этот идентификатор как ключ для создания первой пары деталей (в примере выделено желтым). И так создаем на первом этапе словарь с соединенными деталями. А далее начинаем искать циклом в цикле совпадения по идентификаторам деталей - если какая-то деталь уже была в каком-то соединении, то всю связку добавляем к той связке где деталь присутствовала, удаляем из словаря связку которую скопировали, чтобы больше ее не проверять.

Автор - Unforcer
Дата добавления - 02.08.2023 в 16:01
  • Страница 1 из 1
  • 1
Поиск:

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