Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Průniky intervalů - Excel

Ahoj,

prosím o pomoc s problémem v Excelu. Mám seznam jízd, u kterých je vždy uvedeno datum, čas "od" a čas "do". Pro každé konkrétní datum potřebuju zjistit, kolik je potřeba vozidel k obsloužení všech jízd v rámci dne. Není to prosté zjištění počtu průniku intervalů, ale bude to z něj nejspíš nějak vycházet... Pro lepší představu viz tečy níže (každá řada teček představuje jednu jízdu, na ose y je čas). V uvedeném případě stačí vozidla tři. Předpokládá se, že po ukončení jízdy může vozidlo ihned začít obsluhovat další jízdu (nepředpokládá se čas potřebný k přejezdu vozidla).

Díky moc!

    .        .
    .        .
    .        .

       .
.      .
.      .   .
.      .   .
.          .
.
.
.
.

Pridaný tag code pre tečky. (los)

Předmět Autor Datum
Tečky se smrskly, každopádně měly představovat celkem pět jízd... nový
Libor456 21.09.2014 16:45
Libor456
Nedal si sem príklad, ako vyzerá tvoj zošit, takže predpokladám, že tam máš niekde tabuľku so zoznam… poslední
los 21.09.2014 21:15
los

Nedal si sem príklad, ako vyzerá tvoj zošit, takže predpokladám, že tam máš niekde tabuľku so zoznamom jázd (aInputRangeAddress) a potom tabuľku so zoznamom dátumov, pre ktoré chceš vypočítať počet áut (aOutputRangeAddress). Makro by mohlo vyzerať napríklad takto (konštanty si musíš upraviť podľa seba):

Const aInputRangeAddress = "A1:C5"
Const aInputDateColumn = 1
Const aInputStartTimeColumn = 2
Const aInputEndTimeColumn = 3
Const aOutputRangeAddress = "E1:F2"
Const aOutputDateColumn = 1
Const aOutputCountColumn = 2

Sub CountCars()
    Dim aStartTime As Variant
    Dim aEndTime As Variant
    Dim aInputRange As Range
    Dim aRow As Range
    
    aStartTime = WorksheetFunction.Min(aInputRange.Columns(aInputStartTimeColumn))
    aEndTime = WorksheetFunction.Max(aInputRange.Columns(aInputEndTimeColumn))
    Set aInputRange = Range(aInputRangeAddress)
    For Each aRow In Range(aOutputRangeAddress)
        aRow.Columns(aOutputCountColumn).Value = CountCollisions(aInputRange, _
            aInputRange.Row, aRow.Columns(aOutputDateColumn).Value, aStartTime, aEndTime)
    Next aRow
End Sub

Function CountCollisions(aInputRange As Range, aRowIndex As Integer, aDate As Variant, aStartTime As Variant, aEndTime As Variant)
    Dim aRow As Range
    Dim aCollisions As Integer
    
    CountCollisions = 0
    For Each aRow In aInputRange.Rows
        If aRow.Row >= aRowIndex And _
                aRow.Columns(aInputDateColumn) = aDate And _
                aRow.Columns(aInputStartTimeColumn) < aEndTime And _
                aRow.Columns(aInputEndTimeColumn) > aStartTime Then
            aCollisions = 1 + CountCollisions(aInputRange, aRow.Row + 1, aDate, _
                WorksheetFunction.Max(aStartTime, aRow.Columns(aInputStartTimeColumn)), _
                WorksheetFunction.Min(aEndTime, aRow.Columns(aInputEndTimeColumn)))
            If aCollisions > CountCollisions Then CountCollisions = aCollisions
        End If
    Next aRow
End Function

Zpět do poradny Odpovědět na původní otázku Nahoru