lunes, 15 de abril de 2013

Obtener Número de semana dentro de un mes para una fecha dada. La función NUM.SEMANA.

Todos conocemos la función NUM.SEMANA que nos devuelve el número de semana para un día cualquiera del año, un valor entre 1 y 52 (número de semanas total del año). Es una función bastante sencilla, ya que sólo requiere dos argumentos:
=NUM.DE.SEMANA(núm_de_serie;[tipo_de_devolución])
siendo el segundo argumento con el que indicamos en qué día empieza la semana (lunes, martes, etc).


La misión de hoy va algo más lejos, ya que no queremos concoer el número de semana respecto al total del año, si no el número de semana correspondiente dentro de un mes... es decir, cada mes, tendrá un valor de 1,2,3,4,5 o incluso 6 semanas.
Para disponer de un ejemplo, y poder comprobar nuestro cálculo, recuperaremos una macro explicada en este blog tiempo atrás (ver como construir un calendario con macros).
Si bien he realizado una mínima corrección para comenzar las semanas de los meses en Lunes (contante vbMonday). Y esto es lo que conseguimos:

Obtener Número de semana dentro de un mes para una fecha dada. La función NUM.SEMANA.



Por verificar lo que buscamos. Si nos fijamos en el mes de diciembre de 2013, vemos que el mes comienza el 01/12/2013, Domingo; esta sería la semana 1 del mes, y el 31/12/2013, Martes correspondería a la semana 6 del mes.

Con este aspecto claro, vamos a ver nuestra fórmula, calculada sobre cualquier día entre el 01/01/2013 y 31/12/2013, logrado con una función =ALEATORIO.ENTRE("01/01/2013";"31/12/2013"), que hemos colocado en al celda AB3. Nuestra fórmula en AC3 es:
=NUM.DE.SEMANA(AB3;2)-NUM.DE.SEMANA(FIN.MES(AB3;-1)+1;2)+1

Obtener Número de semana dentro de un mes para una fecha dada. La función NUM.SEMANA.
haz clic en la imagen


Podemos actualizar la hoja cuantas veces queramos y comprobar como efectivamente la fórmula es correcta...

Pasamos a explicarla en detalle. Comenzaremos por la parte más profunda:
FIN.MES(AB3;-1)+1
con esta función obtenemos, primero, el último día del mes anterior al de la fecha de estudio, al que sumando +1 posteriormente, obviamente logramos el primer día del mes de la fecha a analizar.

Con la fecha primero de mes anidada en la función NUM.SEMANA logramos entonces el número de semana absoluto (de 1 a 52) en que comienza el mes al que corresponde la fecha a estudiar.
NUM.DE.SEMANA(FIN.MES(AB3;-1)+1;2)

Si este valor lo restamos de la semana absoluta de la fecha de estudio:
NUM.DE.SEMANA(AB3;2)
por diferencias tendríamos el valor dentro del mes.. sólo hace falta un ajuste a la fórmula, sumándo +1 a esa diferencia tendremos el valor exacto.
=NUM.DE.SEMANA(AB3;2)-NUM.DE.SEMANA(FIN.MES(AB3;-1)+1;2)+1

5 comentarios:

  1. Excelente!!! Estaba tratando de realizar para unos reportes de la gestión semanal de la empresa en la que trabajo, muy buen foro...

    ResponderEliminar
  2. genial gracias justo lo que necesitaba!

    ResponderEliminar
  3. hola en el caso del calendario de diciembre tiene 6 semanas, como hago para que en el calculo me redondee a 4 semanas. gracias

    ResponderEliminar
    Respuestas
    1. Hola Osval,
      y cómo sería ese redondeo que comentas??...
      en el caso del año del ejemplo (2013).
      qué días serían la semana 1, y la 2, y la 3 y la 4??

      El resto de los meses del año también se debe redondear a meses de 4 semanas??

      Ten en cuenta que los años y los meses son como son, con 4,5 o 6 semanas... cualquier alteración a esto supone una nueva definición de qué entendemos por semanas/meses

      Saludos

      Eliminar