viernes, 1 de junio de 2012

VBA: Macro para conseguir un Calendario en Excel.

Un lector del blog, Luís García, tuvo a bien enviarme una macro de Excel para realizar un calendario completo del año en tres columnas y 4 filas, que ha desarrollado basándose en una funcion matricial para realizar un mes especifico realizada por Damian Silva.
Realmente me ha parecido interesante, por lo que agregándole dos cosillas sin importancia, he decidido compartirlo con todos.

Insertaremos en un módulo del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel:

Sub calendario3()
Dim i As Integer
Dim fecha As Date
Dim aumento As Integer
Dim s As Integer
Dim contador
Range("B4").Select
Application.ScreenUpdating = False

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
' el dia inicial tomando en cuanta para mi gusto que lunes es el primer dia de la semana
inicio = Weekday(DateSerial(año, mes, 1), vbSunday)
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 = "Do"
    ActiveCell.Offset(-1, 1).Value = "Lu"
    ActiveCell.Offset(-1, 2).Value = "Ma"
    ActiveCell.Offset(-1, 3).Value = "Mi"
    ActiveCell.Offset(-1, 4).Value = "Ju"
    ActiveCell.Offset(-1, 5).Value = "Vi"
    ActiveCell.Offset(-1, 6).Value = "Sá"
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
Application.ScreenUpdating = True
End Sub


el funcionamiento es 'sencillo', pregunta a través de un INPUTBOX la fecha desde donde queremos comience el calendario, y tras todo el proceso de cálculo, traslada a la Hoja de Excel, a partir de la celda B4, la cabecera de mes y día de la semana, y los días del mes correspondientes.
El resultado de ejecutar esta macro la podemos ver en la siguiente imagen:

VBA: Macro para conseguir un Calendario en Excel.

1 comentario:

  1. hola:

    No consigo que lo obtenido con year(fecha1) se grabe en una celda de una hoja.

    Por ejemplo:

    añoanterior = Year(Hoja1.Cells(1, 2))

    Hoja4.Cells(1, 3) = añoanterior

    Lo he probado con y sin variable auxiliar, y nada. Pero si creo un msgbox(añoanterior) se visualiza correctamente.

    ¿qué falta?

    Muchas gracias.

    ResponderEliminar