-
Sub Crea_Calendario()
-
-
' Desprotege la hoja si tienes un calendario previo para prevenir el error.
-
ActiveSheet.Protect DrawingObjects:=False, Contents:=False, _
-
Scenarios:=False
-
'Previene el parpadeo de la ventana mientras se crea el calendario.
-
Application.ScreenUpdating = False
-
' Control de errores.
-
On Error GoTo MyErrorTrap
-
' Limpia el area a1:g14 incluyendo cualquier calendario previo.
-
Range("a1:g14").Clear
-
' Usa un InputBox para pedir el mes y año deseado y ponerlo en la variable MyInput.
-
MyInput = InputBox("Escribe el mes y el año para el calendario en formato 01/2008 ")
-
' Permite al usuario terminar la macro Cancelando el InputBox.
-
If MyInput = "" Then Exit Sub
-
' Coge el valor del día del comienzo del mes.
-
StartDay = DateValue(MyInput)
-
If Day(StartDay) <> 1 Then
-
StartDay = DateValue(Month(StartDay) & "/1/" & _
-
Year(StartDay))
-
End If
-
Range("a1").NumberFormat = "mmmm yyyy"
-
' Formatea el mes y el año.
-
With Range("a1:g1")
-
.HorizontalAlignment = xlCenterAcrossSelection
-
.VerticalAlignment = xlCenter
-
.Font.Size = 18
-
.Font.Bold = True
-
.RowHeight = 35
-
End With
-
' Formatea los días de la semana.
-
With Range("a2:g2")
-
.ColumnWidth = 18
-
.VerticalAlignment = xlCenter
-
.HorizontalAlignment = xlCenter
-
.VerticalAlignment = xlCenter
-
.Orientation = xlHorizontal
-
.Font.Size = 12
-
.Font.Bold = True
-
.RowHeight = 20
-
End With
-
' Pone los días de la semana en a2:g2.
-
Range("a2") = "Lunes"
-
Range("b2") = "Martes"
-
Range("c2") = "Miercoles"
-
Range("d2") = "Jueves"
-
Range("e2") = "Viernes"
-
Range("f2") = "Sabado"
-
Range("g2") = "Domingo"
-
' Formatea las celdas a3:g7 para los días.
-
With Range("a3:g8")
-
.HorizontalAlignment = xlRight
-
.VerticalAlignment = xlTop
-
.Font.Size = 18
-
.Font.Bold = True
-
.RowHeight = 21
-
End With
-
' Pone el mes y año indicado en la variable MyInput en "a1".
-
Range("a1").Value = Application.Text(MyInput, "mmmm yyyy")
-
' Pone la variable y coge el dia de la semana en el que el mes empieza.
-
DayofWeek = Weekday(StartDay)
-
' Separa las variables de mes y año en dos variables
-
CurYear = Year(StartDay)
-
CurMonth = Month(StartDay)
-
' Calcula el primer día del mes siguiente.
-
FinalDay = DateSerial(CurYear, CurMonth + 1, 1)
-
' Pone un "1" en la celda del primer día del mes escogido
-
Select Case DayofWeek
-
Case 1
-
Range("g3").Value = 1 ' g3 porque empieza por domingo
-
Case 2
-
Range("a3").Value = 1
-
Case 3
-
Range("b3").Value = 1
-
Case 4
-
Range("c3").Value = 1
-
Case 5
-
Range("d3").Value = 1
-
Case 6
-
Range("e3").Value = 1
-
Case 7
-
Range("f3").Value = 1
-
End Select
-
' Loop para el rango a3:g8 incrementando en 1 a partir del primer "1".
-
For Each cell In Range("a3:g8")
-
RowCell = cell.Row
-
ColCell = cell.Column
-
' Si "1" está en la primera columna.
-
If cell.Column = 1 And cell.Row = 3 Then
-
' Si NO está en la primera columna.
-
ElseIf cell.Column <> 1 Then
-
If cell.Offset(0, -1).Value>= 1 Then
-
cell.Value = cell.Offset(0, -1).Value + 1
-
' Se detiene cuando el el último dia del mes se ha colocado.
-
If cell.Value> (FinalDay - StartDay) Then
-
cell.Value = ""
-
Exit For
-
End If
-
End If
-
' Solo si la actual celda no está en fila 3 y está en la columna 1.
-
ElseIf cell.Row> 3 And cell.Column = 1 Then
-
cell.Value = cell.Offset(-1, 6).Value + 1
-
' Se detiene cuando el el último dia del mes se ha colocado.
-
If cell.Value> (FinalDay - StartDay) Then
-
cell.Value = ""
-
Exit For
-
End If
-
End If
-
Next
-
-
' Crea las celdas de entrada de datos y las formatea.
-
For x = 0 To 5
-
Range("A4").Offset(x * 2, 0).EntireRow.Insert
-
With Range("A4:G4").Offset(x * 2, 0)
-
.RowHeight = 65
-
.HorizontalAlignment = xlCenter
-
.VerticalAlignment = xlTop
-
.WrapText = True
-
.Font.Size = 10
-
.Font.Bold = False
-
' Desbloquea estas celdas para insertar texto después porque
-
' la hoja estará protegida.
-
.Locked = False
-
End With
-
' Crea el borde alrededor de los días.
-
With Range("A3").Offset(x * 2, 0).Resize(2, _
-
7).Borders(xlLeft)
-
.Weight = xlThick
-
.ColorIndex = xlAutomatic
-
End With
-
-
With Range("A3").Offset(x * 2, 0).Resize(2, _
-
7).Borders(xlRight)
-
.Weight = xlThick
-
.ColorIndex = xlAutomatic
-
End With
-
Range("A3").Offset(x * 2, 0).Resize(2, 7).BorderAround _
-
Weight:=xlThick, ColorIndex:=xlAutomatic
-
Next
-
If Range("A13").Value = "" Then Range("A13").Offset(0, 0) _
-
.Resize(2, 8).EntireRow.Delete
-
' Elimina las lineas del grid.
-
ActiveWindow.DisplayGridlines = False
-
' Protege la hoja para prevenir la sobre escritura de los días.
-
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
-
Scenarios:=True
-
' Redimensiona la ventana para ver todo el calendario.
-
ActiveWindow.WindowState = xlMaximized
-
ActiveWindow.ScrollRow = 1
-
-
' Permitimos a la ventana reescribirse para ver el calendario.
-
Application.ScreenUpdating = True
-
' Si no ha ocurrido ningún error aquí acaba la Macro
-
Exit Sub
-
' Si ha dado error al introducir los datos te muestra un mensaje y te
-
' muestra de nuevo el InputBox para que vuelvas a introducir la fecha.
-
MyErrorTrap:
-
MsgBox "No has introducido el mes y el año correctamente." _
-
& Chr(13) & "Escribe el mes correctamente" _
-
& Chr(13) & "y 4 digitos para el año"
-
MyInput = InputBox("Escribe el mes y el año correctamente para el calendario")
-
If MyInput = "" Then Exit Sub
-
Resume
-
End Sub
Comentarios Recientes