1. AyudaExcel utiliza cookies. Si continuas utilizando AyudaExcel, estás aceptando la utilización de nuestras cookies. Más información.
  2. ¡Bienvenid@ a AyudaExcel! El foro más visitado sobre Excel en habla hispana.

    Si esta es tu primera visita, asegúrate de revisar los temas de la sección Utilización y Funcionamiento para familiarizarte con las funciones del foro. Si deseas publicar mensajes, será necesario que te Registres para que puedas dejar respuestas y crear tus propios mensajes, recuerda que es gratuito.

[CERRADO] Suma de dias de un rango de fechas que se traslapan o no

Tema publicado en 'Macros y programación VBA' iniciado por fjchavez, 27 Ene 2011.

Estado del tema:
Cerrado para nuevas respuestas
  1. fjchavez

    fjchavez Usuario

    Registrado:
    13 Jul 2010
    Mensajes:
    34
    Me Gusta recibidos:
    0
    Hola, tengo un proyecto de programación que involucra el cálculo de días entre dos fechas. La cuestión se complica debido a que tengo un array de fechas iniciales y otro de fechas finales. La idea es contar los días en total sin contar las fechas que se traslapen.
    Es decir si tengo las fechas:
    row 1 ---> 11/03/2011 a 11/04/2011
    row 2 ---> 15/03/2011 a 15/04/2011
    row 3 ---> 20/04/2011 a 16/06/2011

    Entonces se deberian contar los días de los rangos de fechas del 11/03/2011 al 15/04/2011 mas el rango de fechas 20/04/2011 al 16/06/2011.
    Como podria hacer eso via vba de excel o alguna orientación de como programarlo.
    Muchas gracias!.

    Adjuntos:

    Editado por moderación: 27 Ene 2011
  2. Macro Antonio

    Macro Antonio Incondicional de Ayuda Excel

    Registrado:
    12 May 2010
    Mensajes:
    5.513
    Me Gusta recibidos:
    982
    Re: Suma de dias de un rango de fechas que se traslapan o no

    Hola:

    Prueba con esta macro:
    CÓDIGO:
    Sub CalcularIntervalos()
    Dim Desde As Date, Hasta As Date
    Range("A2").Select
    Do Until ActiveCell = ""
        Desde = CDate(ActiveCell)
        Hasta = CDate(ActiveCell.Offset(0, 1))
        If ActiveCell.Row > 2 Then
           If Not Desde > CDate(ActiveCell.Offset(-1, 1)) Then
              Desde = CDate(ActiveCell.Offset(-1, 1)) + 1
              'ActiveCell.Offset(0, 4) = Desde
           End If
        End If
        ActiveCell.Offset(0, 2) = Hasta - Desde '+1 si se quiere contar el día final
        ActiveCell.Offset(1, 0).Activate
    Loop
    End Sub
    
    Saludos
  3. luigi

    luigi Invitado

    Re: Suma de dias de un rango de fechas que se traslapan o no

    Buenas:
    Se deben adecuar los temas según las Normas, he corregido el título (Sacado la palabra Ayuda!!!) según esto
    Pues se corre el riesgo de

    Todo esto se halla felizmente alojado en este enlace
    Saludos.
  4. fjchavez

    fjchavez Usuario

    Registrado:
    13 Jul 2010
    Mensajes:
    34
    Me Gusta recibidos:
    0
    Re: Suma de dias de un rango de fechas que se traslapan o no

    Gracias Macro Antonio, funciona perfectamente, pero me parece que funciona siempre y cuando las fechas esten en orden porque acabo de poner en la celda [A7]= 18/04/2011 [B7]=15/05/2011 y no me funciona. Como podria generalizarlo?

    Luis, lo tendre en cuenta para mis próximos posteos.
  5. Macro Antonio

    Macro Antonio Incondicional de Ayuda Excel

    Registrado:
    12 May 2010
    Mensajes:
    5.513
    Me Gusta recibidos:
    982
    Re: Suma de dias de un rango de fechas que se traslapan o no

    Hola:

    No, no lo hace siempre, se compara el intervalo con el anterior, no con el siguiente.

    Si tomamos como ejemplo las filas 2 y 3 de tu archivo, el intervalo 15/2 a 15/3, esta restado del intervalo 15/2 a 15/8.

    Resumiendo el proceso queda: de 15/2 a 15/3 y de 16/3 a 15/8.

    Saludos.
  6. fjchavez

    fjchavez Usuario

    Registrado:
    13 Jul 2010
    Mensajes:
    34
    Me Gusta recibidos:
    0
    Re: Suma de dias de un rango de fechas que se traslapan o no

    Hola Macro antonio, y si agrego además estas filas

    row 1 ---> 11/03/2011 a 11/04/2011
    row 2 ---> 15/03/2011 a 15/04/2011
    row 3 ---> 20/04/2011 a 16/06/2011
    row 4 ---> 26/11/2011 a 26/12/2011
    row 5 ---> 17/07/2011 a 18/08/2011
    row 6 ---> 12/02/2011 a 12/03/2011
    row 7 ---> 16/06/2011 a 05/08/2011


    Al ejecutar la macro me da valores negativos.
    Como podriamos modificar tu macro para que no necesariamente me compare con la anterior porque no necesariamente viene en orden como en este ejemplo y ademas no tengo solo 7 filas sino 100 a más.
    Gracias por tu orientación.
  7. Macro Antonio

    Macro Antonio Incondicional de Ayuda Excel

    Registrado:
    12 May 2010
    Mensajes:
    5.513
    Me Gusta recibidos:
    982
    Re: Suma de dias de un rango de fechas que se traslapan o no

    Hola:

    No hay otra opción que ordenar los datos por las columnas 1 y 2. (Datos\Ordenar).

    Si necesariamente debes respetar el orden que tienes, añade al final de la última columna con datos, una columna auxiliar y pon un numerador de filas (1,2,3....).

    Ordena tal como te he dicho, ejecuta la macro, y vuelve a ordenar por la columna auxiliar, de esta manera, recuperarás el orden inicial. Elimina la columna auxiliar y listo.


    Saludos
    Última edición: 28 Ene 2011
  8. fjchavez

    fjchavez Usuario

    Registrado:
    13 Jul 2010
    Mensajes:
    34
    Me Gusta recibidos:
    0
    Re: Suma de dias de un rango de fechas que se traslapan o no

    ok, ahora tengo una consulta hay alguna forma que al ordenar el rango de fechas que tengo almacenado en la variable rangofechas no se me ordene en la hoja de calculo, osea solo en mi variable pero no modifique mi hoja???? porque estoy creando una funcion.
  9. Macro Antonio

    Macro Antonio Incondicional de Ayuda Excel

    Registrado:
    12 May 2010
    Mensajes:
    5.513
    Me Gusta recibidos:
    982
    Re: Suma de dias de un rango de fechas que se traslapan o no

    Hola:

    Que yo sepa, no.
    CÓDIGO:
    ...osea solo en mi variable pero no modifique mi hoja????...
    Tu variable es el propio rango de celdas de la hoja.

    Saludos
  10. fjchavez

    fjchavez Usuario

    Registrado:
    13 Jul 2010
    Mensajes:
    34
    Me Gusta recibidos:
    0
    Re: Suma de dias de un rango de fechas que se traslapan o no

    Ok, dime se puede llamar desde una funcion a una subrutina???.....he creado mi funcion pero no me funciono el ordenar, ni el poner valores en celdas. Como puedo arreglar esta funcion para que me funcione.

    CÓDIGO:
    Function dsctomes(r As Range)
    
    Dim i As Integer
    Dim orden As Integer
    Dim fini As Integer
    Dim cini As Integer
    Dim ffin As Integer
    Dim suma As Integer
    Dim meses As Single
    
    'fila en la que inicia el rango
    fini = r.row
    'columna en la que inicia el rango
    cini = r.Column
    'fila en la que termina el rango
    ffin = r.Rows.Count + fini - 1
    'comenzamos a ver si son activos para el calculo 0,1 y le asignamos un contador del orden
    orden = 1
    For i = fini To ffin
        fechaini = Cells(i, cini)
        fechafin = Cells(i, cini).Offset(0, 1)
        radio = Cells(i, cini).Offset(0, -3)
        cobertura = Cells(i, cini).Offset(0, -2)
        tipo = Cells(i, cini).Offset(0, -1)
        If radio <> Empty & cobertura <> Empty & tipo <> Empty & fechaini <> Empty & fechafin <> Empty Then
            fechaini.Offset(0, 2) = orden
            fechaini.Offset(0, 3) = 1
        Else
            fechaini.Offset(0, 2) = orden
            fechaini.Offset(0, 3) = 0
        End If
        orden = orden + 1
    Next i
    'ordenamos 1ero si sin activos 1, luego  por fecha inicial y final
    Range(Cells(fini, cini), Cells(ffin, cini + 3)).Sort Key1:=Cells(fini, cini + 3), Order1:=xlDescending, _
    Key2:=Cells(fini, cini), Order2:=xlAscending, Key3:=Cells(fini, cini + 1), Order3:=xlAscending, Header:=xlNo
    'seleccionamos la celda inicial
    Cells(fini, cini).Select
    'hacemos este bucle hasta que nos aparezca un inactivo 0
    Do Until ActiveCell.Offset(0, 3) = 0
        Desde = CDate(ActiveCell)
        Hasta = CDate(ActiveCell.Offset(0, 1))
        If ActiveCell.row > fini Then
           If Not Desde > CDate(ActiveCell.Offset(-1, 1)) Then
              Desde = CDate(ActiveCell.Offset(-1, 1)) + 1
           End If
        End If
        'MsgBox "Hasta= " & Hasta & Chr(13) & "Desde= " & Desde & Chr(13) & "Resultado= " & Hasta - Desde + 1
        suma = suma + (Hasta - Desde + 1)
        ActiveCell.Offset(1, 0).Activate
    Loop
    'los dias los llevamos a meses y almacenamos en la variable meses
    meses = Round(suma / 30, 0)
    'ordenamos la hoja como al principio
    Range(Cells(fini, cini), Cells(ffin, cini + 3)).Sort Key1:=Cells(fini, cini + 2), Order1:=xlAscending, Header:=xlNo
    'devolvemos el numero de meses
    dsctomes = meses
    End Function
    
  11. fjchavez

    fjchavez Usuario

    Registrado:
    13 Jul 2010
    Mensajes:
    34
    Me Gusta recibidos:
    0
    Re: Suma de dias de un rango de fechas que se traslapan o no

    Hola Macro Antonio,

    Estuve corriendo la macro para diversos rangos de fechas pero me da la cantidad de dias errada.

    Caso:

    row 0----->FECHA INICIO a FECHA FIN
    row 1----->12-feb-11 a 12-mar-11
    row 2----->12-feb-11 a 13-mar-11
    row 3----->13-feb-11 a 13-mar-11
    row 4----->15-feb-11 a 15-dic-11
    row 5----->16-jul-11 a 17-ago-11

    La fila 5 hace que el calculo falle, podemos generalizar la macro para que funcione siempre???
  12. Macro Antonio

    Macro Antonio Incondicional de Ayuda Excel

    Registrado:
    12 May 2010
    Mensajes:
    5.513
    Me Gusta recibidos:
    982
    Re: Suma de dias de un rango de fechas que se traslapan o no

    Hola:

    Tengo por delante una temporada de trabajo bastante complicada, te aconsejo que abras otro tema específico con este tema, a ver si alguien mas te echa una mano.

    Saludos.
Estado del tema:
Cerrado para nuevas respuestas

Compartir esta página