Страницы: 1
RSS
Разогнать макрос, Требуется подтянуть данные из одной таблицы в другую, таблицы имеют большое число строк (более 10 тысяч), обрабатываются долго
 
Добрый день!
У меня есть основная таблица "Реестр Претензионного отдела", которая ежедневно должна забирать данные из таблицы "Материалы". Необходимо найти по номеру обращения и типу помещения (opr) требующиеся материалы и определить статус их закупки. Общий статус обращения вычисляется по худшему из статусов по материалам. Я написала макрос, но пока не запускала его из-за того, что он точно будет слишком долго считать, поэтому могут быть ошибки)
Помогите, пожалуйста, решить мою задачу максимально быстрым макросом! Код прилагаю.
Код
Sub ПодгрузитьЗаявки()
    lastrow1 = Workbooks("Реестр Претензионного отдела.xlsm").Sheets("РЕЕСТР").ListObject("Реестр").Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
    Workbooks.Open ("C:\Users\Мария\OneDrive\Работа\Материалы.xlsm")
    For i = 2 To lastrow1
        If Workbooks("Реестр Претензионного отдела.xlsm").Sheets("РЕЕСТР").ListObject("Потребность").Cells(i, 9) = "Ожидание ТМЦ" Then
            opr = Workbooks("Реестр Претензионного отдела.xlsm").Sheets("РЕЕСТР").ListObject("Реестр").Cells(i, 4).Value + Workbooks("Реестр Претензионного отдела.xlsm").Sheets("РЕЕСТР").ListObject("Реестр").Cells(i, 1).Value
            stat_m = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Range.Find(opr)
            j = stat_m.Row
            status = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Cells(j, 11)
            Select Case status
                Case status = "Доставлено"
                    stat = "Доставлено"
                    stat_m = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Range.FindNext(stat_m)
                Case status = "Оплачено"
                    stat = "Оплачено"
                    stat_m = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Range.FindNext(stat_m)
                Case status = "В оплате"
                    stat = "в оплате"
                    stat_m = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Range.FindNext(stat_m)
                Case status = "К оплате"
                    stat = "К оплате"
                    stat_m = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Range.FindNext(stat_m)
                Case status = "Заказано"
                    stat = "Заказано"
                    stat_m = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Range.FindNext(stat_m)
                Case status = "На обработке в снабжении"
                    stat = "На обработке в снабжении"
                    stat_m = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Range.FindNext(stat_m)
                Case status = "Передано в снабжение"
                    stat = "Передано в снабжение"
                    stat_m = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Range.FindNext(stat_m)
                Case status = "Заказать"
                    stat = "Заказать"
                    stat_m = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Range.FindNext(stat_m)
            End Select
            Workbooks("Реестр Претензионного отдела.xlsm").Sheets("РЕЕСТР").ListObject("Реестр").Cells(i, 15) = stat
        End If
    Next i
End Sub
Изменено: Елена Дроздова - 07.06.2022 14:32:14
 
нужен файл с данными и описание задачи
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Имеющиеся файлы не могу приложить, т.к. они много весят
 
