Volver al Blog
Días Laborables
Excel
DIAS.LAB
DIA.LAB
Funciones de Fecha

El Servicio Incumplió 14 Tickets Que Cumplieron el Plazo y Dio Por Buenos los Tres Que Nunca Cerró, Porque DIAS.LAB Cuenta las Dos Fechas y la Lista de Festivos Se Acababa en 2025

23/09/2026
El Servicio Incumplió 14 Tickets Que Cumplieron el Plazo y Dio Por Buenos los Tres Que Nunca Cerró, Porque DIAS.LAB Cuenta las Dos Fechas y la Lista de Festivos Se Acababa en 2025

Resumen Rápido

Puntos clave de este artículo

  • 📅 `DIAS.LAB` cuenta días laborables **incluyendo las dos fechas**, así que el mismo día es 1 y de lunes al lunes siguiente es 6 — el recuento responde a "cuántos días laborables contiene este intervalo", mientras que todo informe montado encima pregunta "cuánto tardó esto"
  • 💸 Nueve tickets en la raya más cinco abiertos a caballo de un festivo se imprimieron como incumplimiento: 31 informados contra 20 reales, 21,38% contra 13,79%, y una penalización del 7,5% de 3.600 £ pagada donde se debían el 2,5% y 1.200 £
  • 🕳️ Una fecha de resolución vacía no es un hueco para una función de fecha — es cero, cero es el 0 de enero de 1900, y `DIAS.LAB` contó hacia atrás hasta el origen y devolvió −33.032, que es menor o igual que 5, así que los tres tickets abiertos más viejos del libro imprimieron "Cumple"
  • 🏖️ El argumento de festivos es opcional en la sintaxis y obligatorio en la práctica: déjalo fuera y no hay error, ni marca, ni color — solo recuentos altos exactamente en el número de festivos que abarcan tus datos, y una lista que se acabó en 2025 falla igual de callada
  • 📆 Un festivo que cae en fin de semana no resta nada — el 26 de diciembre de 2026 es sábado, así que la fecha que necesita la lista es el lunes sustitutorio, el 28 — mientras que una sola fecha en texto pegada de una web devuelve `#¡VALOR!` para toda la columna
  • ✅ Deja de contar y compara: `=DIA.LAB(registro;5;Festivos)` da una fecha de vencimiento, `=SI(C2<=D2;"Cumple";"Incumple")` da el veredicto, y la pregunta de si cuenta el día de inicio desaparece dentro de la función que ya la ha respondido
Tiempo de lectura: ~24 min

El contrato dice cinco días laborables. El informe que lo demuestra tiene cuatro columnas: la fecha en que se registró un ticket, la fecha en que se resolvió, un recuento de días laborables entre ambas y un veredicto. El recuento salía de =DIAS.LAB(B2;C2), que lleva en el archivo desde que se firmó el contrato, y el veredicto de =SI(D2<=5;"Cumple";"Incumple").

Para agosto de 2026 ese informe imprimió 31 incumplimientos sobre 145 tickets — el 21,38% — contra un techo contractual del 10%. Al 7,5% de una cuota mensual de 48.000 £, la penalización salió a 3.600 £, y la cuenta entró en una revisión formal con una llamada semanal enganchada.

Catorce de esos 31 tickets se resolvieron dentro de los cinco días laborables.

InformadoReal
Tickets que incumplen el acuerdo3120
Tasa de incumplimiento sobre 145 tickets21,38%13,79%
Tramo de penalización7,5%2,5%
Penalización pagada sobre 48.000 £3.600 £1.200 £
Pagado de más2.400 £
Tickets abiertos fuera de plazo informados como Cumple3

Había dos cosas mal en el recuento y una cosa mal en el veredicto, y ninguna de las tres produjo un valor de error en ninguna parte de la hoja.

DIAS.LAB cuenta días laborables, incluyendo las dos fechas que le pasas — no el hueco entre ellas. Un ticket registrado un lunes y resuelto el lunes siguiente ha tardado cinco días laborables y DIAS.LAB devuelve 6. Nueve tickets estaban justo en la raya y todos ellos se imprimieron como incumplimiento.

