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:
![](https://i0.wp.com/excelsignum.com/wp-content/uploads/2020/09/FUNCION-PARA-MOSTRAR-RELACION-DE-FECHAS-ENTRE-DOS-FECHAS.jpg?resize=738%2C536&ssl=1)
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.
¡¡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