Добрый день! У меня есть основная таблица "Реестр Претензионного отдела", которая ежедневно должна забирать данные из таблицы "Материалы". Необходимо найти по номеру обращения и типу помещения (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
Пока ищете возможность передать файлы, подкину варианты оптимизации. Вместо этого
Код
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)
Елена Дроздова написал: Я написала макрос, но пока не запускала его из-за того, что он точно будет слишком долго считать
Может, Вам стоит подумать о том, как объяснить задачу и что должен делать макрос, а не выкладывать набор строк, в которых кто-нибудь должен разбираться?
Цитата
Елена Дроздова написал: Подгрузка данных из одной одной большой таблицы в другую с предварительной обработкой
Что и откуда подгружать и что должно получиться в результате "предварительной обработки"?
Цитата
Елена Дроздова написал: Т.к. материалов по одному идентификатору может быть несколько
написал: объяснить задачу и что должен делать макрос
Описание задачи ниже:
Цитата
написал: Найти в реестре позиции со статусом "Ожидание ТМЦ" в столбце I, определить по ним Тип помещения (D) + №п/п(A) (идентификатор для файла с материалами (M)), затем по этому идентификатору найти в таблице материалов статус необходимых материалов (K). Т.к. материалов по одному идентификатору может быть несколько, а статусы у них могут быть разные, необходимо выбрать худший и именно его подтянуть в реестр в столбец O
Цитата
написал: владельцу Вашей фирмы есть о чем подумать
Это точно не мое дело) Мое дело - оптимизировать свою работу. Могу попытаться объяснить суть подробнее: Таблица "Реестр Претензионного отдела" содержит перечень замечаний, которые необходимо устранить. Таблица "Материалы" содержит перечень материалов, которые требуется закупить для устранения. Для устранения одного замечания может потребоваться несколько материалов. Каждый материал может быть закуплен разными способами, в разное время, находиться в разном статусе. Если для устранения замечания А требуются материалы Б, В и Г, закупка которых находится в статусах "Заказать", "К оплате" и "Доставлено" соответственно, то и замечанию А необходимо присвоить худший из этих статусов, то есть "Заказать". Чтобы связать две таблицы, я использую порядковый номер замечания и тип помещения, к которому оно относится. Зачем нужен тип - затем, чтобы связать таблицу материалов с еще одним реестром со своими порядковыми номерами, где другие типы помещений.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Елена Дроздова, рисунок посмотрел, а какое отношение от имеет к ранее выложенным файлам? повторюсь: с такими пояснениями, видимо, решать вам это все самостоятельно
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
я ГОРАЗДО больше удовлетворения получаю от решения задач а не от пустой перески такие переписки меня огорчают вместо того чтобы прочитать задачу, решить ее и получить положительную эмоцию я испытываю разочарование от бесполезной переписки, когда очевидно что переписка ведет не к выяснению деталей задачи и пониманию ее в конечном итоге, а в противоположную сторону видимо, ничего интересного в этой теме я больше не прочитаю((
Ігор Гончаренко, а Вы попытайтесь представить, как себя чувствует человек, которому нужна помощь, который пытается объяснить, что ему нужно, но его не понимают. Если бы Вы задали конкретные вопросы, которые помогли бы сдвинуть дело в мертвой точки, я бы с радостью на них ответила. А пока я могу только переформулировывать одно и то же, что к результату не приводит.