El argumento de festivos no se pasó nunca, así que el lunes 31 de agosto — festivo en el Reino Unido, un día en el que no había nadie trabajando y no se podía tocar un ticket — contó como día laborable para todos los tickets abiertos a caballo de esa fecha. Otros cinco tickets pasaron de 5 a 6.

Y tres tickets no se habían resuelto en absoluto. Su celda de resolución estaba vacía, DIAS.LAB leyó una celda vacía como cero, cero es el 0 de enero de 1900, y la función contó obedientemente hacia atrás desde agosto de 2026 hasta el principio de la era: −33.032, −33.033 y −33.039. Todos y cada uno son menores o iguales que 5. Los tres tickets que llevaban abiertos 14, 13 y 7 días laborables — los únicos tres del mes que nadie podía defender — imprimieron Cumple, y nada los escaló, porque un informe que dice que un ticket cumplió su plazo es un informe que dice que el ticket está terminado.

Qué cubre esto. DIAS.LAB y DIA.LAB están en todas las versiones de Excel, en Windows, Mac y web. DIAS.LAB.INTL y DIA.LAB.INTL, que admiten un argumento de fin de semana, llegaron en Excel 2010 y están en todas partes hoy. LET necesita Excel 2021, 365 o web; todas las fórmulas de aquí se dan también sin él. HOY es volátil y recalcula con cada edición, lo cual importa en la sección 10. El ejemplo es un servicio de soporte porque un acuerdo de nivel de servicio es el informe donde esto sobrevive más tiempo: el número es pequeño, se recalcula cada mes y nadie lo rehace a mano.


1) Ocho Tickets, Cinco Veredictos Equivocados, Ningún Valor de Error

Estas son ocho de las 145 filas, con lo que contó el informe al lado de lo que realmente se trabajó.

Ocho Tickets, Cinco Veredictos Equivocados y Ni Un Solo Valor de Error en la Hoja

Ocho de los 145 tickets registrados en agosto de 2026, tal y como los imprimió el informe el martes 1 de septiembre. El acuerdo es de cinco días laborables. La columna D es =DIAS.LAB(B;C) sin argumento de festivos — lo que contó el informe. La columna E son los días laborables realmente tardados, contando el festivo del lunes 31 de agosto como el día no laborable que era. INC-4418 e INC-4423 son el desfase de uno a secas; INC-4441 e INC-4437 son el desfase más el festivo que falta; INC-4460 es un incumplimiento real; y las dos últimas filas son tickets que no se resolvieron nunca, donde una fecha final vacía se lee como el 0 de enero de 1900 y el recuento corre hacia atrás hasta el origen. Todas las cifras de este artículo salen de estas ocho filas y del mes de 145 tickets del que se sacaron.

ABCDEFG
1
Ticket
Logged
Resolved
Days the report counted
Working days actually taken
Status printed
Status true
2
INC-4402
05/08/2026 (Wed)
05/08/2026 (Wed)
1
0
Met
Met
3
INC-4418
03/08/2026 (Mon)
10/08/2026 (Mon)
6
5
Breached
Met
4
INC-4423
04/08/2026 (Tue)
11/08/2026 (Tue)
6
5
Breached
Met
5
INC-4441
24/08/2026 (Mon)
01/09/2026 (Tue)
7
5
Breached
Met
6
INC-4437
27/08/2026 (Thu)
04/09/2026 (Fri)
7
5
Breached
Met
7
INC-4460
18/08/2026 (Tue)
27/08/2026 (Thu)
8
7
Breached
Breached
8
INC-4429
11/08/2026 (Tue)
(still open)
-33032
14
Met
Breached
9
INC-4471
20/08/2026 (Thu)
(still open)
-33039
7
Met
Breached

fxLas celdas con fórmulas están resaltadas en verde

Pasa el mouse sobre las celdas con fórmulas para ver la fórmula y resaltar las celdas referenciadas

Lee las dos últimas columnas una contra la otra. INC-4402, abierto y cerrado en una tarde, sale como que tardó un día — inofensivo aquí, y exactamente el mismo desfase de uno que volteó las tres filas siguientes. INC-4418 e INC-4423 son el caso limpio de lunes a lunes: cinco días laborables trabajados, seis contados. INC-4441 e INC-4437 son cinco días trabajados y siete contados, porque estaban abiertos a caballo del 31 de agosto y el recuento incluyó el festivo y además sumó su propio día extra. INC-4460 es un incumplimiento real, correctamente marcado, y es la única fila de esta tabla donde el informe y la verdad coinciden por el motivo correcto. Las dos últimas filas son los tickets abiertos, imprimiendo un número negativo de cinco cifras en una columna titulada Días laborables, y pasando el filtro.

