3 febrero, 2023

CALCULAR DIAS LABORABLES PARA MULTIPLES RANGOS DE VACACIONES Y DIAS DE FIN DE SEMANA

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:

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):

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.

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

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