Un lector necesita tener en su planilla de cálculos un almanaque que le muestre 6 meses. Si, como esos que generalmente las empresas o comercios regalan a su clientela, y que nosotros tan contentos colgamos de la pared o heladera. Esto también, al igual que siempre, tiene muchas formas de ser resuelto. Ya hablé en otras entradas sobre el control calendario (activeX), el cual puede ser inserto en nuestra hoja y de allí seleccionar la fecha que necesitemos. Una de las posibles soluciones sería colocar 6 de estos controles y listo. Pero habrá que ver si nuestro proyecto soporta este tipo de objetos, cosa que se complica si el archivo será utilizado en distintos ordenadores.
crearemos un calendario similar, solo con funciones.
[+/-] Ver el resto / OcultarDescartamos, entonces, los controles ActiveX. Dado que no recurriremos a objetos de VBA, nos resta entonces echar mano a las funciones. Y ahora el tema se abre en dos: las fórmulas de Excel (que en este caso son matriciales) o las UDF (funciones definidas por el usuario, que se programan desde VBA). Voy a inclinarme por la segunda, dado que con muy poco código de Visual Basic lograremos nuestro cometido; en cambio esas matriciales de las que hablé son complicadas y quisiera que esta entrada sea esclarecedora y no un montón de fórmulas anidadas de difícil compresión. Igualmente, el tema queda abierto y si alguno necesita de ese ejemplo en particular solo debe avisarme.
Empezaremos por el final: les muestro como quedará nuestro trabajo:
Analicemos la imagen: En la celda I2 tengo la función =FECHA(C4;C2;1). Estoy es muy sencillo: armo la fecha con el año y el mes que el usuario ingresa en C4 y C2, respectivamente. Siempre como día (último argumento de la función) utilizo el valor 1 (uno), ya que para armar mi calendario necesito contar con el primer día del mes. Así, el valor final obtenido es 01/04/2011, el cual usaré en mi UDF.
A partir de la fila 6 comienza nuestro calendario. Si me posiciono sobre una celda del mismo veré que la función es:
{=calendario_damiansilva(I2)}
Hasta donde yo sé.... Excel no cuenta con ninguna función (ni creo que lo haga) llamada "calendario_damiansilva()". Estimo, aproximadamente, como una probabilidad de 0,2 en 1.000.000.000.000.000.000.000.000 que la gente de Microsoft sepa de mi existencia. Y muy a pesar de esos malagradecidos de Redmond... ahí estoy. =)
Vamos al editor de visual basic (alt + f11), insertamos un módulo, pegando allí el siguiente código:
Public Function Calendario_DamianSilva(fecha) 'dimensionamos la matriz con la cual trabajaremos Dim Aux(6, 7) 'ante la menor duda, consulte a su médico: por eso 'vacío (por las dudas) la matriz: For i = 0 To 5 For j = 0 To 6 Aux(i, j) = "" Next j Next i 'tomo el mes y año del argumento "fecha" mes = Month(fecha) anio = Year(fecha) 'ahora calculo el primer y ultimo día del mes: primero = Weekday(DateSerial(anio, mes, 1)) ultimo = Day(DateSerial(anio, mes + 1, 1) - 1) fila = 0 columna = primero - 1 'y listo, con un bucle voy incrementando los 'números de los días. vean el condicional: 'si la columna = 7 (es decir, que llegué al 'fin de la semana) la vuelvo a 0 y aumento 'el nro de fila: For j = 1 To ultimo Aux(fila, columna) = j columna = columna + 1 If columna = 7 Then fila = fila + 1 columna = 0 End If Next j 'retorno el valor de la función: Calendario_DamianSilva = Aux End Function
Con lo anterior nos aseguramos de que la función "Calendario_DamianSilva(fecha)" es ahora parte de la batería de herramientas de Excel. Seleccionamos ahora el área del calendario, en la planilla, de esta forma:
dejando activa la primer celda. Presionamos F2 (para ingresar en el modo "edición") e ingresamos:
=Calendario_DamianSilva(fecha)
Para finalizar, y recordando que es una función matricial, presionamos "Ctrol + Alt + Enter". Terminamos, ya que Excel se encargará de rellenar toda la selección.
Si cambio abril por enero, por ejemplo, toda la información se actualiza automaticamente:
si, mi cumpleaños cayó un miércoles este 2001. todo funciona correctamente.
Para "profesionalizar" este calendario, podríamos solicitar al usuario que nos ingrese el día, y resaltarlo en el almanaque mediante la herramienta "formato condicional":
si $C$2 tiene algún valor y dicho valor coincide con B10 (noten que a B10 lo referencié de forma "relativa", no "absoluta" ($) ), entonces el formato condicional se aplicará. Luego copio B10 y voy a Pegado Especial /Formato, pegándolo en el resto del calendario.
¿Funciona? Si.
El código en VBA que mas arriba les dejé es el "básico básico" para crear un calendario mediante una UDF. Se le pueden realizar muchas mejoras: que tome un segundo argumento (opcional, preferentemente) con feriados o fechas que nuestro proyecto debe resaltar u omitir, agregar la funcionalidad de que se adapte a otros usos y costumbres: imaginen que este ejemplo no servirá de mucho a un egipcio, sirio o israelita (por mencionar algunos), ya que respetan otros días como fines de semana
Ya estaba cerrando el post sin la solución final para mi lector. El necesita visualizar 6 meses:
Al cambiar el mes / año respectivo, los meses subsiguientes también se modifican solos:
Es sencillo de lograr, si a la fecha creada le sumamos la cantidad de meses que deseamos armar. Les dejo el link al archivo, en el cual podrán visualizar una hoja auxiliar que diseñé para llegar a esos 6 meses.
Suerte y cualquier duda o consulta la resolvemos.- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Funciones
Etiquetas:
Funciones
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Hola, tengo Excel 2007 y armé un calendario para registrar las vacaciones, y lo que hago es ingresar la fecha de inicio de vacaciones, luego la fecha final, y finalmente coloreo cada celda que se corresponde con las fechas ingresadas. Hay alguna función que automatice esta parte (la de colorear las casillas de los días de vacaciones)??? Desde ya muchas gracias. Raúl - rabel01@gmail.com
ResponderEliminarte dejo un archivo con el link al post que levanté con tu consulta:
ResponderEliminarhttp://damianexcel.blogspot.com/2011/12/colorear-fechas-con-formato-condicional.html
cualquier cosa me avisas.
gracias x tu mensaje
buenas tardes apoyandome en tu excelente funcion realice esta macro para obtener un calendario del año completo solo tienes que seleccionar la celda d5 y corres la macro lo que faltaria es agregar el formato deseado al calendario
ResponderEliminarSub calendario2()
Dim i As Integer
Dim fecha As Date
Dim aumento As Integer
Dim s As Integer
Dim contador
s = 1
'tomo la fecha inicial de cualquier año
fecha1 = CDate(InputBox("ingrese la fecha, bajo el formato dd/mm/aaaa, Ejemplo: 01/12/2012 "))
'con un bucle recorro todos los meses del año inicio en 0 para que tome el mes de la fecha que le_
'anexamos al principio
contador = 0
For aumento = 0 To 11
contador = contador + 1
fecha2 = DateSerial(Year(fecha1), Month(fecha1) + aumento, Day(fecha1))
' voy aumentando un mes a la fecha inicial
fecha = DateSerial(Year(fecha2), Month(fecha2), Day(fecha2))
'para quenos quede la fecha a utilizar en la macro
año = Year(fecha) ' tomo el año de la fecha
mes = Month(fecha) ' tomo el mes de la fecha
inicio = Weekday(DateSerial(año, mes, 1), vbMonday) ' el dia inicial tomando en cuanta para mi gusto que lunes es el primer dia de la semana
fin = Day(DateSerial(año, mes + 1, 1) - 1)
j = 1 ' primer dia del mes
p = inicio ' de lun a vier que colocamos el valor de los dia dependiendo del mes
For x = 1 To fin
ActiveCell.Offset(j - 1, p - 1) = x
ActiveCell.Offset(-2, 0).Value = DateSerial(año, mes, 1)
ActiveCell.Offset(-2, 0).NumberFormat = "mmmm-yyyy"
ActiveCell.Offset(-2, 0).Interior.ColorIndex = Int(Rnd * 55) + 1
ActiveCell.Offset(-1, 0).Value = "Lu"
ActiveCell.Offset(-1, 1).Value = "Ma"
ActiveCell.Offset(-1, 2).Value = "Mi"
ActiveCell.Offset(-1, 3).Value = "Ju"
ActiveCell.Offset(-1, 4).Value = "Vi"
ActiveCell.Offset(-1, 5).Value = "Sá"
ActiveCell.Offset(-1, 6).Value = "Do"
If p = 7 Then
p = 0
j = j + 1
End If
p = p + 1
Next
ActiveCell.Offset(0, 9).Select
If contador = 3 Or contador = 6 Or contador = 9 Or contador = 12 Then
ActiveCell.Offset(9, -27).Select
End If
Next
End Sub
¿que formato necesitas aplicar?
ResponderEliminar