No hay nada en rojo en la hoja. No hay ningún #¡VALOR!, ningún #¡NUM!, ningún hueco en la columna de veredicto. Todos los recuentos son enteros, casi todos son verosímiles, y los dos que no lo son están en una columna que nadie lee una vez que existe la columna de veredicto.

🎯 Escenario: Abre cualquier archivo que calcule antigüedades — tickets, facturas, siniestros, aprobaciones — y busca la celda que cuenta los días. Si es un =DIAS.LAB(inicio;fin) pelado, con dos argumentos y sin un tercero, tienes los dos fallos de este informe, y la única pregunta que queda es si algo en tus datos ha caído alguna vez justo en el límite.


2) DIAS.LAB Cuenta Días, No el Hueco Entre Ellos

=DIAS.LAB(inicio; fin; [festivos]) devuelve el número de días laborables completos en el intervalo cerrado de inicio a fin. Los dos extremos están incluidos. Los fines de semana se excluyen, los festivos se excluyen si se los pasas, y eso es toda la función.

La consecuencia ocupa una celda:

=DIAS.LAB(FECHA(2026;8;5); FECHA(2026;8;5))   → 1

Un día laborable, para un ticket abierto a las 09:40 y cerrado a las 15:10 del mismo miércoles. No transcurrió nada. La función no está equivocada — está respondiendo a cuántos días laborables contiene este intervalo, y la respuesta es uno, el miércoles. El informe preguntaba cuánto tardó esto, y la respuesta a eso es cero.

Así que las dos medidas se diferencian en uno siempre que los dos extremos son días laborables:

Lo que quieresFórmulaLun 3 ago → Lun 10 ago
Días laborables que toca el intervalo=DIAS.LAB(B2;C2;Festivos)6
Días laborables transcurridos=DIAS.LAB(B2;C2;Festivos)-15

El -1 solo es correcto mientras la fecha de inicio sea en sí un día laborable. Registra un ticket a las 22:00 de un sábado y DIAS.LAB cuenta desde el lunes, así que restar uno ahora se queda corto en un día. Eso no es un argumento a favor de una resta más lista; es la razón por la que la sección 5 deja de contar del todo y compara contra una fecha de vencimiento.

🎯 Escenario: Pon =DIAS.LAB(A1;A1) en una celda vacía con cualquier fecha laborable en A1. Devuelve 1, y esa única celda es el desfase entero, demostrado de una forma que puedes enseñarle a alguien en diez segundos. Cambia A1 por un sábado y devuelve 0.


3) El Argumento de Festivos Es Opcional en la Sintaxis y Obligatorio en la Práctica

El tercer argumento es una fecha, un rango de fechas o una matriz de ellas, y toda fecha de esa lista que caiga en día entre semana dentro del intervalo se quita del recuento.

=DIAS.LAB(FECHA(2026;8;24); FECHA(2026;9;1))            → 7
=DIAS.LAB(FECHA(2026;8;24); FECHA(2026;9;1); Festivos)  → 6

Déjalo fuera y Excel no te avisa, porque no hay nada de lo que avisar: una función a la que no se le dan festivos informa correctamente de que no se excluyó ningún festivo. El libro no tiene ninguna opinión sobre en qué país estás, qué oficina observa qué, ni sobre si la lista que le dieron en 2024 sigue siendo cierta.

Esta seguía siendo cierta, hasta que dejó de serlo. El rango con nombre Festivos existía, en una pestaña llamada Ref, y iba del 01/01/2024 al 26/12/2025 — dos años escritos a mano por alguien que ya no está, y nunca ampliados. Tampoco se le pasaba a la fórmula, que es la mitad más embarazosa de la historia y la mitad que hizo invisibles las filas que faltaban: ni siquiera una lista al día puede ayudar a una fórmula que no la referencia.

