Menuda tarea me ha encargado un lector, a este ejercicio no lo había realizado nunca. Y la verdad que no deja de ser un muy buen planteamiento: como bien adelanta el título de la entrada, el necesita determinar que día obedece al primer sábado de cada mes. Desea ingresar el mes y el año y que mi función le devuelva en que número de día cayó (o caerá) el primer sábado de ese mes. Y no es tan sencillo como parece a primera vista; después de todo, solo tengo dos datos: Mes y Año ¿como lo hacemos?
en una celda el mes, en otra el año.. y al final el resultado: exactamente, el primer sábado del mes de enero de 2011 cayó un día primero.
[+/-] Ver el resto / OcultarSi probamos a futuro, vemos que el primer sábado de noviembre/2011 caerá 5:
Mi solución viene por el lado de las funciones matriciales. Y, como casi siempre en estos casos, serán varias funciones anidadas, para evitar el uso de celdas auxiliares.
Creo conveniente hacer un buen "paso a paso" y así ir aprendiendo correctamente que es lo que se hace, entendiéndolo desde el principio.
Afortunadamente la semana tiene un número fijo de días: 7. Esto parece un dato menor y demasiado obvio, pero que nos simplificará las cosas, ya que tenemos un buen punto de partida. Dentro de los primeros 7 días de la semana (de cualquier mes, de cualquier año) se encuentra nuestro primer sábado.
Excel posee la función =DIASEM(fecha, [tipo]), la cual nos retorna un número de 1 a 7 que identifica el día de la semana (del lunes al domingo, si el argumento [tipo] es 2). Entonces, si pongo en A1:A7 desde el primero de mes en adelante y en B1:B7 ingreso la función antes descripta, obtendré este resultado:
Bien: el 01/11/2011 caerá martes, el 02 miércoles y así sucesivamente. Nosotros estamos interesados en ese 6, que representa nuestro buscado primer sábado del mes. Pueden buscar en la ayuda de Excel sobre el segundo argumento, opcinal, [tipo], dado que el resultado variará de acuerdo a el. Para este caso uso 2, que hace al lunes el primer día de la semana (1) y al domingo, el último (7). De allí que nuestra guía sea 6, es decir en un lenguaje mas humano, sábado.
Si sigo con el ejemplo anterior, deberé utilizar tres o cuatro columnas auxiliares. Solo lo expuse para mostrar claramente como funciona DIASEM(). Recordemos que esto se llevará a cabo con funciones matriciales, así que de ahora en mas razonaremos de esa forma. Las matriciales me permiten armar un "rango virtual", recorrerlo y extraer el dato que necesito. Miren esto:
En la imagen anterior se aprecia como armé una matriz Verdadero / Falso. La función dice: =DIASEM(A1;2)=6. O sea que pregunta: ¿el día de la semana correspondiente a la celda A1 es = 6 (sábado)? En caso afirmativo, el resultado será VERDADERO. El 05/11/2011 es sábado.
Hemos visto, en otras entradas del blog, que VERDADERO es igual a 1 y FALSO es igual a 0, lo cual me permite utilizarlos en operaciones matemáticas, como si fuesen números. Y eso es lo que haré en la columna C:
Sencillo: en todo el rango B hay un solo 1, los demás son ceros. Si multiplico las celdas de B por su número de fila, obtendré un resultado mayor a cero únicamente en el lugar en donde se encuentra el VERDADERO, o sea, el sábado (6). Todo número multiplicado por 0 tiene como resultado (afortunadamente) 0, así que tema resuelto. Ya tengo en mis manos la posición dentro del rango del dato que busco.
Siguiendo con el paso a paso, me resta identificar ese valor en otra celda:
con Max() identifico y aislo claramente el resultado obtenido.
Ya sé que mi sábado está en la quinta posición dentro de la matriz, de ahora en mas será muy sencillo obtener la fecha en cuestión:
Ahá, vamos a darle un formato apropiado, ya que a nuestro usuarios poco les interesará saber que transcurrieron 40852 días desde el 01/01/1900 hasta el 05/11/2011. Podemos personalizar bastante la fecha:
Obteniendo un resultado visual mas acorde:
Hemos utilizado 5 columnas para llegar a la solución final. El primer sábado del mes de Noviembre del año 2011 cae 05/11. Ahora empezaremos a anidar funciones y luego "cerrarlas" con un "ctrol + alt + enter" para convertirlas en matriciales. Aquí una cuestión: son mas difíciles de comprender, pero ahorran espacio "a lo loco", como decimos en Argentina. En una sola celda resuelvo lo que, sin ellas, me lleva 3 columnas de 7 filas cada una, mas dos celdas auxiliares. Si, la diferencia es enorme.
Utilizaremos solamente el rango A1:A7, para armar automáticamente los primeros 7 días de la semana, en base al mes y año ingresados por el usuario. Esto se logra:
en B10 el mes, en B11 el año. Al día lo formo con el número de fila, para que al copiar y pegar hacia abajo se autocomplete del 1 al 7.
Y luego solo nos resta poner en B12 la función:
{=INDICE(A1:A7;MAX((DIASEM(A1:A7;2)=6)*FILA(A1:A7)))}
Analicemos un poco.
=INDICE(A1:A7;MAX((DIASEM(A1:A7;2)=6)*FILA(A1:A7)))
Casi se podría decir que está todo ordenado "al revés" de lo expuesto en el ejemplo del "paso a paso".
A la función INDICE() le paso como primer argumento la matriz (rango) en donde se encuentran las fechas... después "levanto" en el aire la matriz VERDADERO / FALSO y la multiplico el número de fila respectivo. Ya vimos que (en este ejemplo) el único valor mayor a cero es 5, dato que extraigo con MAX().
Hay que hacer hincapié en el hecho de que una matricial funciona, a grosso modo, como un bucle For...Next o Do While de Visual Basic. Le pasamos un rango y lo recorre elemento x elemento. Aquí va "mirando" cada una de las celdas de A1:A7 y se fija se el día de esa fecha es igual a 6, lo que produce nuestros FALSOS o VERDADERO, multiplicándolos por el nro de fila. De allí surge nuestro 5, que extraemos con MAX(). Y al resultado de todo eso lo usamos como segundo argumento de INDICE(), para indicar la posición de la fecha buscada dentro de la matriz.
No es un tema sencillo de aprender... y bastante difícil de explicar. Pero con práctica todo se puede; como dice un gran amigo: "si lo puedo hacer yo.....", en clara alusión a que es un trabajo que cualquiera es capaz de realizar. Requiere un poco de paciencia y constancia, pero los resultados valen la pena.
Aquí les dejo el link al archivo.
Suerte y cualquier duda, me avisan.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Funciones
Etiquetas:
Funciones
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Hola cómo estás?
ResponderEliminarMi nombre es Oscar y quisiera saber si me puedes ayudar con algo.
Resulta que intento calcular los días hábiles del mes actual (fecha del sistema), tomando como días hábiles de Lunes a Sábado, pero descontando los días festivos que indicaría con un número en otra celda (P.Ej. 2) con una lista desplegable en la que elija los festivos del mes que corre.
Por último quiero mostrar el mes actual en otra celda, pero devolviendo el nombre. Lo intenté usando la función: =MES(HOY()) y personalizando el formato con: mmmm pero siempre me muestra Enero como el mes actual, sin importar que número devuelve la función.
Te agradezco si me puedes ayudar.
hola oscar, gracias por tu mensaje.
ResponderEliminarempiezo al revés, por la segunda consulta:
en la celda debes poner solamente la fecha actual:
=HOY() y desde formato/celdas/número, seleccionas la opción "personalizada" y pones: "mmmm" (sin comillas) para que te aparezca el nombre del mes completo. No funciona con =MES(HOY()), solamente debe ir =HOY(), con el formato que te indiqué.
si podes pasarme algún ejemplo de la primer pregunta (sobre los días festivos) mejor, preferentemente algo que tengas hecho, a la dirección de correo electrónico que está al pié del formulario. por ahí tenes una planilla con algunos pasos realizados, y me doy cuenta mejor sobre tu necesidad.
quedo al aguardo de tus noticias.
Quiero saber si me puedes orientar para automatizar un proceso que realizo con gráficos de barras.
ResponderEliminarConsiste en que el relleno de las columnas (barras) de dicho gráfico cambie de acuerdo a unas condiciones o reglas creadas en la tabla que sirve de datos de origen para dicho gráfico. Este relleno es de tipo imágen, por lo que se hace más complejo porque el origen de la imágen es el disco del equipo (PC), ¿Podría tal ves hacerse con las imágenes que están dentro de la misma hoja de cálculo en la tabla de convecciones?
Gracias!
Oscar: te dejo el link a la entrada que levanté con tu consulta.
ResponderEliminarhttp://damianexcel.blogspot.com/2011/06/imagenes-de-relleno-en-graficos.html
Avisame que tal te fué.
saludos.xls
Formula que calcula en que fecha cae el 1ro, 2do, 3ro o 4to sabado del mes (sin funciones matriciales)
ResponderEliminar=SI(DIASEM(VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())));1)=1;VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())))+6+(C3-1)*7;SI(DIASEM(VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())));1)=2;VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())))+5+(C3-1)*7;SI(DIASEM(VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())));1)=3;VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())))+4+(C3-1)*7;SI(DIASEM(VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())));1)=4;VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())))+3+(C3-1)*7;SI(DIASEM(VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())));1)=5;VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())))+2+(C3-1)*7;SI(DIASEM(VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())));1)=6;VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())))+1+(C3-1)*7;VALFECHA(CONCATENAR("01 ";$B$1;" ";AÑO(HOY())))+(C3-1)*7))))))
Si bien calcula el 5to sabado tambien, no advierte cuando el mes solo tiene 4 sabados.
En B1 va el mes en cuestion en formato texto (marzo o mar por ejemplo) y en C3 va el numero de sabado que queremos averiguar (1, 2, 3, 4 o 5).
Siempre trabaja sobre el año actual, aunque es posible modificarla para que se pueda elegir otro año, en ese caso cambiar todas las instancias donde dice AÑO(HOY()) por la referencia a la celda que contiene el numero de año (en formato numero o general)
Perfecto !!! Muchas gracias por tu aporte.
ResponderEliminarSalud2.xlsx