Hojas de cálculo en Excel - página principal

Incluir un calendario en un formulario

Hoy veremos como incluir un calendario en un formulario. No se trata de un calendario, como aquel calendario para imprimir que vimos en un artículo anterior, sino de un control de calendario. Igual que en los formularios tenemos controles como pueden ser las etiquetas, los cuadros de texto, los cuadros combinados, o las casillas de verificación, por ejemplo, también podemos añadir un calendario.

Para ver como funciona, deberemos incluir un formulario desde VBA, seleccionando en el menú “Insertar”, la opción “Userform”. Por defecto, desde VBA, solo se nos muestran en el cuadro de herramientas, aquellos controles que son de uso más común. Para poder ver el resto de controles que podemos incluir en un formulario, deberemos cliquear con el botón derecho del ratón dentro de la ventana “Cuadro de herramientas”, donde nos aparecen los controles, pero en el espacio donde no hay controles. De esa forma, nos aparecerá un menú desplegable donde podremos seleccionar controles adicionales.


Seleccionaremos la opción “Controles adicionales”, y en la lista, escogeremos el correspondiente al control de calendario, marcándolo con una muesca. Seguidamente, pulsaremos sobre el botón “Aceptar”, y en el cuadro de herramientas nos aparecerá ahora un nuevo elemento, que será el correspondiente al calendario:


Ahora solo nos quedará pulsar sobre ese botón del calendario, y dibujar el mismo sobre el formulario. Hacer esto, es tan sencillo como pulsar el ratón sobre el formulario, mantener pulsado el botón, y arrastrar hacia abajo y hacia la derecha, para ir viendo como nos aparece un cuadro que es donde al soltar el botón del ratón, nos aparecerá dibujado el calendario. Por defecto, nos aparecerá el mes de la fecha en curso.


Ahora ya solo nos quedará darle alguna utilidad al calendario, más allá de la propia para tener visible el mes. Por ejemplo podremos insertar la fecha que seleccionemos en el calendario, en una celda. Para ello utilizaremos el evento click, que ejecutará las acciones contenidas dentro de ese evento, cada vez que cliqueemos dentro del calendario.

Por ejemplo, si queremos insertar la fecha que seleccionemos en el calendario, en una celda, utilizaremos esto dentro del código del propio formulario (en este ejemplo, insertamos la fecha en la celda A1):


Private Sub Calendar1_Click()
'Ponemos la fecha en la celda A1
Range("A1") = Calendar1.Value
End Sub

Ahora, incluiremos este otro código dentro del formulario, que lo que hará es cargarse el calendario con el mes y el día de la fecha en que lo abramos (la fecha del sistema). Esto se producirá cada vez que activemos (o carguemos) el formulario:

Private Sub UserForm_Activate()
'Al activar el formulario, que aparezca
'la fecha de hoy en el calendario

Calendar1.Today
End Sub

De esta forma tan sencilla, tendremos un calendario bien elegante, insertado dentro de nuestros formularios, para que con un solo clic, incluyamos fechas en nuestra hoja de cálculo. Y no solo eso, sino que además pasará como algo que hemos hecho nosotros, cuando en realidad es un control ya diseñado que incorpora Excel.

Desde aquí podéis descargar el fichero de Excel, con el ejemplo que hemos visto en este artículo.



29 comentarios:

Paco dijo...

Buenos días,
Muchas gracias por tus aportes, son realmente geniales.
Tengo un ligero contratiempo con esta funcionalidad que hoy nos cuentas.
En mi lista de Controles hay varios relacionados con "Calendar" pero ninguno de ellos correspode con el que tu nos muestras.
Me puedes dar más datos sobre él?
Muchísimas gracias!!!!
Un Saludo
Paco

Javier Marco dijo...

En teoría deberían aparecerte…

En Excel 2003, lo puedes encontrar en la opción: Control de calendario 11.0 (están ordenados por orden alfabético, de la A a la Z).