Cuatro cosas sobre las listas de festivos que conviene saber antes de montar una:

  • Un festivo que cae en fin de semana no resta nada. El 26 de diciembre de 2026 es sábado. Poner 26/12/2026 en la lista no cambia ningún recuento en ninguna parte, porque ese día nunca se contó. Lo que de verdad cierra es el día sustitutorio, el lunes 28 de diciembre de 2026, y esa es la fecha que necesita la lista.
  • El texto que parece una fecha rompe la fórmula entera, y a voces. Pega una lista de festivos de una página web y normalmente obtienes texto alineado a la izquierda en vez de fechas. DIAS.LAB devuelve #¡VALOR! para toda la columna en vez de ignorar la entrada mala en silencio — el único fallo de esta familia que se anuncia.
  • Los duplicados son inofensivos. La misma fecha dos veces en la lista se quita una vez. No hace falta deduplicar antes de usarla.
  • Los huecos también son inofensivos. Un rango sobredimensionado — Ref!$A$2:$A$500 contra 60 festivos reales — lee las celdas vacías como cero, y el número de serie 0 es una fecha de enero de 1900 que queda fuera de cualquier intervalo que vayas a medir nunca. Dimensiona el rango para los próximos cinco años y deja de pensar en ello.

🎯 Escenario: En una celda vacía, =TEXTO(MAX(Festivos);"dd/mm/aaaa"). Ese es el último día que tu libro cree que es festivo. Si está en el pasado, todo recuento que cruce un festivo desde entonces va un día alto, y el informe lleva desviándose exactamente el tiempo que lleva caducada la lista.


4) La Fecha de Resolución en Blanco Que Imprimió "Cumple" con −33.032

Una celda vacía entregada a una función de fecha no es un error ni un vacío. Es cero, y cero es una fecha: el 0 de enero de 1900, el día anterior al comienzo de la era de Excel.

Así que un ticket sin resolver le pide a DIAS.LAB que cuente días laborables desde el 11 de agosto de 2026 hasta el principio del calendario, y la función lo hace, correctamente, en los dos sentidos:

=DIAS.LAB(B2; C2)     ' B2 = 11/08/2026, C2 vacía   → -33032
=SI(D2<=5; "Cumple"; "Incumple")                    → "Cumple"

No hay ninguna regla en Excel que diga que una duración tiene que ser positiva, y no hay ninguna regla en una comparación <= que diga que un número negativo grande es sospechoso. La columna de veredicto se montó para pillar números demasiado grandes. Nada en ella se montó para pillar un número demasiado pequeño, porque hasta que faltó una fecha de resolución, demasiado pequeño no era algo que pudiera pasar.

Este es el fallo que costó más que los 2.400 £. Los tres tickets eran los tres más viejos del libro, y el informe que todo el mundo usaba para decidir qué perseguir decía que estaban hechos.

Dos guardas, y con cualquiera de las dos basta:

=SI(C2=""; "Abierto"; SI(DIAS.LAB(B2;C2;Festivos)-1<=5; "Cumple"; "Incumple"))
=SI(C2=""; ""; DIAS.LAB(B2;C2;Festivos)-1)

Comprueba la entrada, no la salida. Un blanco es un hecho sobre el ticket — no está terminado — y un informe que lo dobla en un número ha tirado ese hecho antes de llegar a ningún veredicto.

🎯 Escenario: =CONTAR.BLANCO(C2:C146) sobre tu columna de fecha final, y =SUMAPRODUCTO(--(D2:D146<0)) sobre tu columna de duración. La primera cuenta las filas que todavía no se pueden medir; la segunda cuenta las filas que se midieron igualmente. Las dos deberían dar cero, y en esta hoja la segunda daba 3.


5) DIA.LAB Es la Otra Mitad de la Pareja, y No Cuenta el Día de Inicio

=DIA.LAB(inicio; días; [festivos]) va en el otro sentido: dale una fecha y un número de días laborables y devuelve la fecha que queda tantos días laborables después, saltándose fines de semana y festivos.

=DIA.LAB(FECHA(2026;8;3); 5; Festivos)    → 10/08/2026
=DIA.LAB(FECHA(2026;8;24); 5; Festivos)   → 01/09/2026

