es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Buscando duplicados y verificando períodos solapados.

Tengo una tabla con tres columnas como se ilustra a continuación:

Id StartDate EndDate
1 20201101 20210131
2 20200801 20201031
2 20201101 99991231
3 20200901 99991231
3 20210301 99991231
4 20200301 20200930
4 20201001 20210430
4 20210315 99991231

Quiero probar si hay intervalos de tiempo superpuestos dentro de cada grupo de identificadores duplicados. Por ejemplo, las dos filas con id = 3 tienen intervalos de tiempo superpuestos. Lo mismo ocurre con las dos últimas filas de id = 4.

Entonces imagino que cuando el bucle encuentre una superposición, me arrojará un msgbox con el id correspondiente.

¿Cómo puedo lograr esto?

Estoy pensando que podría requerir un bucle anidado. Y para probar la superposición, usaría la siguiente lógica:

Si StartDate1 <= EndDate2 y StartDate2 <= EndDate1 entonces ...
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, se puede utilizar un bucle anidado para comparar cada fila con las demás dentro del mismo grupo de ids duplicados. Dentro del bucle anidado, se puede utilizar la lógica que mencionaste para evaluar si hay una superposición. Si se encuentra una superposición, se mostrará un MsgBox con el correspondiente id.

    Aquí hay un ejemplo de código:

    Sub VerificarRangosSuperpuestos()
    
        Dim ultimaFila As Long
        Dim i As Long
        Dim j As Long
        Dim id As Long
        Dim fechaInicio As Date
        Dim fechaFin As Date
    
        ultimaFila = Cells(Rows.Count, "A").End(xlUp).Row
    
        For i = 2 To ultimaFila
            id = Cells(i, "A").Value
            fechaInicio = Cells(i, "B").Value
            fechaFin = Cells(i, "C").Value
            For j = i + 1 To ultimaFila
                If id = Cells(j, "A").Value Then
                    If fechaInicio <= Cells(j, "C").Value And Cells(j, "B").Value <= fechaFin Then
                        MsgBox "Se encontró una superposición para el id " & id
                    End If
                Else
                    Exit For
                End If
            Next j
        Next i
    
    End Sub
    

    Este código recorrerá cada fila y la comparará con las demás dentro del mismo grupo de ids duplicados. Si se encuentra una superposición, se mostrará un MsgBox con el correspondiente id. Ten en cuenta que el formato de fecha en los datos de ejemplo es en yyyymmdd, pero se puede ajustar al formato de fecha que se utilice en realidad.

Comments are closed.