Hola a todos,
Si hace unas semanas escribía la siguiente publicación: CALCULAR DIAS LABORABLES PARA MÚLTIPLES RANGOS DE VACACIONES O FESTIVOS en la que calculaba los días laborables entre dos fechas teniendo en cuenta múltiples rangos de vacaciones, hoy he programado una variación teniendo cuenta la función DIAS.LAB.INTL (en VBA es: Application.WorksheetFunction.NetworkDays_Intl
).
La idea es que podamos elegir cuando es fin de semana, por ejemplo, si es un lunes y un sábado o un viernes y un domingo, etc.
Siguiendo el ejemplo anterior, he incluido una nueva columna (M) donde se especifica el día del mes que vamos a utilizar (es uno de los parámetros de la función DIAS.LAB.INTL.
Por ejemplo, si queremos que el fin de semana sea el sábado y el domingo, será así: 0000011. Es decir, los 1 indican el día que es considerado fin de semana:
![](https://i0.wp.com/excelsignum.com/wp-content/uploads/2022/12/CALCULAR-DIAS-LABORABLES-PARA-MULTIPLES-RANGOS-DE-VACACIONES-Y-DIAS-DE-FIN-DE-SEMANA.png?resize=1024%2C465&ssl=1)
Para programarlo he reutilizado el código anterior e introducido algunas modificaciones:
Sub DIAS_LAB_INTL()
Dim i As Long, j As Long, Final As Long, Fin As Long
Dim nSerie As Long, nCadena As String, sCadena As String
Dim Rango As Variant
With Sheets("Hoja1")
Final = Application.CountA(.Range("A:A"))
Fin = Application.CountA(.Range("J:J"))
'Recorremos listado de casos
For i = 2 To Final
'Recorremos fechas festivos
For j = 2 To Fin
'Seleccionamos todos NACIONAL y los locales que correspondan
If .Cells(j, 10) = .Cells(i, 1) Or .Cells(j, 10) = "NACIONAL" Then
nSerie = CLng(CDate(.Cells(j, 11)))
nCadena = nCadena & " " & nSerie
End If
Next j
'Creamos cadena
sCadena = Mid(nCadena, 2, Len(nCadena))
'Convertimos en matriz
Rango = Split(Trim(sCadena), " ")
'Buscamos días del fin de semana
For n = 2 To Fin
If .Cells(n, 10) = .Cells(i, 1) Then
weekend = .Cells(n, 13)
.Cells(i, 7) = .Cells(n, 13)
Exit For
End If
Next n
.Cells(i, 6) = Application.WorksheetFunction.NetworkDays_Intl(CDate(.Cells(i, 4)), CDate(.Cells(i, 5)), weekend, Rango)
nCadena = vbNullString
weekend = vbNullString
Next i
End With
End Sub
He incluido un nuevo loop para obtener el código del fin de semana y así pasarlo a la función NetworkDays_Intl con la variable que he denominado «weekend».
En realidad es un cambio muy sencillo que nos permite obtener e incluir los días del fin de semana en el procedimiento de la publicación anterior.
Una vez ejecutado el código aparecerán en la columna F el total de días laborables y en la columna G he indicado en el código que se muestre el la cadena de días que define el fin de semana (solo informativo):
![](https://i0.wp.com/excelsignum.com/wp-content/uploads/2022/12/CALCULAR-DIAS-LABORABLES-PARA-MULTIPLES-RANGOS-DE-VACACIONES-Y-DIAS-DE-FIN-DE-SEMANA1.png?resize=1024%2C470&ssl=1)
Espero que sea de vuestro interés. Podéis descargar aquí el archivo de ejemplo:
¿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