DIA.LAB cuenta hacia delante desde la fecha de inicio sin contarla, que es exactamente la medida que quiere decir el acuerdo y exactamente la medida que DIAS.LAB no te da. Las dos funciones son coherentes entre sí — DIAS.LAB(inicio; DIA.LAB(inicio;5)) da 6 — e incoherentes con la intuición de la otra, que es toda la razón por la que el desfase de uno sobrevive en tantos archivos.

Esa asimetría es un regalo, porque significa que no tienes que volver a razonar sobre la regla de recuento nunca más. Calcula el vencimiento una vez, compara la resolución contra él, y la pregunta ¿cuenta el día de inicio? desaparece dentro de una función que ya la ha respondido:

=DIA.LAB(B2; 5; Festivos)                                → la fecha de vencimiento
=SI(C2=""; "Abierto"; SI(C2<=D2; "Cumple"; "Incumple"))  → el veredicto

Dos cosas más que hace:

  • Maneja una fecha de inicio que no es laborable. Un ticket registrado a las 22:00 del sábado 1 de agosto recibe DIA.LAB(01/08/2026; 5) = viernes 7 de agosto, con el reloj empezando en la práctica el lunes. Sin caso especial, sin SI.
  • Camina hacia atrás con un número negativo. =DIA.LAB(FIN.MES(HOY();0)+1; -3; Festivos) es el antepenúltimo día laborable de este mes — la forma de todo cierre de plazo, remesa de pagos y fecha límite de envío que alguien haya tenido que publicar.

DIA.LAB devuelve un número de serie, así que una celda con formato General muestra 46244 en vez de una fecha. Da formato de fecha a la columna una vez y no vuelve a aparecer.

🎯 Escenario: Añade una columna a tu informe de antigüedad — =DIA.LAB(registro; <tu plazo>; Festivos) — y ordena por ella. Ahora tienes una cola en el orden en que caen de verdad los vencimientos, que no es el orden en que caen las fechas de registro, porque un ticket registrado un viernes por la tarde vence antes que uno registrado el lunes por la mañana aunque haya estado más tiempo en la cola.


6) DIAS.LAB.INTL y DIA.LAB.INTL: Cuando la Semana No Es de Lunes a Viernes

Las dos funciones tienen una hermana .INTL con un argumento extra en tercera posición, antes de los festivos, que dice cuáles son los días de fin de semana.

=DIAS.LAB.INTL(inicio; fin; [fin_de_semana]; [festivos])
=DIA.LAB.INTL(inicio; días; [fin_de_semana]; [festivos])

El argumento de fin de semana admite un código o una cadena:

CódigoFin de semanaCódigoFin de semana
1 u omitidosábado, domingo11solo domingo
2domingo, lunes12solo lunes
3lunes, martes13solo martes
4martes, miércoles14solo miércoles
5miércoles, jueves15solo jueves
6jueves, viernes16solo viernes
7viernes, sábado17solo sábado

La forma de cadena son siete caracteres, empezando en lunes, con 1 para día no laborable:

=DIAS.LAB.INTL(B2; C2; "0000110"; Festivos)   ' libra viernes y sábado
=DIAS.LAB.INTL(B2; C2; "0000011"; Festivos)   ' el sábado y domingo de siempre, escrito
=DIAS.LAB.INTL(B2; C2; "0001011"; Festivos)   ' semana de cuatro días, jueves libre
=DIAS.LAB.INTL(B2; C2; "0000001"; Festivos)   ' semana de seis días, solo domingo

No existe una cadena con siete 1 — una semana sin ningún día laborable devuelve #¡VALOR! en vez de dividir tu calendario por cero.

La cadena es la que conviene usar, porque cubre los casos que los códigos no pueden: un único día no laborable en mitad de la semana, una planta que cierra los miércoles, un turno a tiempo parcial. Y son los mismos siete caracteres en todas las versiones de idioma de Excel, cosa que de un código no está garantizada.

🎯 Escenario: Si alguna parte de tu operación trabaja una semana que no es de lunes a viernes, pon la cadena de fin de semana en una celda al lado de la lista de festivos, no dentro de la fórmula. =DIAS.LAB.INTL(B2;C2;$F$1;Festivos) es una edición cuando cambia el turno; la misma cadena escrita en 400 fórmulas es un buscar-y-reemplazar y un padrenuestro.


7) Las Horas No Son Días, y Casi Todos los Acuerdos Van en Horas

