Hola a todos!
Hace unos días publicaba un post en Power Query sobre cómo calcular días laborables con una función definida: FUNCIÓN DEFINIDA EN POWER QUERY PARA CALCULAR DÍAS LABORABLES ENTRE DOS FECHAS
En uno de los comentarios que me hicieron, me indican la necesidad de conseguir el cálculo de días laborables en caso de tener múltiples rangos de vacaciones o festividades. El ejemplo que indica es claro, los días festivos y cuando tratamos unidades territoriales, por ejemplo de ámbito local, provincial o autonómico.
Por ejemplo, si queremos obtener los días laborales para un rango de fechas de ámbito nacional solo tendremos que aplicar los días festivos nacionales y listo. Pero si queremos además que sea capaz de calcular los días laborales teniendo en cuenta los festivos nacionales y los locales de determinados lugares de España, la solución técnica se complica.
Para esta primera aproximación lo he desarrollado con una subrutina en VBA que funciona correctamente.
Veamos un ejemplo práctico:
Como podéis observar tenemos varias personas con un rango de fechas y que viven en lugares distintos y tenemos las fechas de festivos nacionales y festivos locales de cada uno de esos sitios. Obviamente los nacionales son comunes a todos.
Para poder realizar el cálculo utilizaré esta rutina:
Sub DIAS_LAB()
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), " ")
Cells(i, 6) = Application.WorksheetFunction.NetworkDays(CDate(.Cells(i, 4)), CDate(.Cells(i, 5)), Rango)
nCadena = vbNullString
Next i
End With
End Sub
El resultado de generar este proceso es el siguiente:
La clave es en ir generando mediante un loop una matriz con los festivos nacionales y locales de cada Provincia. He dejado la columna L con el día de la semana para comprobar como algunos festivos caen en fin de semana y por lo tanto no tendrán efecto en el resultado final dado que no es día laborable.
Espero en breve poder generar en Power Query algo parecido 🙂
Espero que sea de utilidad!!. Os dejo el archivo.
¿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
buenas tardes, se podría ampliar la rutina para aquellas personas que tengan días laborables distintos? por ejemplo añadir otro campo donde indique: dias descanso – 1 – sábado-domingo, 2- domingo-lunes, etc., como funciona DIASLAB.INTL. sería de mucha ayuda para no repetir la función DIAS.LAB.INTL en cada línea. gracias anticipadas
Sí, claro, se tendría que programar que utilizando dias.lab.int
El tercer argumento sería la lista que he creado en el post, en este ejemplo el fin de semana es el miércoles y el domingo.
Application.WorksheetFunction.NetworkDays_Intl("01/01/2022", Date, "0010001")
Buenos días Segu,
He probado la subrutina y funciona muy bien, aunque le encuentro que hay algunos aspectos que para ser más practica y evitar errores en la subrutina (en los festivos si los buscas por nombre de provincia en lugar de código postal) y el usuario a puesto incorrectamente el nombre, ej… «La Rioja» por «Rioja», ó «Girona» por «Gerona», etc… el programa da error al no encontrarlos. Pienso que mejor seria hacerlo por código postal (normalmente en todos estos controles hay un campo de Cp), el cual lo podemos dividir por 1000 y sacar (eso sí como entero) los dos primeros dígitos de la provincia y así nunca habrá error condicionado por éste campo. También la tabla de festivos debería ser independiente y que estuviera en otro archivo y que ésta subrutina vaya a buscarlos siempre que se ejecute, es más practico y nos evita el tener que estar copiado siempre la tabla de festivos sobre los campos y celdas establecidos en los ficheros que vayamos a controlar.
Yo he generado el fichero de festivos en base al compartido de «Festivos Nacionales» y de código postal de provincias, ya que los nacionales son compartidos por todas las provincias y así sólo hace falta añadir los regionales y locales de cada provincia (aunque verás que algunos de «La Rioja» los he incluido como nacionales al ser la salida del producto desde un almacén de allí y por tanto si es festivo allí el producto tampoco sería enviado.
Adjunto tabla:
Código postal Provincia Fecha Tipo Festivo
Nacional Todas 01/01/2022 Nacional
Nacional Todas 06/01/2022 Nacional
Nacional La Rioja 14/04/2022 Regional
Nacional Todas 15/04/2022 Nacional
Nacional La Rioja 18/04/2022 Regional
Nacional La Rioja 09/06/2022 Regional
Nacional La Rioja 11/06/2022 Local
Nacional La Rioja 25/07/2022 Regional
Nacional Todas 15/08/2022 Nacional
Nacional La Rioja 29/09/2022 Local
Nacional Todas 12/10/2022 Nacional
Nacional Todas 01/11/2022 Nacional
Nacional Todas 06/12/2022 Nacional
Nacional Todas 08/12/2022 Nacional
Nacional La Rioja 26/12/2022 Regional
01 Álava 28/04/2022 Local
01 Álava 06/09/2022 Regional
02 Albacete 31/05/2022 Regional
02 Albacete 16/06/2022 Regional
02 Albacete 24/06/2022 Local
02 Albacete 08/09/2022 Local
03 Alicante 19/03/2022 Regional
03 Alicante 28/04/2022 Local
03 Alicante 23/06/2022 Local
03 Alicante 24/06/2022 Regional
04 Almería 28/02/2022 Regional
04 Almería 02/05/2022 Regional
04 Almería 24/06/2022 Local
04 Almería 27/08/2022 Local
05 Ávila 23/04/2022 Regional
05 Ávila 02/05/2022 Regional
05 Ávila 15/10/2022 Local
06 Badajoz 01/03/2022 Local
06 Badajoz 02/05/2022 Regional
06 Badajoz 24/06/2022 Local
06 Badajoz 08/09/2022 Regional
07 Baleares 20/01/2022 Local
07 Baleares 01/03/2022 Regional
07 Baleares 24/06/2022 Local
08 Barcelona 06/06/2022 Regional
08 Barcelona 24/06/2022 Regional
08 Barcelona 24/09/2022 Local
08 Barcelona 26/09/2022 Local
09 Burgos 23/04/2022 Regional
09 Burgos 02/05/2022 Regional
09 Burgos 17/06/2022 Local
09 Burgos 29/06/2022 Local
10 Cáceres 23/04/2022 Local
10 Cáceres 02/05/2022 Regional
10 Cáceres 27/05/2022 Local
10 Cáceres 08/09/2022 Regional
11 Cádiz 28/02/2022 Regional
11 Cádiz 01/03/2022 Local
11 Cádiz 02/05/2022 Regional
11 Cádiz 07/10/2022 Local
12 Castellón 19/03/2022 Regional
12 Castellón 28/03/2022 Local
12 Castellón 24/06/2022 Regional
12 Castellón 29/06/2022 Local
13 Ciudad Real 31/05/2022 Regional
13 Ciudad Real 06/06/2022 Local
13 Ciudad Real 16/06/2022 Regional
13 Ciudad Real 22/08/2022 Local
14 Córdoba 28/02/2022 Regional
14 Córdoba 02/05/2022 Regional
14 Córdoba 08/09/2022 Local
14 Córdoba 24/10/2022 Local
15 La Coruña 01/03/2022 Local
15 La Coruña 19/03/2022 Regional
15 La Coruña 17/05/2022 Regional
15 La Coruña 07/10/2022 Local
16 Cuenca 28/01/2022 Local
16 Cuenca 31/05/2022 Regional
16 Cuenca 01/06/2022 Local
16 Cuenca 16/06/2022 Regional
17 Gerona 06/06/2022 Regional
17 Gerona 24/06/2022 Regional
17 Gerona 29/10/2022 Local
18 Granada 28/02/2022 Regional
18 Granada 02/05/2022 Regional
18 Granada 26/05/2022 Local
18 Granada 16/06/2022 Local
19 Guadalajara 31/05/2022 Regional
19 Guadalajara 16/06/2022 Regional
19 Guadalajara 08/09/2022 Local
19 Guadalajara 16/09/2022 Local
20 Guipúzcoa 06/09/2022 Regional
20 Guipúzcoa 09/09/2022 Local
21 Huelva 28/02/2022 Regional
21 Huelva 02/05/2022 Regional
21 Huelva 03/08/2022 Local
21 Huelva 08/09/2022 Local
22 Huesca 22/01/2022 Local
22 Huesca 23/04/2022 Regional
22 Huesca 02/05/2022 Regional
22 Huesca 10/08/2022 Local
23 Jaén 28/02/2022 Regional
23 Jaén 02/05/2022 Regional
23 Jaén 18/10/2022 Local
24 León 23/04/2022 Regional
24 León 02/05/2022 Regional
24 León 24/06/2022 Local
24 León 05/10/2022 Local
25 Lérida 11/05/2022 Local
25 Lérida 06/06/2022 Regional
25 Lérida 24/06/2022 Regional
27 Lugo 01/03/2022 Local
27 Lugo 19/03/2022 Regional
27 Lugo 17/05/2022 Regional
27 Lugo 05/10/2022 Local
28 Madrid 02/05/2022 Regional
28 Madrid 16/05/2022 Local
28 Madrid 09/11/2022 Local
29 Málaga 28/02/2022 Regional
29 Málaga 02/05/2022 Local
29 Málaga 19/08/2022 Local
29 Málaga 08/09/2022 Local
30 Murcia 19/03/2022 Regional
30 Murcia 19/04/2022 Local
30 Murcia 02/05/2022 Regional
30 Murcia 13/09/2022 Local
31 Navarra 19/03/2022 Regional
31 Navarra 03/12/2022 Local
32 Orense 16/02/2022 Local
32 Orense 19/03/2022 Regional
32 Orense 17/05/2022 Regional
32 Orense 11/11/2022 Local
33 Asturias 02/05/2022 Regional
33 Asturias 08/09/2022 Regional
33 Asturias 21/09/2022 Local
34 Palencia 02/02/2022 Local
34 Palencia 23/04/2022 Regional
34 Palencia 02/05/2022 Regional
34 Palencia 02/09/2022 Local
35 Las Palmas 30/05/2022 Regional
35 Las Palmas 24/06/2022 Regional
36 Pontevedra 02/03/2022 Local
36 Pontevedra 19/03/2022 Regional
36 Pontevedra 17/05/2022 Regional
36 Pontevedra 11/07/2022 Local
37 Salamanca 23/04/2022 Regional
37 Salamanca 02/05/2022 Regional
37 Salamanca 13/06/2022 Local
37 Salamanca 08/09/2022 Local
38 Santa Cruz de Tenerife 03/05/2022 Local
38 Santa Cruz de Tenerife 30/05/2022 Regional
38 Santa Cruz de Tenerife 24/06/2022 Regional
39 Cantabria 28/07/2022 Regional
39 Cantabria 15/09/2022 Regional
40 Segovia 23/04/2022 Regional
40 Segovia 02/05/2022 Regional
40 Segovia 29/06/2022 Local
40 Segovia 25/10/2022 Local
41 Sevilla 28/02/2022 Regional
41 Sevilla 02/05/2022 Regional
41 Sevilla 04/05/2022 Local
41 Sevilla 16/06/2022 Local
42 Soria 23/04/2022 Regional
42 Soria 02/05/2022 Regional
42 Soria 03/10/2022 Local
43 Tarragona 06/06/2022 Regional
43 Tarragona 24/06/2022 Regional
43 Tarragona 19/08/2022 Local
43 Tarragona 23/09/2022 Local
44 Teruel 19/04/2022 Local
44 Teruel 23/04/2022 Regional
44 Teruel 02/05/2022 Regional
44 Teruel 11/07/2022 Local
45 Toledo 19/03/2022 Local
45 Toledo 31/05/2022 Regional
45 Toledo 16/06/2022 Regional
46 Valencia 22/01/2022 Local
46 Valencia 19/03/2022 Regional
46 Valencia 25/04/2022 Local
46 Valencia 24/06/2022 Regional
47 Valladolid 23/04/2022 Regional
47 Valladolid 02/05/2022 Regional
47 Valladolid 13/05/2022 Local
47 Valladolid 08/09/2022 Local
48 Vizcaya 04/07/2022 Local
48 Vizcaya 06/09/2022 Regional
49 Zamora 23/04/2022 Regional
49 Zamora 02/05/2022 Regional
49 Zamora 29/06/2022 Local
50 Zaragoza 31/01/2022 Local
50 Zaragoza 07/03/2022 Local
50 Zaragoza 23/04/2022 Regional
50 Zaragoza 02/05/2022 Regional
51 Ceuta 13/06/2022 Local
51 Ceuta 05/08/2022 Local
52 Melilla 03/05/2022 Local
52 Melilla 11/07/2022 Local
52 Melilla 08/09/2022 Local
52 Melilla 17/09/2022 Local
Quedo a la espera de que realmente sea de interés ésta nueva propuesta y podamos todos disfrutar de tu herramienta de cálculos de festivos.
¡Muchas gracias y agradezco el interés y dedicación que dedicaste a ello!
Atentamente.