Заказ--------------------------------------------------------------------Период----------------Статус Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 12.09.2018 15:06 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 12.09.2018 15:11 На согласовании Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 13.09.2018 15:32 Согласован Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 14.09.2018 12:50 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 14.09.2018 12:51 Отменен Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 15.09.2018 12:56 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 15.09.2018 13:01 На согласовании Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 16.09.2018 13:45 Согласован
Результат.
Заказ уникальный-----------------------------------------------------Дата отправки на согласования--------Дата согласования Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 15.09.2018 13:0116.09.2018 13:45
То есть находит "дату отправки на согласования" и "дату согласования" последнюю в ряде событий.
[vba]
Код
Sub dс() Dim dic As Object Dim ShtK As Worksheet
Application.ScreenUpdating = False 'отключаем обновление экрана Application.Calculation = xlCalculationManual 'отключаем автоматический пересчёт формул после каждого действия с листом Application.EnableEvents = False 'отключаем отслеживание событий
Set ShtK = Workbooks("Согласование заказа в 1С.xlsm").Worksheets("TDSheet") ShtK.Range("F2:I100000").ClearContents 'очищаем поля перед вставкой новых значений
Set dic = CreateObject("Scripting.Dictionary")
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 3).Value = "На согласовании" Or Cells(i, 3).Value = "Отклонен" Or Cells(i, 3).Value = "Ошибка обмена" Or Cells(i, 3).Value = "Ожидание синхронизации" Or Cells(i, 3).Value = "Отменен" Then ky = Cells(i, 2).Value it = Cells(i, 1).Value & "|" & Cells(i, 3).Value If dic.exists(ky) Then dic.Item(ky) = it Else dic.Add ky, it End If Next On Error Resume Next For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 3).Value = "Согласован" Or Cells(i, 3).Value = "Не требует согласования" Then ky = Cells(i, 2).Value s = Split(dic.Item(ky), "|") dic.Item(ky) = s(LBound(s)) & "|" & Cells(i, 1).Value End If Next i = 2 For Each ky In dic.keys s = Split(dic.Item(ky), "|") Range("G" & i) = ky Range("H" & i) = s(LBound(s)) Range("I" & i) = s(UBound(s)) Range("F" & i) = Mid(ky, 18, 16) i = i + 1 Next
Application.ScreenUpdating = True 'включаем обновление экрана Application.Calculation = xlCalculationAutomatic 'включаем автоматический пересчёт формул после каждого действия с листом Application.EnableEvents = True 'включаем отслеживание событий
End Sub
[/vba]
Помогите преобразовать код, что бы результатом было первое событие, то есть первая дата отправки на согласование и первая дата согласования.
Входящие данные:
Заказ--------------------------------------------------------------------Период----------------Статус Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 12.09.2018 15:06 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 12.09.2018 15:11 На согласовании Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 13.09.2018 15:32 Согласован Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 14.09.2018 12:50 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 14.09.2018 12:51 Отменен Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 15.09.2018 12:56 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 15.09.2018 13:01 На согласовании Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 16.09.2018 13:45 Согласован
Результат:
Заказ уникальный-----------------------------------------------------Дата отправки на согласования--------Дата согласования Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 12.09.2018 15:1113.09.2018 15:32
Ещё один небольшой комментарий, при работе с большим объёмом данных больше 300 000 строк макрос подвисает. Возможно есть какой то лучше способ чем использовать On Error Resume Next
Заранее спасибо
Добрый день, Друзья
Макрос ниже даёт следующий результат:
Входящие данные:
Заказ--------------------------------------------------------------------Период----------------Статус Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 12.09.2018 15:06 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 12.09.2018 15:11 На согласовании Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 13.09.2018 15:32 Согласован Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 14.09.2018 12:50 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 14.09.2018 12:51 Отменен Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 15.09.2018 12:56 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 15.09.2018 13:01 На согласовании Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 16.09.2018 13:45 Согласован
Результат.
Заказ уникальный-----------------------------------------------------Дата отправки на согласования--------Дата согласования Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 15.09.2018 13:0116.09.2018 13:45
То есть находит "дату отправки на согласования" и "дату согласования" последнюю в ряде событий.
[vba]
Код
Sub dс() Dim dic As Object Dim ShtK As Worksheet
Application.ScreenUpdating = False 'отключаем обновление экрана Application.Calculation = xlCalculationManual 'отключаем автоматический пересчёт формул после каждого действия с листом Application.EnableEvents = False 'отключаем отслеживание событий
Set ShtK = Workbooks("Согласование заказа в 1С.xlsm").Worksheets("TDSheet") ShtK.Range("F2:I100000").ClearContents 'очищаем поля перед вставкой новых значений
Set dic = CreateObject("Scripting.Dictionary")
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 3).Value = "На согласовании" Or Cells(i, 3).Value = "Отклонен" Or Cells(i, 3).Value = "Ошибка обмена" Or Cells(i, 3).Value = "Ожидание синхронизации" Or Cells(i, 3).Value = "Отменен" Then ky = Cells(i, 2).Value it = Cells(i, 1).Value & "|" & Cells(i, 3).Value If dic.exists(ky) Then dic.Item(ky) = it Else dic.Add ky, it End If Next On Error Resume Next For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 3).Value = "Согласован" Or Cells(i, 3).Value = "Не требует согласования" Then ky = Cells(i, 2).Value s = Split(dic.Item(ky), "|") dic.Item(ky) = s(LBound(s)) & "|" & Cells(i, 1).Value End If Next i = 2 For Each ky In dic.keys s = Split(dic.Item(ky), "|") Range("G" & i) = ky Range("H" & i) = s(LBound(s)) Range("I" & i) = s(UBound(s)) Range("F" & i) = Mid(ky, 18, 16) i = i + 1 Next
Application.ScreenUpdating = True 'включаем обновление экрана Application.Calculation = xlCalculationAutomatic 'включаем автоматический пересчёт формул после каждого действия с листом Application.EnableEvents = True 'включаем отслеживание событий
End Sub
[/vba]
Помогите преобразовать код, что бы результатом было первое событие, то есть первая дата отправки на согласование и первая дата согласования.
Входящие данные:
Заказ--------------------------------------------------------------------Период----------------Статус Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 12.09.2018 15:06 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 12.09.2018 15:11 На согласовании Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 13.09.2018 15:32 Согласован Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 14.09.2018 12:50 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 14.09.2018 12:51 Отменен Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 15.09.2018 12:56 Ожидание синхронизации Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 15.09.2018 13:01 На согласовании Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 16.09.2018 13:45 Согласован
Результат:
Заказ уникальный-----------------------------------------------------Дата отправки на согласования--------Дата согласования Заказ поставщику СА-ЦБ\ЗПС-037889 от 12.09.2018 15:06:15 12.09.2018 15:1113.09.2018 15:32
Ещё один небольшой комментарий, при работе с большим объёмом данных больше 300 000 строк макрос подвисает. Возможно есть какой то лучше способ чем использовать On Error Resume Next
sboy, у меня ограничения, по установке доп. ПО, компьютер рабочий. В принципе код работает и в результате даёт максимальное значение, но нужно из массива как то достать минимальные значения.
sboy, у меня ограничения, по установке доп. ПО, компьютер рабочий. В принципе код работает и в результате даёт максимальное значение, но нужно из массива как то достать минимальные значения.Mutarix
при работе с большим объёмом данных больше 300 000 строк макрос подвисает. Возможно есть какой то лучше способ чем использовать On Error Resume Next
- конечно. Не обращаться к ячейкам индивидуально. Вот например зачем на каждом шаге ШЕСТЬ раз лезете в ячейку Cells(i, 3)? Достаточно одного обращения, и не к ячейке, а к элементу массива данных.
при работе с большим объёмом данных больше 300 000 строк макрос подвисает. Возможно есть какой то лучше способ чем использовать On Error Resume Next
- конечно. Не обращаться к ячейкам индивидуально. Вот например зачем на каждом шаге ШЕСТЬ раз лезете в ячейку Cells(i, 3)? Достаточно одного обращения, и не к ячейке, а к элементу массива данных.Hugo