DIAS.LAB tira la parte horaria de los dos argumentos. Un ticket registrado a las 16:55 del lunes y cerrado a las 09:05 del viernes, y otro registrado a las 09:05 del lunes y cerrado a las 16:55 del viernes, devuelven el mismo número, y el segundo tardó dos días laborables completos más que el primero.

Si tus marcas de tiempo llevan hora — y un registro de tickets exportado casi siempre la lleva — estás midiendo fronteras de calendario cruzadas, no trabajo hecho. Esa es una medida legítima, y es la medida en la que están escritos casi todos los contratos, pero conviene saber cuál de las dos tienes.

Cuando el acuerdo va de verdad en horas, cuenta las horas:

=LET(
  ini; B2; fin; C2; horasdia; 7,5; abre; 9/24;
  completos; DIAS.LAB(ini; fin; Festivos) - 2;
  primero;   MEDIANA(0; (abre + horasdia/24 - RESIDUO(ini;1)) * 24; horasdia);
  ultimo;    MEDIANA(0; (RESIDUO(fin;1) - abre) * 24; horasdia);
  completos*horasdia + primero + ultimo
)

Sin LET, lo mismo en tres columnas auxiliares — días laborables intermedios, horas que quedaban el primer día, horas usadas el último — es más claro de auditar y más fácil de explicarle a quien te discuta un número. En cualquier caso, la regla es que la unidad de la fórmula coincida con la unidad del contrato. Un acuerdo de cinco días medido en días y uno de 37,5 horas medido en horas son informes distintos que discreparán exactamente en los tickets por los que la gente discute.

🎯 Escenario: =SUMAPRODUCTO(--(RESIDUO(B2:B146;1)>0)) sobre tu columna de inicio. Si no da cero, tus fechas llevan hora, y todo recuento de días completos del archivo está redondeando el día de alguien hacia arriba o hacia abajo sin decirlo.


8) Una Lista de Festivos Por Calendario, No Una Por Libro

Un servicio que atiende a un cliente británico y a otro irlandés tiene dos calendarios. Coinciden en Navidad y difieren en el primer lunes de junio, y un único rango Festivos aplica en silencio los días libres de un país a los tickets del otro.

Guarda los festivos en una tabla de dos columnas — Fecha y Calendario — y selecciona los correctos por fila:

=DIAS.LAB(B2; C2; FILTRAR(Fest[Fecha]; Fest[Calendario]=$D2))

El argumento de festivos admite una matriz, así que un FILTRAR derramado entra directamente sin nada envolviéndolo. Antes de FILTRAR — Excel 2019 y anteriores — mantén una columna por calendario, una al lado de otra, y apunta a la correcta con INDICE/COINCIDIR sobre la fila de encabezados, o simplemente ten dos rangos con nombre y elige con SI. Lo que no deberías hacer es tener dos libros.

🎯 Escenario: =CONTARA(Fest[Fecha])-CONTAR(Fest[Fecha]) devuelve cuántas entradas de tu tabla de festivos son texto en vez de fechas. Debería ser cero. Cualquier otra respuesta es el #¡VALOR! de la sección 3 esperando a la fila a la que le toque.


9) Una Tabla de Festivos Que No Pueda Caducar en Silencio

La lista que rompió este informe no se rompió. Se acabó. Nada en Excel trata el final de una lista como un acontecimiento, así que mete la comprobación en la hoja:

=SI(MAX(Fest[Fecha]) < FIN.MES(HOY();3);
    "LA LISTA DE FESTIVOS ACABA EL " & TEXTO(MAX(Fest[Fecha]);"dd/mm/aaaa") & " — AMPLÍALA";
    "")

Pon eso en una celda arriba del informe, en rojo, donde quien lo ejecuta tenga que mirarlo. Tres meses de margen dan para arreglarlo con calma y son pocos como para que nadie lo ignore durante un año.

Los festivos de fecha fija se pueden generar en vez de escribirlos, incluida la regla del día sustitutorio que pilla a la gente:

