Страницы: 1
RSS
Макрос сбор первого и последнего значения по дате
 
Добрый день, помогите с макросом.

Есть выгрузки данных по датам, нужен макрос который сможет собирать значения первой строки по дате столбца B и последней строки по дате столбца D и вставлять эти данные в столбцы F и G, последней строки текущей даты.

Прикрепляю, подробный пример с исходным и готовым файлом.

Спасибо!
 
А просто сводная не пойдет
 
Evgeny772, добрый день. Может сводная подойдет? Только даты нужно привести в формат дат, а не текста.
 
Ну если очень нужно макросом
Код
Sub Макрос1()
    arr_b = Range("A2:D" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    Set sd = CreateObject("Scripting.Dictionary")
    For n = 1 To UBound(arr_b)
        If Not sd.Exists(CDate(arr_b(n, 1))) Then Set sd(CDate(arr_b(n, 1))) = CreateObject("Scripting.Dictionary"): m = m + 1
        If Not sd(CDate(arr_b(n, 1))).Exists("min") Then
            sd(CDate(arr_b(n, 1))).Add "min", CDate(arr_b(n, 2))
        Else
            If CDate(sd(CDate(arr_b(n, 1)))("min")) > CDate(arr_b(n, 2)) Then
                sd(CDate(arr_b(n, 1)))("min") = CDate(arr_b(n, 2))
            End If
        End If
        If Not sd(CDate(arr_b(n, 1))).Exists("max") Then
            sd(CDate(arr_b(n, 1))).Add "max", arr_b(n, 3) & " " & CDate(arr_b(n, 4))
        Else
            If CDate(sd(CDate(arr_b(n, 1)))("max")) < arr_b(n, 3) & " " & CDate(arr_b(n, 4)) Then
                sd(CDate(arr_b(n, 1)))("max") = arr_b(n, 3) & " " & CDate(arr_b(n, 4))
            End If
        End If
    Next
    ReDim arr_rez(1 To m, 1 To 4)
    n = 1
    For Each y In sd
        arr_rez(n, 1) = y
        arr_rez(n, 2) = Format(sd(y)("min"), "HH:mm:ss")
        arr_rez(n, 3) = CDate(Split(sd(y)("max"), " ")(0))
        arr_rez(n, 4) = Format(sd(y)("max"), "HH:mm:ss")
        n = n + 1
    Next
    [g2].Resize(UBound(arr_rez), 4) = arr_rez
End Sub

ps: Сразу не обратил внимания, что может начинаться одним днем, а заканчиваться другим. Поэтому примеры со сводной тоже не совсем корректны, хотя в них результат как на листе "Готовый пример"
Изменено: Msi2102 - 17.02.2026 10:39:56 (отредактировал макрос)
 
Msi2102, Огромное, спасибо!

Если не затруднит можно версию, в случаях когда период заканчивается следующим днем, что бы была последняя цифра этого дня? например 23:59:59 или 23:00:01 не важно, главное в пределах этих суток
 
Не совсем понял, что именно вы хотите. Разбить даты? Например: начало 11.02.2026 13:06:03, конец 12.02.2026 12:42:49, чтобы разбились на две
начало 11.02.2026 13:06:03, конец 11.02.2026 23:59:59 и следующая начало 12.02.2026 00:00:00, конец 12.02.2026 12:42:49, тогда будет начало следующего дня начинаться не с 12.02.2026 13:37:25, а с 12.02.2026 00:00:00, или нужна последняя дата которая есть в таблице.
Могу ещё посоветовать разбить эти даты в начальной таблице

Немного отредактировал сводную, там видны эти даты
 
Msi2102, Еще раз спасибо! Ладно) с такими днями думаю вручную разберусь
 
Цитата
Evgeny772 написал:
с такими днями думаю вручную разберусь
Посмотрите файл, так должно быть?
 
Msi2102, Тут мы уже куда то не туда ушли.

Имелось ввиду если 12.02 последний период закрылся после 00:00:00, то взять последнее встречающееся значение в столбце конец периода до 00:00:00, в данном случае 18:45:22

Вообще это делается для того что бы считать сколько часов длилась смена единицы техники, от момент первого запуска "утром" до момента заглушения "вечером" или ночью, в дальнейшем я просто делаю формулу Последний запуск - Первый запуск = Кол-во часов смена.

Но вот с такими днями когда работа перевалила за 00:00:00, по такой формуле не посчитать, поэтому считаю вручную  
 
Я так и не понял, что именно Вы хотите посчитать, количество часов в сутки или количество часов в смену, тогда начало и конец смены, вначале просили просто начало и конец. Если нужно посчитать количество часов, то что делать с переходящим временем, разбивать или целиком в предыдущие сутки включать.
Если нужно только время
Цитата
Evgeny772 написал:
Имелось ввиду если 12.02 последний период закрылся после 00:00:00, то взять последнее встречающееся значение в столбце конец периода до 00:00:00, в данном случае 18:45:22
то как быть если будет всего одно включение которое переходит с одного дня на другой, по вашему рассуждению он не будет учитываться, например 13.02.2026 14:49:33, закончится не в 13.02.206 20:06:33 а 14.02.206 20:06:33
 
Msi2102, Вообще я считаю количество часов в смене, от первого начала периода, до последнего конца периода, второе минус первое, написал я это просто для понимания общей картины.

Как быть?
Наверное с такими сменами где переходящие в след сутки мне проще вручную разбираться), как я раньше и делал! В целом Вы мне и так очень сильно помогли в рамках моего вопроса, Есть еще небольшой вопрос по разбивке столбцов макросом, но это наверное по правилам лучше в отдельной теме...
Изменено: Evgeny772 - 17.02.2026 12:16:29
 
Цитата
написал:
Поэтому примеры со сводной тоже не совсем корректны,
Может сводную немного доработать для переходящих смен? Еще вариант
 
Цитата
Evgeny772 написал:
Вообще я считаю количество часов в смене, от первого начала периода, до последнего конца периода, второе минус первое, написал я это просто для понимания общей картины.
Может пригодится, Макрос2 считает общее количество без разбивки дат, Макрос3 считает количество часов с учетом перехода 00:00:00, остаток прибавляет к следующему дню. Во втором столбце общее количество секунд
Скрытый текст
Изменено: Msi2102 - 17.02.2026 17:47:28 (заменил файл, добавил немного расчетов)
 
Здравствуйте! Сделала как в примере и как поняла, в комментариях запуталась...
pq_v1

pq_v2
Ma_Ri ≠ Мария
 
Alex, рабочий вариант  :)  
 
Msi2102, Спасибо! +1 рабочий вариант!
 
Ma_Ri, Спасибо, тоже вполне рабочий способ!
 
Цитата
макрос который сможет
формулас
в файле)
Страницы: 1
Читают тему
Наверх