En Excel 2007, lo tienes en la opción: Control de calendario 12.0 (también están ordenados por orden alfabético, de la A a la Z).

Gustavo dijo...

Me pareció interesante al aplicar los primeros pasos; pero al aplicar las macros estas no se ejecutaron, deberías colocar mas detalles.
Saludos

Javier Marco dijo...

Las macros se ejecutan. siempre y cuando las tengas habilitadas :-)

En el caso de este ejemplo, cuando cliqueas en un día del calendario, en la celda A1, aparece la fecha sobre la que has cliqueado. Aparte de eso, te aparecerá siempre al cargar el formulario, el mes de la fecha (como hoy es 9 de noviembre de 2011, te aparecerá el calendario del mes de noviembre de 2011).

Esas son las dos únicas macros, que están dentro del formulario. Desde el modo VBA (Alt+F11), dentro de Formularios, cliquea encima del Userform1 (del calendario en sí), y podrás ver esos códigos. En los módulos no hay ningún código, y en las hojas tampoco.

LUIS dijo...

Excelente todo lo tuyo... ahora si pusieras un video de como lo haces ya que una imagen vale mas que 1.000 palabras, tu blog seria IMPRESIONANTE

Anónimo dijo...

cuando hago todos los pasos pincho en control calendario y trato de ponerlo sobre UserForm1 pero me sale el siguiente error
The subjet is not trusted for the specified action

no se si me falta activar alguna referencia... me podrías indicar que hacer??

Javier Marco dijo...

Échale un vistazo a este enlace: http://groups.google.com/group/microsoft.public.office.developer.vba/browse_thread/thread/3ef04a2f2a8cef1e/76252635e022bb41?pli=1

ALVARO RR dijo...

Buen dia

Me gustaria saber si es posible enviarte un archivo y me comentes si a ese archivo plano se le puede hacer un macrio para trabajarlo en excel.

Agradezco tu colaboracion

Javier Marco dijo...

Álvaro, mírate este artículo: Importar datos concretos de un fichero de texto.

Estudiando ese ejemplo, seguramente podrás conseguirlo :-)

Fernando dijo...

Hola Javier
Felicidades por el blog. Es de una ayuda inestimable.
Tengo un libro con diferentes hojas en las que se ejecutan diversos procesos. En Hoja1 hay una celda con un valor que va cambiando en función del día.
Lo que necesito que al abrir el libro, seleccione esa celda y en función de su valor, vaya a otra celda de otra hoja. He probado con este código, pero no me funciona:

Sub Auto_open()

'Ocultamos el procedimiento
Application.ScreenUpdating = False
Hoja12.Select
Range("Q2").Select
If Q2 = 1 Then
Hoja12.Select
Range("P6").Select
ElseIf Q2 = 2 Then
Hoja13.Select
Range("P6").Select
ElseIf Q2 = 3 Then
Hoja14.Select
Range("P6").Select
End If
'Mostramos de nuevo el procedimiento
Application.ScreenUpdating = True

End Sub

Evidentemente algo hago mal
Infinitamente agradecido por tu ayuda. Salu2

Javier Marco dijo...

Sustituye esto:

If Q2 = 1 Then

por esto:

If Range("Q2") = 1 Then

Con los Elseif, idem de lo mismo.

Saludos.

Jorge Ivan dijo...

Hola Javier!! Esta muy bacano tu blog, el articulo que mas me ha gustado es aquel que habla sobre la funcion BDCONTAR, trabajo tambien con esta clase de funciones, y de ese articulo tambien me doy cuenta de que eres genial, todos me categorizan como muy bueno para el excel aca en la Universidad donde estudio y trabajo, pero tu!... eres mortal!!.
Ahora, es por eso que yo te traia una duda, que tiene tambien que ver con lo de las funciones BD, resulta que la funcion BDEXTRAER, no puede extraerme mas de una linea de datos si los criterios se encuentran repetidos en la base de datos. Creo debes conocer este problema. Es decir, yo debo enfrentar la extraccion de diferentes pagos por parte de los estudiantes, y en muchos casos los estudiantes pagan la matricula de un semestre en cuotas, por lo cual, yo puedo con esta funcion, extraer facilmente el pago de un estudiante a un semestre, si este es unitario, pero si son varios, no se como extraer toda una lista.