=FECHA(A2;12;25)                                        ' Navidad, caiga en el día que caiga
=DIA.LAB(FECHA(A2;12;25)-1; 1)                          ' el día en que se observa de verdad
=FECHA(A2;5;1) + RESIDUO(8-DIASEM(FECHA(A2;5;1);2);7)   ' primer lunes de mayo
=FECHA(A2;6;1) - RESIDUO(DIASEM(FECHA(A2;6;1);2)-2;7)-1 ' último lunes de mayo
=FECHA(A2;9;1) - RESIDUO(DIASEM(FECHA(A2;9;1);2)-2;7)-1 ' último lunes de agosto

La Pascua no es una fórmula de una línea de la que nadie deba fiarse, y los festivos que se mueven con ella — Viernes Santo el 3 de abril de 2026, Lunes de Pascua el día 6 — se escriben a mano. Igual que todo lo discrecional: el día entre Navidad y Año Nuevo que cierra tu oficina y el calendario oficial no.

🎯 Escenario: Pon el año en una columna y las fechas generadas al lado, cinco años hacia delante, y compáralas una vez contra la lista publicada por tu administración. A partir de ahí las únicas filas que alguien mantiene a mano son la Pascua y los cierres propios de la empresa — unas cuatro celdas al año.


10) El Informe, Reconstruido en Cuatro Columnas

D2:  =DIA.LAB(B2; 5; Fest[Fecha])                                    ' vencimiento
E2:  =SI(C2=""; SI(HOY()>D2; "Incumplido — sigue abierto"; "Abierto");
        SI(C2<=D2; "Cumple"; "Incumple"))                            ' veredicto
F2:  =SI(C2=""; ""; DIAS.LAB(B2; C2; Fest[Fecha]) - 1)               ' días laborables tardados
G2:  =SI(C2=""; MAX(0; DIAS.LAB(D2;HOY();Fest[Fecha]) - 1); "")      ' días laborables de retraso

O en una sola celda, si tienes LET:

=LET(
  registro; B2; resuelto; C2;
  vence; DIA.LAB(registro; 5; Fest[Fecha]);
  SI(resuelto="";
     SI(HOY()>vence; "Incumplido — abierto " & DIAS.LAB(vence;HOY();Fest[Fecha])-1 & "d"; "Abierto");
     SI(resuelto<=vence; "Cumple"; "Incumplido por " & DIAS.LAB(vence;resuelto;Fest[Fecha])-1 & "d"))
)

Lo que ha cambiado no es la aritmética. Es que el veredicto sale ahora de una comparación de fechas en vez de un recuento, así que la regla de recuento no se puede equivocar; el vencimiento lo calcula la función cuyo trabajo son los vencimientos; los festivos se nombran en todas las fórmulas que tocan un calendario; y un ticket sin resolver es un estado que el informe entiende en vez de una celda vacía que convierte en silencio a 1900.

Pásalo sobre agosto y devuelve 20 incumplimientos, 3 de ellos todavía abiertos, y una tasa del 13,79%.

🎯 Escenario: Reconstruye un mes que ya hayas informado, en una copia, con la versión de fecha de vencimiento. Si las dos discrepan, la discrepancia es la lista de todas las filas por las que alguna vez se discutió, y suele ser lo bastante corta para revisarla a mano y lo bastante larga para que merezca la tarde.


11) Cinco Comprobaciones de Una Celda

  1. ¿El recuento es inclusivo? =DIAS.LAB(A1;A1) con una fecha laborable en A1. Devuelve 1. Si tu informe trata eso como un día tardado, todas sus duraciones van una de más.
  2. ¿Se ha acabado la lista de festivos? =TEXTO(MAX(Fest[Fecha]);"dd/mm/aaaa"). Compárala con la última fecha de tus datos. Esta decía 26/12/2025 contra un informe de agosto de 2026.
  3. ¿Se está midiendo algo al revés? =SUMAPRODUCTO(--(DIAS.LAB(B2:B146;C2:C146;Fest[Fecha])<0)). Cuenta las filas donde la fecha final precede a la inicial, huecos incluidos. Daba 3, debería dar 0.
  4. ¿Llegan los festivos a las fórmulas? =DIAS.LAB(FECHA(2026;8;28);FECHA(2026;9;1);Fest[Fecha]). Devuelve 2 si el festivo de agosto está en la lista y llega a la función, y 3 si no. Sirve cualquier fecha que sepas que es festiva.
  5. ¿Coinciden dos caminos? =CONTAR.SI(E2:E146;"Incumple") contra =SUMAPRODUCTO(--(C2:C146>D2:D146)*(C2:C146<>"")). La columna de veredicto y la comparación cruda deberían dar el mismo número. Cuando no lo dan, la cadena de SI tiene un caso que nadie diseñó.

