Hola a todos!, qué tal estáis?, espero que bien!.

Para el post de hoy voy a explicar como podemos crear una función que nos devuelva el listado de fechas entre dos fechas. Por ejemplo, si tenemos la fecha inicio: 01/09/2020 y fecha fin: 12/09/2020. La función debe mostrar esto:

02/09/2020
03/09/2020
04/09/2020
05/09/2020
06/09/2020
07/09/2020
08/09/2020
09/09/2020
10/09/2020
11/09/2020

Es decir, las fechas comprendidas entre las fechas indicadas.

Debo indicar que la función no devuelve los días inicio y final, dado que estamos especificando las fechas entre. Si necesitásemos incluir estas fechas, os dejaré el código comentado en la función.

Para conseguir este resultado, os propongo la siguiente función:

Function DIAS_NAT_ENTRE(ByVal inicio As Date, fin As Date)
    'Declaramos variables
    Dim nCont       As Date
    Dim sCadena     As String, fsem As String
    Dim matriz      As Variant, j As Double
    Dim miArray     As Variant
    With Sheets("FECHAS")
        'Indicamos las celdas con la fecha inicio y fin
        'si queremos mostrar el primer y último día descomentamos estas dos lineas (inicio, fin)
        'inicio = DateSerial(Year(inicio), Month(inicio), Day(inicio) - 1)
        'fin = DateSerial(Year(fin), Month(fin), Day(fin) + 1)
        'Mediante un loop añadimos un día a la fecha inicial
        'y guardamos fechas en la variable sCadena
        Do While inicio < fin - 1
            nCont = DateAdd("w", 1, inicio)
            inicio = nCont
            sCadena = sCadena & " " & inicio
        Loop
        'pasamos la información de la matriz a la hoja
        matriz = Split(sCadena, " ")
        'Pasamos el resultado a la función
        ReDim miArray(0 To UBound(matriz))
        For j = 0 To UBound(matriz)
            miArray(j) = Format(matriz(j), "dd/mm/yyyy")
        Next j
        DIAS_NAT_ENTRE = Application.Transpose(miArray)
    End With
    
End Function

El código que os decía que estaba comentado y que podéis ver es:

'inicio = DateSerial(Year(inicio), Month(inicio), Day(inicio) - 1)
        'fin = DateSerial(Year(fin), Month(fin), Day(fin) + 1)

Únicamente tenéis que eliminar las comillas simples del principio y se mostrará la fecha inicio y la final en el resultado.

Por otra parte, si lo que queremos es obtener el listado de fechas pero que sean días laborables (para este ejemplo que no sean ni sábado ni domingo), vamos a utilizar el siguiente código:

Function DIAS_LAB_ENTRE(ByVal inicio As Date, fin As Date)
    'Declaramos variables
    Dim nCont       As Date
    Dim sCadena     As String, fsem As String
    Dim matriz      As Variant, j As Double
    Dim miArray     As Variant
    With Sheets("FECHAS")
        'Indicamos las celdas con la fecha inicio y fin
        'si queremos mostrar el primer y último día descomentamos estas dos lineas (inicio, fin)
        'inicio = DateSerial(Year(inicio), Month(inicio), Day(inicio) - 1)
        'fin = DateSerial(Year(fin), Month(fin), Day(fin) + 1)
        'Mediante un loop añadimos un día a la fecha inicial
        'y guardamos fechas en la variable sCadena
        Do While inicio < fin - 1
            nCont = DateAdd("w", 1, inicio)
            inicio = nCont
            fsem = Format(inicio, "ddd")
            If fsem <> "sá." And fsem <> "do." Then
                sCadena = sCadena & " " & inicio
            End If
        Loop
        'pasamos la información de la matriz a la hoja
        matriz = Split(sCadena, " ")
        ReDim miArray(0 To UBound(matriz))
        For j = 0 To UBound(matriz)
            miArray(j) = Format(matriz(j), "dd/mm/yyyy")
        Next j
        DIAS_LAB_ENTRE = Application.Transpose(miArray)
    End With
End Function

Como se puede observar, evalúo que día de la semana es sábado o domingo:

fsem = Format(inicio, "ddd")

Y lo condiciono en el código:

If fsem <> "sá." And fsem <> "do." Then

Esto lo podemos hacer de otras formas utilizando número de día de la semana, pero me ha parecido más claro así. (ojo, si el equipo trabaja en otros idiomas tendréis que indicar cómo se muestra sábado y domingo).

Este es el resultado para una y otra función:

Y este es el resultado final, como podéis ver obtenemos el resultado esperado.

Este procedimiento en versiones de Excel que no cuentan aún con la actualización que contiene las nuevas fórmulas de matriz dinámica se mostrará de manera distinta, es decir será necesario seleccionar el rango del resultado, seleccionar la fórmula y aplicar CTRL + MAYUS + ENTRAR.

Por otra parte, al igual que el resto de funciones de matriz dinámica, cuando hayamos guardado el libro y vuelto a abrirlo, para modificar estas fórmulas es necesario también seleccionar la fórmula y el rango y aplicar CTRL + MAYUS + ENTRAR, de lo contrario, como sabéis, no podremos modificar una matricial.

Y esto es todo, espero que os sea de utilidad 🙂

Descarga el archivo de ejemplo pulsando en:

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Comparte este post