Espero puedas ayudarme con esto, y de antemano muchas gracias. y Sigue con este Blog es espectacular.

Un abrazo desde Colombia
Jorge Ivan

Furanshisuko dijo...

Hola, este blog esta genial, es de mucha ayuda. Mi duda es, yo tengo unas macros que incluyen este calendario en excel 2007 y funcionan a la perfeccion. El problema es cuando lo quiero ejecutar en excel 2010, no carga el calendario. Intenté crearlo nuevamente en excel 2010, pero no lo encuentro por ningun lado. Podrias ayudarme a hacer mis macros compatibles con office 2010

Un saludo y MUCHAS GRACIAS por tu valiosa ayuda

Javier Marco dijo...

Vamos a ver si funciona con lo siguiente: Lo primero, muestra la ficha Programador, para lo cual, desde Archivo --> Opciones --> Personalizar cinta de opciones --> En Fichas principales, ponle una muesca a Programador.

A continuación, desde la ficha Programador, selecciona Insertar (para insertar controles), y elige Más controles (abajo a la derecha). Selecciona a continuación uno llamado Microsoft Date and Time Picker Control 6.0 (SP6), y pulsa sobre el botón Registrar personalizado.

Si con eso no consigues nada, al final del artículo del siguiente enlace, te proponen dos opciones más http://www.rondebruin.nl/calendar.htm:

a) Registrar el control MSCAL.OCX de Excel 2007, disponible en el fichero comprimido que verás al final del artículo (dentro de ese fichero comprimido, hay un pdf con la información necesaria para registrar el complemento, cosa realmente sencilla como verás). Una vez instalado, podrás seleccionar el control calendar, tal y como explico en el artículo.

b) Instalar el add-in personalizado, que está disponible en el blog de msdn.com que hay al final del artículo de esa misma página: http://www.rondebruin.nl/calendar.htm

Ya nos contarás si te ha funcionado. Un saludo.

Furanshisuko dijo...

Javier Marco!. Perfecto, registre el MSCAL.OCX de 2007 en el 2010 y funciono. Me dio un poco de lata porque al ejercutarla me salia error y se cerraba excel y volvia a iniciar. Pero era un problema de actualizacion. Probe en otra maquina con office 2010 completo y funciono al 100%. Muchas gracias,!!!

Anónimo dijo...

Un saludo Javier, este calendario se puede cargar a un textbox? o sea elegir una fecha x del calendario y cargarlo al textbox1, tengo un formlario con fecha tipo de cambio nombre cliente concepto de compra, y quiero que al estar en el textbox1 me salga el calendario, elegir la fecha que necesito y cargarlo a mi textbox1 , una ayuda por favor gracias

Javier Marco dijo...

Pues es tan sencillo como cambiar esto:

Private Sub Calendar1_Click()
'Ponemos la fecha en la celda A1
Range("A1") = Calendar1.Value
End Sub

Por esto otro:

Private Sub Calendar1_Click()
'Ponemos la fecha en la celda A1
TextBox1 = Calendar1.Value
End Sub

Saludos.

D-nIn dijo...

Antes que todo mis más sinceras felicitaciones, es un blog espectacular con un lenguaje muy sencillo, super fácil de entender y unas funciones muy apropiadas.

La pregunta:

He visto que en algunos formularios para seleccionar la fecha puedo dar click sobre la celda y se abre solo el calendario donde puedo escoger la fecha que necesito.
Como podría hacer esto en mi formulario...?

Gracias !!!

Javier Marco dijo...

Acabo de preparar este artículo donde lo explico: Calendario emergente en Excel.

Saludos.

Karoline dijo...

