Страницы: 1
RSS
Если разрыв >24 часов, то нумерацию начать с единицы
 
Всем добрый день. Не могу сообразить как сделать такую вещь:
Имеется список номеров с датой и временем.

Нужно пронумировать их по группе "Номера" и по условию. Если от 1 номера у последующих номеров прошло менее 24 часов, то нумирация идет в обычном режиме 1, 2, 3, 4 и тд. Но если более 24 часов, первый же номер после этой отметки будет так же первым и последющие будут сравниваться уже с ним.
79999999999 18.09.2019 16:07 1
79999999999 18.09.2019 17:10 2
79999999999 18.09.2019 17:17 3
79999999999 20.09.2019 17:18 1
79999999999 20.09.2019 17:19 2
79999999999 22.09.2019 17:21 1
79999999999 25.09.2019 17:21 1
Своими силами сделать не выходит, надеюсь смог более менее понятно описать. Файл во прилагаю
Изменено: Александр - 02.10.2019 08:08:04
 
Цитата
Александр написал:
79999999999 20.09.2019 17:19 2
79999999999 22.09.2019 17:21 3
почему нумерация не прервалась тут явный разрыв больше суток
Лень двигатель прогресса, доказано!!!
 
Цитата
Сергей написал:
почему нумерация не прервалась тут явный разрыв больше суток
Опечатался, вы верно все подметили

Исправил в примерах
Изменено: Александр - 02.10.2019 08:09:24
 
пробуйте
Лень двигатель прогресса, доказано!!!
 
Цитата
Сергей написал:
пробуйте
Интересное решение. А если номера разные?) Т.е. надо еще по номерам группировать

Я написал конечно макрос под это дело, но чисто академический интерес как это можно сделать функциями экселя :)
Код
Private Function Numeric_By_Groups()
    
    Application.ScreenUpdating = False
    
    Dim r As Long, _
        LastRow As Long, _
        MemDate As Date, _
        Iterator As Long
    
    Iterator = 1
    
    Columns(8).Clear
    
    With ActiveSheet.UsedRange
        LastRow = .Rows.Count - .Row + 1
    End With
    
    For r = 2 To LastRow
        With Cells(r, 2)
            If Not .Value = .Offset(-1, 0).Value Then
                Iterator = 1
                MemDate = .Offset(0, 2).Value
                .Offset(0, 6).Value = Iterator
            End If
            
            If .Value = .Offset(1, 0).Value Then
                If DateDiff("h", MemDate, .Offset(0, 2).Value) < 24 Then
                    Iterator = Iterator + 1
                    .Offset(1, 6).Value = Iterator
                Else
                    Iterator = 1
                    MemDate = .Offset(1, 2).Value
                    .Offset(1, 6).Value = Iterator
                End If
            Else
                .Offset(1, 6).Value = Iterator
            End If
        End With
    Next r
    
End Function
Изменено: Александр - 02.10.2019 08:22:17
 
нормальный пример тогда создайте с разными датами и номерами и как должна выглядеть нумерация
Лень двигатель прогресса, доказано!!!
 
Надеюсь данный пример понятнее будет :)

Спасибо
Изменено: Александр - 02.10.2019 09:59:58
 
еще вариант
Код
=ЕСЛИ(ИЛИ(B2-B1>1;A2<>A1);1;D1+1)
Лень двигатель прогресса, доказано!!!
 
Не жмите бездумно на кнопку цитирования.
Не пишите через строку
[МОДЕРАТОР]

В целом работает, решение классное. Странно, что я изначально не додумался до этого.

Но на боевом файле не корректно сработал. Приложил пример где работает неккоректно. К сожалению приложить полный боевой файл не могу из-за соображения, что имеются конф информация. В файле 170к строк :)
 

=IF(OR(IFERROR(B2-INDEX(B:B;LOOKUP(2;1/($A$1:A1=A2)/($D$1:D1=1);ROW($A$1:A2)))>1;);A2<>A1);1;D1+1)
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх