6 febrero, 2025

CALCULAR DIAS LABORABLES PARA MÚLTIPLES RANGOS DE VACACIONES O FESTIVOS

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.

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

3 comentarios en «CALCULAR DIAS LABORABLES PARA MÚLTIPLES RANGOS DE VACACIONES O FESTIVOS»

  1. 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

    1. 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")

  2. 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.

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies