jueves, 6 de mayo de 2021

DIAS.LAB.INTL Personalizar días laborables.

Nunca llegaré a conocer Excel.... esa es mi impresión a día de hoy.
O no te acostarás sin saber una cosa más.
Hace un par de días escribí un artículo sobre cómo personalizar el cálculo de días laborables entre dos fechas... Una fórmula válida en toda situación (buena como ejercicio), pero totalmente innecesaria :'( Ya que un día después descubrí entre la ayuda de Microsoft, que la función DIAS.LAB.INTL está ya preparada para obtener ese cálculo.
Y como siempre es bueno reconocer nuestras faltas, aquí va la mía.

La función DIAS.LAB.INTL tiene la siguiente sintáxis:
DIAS.LAB.INTL(fecha_inicial; fecha_final; [fin_de_semana]; [vacaciones])
con un tercer argumento muy interesante, con una serie de codificaciones, para indicar qué entendemos como fin de semana (i.e., como días no laborables), al margen del listado de festivos adicionales del cuarto argumento '[vacaciones]'.

Nada nuevo...
Pues resulta que, desconozco si siempre ha sido así o en qué momento se actualizó, existe para el tercer argumento otra posibilidad para indicar cuáles son nuestros días laborables!!.
Según la documentación:
Los valores de cadena de fin de semana tienen siete caracteres de largo y cada carácter de la cadena representa un día de la semana, comenzando por el lunes. 1 representa un día no laborable y 0 representa un día laborable. Solo los caracteres 1 y 0 están permitidos en la cadena. Si usa 1111111 siempre devolverá 0.

Por ejemplo, 0000011 daría como resultado un fin de semana que es sábado y domingo.

Así pues, de acuerdo a una serie de SIETE dígitos (de 0 y 1), uno por cada día de la semana, con la equivalencia LMXJVSD y representando:
1 - día no laborable
0 - día laborable
Podremos personalizar nuestras semanas de trabajo.
Por ejemplo, si mi semana laboral es el lunes y viernes exclusivamente, mi argumento sería: "0111011"
=DIAS.LAB.INTL(B2;C2;"0111011")
DIAS.LAB.INTL Personalizar días laborables.

Asombroso!... super flexible, con la posibilidad añadida de incorporar festivos adicionales!!

Por aportar mi granito de arena y dar una posibilidad más literal a la hora de componer el código de siete dígitos, montaremos la siguiente fórmula a insertar como tercer argumento:
DIAS.LAB.INTL Personalizar días laborables.

La fórmula en E4 sería:
=DIAS.LAB.INTL(B2;C2;
UNIRCADENAS("";FALSO;--NO(ESNUMERO(COINCIDIR({"L"\"M"\"X"\"J"\"V"\"S"\"D"};TRANSPONER(XMLFILTRO("<i><f><d>"&SUSTITUIR(D2;"|";"</d><d>")&"</d></f></i>";"//f/d"));0)))))

Conseguimos entonces informar el tercer argumento con los días laborales (celda D2) indicados de forma literal: L|V en lugar de numéricamente: "0111011"
La 'formulita':
--NO(ESNUMERO(COINCIDIR({"L"\"M"\"X"\"J"\"V"\"S"\"D"};TRANSPONER(XMLFILTRO(""&SUSTITUIR(D2;"|";"")&"";"//f/d"));0))))
es la encargada de obtener la secuencia (vector) de 0 y 1 de siete dígitos que buscamos... para luego obtener el código en formato texto que necesitamos empleando UNIRCADENAS.

Si no te gusta usar la 'barra vertical' y prefieres la secuencia directa de días de la semana: LMJ o similar. Puedes usar en lugar de XMLFILTRO la combinación de EXTRAER, LARGO y SECUENCIA.
En la fórmula siguiente, además, he incluido el cuarto argumento de festivos:
=DIAS.LAB.INTL(B2;C2;
UNIRCADENAS("";FALSO;--NO(ESNUMERO(COINCIDIR({"L"\"M"\"X"\"J"\"V"\"S"\"D"};TRANSPONER(EXTRAE(D3;SECUENCIA(1;LARGO(D3));1));0))));
B7:B9)

DIAS.LAB.INTL Personalizar días laborables.
Reflexión personal: investiga soluciones estándar antes de desarrollar algo nuevo :D

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.