12) Doce Trampas

  1. DIAS.LAB incluye los dos extremos. El mismo día es 1, no 0, y de lunes al lunes siguiente es 6, no 5. Resta uno, o deja de contar y compara contra un vencimiento de DIA.LAB.
  2. DIA.LAB excluye el día de inicio. La pareja no es simétrica, y por eso mezclarlas en un mismo informe produce dos definiciones de "cinco días" en columnas contiguas.
  3. El argumento de festivos es opcional y su ausencia es invisible. Sin error, sin marca, sin color — solo recuentos altos exactamente en el número de festivos que abarcan tus datos.
  4. Una lista de festivos tiene una última fila. No caduca, no avisa, no falla; simplemente deja de ser cierta, y el informe sigue imprimiendo.
  5. Un festivo en fin de semana no hace nada. Excel ya se lo había saltado. El día sustitutorio entre semana es la fecha que tiene que estar en la lista.
  6. Una fecha final en blanco es el 0 de enero de 1900, así que algo sin terminar devuelve un negativo de cinco cifras y pasa todas las pruebas de "por debajo del límite" del archivo.
  7. Las fechas en texto devuelven #¡VALOR! para la fórmula entera, incluida una sola entrada de texto enterrada en un rango de festivos por lo demás limpio.
  8. Las horas se tiran en silencio. De las 16:55 del lunes a las 09:05 del viernes y de las 09:05 del lunes a las 16:55 del viernes cuentan igual.
  9. El argumento de fin de semana va en tercera posición en las .INTL, donde van los festivos en la versión normal. =DIAS.LAB.INTL(B2;C2;Festivos) lee tu rango de festivos como un código de fin de semana.
  10. Una cadena de fin de semana son siete caracteres empezando en lunes, y "0000011" es el fin de semana normal. Ponerla del revés produce una semana laboral de sábado y domingo, que cuenta alrededor del 40% de lo que esperabas y no da error nunca.
  11. HOY() es volátil. Un informe de días de retraso recalcula cada vez que se abre el archivo, así que la copia guardada del mes pasado no dice lo que decía cuando se envió. Pega las columnas de antigüedad como valores antes de archivar.
  12. DIA.LAB devuelve un número de serie. Una columna de vencimientos sin formato llena de 46244 es la única trampa de esta lista que se nota al instante, lo que la convierte en la más barata.

Nadie en esta historia hizo nada descabellado. =DIAS.LAB(B2;C2) es lo que ofrece el explorador de funciones cuando escribes días laborables, la forma de dos argumentos es la que enseña primero cualquier tutorial, y contar días es la manera obvia de responder a una pregunta sobre un número de días. La lista de festivos la montó alguien lo bastante concienzudo como para montar una lista de festivos. La columna de veredicto se escribió para pillar tickets que tardaban demasiado, y los pilló.

Lo que lo hizo caro es que los tres fallos empujan el número en la dirección que parece una mala noticia. Un recuento inclusivo sale alto. Un festivo que falta sale alto. Un informe que dice que tu equipo falla más de lo que falla se escala, se investiga y se paga — y todas esas respuestas tratan el número como un suelo en vez de como una pregunta. El único fallo que empujaba en el otro sentido era invisible por construcción, porque los tickets que escondía eran los que se informaban como terminados, y nadie audita las filas que pasaron.

Así que la disciplina es pequeña, y son tres costumbres. Calcular el vencimiento con DIA.LAB en vez de contar días con DIAS.LAB, para que la función que conoce la regla de recuento sea la que la aplica. Nombrar un rango de festivos, pasárselo a todas las fórmulas que tocan un calendario, y poner una celda arriba del informe que se ponga roja tres meses antes de que la lista se acabe. Y comprobar las entradas antes que el veredicto — una fecha final en blanco es un estado, no un cero, y en cuanto a un informe se le permite convertir sin terminar en un número, las peores filas del archivo son las que va a esconder.

Comparte este artículo:
Volver al Blog