типичный замкнутый круг(((
нет файла, нет макроса
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Пока ищете возможность передать файлы, подкину варианты оптимизации.
Вместо этого
Код
 For i = 2 To lastrow1
        opr = Workbooks("Реестр Претензионного отдела.xlsm").Sheets("РЕЕСТР").ListObject("Реестр").Cells(i, 4).Value + Workbooks("Реестр Претензионного отдела.xlsm").Sheets("РЕЕСТР").ListObject("Реестр").Cells(i, 1).Value
Можно использовать это
Код
    Dim areestr As Variant
    areestr = Workbooks("Реестр Претензионного отдела.xlsm").Sheets("РЕЕСТР").ListObject("Реестр").Range
    For i = 2 To lastrow1
        opr = areestr(i, 4) + areestr(i, 1)
 
Вот, обрезала файлы
 
Задача:
Найти в реестре позиции со статусом "Ожидание ТМЦ" в столбце I, определить по ним Тип помещения (D) + №п/п(A) (идентификатор для файла с материалами (M)), затем по этому идентификатору найти в таблице материалов статус необходимых материалов (K). Т.к. материалов по одному идентификатору может быть несколько, а статусы у них могут быть разные, необходимо выбрать худший и именно его подтянуть в реестр в столбец O
 
Елена Дроздова,  Вы написали макрос, который не запускали и получается не проверяли, но убеждены что будет работать долго , при этом просите оптимизировать его нас вслепую .  

Это не оптимизация, а просто вопрос зачем все эти селекты
Код
Select Case status
            Case status = "Доставлено"
                stat = "Доставлено"
                stat_m = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Range.FindNext(stat_m)



вся грядка заменяется двумя строками.
Код
stat =status
stat_m = Workbooks("Материалы.xlsm").Sheets("Потребность").ListObject("Потребность").Range.FindNext(stat_m)
По вопросам из тем форума, личку не читаю.
 
Цитата
написал:
убеждены что будет работать долго
Убеждена, т.к. файлы очень тяжелые.
"Грядка" нужна для определения худшего из статусов
 
Никто не поможет? :cry:  
 
С названием темы беда. Елена Дроздова,  предложите новое, из которого будет понятна задача - модераторы поменяют.
 
Подгрузка данных из одной одной большой таблицы в другую с предварительной обработкой
 
Цитата
Елена Дроздова написал:
Я написала макрос, но пока не запускала его из-за того, что он точно будет слишком долго считать
Может, Вам стоит подумать о том, как объяснить задачу и что должен делать макрос, а не выкладывать набор строк, в которых кто-нибудь должен разбираться?
Цитата
Елена Дроздова написал:
Подгрузка данных из одной одной большой таблицы в другую с предварительной обработкой
Что и откуда подгружать и что должно получиться в результате "предварительной обработки"?
Цитата
Елена Дроздова написал:
Т.к. материалов по одному идентификатору может быть несколько
владельцу Вашей фирмы есть о чем подумать :)
 
Цитата
написал:
объяснить задачу и что должен делать макрос
Описание задачи ниже:
Цитата
написал:
Найти в реестре позиции со статусом "Ожидание ТМЦ" в столбце I, определить по ним Тип помещения (D) + №п/п(A) (идентификатор для файла с материалами (M)), затем по этому идентификатору найти в таблице материалов статус необходимых материалов (K). Т.к. материалов по одному идентификатору может быть несколько, а статусы у них могут быть разные, необходимо выбрать худший и именно его подтянуть в реестр в столбец O
Цитата
написал:
владельцу Вашей фирмы есть о чем подумать
Это точно не мое дело) Мое дело - оптимизировать свою работу.
Могу попытаться объяснить суть подробнее:
Таблица "Реестр Претензионного отдела" содержит перечень замечаний, которые необходимо устранить. Таблица "Материалы" содержит перечень материалов, которые требуется закупить для устранения. Для устранения одного замечания может потребоваться несколько материалов. Каждый материал может быть закуплен разными способами, в разное время, находиться в разном статусе. Если для устранения замечания А требуются материалы Б, В и Г, закупка которых находится в статусах "Заказать", "К оплате" и "Доставлено" соответственно, то и замечанию А необходимо присвоить худший из этих статусов, то есть "Заказать".
Чтобы связать две таблицы, я использую порядковый номер замечания и тип помещения, к которому оно относится. Зачем нужен тип - затем, чтобы связать таблицу материалов с еще одним реестром со своими порядковыми номерами, где другие типы помещений.
 
пишите все раками
вашу задачу (с вашими пояснениями) решить не возможно
удачи!
да уж))) написал, так написал
Изменено: Ігор Гончаренко - 09.06.2022 09:59:59
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
пишите все раками
Оговорка по Фрейду  :D
Изменено: Msi2102 - 09.06.2022 09:56:46
 
Цитата
написал:
вашу задачу (с вашими пояснениями) решить не возможно
Я не знаю, как еще сформулировать. Мне проще нарисовать на бумаге
 
Может, так будет понятнее...
Изменено: Елена Дроздова - 09.06.2022 12:03:07
 
Замечательный рисунок! ))
 
Елена Дроздова, есть ещё платная ветка — там выше вероятность, что помогут в вашем случае  ;)
Не претендую…

Юрий М  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Елена Дроздова,
рисунок посмотрел, а какое отношение от имеет к ранее выложенным файлам?
повторюсь: с такими пояснениями, видимо, решать вам это все самостоятельно
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
какое отношение от имеет к ранее выложенным файлам?
На рисунке максимально примитивно отобразила краткое содержание того, что должно быть в файлах, не перерисовывая таблицы полностью
Цитата
написал:
с такими пояснениями
Что не так в моих пояснениях?(((
 
все
(не так)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, Вы могли бы конкретизировать? Создается впечатление, что Вы просто смеетесь надо мной.
 
я ГОРАЗДО больше удовлетворения получаю от решения задач а не от пустой перески
такие переписки меня огорчают
вместо того чтобы прочитать задачу, решить ее и получить положительную эмоцию я испытываю разочарование от бесполезной переписки, когда очевидно что переписка ведет не к выяснению деталей задачи и пониманию ее в конечном итоге, а в противоположную сторону
видимо, ничего интересного в этой теме я больше не прочитаю((
Изменено: Ігор Гончаренко - 09.06.2022 14:13:12
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, а Вы попытайтесь представить, как себя чувствует человек, которому нужна помощь, который пытается объяснить, что ему нужно, но его не понимают. Если бы Вы задали конкретные вопросы, которые помогли бы сдвинуть дело в мертвой точки, я бы с радостью на них ответила. А пока я могу только переформулировывать одно и то же, что к результату не приводит.
Изменено: Елена Дроздова - 09.06.2022 14:20:04
Страницы: 1
Наверх