Muchas gracias por la información. Me funcionó excelentemente, sólo que ahora quisiera hacer algo adicional. ¿Sería posible que el calendario apareciera cuando uno hiciera doble click sobre la celda en la que se debe mostrar? Es decir, actualmente cada vez que paso accidentalmente por la celda donde tiene que aparecer el calendario, emerge automaticamente y realmente no lo necesito. Solo quiero que aparezca cuando le de doble click a la celda. Gracias si me pueden ayudar (y si no, gracias igualmente)

Saludos :D

Karoline.

Javier Marco dijo...

Supongo que te refieres a este artículo: calendario emergente.

Prueba a cambiar esta primera línea:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

por esta otra:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Y luego, dentro del condicional IF, añade esta primera línea (dentro del "if", antes del "else"):

Cancel = True

Saludos.

Rodrigo dijo...

Hola te cuento que uso excel 2010 y al hacer click secundario en herramientas para agregar el calendario no me sale nada :(
Que puede ser. Ayuda!!!

Javier Marco dijo...

En Excel 2010 por defecto no viene el calendario, pero se puede solucionar.

Lee un poco más arriba, mi comentario del 15 de junio de 2011, donde doy una solución.

fofo dijo...

hola vi tu tutorial perdon por joderlo tanto... en un comentario mas arriba leio como ponerlo con un texbox yo lo intente con label pero no me funcono nisiquiera con un texbox me funciono

Private Sub Calendar1_Click()
TextBox1.Text = Calendar1.Value
Calendar1.Visible = False
End Sub

Private Sub CommandButton1_Click()
Calendar1.Visible = True
End Sub

Private Sub Label1_Click()
Calendar1.Visible = True
End Sub

Private Sub TextBox1_Change()
Calendar1.Visible = True
End Sub

uso excel 2003

me ayudas?

Javier Marco dijo...

Para que te funcione, tal y como lo has puesto, tienes que tener el TextBox1 y/o el Label1 en el mismo formulario donde tienes el calendario.

Si así fuera, esto te funcionaría correctamente, y mostraría el día seleccionado en el calendario, tanto en el TextBox1, como en el Label1:

Private Sub Calendar1_Click()
TextBox1.Text = Calendar1.Value
Label1 = Calendar1.Value
End Sub

Saludos.

fofo dijo...

gracais por tu ayuda lo resolvi de esta forma

Private Sub calendario_Click()
'========================= INGRESAR FECHA DE COMPRA
label = Calendario.Value
Calendario.Visible = False
End Sub

Private Sub boton_Click()
'========================= DESPLEGAR CALENDARIO
Calendario.Top = 70
Calendario.Left = 55
Calendario.Visible = True
End Sub

por lo que al presionar el boton me despliega el calendario al teminar de sleccionar la fecha se cierra solo gracias por tu ayuda pues de otro modo hubiera durado un monton resolviendolo

maximiliano dijo...

hola javier, queria comunicarme con vos para contarte sobre una formula de excel que nescesito. Mira, Yo trabajo realizando partes diario en una empresa, en la cual ya tengo una planilla diseniada pero cada vez que cargo a un empleado tengo q seleccionarlo desde otro libro , el empleado lleva un numero de ID por ejemplo 8888 PABLO , entonces yo copio y pego * en dos celdas distintas , en una va el numero y en la siguiente su nombre completo.
como puedo hacer para que ese numero y su n9ombre aparezca unicamente poniendo las iniciales ) quizas haciendo una base de datos? necesito tu ayuda urgente.
muchas gracias. Te dejo mi email simplemente.max@hotmail.com

Anónimo dijo...

amigo m gusto mucho tu tutorial pero quisiera saber si vos o alguien que lea este comentario podria darme el codigo que me permita hacer que al hacer clic en una fecha la fecha m aparesca en un label y no en una celda. gracias.

Javier Marco dijo...

Si tu label se llama labe1, pon este código para que aparezca la fecha en ella:

Label1 = Calendar1.Value