A partir de la nota sobre cómo insertar un calendario en una hoja de Excel, un lector me pregunta como crear un calendario que aparezca cuando elegimos una celda en la que queremos ingresar una fecha.
El objetivo, claramente, es validar la entrada. Es decir, asegurarnos que el usuario ingrese una fecha y no un número cualquiera.
Una forma práctica de hacerlo es usando Validación de datos. Por ejemplo, si queremos asegurarnos que el rango A2:A20 el usuario ingrese sólo fechas del año 2007, podemos definir esta validación de datos
De esta manera, si el usuario elige una fecha fuera del año 2007, recibirá un mensaje de error
Pero en realidad lo que queremos es que el usuario elija la fecha que quiere introducir en la celda. También esto podemos hacerlo con validación de datos, usando la opción Lista.
Creamos un nombre, año_2007, que contenga las fechas a usar. Para esto podemos, por ejemplo, poner las fechas en el rango A1:A365 de la Hoja2. Luego definimos la validación de datos
y así obtenemos una lista desplegable.
Coincidamos en que estos métodos no son muy flexibles que digamos. Así que nuestro objetivo será crear un calendario que aparezca cada vez que queremos elegir una fecha. Esto la haremos con una macro y el Calendar Control (el número depende de la versión de Excel), que ya mencionamos en nuestra nota anterior.
Nuestra macro puede estar almacenada en el Personal.xls y de esta manera estar disponible para todo cuaderno activo. O puede estar ligada a un cuaderno específico y sólo estará disponible cuando este cuaderno esté abierto. Esto último es lo que mostraremos en esta nota.
Nuestro proyecto se compone de lo siguiente:
- una forma que contenga el calendario
- una macro que muestre el calendario cada vez que la celda activa esté dentro del rango indicado e introduzca la fecha elegida en la celda activa
- un evento que dispare la macro cuando la celda activa esté en el rango indicado.
Empecemos por crear la forma que contenga al calendario. Para esto activamos el editor de Visual Basic (ALT+F11) y agregamos una forma (UserForm) al proyecto
En la ventana de Propiedades el proyecto (si no está visible usamos el menú Ver—Ventana Propiedades del VBe, o pulsamos F4) cambiamos el valor estándar en Caption por "Elija un fecha"
Para agregar el Calendar Control debemos hacer visible el cuadro de herramientas (menú Ver—Cuadro de Herramientas). Inmediatamente usamos el menú Herramientas—Controles Adicionales
Y elegimos el Calendar Control. Esto hace que su icono aparezca en el cuadro de controles a la izquierda de la forma. Pulsamos el icono y creamos el calendario sobre la forma
Las propiedades del calendario pueden ser cambiadas en la ventana de Propiedades, estando este seleccionado.
Ahora tenemos que escribir el código para el calendario. Para esto, con la forma seleccionada, usamos el menú Ver—Código (atajo: F7). Esto nos lleva a la ventana de código de la forma. En ella escribimos
Para probar el funcionamiento de la forma la seleccionamos con Ctrl+Tab y pulsamos F5. La forma aparecerá en la Hoja1. Para cerrarla pulsamos la X en el ángulo superior derecho.
Nuestro próximo paso es poner un código que transfiera la fecha elegida en el calendario a la celda activa en la hoja.
Hacemos un doble clic sobre el calendario en la forma, lo que abre la ventana de código donde escribimos
Private Sub Calendar1_Click()
ActiveCell.Value = Calendar1.Value
Unload Me
End Sub
Volvemos a probar el funcionamiento de nuestra forma, seleccionándola con Ctrl+Tab y F5 para accionarla. Elegimos una fecha del calendario y veremos que este se cierra y la fecha elegida aparecerá en la celda activa.
Ahora necesitamos un método para que el calendario se abra sólo cuando la celda seleccionada (activa) este comprendida en el rango donde queremos poner las fechas (en nuestro caso A2:A20).
Para esto necesitamos dos elementos: una rutina que haga aparecer la forma y un evento que accione la rutina cuando la celda seleccionada cae en el rango indicado.
La macro para mostrar la forma la escribimos en un módulo de Vba, que agregamos usando el icono o con el menú Insertar—Módulo:
Sub abrir_calendario()
UserForm1.Show
End Sub
El evento debemos escribirlo en la ventana de código de la Hoja1, que abrimos haciendo un doble clic en el icono de la Hoja1 en la ventana del proyecto.
Allí agregamos este código
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rngFechas As Range
Set rngFechas = Range("A2:A20")
If Union(Target, rngFechas).Address = rngFechas.Address Then _
Call abrir_calendario
End Sub
Con esto hemos terminado nuestro proyecto. Ahora, cada vez que seleccionemos una celda en el rango A2:A20 de la Hoja1, aparecerá el calendario y podemos elegir la fecha.
Como abran notado, podemos cambiar el año y el mes libremente.
Technorati Tags: MS Excel
Gracias, Jorge era precisamente lo que estaba buscanda.
ResponderBorrarAtt:
Julian P.
hola que tal, me sirve de mucho este blog, y se lo agradezco
ResponderBorrarpero tenia una duda, hace mucho es para redondear en excel, digamos lo que andaba buscando es que en las celdas, hacer una funcion "si" si un numero es menor de 50 por ejemplo 43, en otra celda se pone solo 50 y asi hasta llegar hasta el 3000 por ejemplo pero solo llega hasta 500, y me queda una formula asi:
=SI(G26<51;"50";SI(G26<101;"100";SI(G26<151;"150";SI(G26<201;"200";SI(G26<251;"250";SI(G26<301;"300";SI(G26<351;"350";SI(G26<401;"400"))))))))
bueno, espero que sepa entender, saludos
NECESITO AYUDA EN EL CALCULO DEL NUMERO DE CELDAS DENTRO DE COLUMNAS DE DATOS
ResponderBorrarLES ANEXO TABLA
MUCHAS GRACIAS
Bueno, no se trata exactamente de la nota del tema. Para lograr lo que estás buscando, si lo he entendido, es más sencillo usar la función MULTIPLO.INFERIOR.
ResponderBorrarPor ejemplo, supongamos que en el rango A1:A4 tienes los vaores 51, 101, 151 y 201.
EN la celda B1 pones la fórmula MULTIPLO.INFERIOR(A1,10) y la copias al resto del rango.
De esta manera no estás limitado a las 7 condiciones que permite la función SI.
Hola Gilberto,
ResponderBorrarno entiendo tu pregunta. Para mandarme un adjunto hazlo a dunk@maaganm.co.il
Como se hace cuando las celdas con fecha van por ejemplo en h21,h31,h41,h51... y no en un rango h21:h51
ResponderBorrarHola Gabriel,
ResponderBorrarpara crear un rango no continuo mantienes apretada la tecla Ctrl mientras vas seleccionando las celdas con el mouse.
Muchas gracias Jorge por tu respuesta.Sigo con problemas.
ResponderBorrarEn la macro de abajo he llegado hasta una celda (H2022) en total he metido 50 celdas. Si quiero meter mas, H2063, H2104, ... Me da error. Mi ignorancia me impide saber que sucede. Muchas gracias
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rngFechas As Range
Set rngFechas = Range("h13,h54,h95,h136,h177,h218,h259,h300,h341,h382,h423,h464,h587,h628,h669,h710,h751,h792,h833,h874,h915,h956,h997,h1038,h1079,h1120,h1161,h1202,h1243,h1284,h1325,h1366,h1407,h1448,h1530,h1571,h1612,h1653,h1694,h1735,h1776,h1817,h1858,h1899,h1940,h1981,h2022")
If Union(Target, rngFechas).Address = rngFechas.Address Then _
Call abrir_calendario
End Sub
Hola Gabriel,
ResponderBorrarciertos objetos en Excel, tienen un límite de 256 elementos. Esto es lo que sucede con la matriz que determina tu rango (tiene 259 incluyendo las comillas y los paréntesis).
Tendrás que buscar otra formar de determinar la aparición del calendario (por ejemplo darle un fondo a las celdas y luego usar la propiedad interior.colorindex del rango).
Que tal Jorge, mi nombre es Luis Felipe y me han servido mucho tus macros, solo para comentarte que tal vez olvidaste comentar que en el calendario es bueno agregar la linea "Calendar1.Value = Now" en el evento UserForm_Activate(). De esta forma cada que abras el calendario te mostrara la fecha actual, en nuestra empresa es lo mas comodo. Gracias y saludos desde Aguascalientes, México.
ResponderBorrarHola Luis, gracias por el comentario. Efectivamente, se me paso por alto.
ResponderBorrarhola me sirvio mucho este tutorial pero tengo una consulta como ago para que cuando el calendario aparenca esta marcada y posicionado en dia mes actual.
ResponderBorrardejo un un ejemplo.
http://img182.imageshack.us/img182/8140/fehcand0.jpg
Como dijo el lector Luis Felipe Cruz García en su comentario: "agregar la linea "Calendar1.Value = Now" en el evento UserForm_Activate(). De esta forma cada que abras el calendario te mostrara la fecha actual"
ResponderBorrargracias por la ayuda solo tengo una consulta mas como extraigo el mes selecionado en el calendario a una celda en excel ejamplo
ResponderBorrarseleciono 12 junio en el calendaio
y que en una selda apareca el mes que selecione de la fecha
Hola Ariel
ResponderBorrarSeleccionas el área donde aparecen las fechas. Abrís el menú Formato--Celdas y en la pestaña Números elegís Personalizada. En la ventanilla "Tipo" escribis "mmmm" (sin las comillas) y apretas Aceptar. Excel exhibirá sólo el mes, aunque el valor de la celda incluye la fecha completa.
Necesito tu ayuda para poder agilizar la programación de la un extensa hoja en el caso de insertar el calendario.
ResponderBorrarHe creado un botón de opción, que en el caso de que su valor sea True se muestre el objeto Calendario. El problema es el siguiente:
Voy a abilitar este botón de opción en una misma hoja en 15 ocasiones, y la celda vinculada será distinta en cada una de ellas.
Cómo puede agiliar el diseño de la macro? Tengo que crear un evento para cada uno de los botones de opción. Podría agrupar las condiciones, y la instrucción ?
Un saludo,y mil gracias
Tu blog es increiblemente bueno !!!
Perdona, este es el fichero bueno:
ResponderBorrarHoja Control formulario
Hola Petit
ResponderBorrarno podes adjuntar un archivo en el comentario. Mandamelo a jorgedun@gmail.com
Sr.
ResponderBorrarDunkelman, deseo agradecer sus conocimientos, los cuales comparte sin ningun aporte sustantivo de nuestra parte (me refiero como consumidores, de su tiempo e ideas).
En un aparte, deseo realizarle la siguiente consulta, existe la posibilidad de agregar una linea en la macro del formulario que despliega el calendario, que actualice al menos mensualmente la fecha con que se carga el calendario, esto para no tener que entrar al formulario y cambiarlo allí, bueno es facil pedir, si se puede y le resulta factible lo agradeceremos atte.
F. Godoy A.
fernando.godoy@vtr.net
Hola Fernando
ResponderBorrarfíjate en el comentario del amigo Luis Felipe Cruz Garcia:
agregar la linea "Calendar1.Value = Now" en el evento UserForm_Activate(). De esta forma cada que abras el calendario te mostrara la fecha actual
Hola Jorge, la verdad lo que no me queda claro en que parte va el evento Userform_activate() pues dentro de los códigos que describe arriba no lo veo.
ResponderBorrarHola Jair
ResponderBorrartienes razón, no está mencionado en la nota. Los pasos son los siguientes:
1 - selecciona el calendario (Userform) en el editor.
2 - Presiona F7 para llegar al módulo del userfor.
3 - Enlla ventanilla superior derecha del editor elige el evento Activate. En el módulo aparecerá:
Private Sub UserForm_Activate()
End Sub
4 - Agrega Calendar1.Value = Now.
Guarda el proyecto.
Jorge, gracias, cacharreando con las macros, en la macro abrir calendario hice esto y me funcionó:
ResponderBorrarSub abrir_calendario()
UserForm1.Calendar1.Value = Now
UserForm1.Show
End Sub
De nuevo muchas gracias.
Muchas gracias por todo, abusando de tus conocimientos.. ¿como seria para q no sea un rango de celdas las q podamos seleccionar para q se muestre el calendario, sinó una concreta?
ResponderBorrarHola Ana
ResponderBorrarpara que el evento se limite a una celda en particular tienes que poner la dirección de la celda en la definición del rango en SelectionChange. Si la celda en particular es A1 en lugar de
Set rngFechas = Range("A2:A20")
pones
Set rngFechas = Range("A1")
Buenas tardes,
ResponderBorrarAgradezco mucho la existencia de este espacio, es una ayuda increíble para algunas cosas que le "trancan a uno el serrucho"como decimos en Venezuela. Mi calendario fuinciona perfecto si le indico un rango específico de celdas pero si indico celdas separadas por comas b5,b10,b11,e10 no se ejecuta la macro en la celda indicada, al parecer no he cometido ningún error, de hecho he respetado los detalles de la sintaxis para evitar fallas. Agradezco muchísimo su ayuda para simplificar y automatizar tareas de excel.
Saludos,
José Duque
Venezuela
Hola José
ResponderBorrarsiguiendo con mi ejemplo tendrías que cambiar un poco el código del evento para indicar cuál es el rango.
Por ejemplo, si quieres que el calendario se abra también en el rango C2:C20, tienes que poner
Set rngFechas = Range("A2:A20, C2:C20")
en el código.
hola disculpa me gustaria saber como realizo un filtro desplegando el calendario
ResponderBorrarSi usas un calendario de hecho no necesitas una lista desplegable. Pero si quieres tener una lista desplegable con fechas, debes definir una lista de fechas en un rango o en un nombre.
ResponderBorrarhola Jorge
ResponderBorrarimpresionado por sus conocimientos tengo una duda que intentare trasmitirla, el calendario funciona perfectamente, pero en la celda me aparece false, en vez de la fecha, ya le he puesto formato de fecha, en la seccion personalizada, muchas gracias de antemano.
Hola Álvaro
ResponderBorrarmandame el archivo con el problema (jorgedun@gmail.com)
Qué tal Jorge... Te felicito por tu Blog, uno de los pocos que realmente cumple con la grandiosa tarea de trasmitir conocimientos. He resuelto y realizado muchos proyectos gracias a tu ayuda, sin embargo, deseo conocer lo siguiente:
ResponderBorrarDe una lista desplegable, utilizando validación de datos, deseo que en una celda específica, me aparezca otra lista en función de la selección realizada en la lista desplegable. Es decir, por cada selección de la Lista Desplegable, se genere otra lista, ligada a esa selección en una misma celda específica. Cómo lo hago?
Fijate si la técnica que muestro en esta nota te ayuda.
ResponderBorrarHola Jorge, muy útil tu blog.
ResponderBorrarTengo una pregunta. Es posible, y si es asi como?, que junto al libro de excel se gurde el calendario activex (mscal.ocx) para que si le paso el archivo a alguien que no tenga el calendario el libro siga funcionando?
Gracias.
Wilson
Si lees inglés puedes ver esta discusión en el foro Excel de Ozgrid.
ResponderBorrarBásicamente me parece que la mejor soución es pedirle al usuario que instale el calendario.
Estimado Jorge, no me queda mas que agradecerle tanta ayuda, me ha servido de mucho en una hoja que llevo, si no es mucha molestia, podria decirme como modificar para que en otra hoja me haga lo contrario, es decir en el calendario despliegue la fecha que se indica en la celda que esta activa?
ResponderBorrarMuchas gracias
Galileo.
Supongamos que la celda C1 de la hoja1 contiene la fecha, en el evento UserForm_Activate() puedes poner
ResponderBorrarPrivate Sub UserForm_Activate()
Calendar1.Value = Sheets(1).Range("C1").Value
End Sub
Hola Jorge,
ResponderBorrarGracias por tu blog, me ha sido de gran ayuda.
Tengo una duda: ¿como hago para que el calendario aparezca al hacer doble click sobre la celda y no al ponerme sobre ella (que es como funciona en el ejemplo desarrollado arriba.
Desde ya muchas gracias por tu ayuda.
Saludos,
Carlos
Hola:
ResponderBorrarAlguien podria ayudarme, tengo el siguiente codigo
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rngFechas As Range
Set rngFechas = Range("F8:F200", "G8:G200")
If Union(Target, rngFechas).Address = rngFechas.Address Then _
Call abrir_calendario
End Sub
pero al intentar adicionar otro rango de celdas en Range no me muestra el calendario en este tercer rango, como le hago para que me aparezca el calendario en los rangos siguientes("B8:B200","F8:F200", "G8:G200").
Hola Carlos
ResponderBorrarprogrmando el evento Worksheet_BeforeDoubleClick
Buenas tardes señor Jorge, de antemano lo felicito, es usted un maestro en todo el sentido de la palabra, mi consulta es la siguiente: tengo un rango de celdas en excel a los cuales le realicé una validación de datos "tipo fecha", y en visual basic un control calendar, el cual le asigna la fecha a ese rango; pero cuando elijo la fecha en el control y esta se inserta en la celda del rango; la validación de datos no muestra el error:
ResponderBorrarPor eje: fecha <=15-09-08, esa es la condición; y en el calendario elijo por ejemplo 16-09-08, la validación de datos no se activa, solo funciona si le asigno la fecha a la celda manualmente.
Señor Jorge como puedo solucionar esto. mil gracias y espero su pronta respuesta, mi correo es cieiyi3@gmail.com
ATT: Carlos Andrés.
Hola Carlos
ResponderBorrarvalidación de datos funciona cuando el valor es introducido en la celda directamente. Lo que sucede en tu caso es lo mismo que cuando copias y pegas el valor en la celda. También en ese caso validación de datos no funciona.
La solución en tu caso es programar un evento que evalúe el valor en la celda y haga las veces de validación de datos.
Buenos días señor Jorge, en una anterior consulta, le pregunte sobre el por que la Validación de datos en excel, no validaba la fecha introducida por medio de un Control Calendar; para lo cual agradezco su respuesta; he intentado por todos los medio programar ese evento de la siguiente forma: tengo dos Celdas, en la primera celda esta el valor introducido por el calendario (por ejemplo 17-09-08; en otra celda tengo el parametro que necesito para que sea comparado con la primera celda por ej: 15-09-08, necesito que si la primera celda es mayor a la fecha de la segunda; es decir: if "16-09-08" > "15-09-08" then
ResponderBorrarun mensaje de error que diga que se paso de la quincena. por el momento he programado este procedimiiento, pero no se que me falta para que me funcione:
Sub aprobarfecha()
Dim celda As Range
Dim celda1 As Range
Set celda = Range("E8:E60")
Set celda1 = Range("O9")
If IsDate(celda) = True < IsDate(celda1) = True Then
MsgBox "La fecha que usted eligio no puede ser mayor a la quincena programada, por favor ingrese de nuevo la fecha", vbCritical, "Insertar fecha"
End If
End Sub
Claro esta, que si funcionara este procedimiento lo llamaria (Call) en el evento Worksheet_SelectionChange de la Hoja objetivo. que puedo hacer para que me funcione señor Joge?.
Mil gracias por su ayuda.
Que tal sr. Jorge
ResponderBorrarhe estado checando su blog y me ha servido de mucho, solo que tengo una duda. Se puede validar que en la seleccion del dia, solo sea de un dia en especifico, por ejemplo : tengo que hacer un reporte en el cual solo sera semanal, por tal motivo solo me deje seleccionar o validar que la fecha seleccionada se lunes.
Bueno sr Jorge de doy las gracias de ante mano.
Hola Max
ResponderBorrarpuedes usar validaciión de datos en la opción Personalizada con esta fórmula
=DIASEM(A1,2)=1
Esto permitiría ingresar en A1 solo fechas cuyo día de semana sea lunes.
Hola:
ResponderBorrarEl calendario me funciona a la perfección, pero necesito delimitar la entrada de datos a un rango de la columna D y E completa, pero que no se active en las celdas de fondo blanco y/o azul...
Se puede definir el rango para lanzar el calendario de esta manera...
Gracias de antemano.
Si, tienes que agregar una condición en la programación del evento de manera que si el fondo de la celda es blanco o azul
ResponderBorrartarget.Interior.ColorIndex = el número del color en la paleta
Gracias. Lo he solucionado de la siguiente manera:
ResponderBorrarSet rngFechas = Range("D:D, F:F")
If (Union(Target, rngFechas).Address = rngFechas.Address) And ((Target.Interior.ColorIndex <> 2) And (Target.Interior.ColorIndex <> 5)) Then _
Call abrir_calendario
Pero... ahora me surge otro problema:
Las celdas donde debe de lanzarse el evento tienen un formato condicional que hace que cambien de color al cumplirse, pero el Interior.ColoIndex es Blanco aunque la celda sea Naranja o Verde. Lo he solucionado poniendo el fondo de la celda en Negro, pero creo que eso es una chapucilla.
Alguna idea.?
Buenos días Sr. Dunkelman,
ResponderBorrarEn primer lugar, felicitarle por su blog, que nos saca de apuros a muchos (incluso aquellos que no tenemos grandes conocimientos podemos hacer nuestros pinitos con su ayuda).
He seguido sus pasos, y el calendario funciona perfectamente en dos columnas. Pero necesito que funcione en tres columnas distintas, y cuando introduzco el tercer rango (columna J):
Set rngFechas = Range("E5:E3000, I5:I3000, J5:J3000")
Entonces no sólo no funciona el calendario en la columna J, sino que además deja de funcionar en las columnas E e I
Me parece haber leido que alguien más ha tenido este mismo problema, pero creo que no he visto ninguna idea o solución al respecto. ¿Qué podemos hacer para que el calendario funcione en tantas columnas como queramos (mi tope de funcionamiento está en dos columnas y no sé a qué se debe)?
MUCHÍSIMAS GRACIAS POR SU ATENCIÓN
Una solución es crear tres rangos y luego usar OR para definir los rangos válidos.
ResponderBorrarBuenas tardes
ResponderBorrarTengo una duda respecto a la inclusión de varios rangos ya que solo puedo colocar dos y necesito que el calendario aparezca por lo menos en cuatro rangos distintos?
Hector
Como señalo en mi respuesta del 6 de nooviembre, una solución es definir los rangos y usar la función OR en el evento Sub Worksheet_SelectionChange. Por ejemplo, si queremos agregar los rangos F2:F20 y G2:G20, tendríamos que poner en el evento
ResponderBorrarIf Union(Target, rngFechas).Address = rngFechas.Address _
Or Union(Target, rngFechas1).Address = rngFechas1.Address _
Or Union(Target, rngFechas2).Address = rngFechas2.Address Then _
Call abrir_calendario
Ante todo, me han servido de mucho todas las explicaciones que ha dado con respecto al calendario.
ResponderBorrarUna sola cosa, ¿como hago para que introduzca la fecha sin tener que hacer click? solo con pulsar enter, por ejemplo.
Gracias.
Un camino sería agregar un botón (control) con la leyenda Aceptar. A este control le progrmamos un evento como el del calendario, algo así
ResponderBorrarPrivate Sub CommandButton1_Click()
ActiveCell.Value = Calendar1.Value
Unload Me
End Sub
Luego al abrirse el calendario se puede pasar el foco al botón pulsando TAB, y al apretar Enter se ingresará la fecha y se cerrará el calendario.
Gracias, Jorge su ayuda fue muy importante en mi proyecto de nuevo muchas gracias, la solución es la mejor y el calendario funciona como un reloj.
ResponderBorrarHector
buenas
ResponderBorraresta herramienta me servira mucho.
pero no lo puedo hacer funcionar.
tengo office 2003 y solo encuentro la opcion dentro de los controles adicionales de "microsoft office proyect calendar control"
el cual al colocarlo sobre la forma se ve en blanco. y no se veel calendario. al ejecutarlo para que se vea en la hoja de excel se ve un triangulo gris.
me pueden ayudar.
gracais de antemano.
SI te falta el control (lo que me parece extraño) puedes intentar descargarlo e instalarlo o utilizar otro como el DTPicker. Estás tratando de usarlo directamente sobre la hoja o sobre un userform en el editor de Vb?
ResponderBorrarGRacais por su respuesta.
ResponderBorrarlo estoy utilziando sobre un userform en el editor de VD.
seguia al pie de la laetra sus pasos.
tampoco enceuntro el comando al que se refiere.
bueno buscare instalar directametne el VB. pues solo lo tengo gracias a que venia con los programas de office. despues le cuento como me fue.
Muchas gracias
Hola.
ResponderBorraryo denuevo.
soy el mismo anonimo de antes... jijiij
bueno al parecer ese no es el problema.
descarge un VB nuevo y todo y anda.
simplemente no tengo como control adicional el control calendar.
donde lo puedo obtener. tambien he buscado esta opción y no hay muchas respuestas, mas que en algunas versiones del excel 2003, existen control calendar de versiones anteriores, 8 y se a creado algo con el 11... pero nada de si no tienes ninguna versión.
yo vajo todas las actualizaciones que me sugiere el office.
conoces alguna forma para obtener ese control adicional.
de antemano gracias
Hola
ResponderBorraryo denuevo.
Descubri que no tenia el archivo .OCX refeerente a los calendarios.
o baje de VB. y me presento con el siguiente problema como lo agrego a un control adicional.
y descubro lo siguiente:
Importador de controles ActiveX de formularios Windows Forms (Aximp.exe)
(http://msdn.microsoft.com/es-es/library/8ccdh774(VS.80).aspx)
pero para mi colmo. entro de mi sistem32 no encuentro este archivo Aximp.exe, por lo tanto me siento atado de manos.
espero que pueda guiarme, aunque le tema se desvio demasiado del inicio de su tema.
saludos
Puedes descargar el control que te falta aquí
ResponderBorrarJorge: Agradezco su ayuda y el link que me envio. Ahora si puedo utlizar el Control calendar.
ResponderBorrarAunque me encuentro con el siguiente problema en el codigo:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rngFechas As Range
Set rngFechas = Range("D2:D300, I2:I300, J2:J300")
If Union(Target, rngFechas).Address = rngFechas.Address _
Or Union(Target, rngFechas1).Address = rngFechas1.Address _
Or Union(Target, rngFechas2).Address = rngFechas2.Address Then _
Call abrir_calendario
End Sub
al probar si funciona en alguna celda del rango, me sale un error 424 en el momenot de ejecución, se requiere un objeto. Tambien aparece al hacer clik sobre otra parte de la hoja, obtengo el mismo error.
Muchas gracias por toda su ayuda y Felicitaciones por el Blog. Me a ayudad o mucho con otras dudas que tenia para el trabajo que realizo.
Atte
Edu. (ex. Anonimo jijiji)
Edu
ResponderBorrarno has definido los rangos rngFechas1 y rngFechas2, por eso al correr el código se genera el error (Vb busca un objeto que no existe).
Hola Jorge, Gracias x toda la informacion que pones a disposicion, Te molesto porque si bien logre hacer andar el calendario con un click, no se exactamente que deberia cambiar para que funcione al hacer doble click en una celda. Si pudieras indicarme seria Grandioso. Mas arriba lei algo de cambiar el evento, pero no lo logro hacer. Gracias
ResponderBorrarJorge
ResponderBorrarMuchas Gracias.
ya definí todas los rangos y me funciona perfecto. Ademas cambie algunas cosas para que funcionara solo con doble clik para abrir y al elegir la fecha.
Te lo agradezco. este fue mi primer proyecto en VB XD
(bueno tengo otras consultas en otros temas, que envie antes, creo que tengo solucionado el tema, aunque no como esperaba, te enviare un mail para que lo revises)
¿¿hay posibilidades de tener el calendario en español??
saludos
EDU.
El idioma del calendario depende de las definiciones del Windows. En el panel de control de Windows, tenes que entrar en el formalurio de definiciones regionales e idioma (Regional and Language Options) y en la pestaña Regional Options cambiar el idioma a Español
ResponderBorrarBuenos días Sr. Dunkelman.
ResponderBorrarLe agradezco enormemente este espacio en el que comparte sus conocimientos ayudando a los que empezamos y queremos aprender.
Me ha costado lo mío y he conseguido crear el calendario en cuestión. El problema del que no salgo, aún y habiendo buscado soluciones a través de Google, es que al hacer clic en la casilla el calendario aparece siempre en la fecha 10-02-09.
Aún poniendo en el ordenador que estamos en otro mes u otro año sigue apareciendo con esa fecha. Ya sé que con [K3=HOY()] saldría la fecha actual, pero lo que quiero es que cuando aparezca el calendario lo haga en el mes y año que estamos.
¿Hay alguna forma de hacerlo?
Gracias y felicidades.
Sergi
Fijate en el comentario de Felipe Luis Cruz García, donde sugiere agregar la orden
ResponderBorrarCalendar1.Value = Now
en el evento Userform_Activate
Esto hara que cada vez que se abra el calendario (activate), aparezca con la fecha corriente.
Buenos días Sr. Dunkelman.
ResponderBorrarTan solo le escribo para darle las gracias por su ayuda.
Ha sido usted muy amable y paciente.
Saludos cordiales.
Sergi
Al ir a la Opcion Herramientas-> Controles adicionales. Controles adicionales esta desacativada y no puedo elegir el Calendar Control. Que puede estar pasando?
ResponderBorrarPuede ser que falte el control. Fijate en el enlace que puse en mi comentario del 11 de febrero.
ResponderBorrar¿Qué versión de Excel estás usando?
SEÑOR JORGE, mil gracias por tantos conocimientos y ayuda que brinda.
ResponderBorrarTengo una pregunta con respecto a este tema de calendario, el rango que yo he utilizado es muy grande, ¿sería posible que el calendario apareciera junto a la celda activa conforme desplazo la hoja hacia abajo?
Gracias nuevamente por su tiempo y atención
Saludos
G7
SEÑOR JORGE, gracias por su tiempo y atención.
ResponderBorrarTengo la siguiente duda sobre este calendario ¿cómo podria arreglar el código para que el calendario se muestra al dar "doble click" en las celdas?
Ya mencionó usted que utilizando el comando Worksheet_BeforeDoubleClick, pero no sé utlizarlo, Ya hice "mi tarea" investigando pero "no doy pie con bola".
Gracias nuevamente
Saludos
G7
Si sigues las instrucciones de este modelo, el calendario siempre aparece en la parte visible de la hoja, en decir, en la cercanía de la celda activa.
ResponderBorrarJorge, estoy utilizando el DTPicker ya que no tengo el calendario, el inconveniente es que no me copia el valor del calendario a la celda activa ni se cierra al seleccionar una fecha.
ResponderBorrarSaludos
Federico
Puedes descagar el Calendar de la WEB, pero tmbi[en puedes usar el DTPicker en un Userform como el Calendar.
ResponderBorrarBuenas noches: ¿Como se puede hacer para que al elegir una fecha no te permita elegir dias no laborables y feriados? Muchas gracias.
ResponderBorrarNo puedes evitar que los feriados aparezcan en el control, peropuedes impedir que sean ingresados en la celda usando validación de datos.
ResponderBorrarMuchisimas gracias por su respuesta y su sugerencia Sr Dunkelman. Sólo voy a abusar de su confianza para realizar un par de preguntas adicionales:
ResponderBorrar- Veo que esta abierto a realizar trabajos en excel contra un pago ¿Tambien realiza ese tipo de trabajos para desarrollar una interfase para Access? (Lo que sucede es que estoy desarrollando una base de datos en Access con múltiples consultas que se utilizan en el trabajo, pero como no es muy amigable me gustaría dejar algo con una interfase mas amigable para que lo puedan utilizar otras personas aún después que yo deje este puesto).
-2do: ¿Entre sus curiosidades conocerá algún programa de base de datos que origine archivos que se puedan trabajar a la vez por mas de un usuario para el ingreso de datos (estando el archivo en una carpeta compartida)?
Muchas Gracias.
Grupo Cinco
ResponderBorrarte sugiero que te comuniques conmigo vía privada por mail (la dirección en el enlace en Contacto)
HOLA JORGE HACE DIAS NO SOCLICITABA TU AYUDA TENGO LA SIGUIENTE Y ESPERO ME PEUDAS AYUDAR
ResponderBorrarDEBO CARGAR VARIOS DATOS EJEMPLO
COLUMNA A
COLUMNA B
COLUMNA C Y COLUMNA D
NECECITO QUE ME GENERE EN LA COLUMNA E Y F ES POSIBLE
GRACIAS HECTOR LEAL
Hola Héctor,
ResponderBorrarque me genere qué?
Te sugiero que te pongas en contacto conmigo por mail.
Hola.
ResponderBorrarTengo este problemilla, me vendría bien tu ayuda.
Tengo mi calendario implementado en una hoja excel para gastos diarios y por meses.
He linkado una celda al calendario para que en C26 me aparezca la fecha del dia que tengo pinchado en el calendario.
El problema viene porque ahora quiero linkar la celda C27 para que me aparezca el nombre del mes que tenga en ese momento en el calendario.
Como se podria hacer eso?
Gracias y saludos
Hay varias formas. Por ejemplo, en la celda C27 puedes poner esta fórmula
ResponderBorrar=MES(C26)
que extrae el número del mes de la fecha en la celda C26. Si quieres que aparezca el nombre del mes puedes usar la función ELEGIR, por ejemplo
=ELEGIR(MES(C26),"enero","febrero"...
Sr. Jorge Dunkelman:
ResponderBorrarExelente la informacion de validacion de datos en celdas de excel con un calendario, seguí todos sus pasos pero de la unica forma que me ha funcionado es teniendo la macro abierta luego de seleccionar la fecha en el calendario de inmediato la coloca en la celda pero se abre la user Form, de´spues de cerrar la user form no me funciona la fecha haciendo click en la siguiente celda. esto fue lo que escribí.
Option Explicit
Private Sub Userform_Click()
Unload Me
End Sub
Private Sub Calendar1_Click()
ActiveCell.Value = Calendar1.Value
Unload Me
End Sub
Sub abrir_calendario()
UserForm1.Show
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rngFechas As Range
Set rngFechas = Range("A2:A20")
If Union(Target, rngFechas).Address = rngFechas.Address Then _
Call abrir_calendario
End Sub
No se en que estoy fallando, Nota: yo no soy un experto en excel solo logro cambiar algunas rutinas deacuerdo a un orden logico de las macros para lograr resultados en otras celdas pero es lo unico que se hacer, por su colaboracion muchas gracias.
Juán Fernando
ResponderBorrartengo la impresión que estás poniendo los eventos en módulos corrientes en lugar de los móodulos de la hoja correspondiente. Te sugiero que me mandes el archivo por mail.
Esto está muy bien. Lo había visto en C# pero no sabía que se pudiera utilizar algo así en excel+VBA claro.
ResponderBorrarEl problema es que la celda no asume el valor. no sé que pasa?
gracias de antemano
Te sugiero que descargues el archivo con el ejemplo y te fijes cómo se hace.
ResponderBorrarDon Jorge,
ResponderBorrarAntes que todo, muchas gracias por su excelente blog y las respuestas que nos brinda a aquellos que debemos usar regularmente el MS Excel.
Mi consulta es la siguiente, estoy usando el calendario incrustado en una hoja y al seleccionar una fecha en éste tengo el vínculo a una cierta celda, el problema es que no puedo cambiar el formato de la fecha por más que lo intento, siempre aparece como "mm/dd/yyyy". Qué estoy haciendo mal?
Muchas gracias desde ya!!!
Don Luis
ResponderBorrarseguramente ha usado la propiedad LinkedCell del cuadro de propiedades del control para definir la celda que recibe la fecha.
Lo que hay que hacer es dejar esta propiedad en blanco y en su ligar usar un evento para definir la celda y el formato. Por ejemplo
Private Sub Calendar1_Click()
With ActiveCell
.NumberFormat = "dd-mm-yy"
.Value = CDbl(Calendar1.Value)
End With
End Sub
Este código va en el módulo de la hoja.
Posiblemente publique una breve nota sobre el tema con los detalles.
muy bueno toda la información etregada, muchas gracias
ResponderBorrarno se activa mi menu herramientas >> controles adicionales a que crees q se debe
ResponderBorrarEvelyn
ResponderBorrarno tengo claro lo que estás haciendo. EN el menú Herramientas no existe la opción Controles Adicionales. Tal vez te referís a la barra de controles ActiveX (cuadro de controles)?
He revisado y no ha existido una pregunta que me parece válida para el tema y de gran ayuda, ¿habrá forma de lograr que con presionar la tecla "esc" se pueda cerra el calendario? Esto es que casi siempre que cometemos errores o queremos cancelar la acción la tecla "esc" es nuestra salvadora.
ResponderBorrarMil gracias poresta y todas tus aportaciones. Las lisonjas serán enviadas a tu correo.
I.Q.I. Jorge A. de México
Jorge,
ResponderBorrarpara cerrar el formulario sin cambios basta con apretar la "x" en el ángulo superior izquierdo.
También se ´puede programar para habilitar la tecla ESC para esta función, pero me parece innecesario.
Jorge,
ResponderBorrarAgradezco mucho tu atención, y tal vez explayando un poco el por que de mi necesidad(necedad) de la tecla "ESC", generalmente siempre utilizo el teclado por velocidad, evitando siempre utilizar el ratón, por lo que las macros y comando siempre los llamo desde el teclado (hasta algunos como insertar hoja con nombre y quitar autofiltro, por supuesto copyright de usted).
Si me pudieras explicar como programarpara habilitar la tecla, te lo agradecería mucho, si no, de todas maneras quedaré eternamente agradecido por toda la información de su blog.
Atte.
Jorge A. González
Hola Jorge,
ResponderBorrarse puede. La forma que se me ocurre es:
1- en el formulario que contiene el calendario agregás un boton.
2- Hacés doble-clic al botón y en el módulo que se abre ponés este código
Private Sub CommandButton1_Click()
Unload Me
End Sub
3 - Seleccionás el botón y en la ventana de propiedades cambiás la propiedad Cancel a True.
A partir de ahora podés cerrar el calendario con apretando Esc.
El botón podés ocultar arrastrándolo por detrás del calendario.
Jorge,
ResponderBorrarQuedó, como siempre, impresionado y muy agradecido, ya que tengo un par de formularios que se activan casi de la misma manera que este calendario , y que además me surgía el mismo problema. Ahora esta resuelto.
Gracias!!
¿Como puede modificarse la posicion en la que aparece el calendario?.
ResponderBorrarGracias por todo y un cordial saludo,..
EL Userform que contiene al calendario tiene dos propiedades: Left y Top.
ResponderBorrarSe pueden cambiar los valores programáticamente o manualmente en la ventanilla de las propiedades del objeto.
Hola como hago para que al seleccionar un cliente de la lista desplegable tambien aparezca su direcciòn (en la celda de abajo) es para hacer remisiones.
ResponderBorrarUso excel 2007
Gracias
Con alguna de las funciones de búsqueda como BUSCARV o INDICE, por ejemplo.
ResponderBorrarHola Tengo un problema con el calendario.
ResponderBorrarEstoy trabajando con excel 2007 y cuando abro el menú de herramientas, controles adicionales aparece desactivado y no me deja abrirlo. Cómo lo puedo activar?
Muchas gracias
Super excelente post!!! Te felicito JLD Excel por compartir tus conocimientos, tengo algo de experiencia en excel y macros, pero realmente te vuelas la barda!!
ResponderBorrarSolo recomiendo a los usuarios que lean TODOS los Blogs, porque las preguntas de la mayoría ya se contestaron :-)
Y deveras: Gracias!!!
Muy apreciable Jorge:
ResponderBorrarTe pido por favor que me indiques si existe alguna manera para que el calendario aparezca exactamente a un lado de la celda seleccionada, ya sea a la derecha o a la izquierda o en la esquina superior derecha o izquierda, he seguido todas tus indicaciones y no lo logro, ya probe a cambiar Top, Left, StarUpPosition del userform1, pero me lo coloca o en el centro de la pantalla o en su parte superior, si utilizo valores me la coloca siempre fija, yo quisiera que fuera exactamente a un lado de la celda activa, yo deseo algo parecido a los comentarios de excel. Gracias, espero no estar pidiendo imposibles
Saludos
Alexx
Los Mochis, Sinaloa, México
Hola Alex,
ResponderBorraracabo de publicar una nota con una explicación detallada del tema.
hola sr jorge:
ResponderBorrarmuchas gracias por sus aportes me han sido de gran ayuda, ya tengo insertado varios calendarios.
que formula deberia de emplear para que me dijera los dias que hay entre dos fechas, ej.: del 01/enero al 31/enero me diese 31 dias q tiene el mes
MUCHAS GRACIAS POR SU AYUDA
Con la función SIFECHA (DATEDIF). Puedes ver la nota sobre el tema en el blog.
ResponderBorrarHey muchas gracias me pase buscando este macro para un proyecto personal, realmente he aprendido mucho, me ha resultado y va de marravilla todo lo que he encontrado aqui.
ResponderBorrarMi pregunta, habra una manera que se pueda cambiar de celda, aunque no haya seleccionado una fecha en la celda anterior, sin utilizar el boton "X" o la tecla "ESC".
Gracias espero tu respuesta.
EXCELENTE ME FUNCIONO PERO LAS COMPROBACIONES NO, ¿NO SE QUE PASO? MI VERSION ES WIN2007.
ResponderBorrarVictor,
ResponderBorrar¿te refieres a la validación? Puedes enviarme el archivo para que vea donde está el problema.
Hola ke tal Excelente tu blog oye un pregunta tengo 2 celdas que em muestran fechas las utilizo para generar un reporte como puedo hacer que la segunda celda la que me limita mi busqueda no sea menor a la fecha inicial
ResponderBorrarPodés adaptar el modelo que muestro en esta nota (se aplica a horas, pero es el mismo principio para fechas).
ResponderBorrarPara abrir el calendario con doble clic, cambie en Hoja1 la instrucción dada por Jorge por la siguiente:
ResponderBorrarPrivate Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim rngFechas As Range
Set rngFechas = Range("A2:A20, C2:C20, E2:E20")
If Union(Target, rngFechas).Address = rngFechas.Address Then _
Call abrir_calendario
End Sub
Hola
ResponderBorrarhe seguido los pasos indicados para que aparezca el calendario cuando queramos elegir una fecha y no consigo que lo haga.
Tengo excel 2003.
Sí, ya sé que esta la explicación detallada, pero a mí no me funciona.
Fijate en Herramientas-Macro-Seguridad que el nivel establecido permita correr macros.
ResponderBorrarHola
ResponderBorrarHe mirado el nivel de seguridad y está en BAJO.
Consigo poner el calendario en Userform1 pero NO consigo que, en el paso siguiente , cuando marco una fecha del calendario, lo pase a la casilla correspondiente; tan solo, me desaparece la hoja de cálculo.
La explicación tuya inicial esta totalmente correcta?
Dime donde pudo estar cometiendo el error de transcripción.
Saludos
Estimado, después de 115 comentarios creo que podemos concluir que el modelo tal como está explicado, funciona.
ResponderBorrarAsegurate que el evento Worksheet_SelectionChange esté en el módulo de la hoja correspondiente y no en un módulo común del Vbe. Otro detalle a controlar es si el rango que activa el evento está indicado correctamente en el código del evento.
También puedes mandarme tu archivo para que vea donde está el problema.
Hola Jorge
ResponderBorrarPor fin me ha funcionado
Me faltaba el paso final(creo) que era cerrar y guardar el excel.
Cuando he vuelto a arrancarlo ya me ha funcionado.
De todos modos, gracias por haber estado pendiente.
Un saludo
Jorge, gracias por este blog. Es posible tener al mismo tiempo activos el calendario y el Data validation para que la fecha que yo seleccione sea validada antes de escribirla en la celda? Muchas Gracias. Atte. Carlos
ResponderBorrarCarlos,
ResponderBorraruno de los problemas con validación de datos es que funciona sólo cuando el valor es ingresado en la celda manualmente. Es decir, si copiamos el valor y lo pegamos en la celda o lo ponemos usando el calendario, la validación no funciona.
La forma de superar este problema es programando un evento.
Fijate en esta nota.
Hola Jorge, gracias por el link, pero me queda una duda. Lo que necesito es validar si la fecha que selecciono del calendario está "between" las fechas en las celdas L1 y J1. No programo en Visual (aunque me gustaría), qué cambio debo hacer a la rutina que me envías en el link? Muchas gracias de antemano
ResponderBorrarCarlos,
ResponderBorrarno hay que cambiar nada en el código. El cambio hay que hacerlo en la regla de validación. Tendrías que usar una fórmula como
=Y(A1>=$L$1,A1<=$J$1)
donde A1 es la celda a validar.
Eres grande Muchas gracias!!! Es justo lo que necesitaba :)
ResponderBorrarMuchas muchas gracias!!
ResponderBorrarpuede actualizarse dia a dia la fecha que aparece en el calendario???, porque a mi me aparece siempre la misma
ResponderBorrarpuede ponerse debajo del calendario un boton que diga hoy a al darle clic introduzca la fecha de hoy
Hola Jorge, Quisiera consultarte si existe alguna tabla dinámica, que pueda ser segmentada según el teorema de Pareto osea mostrar el 20% de los item que explican el 80% de los valores y el resto agruparlo en un item "otros(as)" integrando el 100% de la muestra. ?
ResponderBorrarMuchas Gracias
Luis,
ResponderBorrarfijate en el comentario de Luis F. Cruz Garcia del 28 de julio del 2007.
Carlos,
ResponderBorrarla consulta no está relacionada con el tema de la nota. De todas maneras, estoy preparando una nota sobre el tema.
Muchas gracias por compartir tus conocimientos!!! lo maximo!!!! una consulta sera posible que al moverse con las flechas del teclado sobre los dias del calendario, y dar enter, quede la fecha seleccionada?
ResponderBorrarAl moverte con las flechas la fecha va cambiando en la celda vinculada sin necesidad de apretar Enter.
ResponderBorrarHola Jorge, siempre leo tu blog y me parece muy bueno tu trabajo y tu ayuda a los que lo necesitan. Soy nueva en este tema y tengo que hacer un trabajo con bases de escel para validar las fechas y horas que pueden haber en un campo. Por ejemplo tengo una bd de 500 registros con diferentes campos uno de ellos fecha de ingreso, otro hora de ingreso, el problema es que aveces alguno de los registros vienen con fechas pero mal escritas o con otro año u otro mes como: 06/072011 o 0607/2011 o 06/07/2001 sabiendo que estamos en el año 2011, en el caso de las horas vienes 15.35 en vez de 15:35. Estos casos son en algunos registros de la bd quisiera saber si se puede hacer una macro para corregir estos errores en una bd.
ResponderBorrarSi el error o los errores son consistentes, es decir que siguen cierta regla, podemos corregirlos manualmente o con una macro.
ResponderBorrarPor ejemplo, si en el campo de las horas el error es siempre el uso de "." en lugar de ":", podemos seleccionar todo el campo y usar buscar y reemplazar (Ctrl+L) para solucionar el problema. La misma acción puede ser hecha con una macro.
El caso de las fechas es un poco más complejo ya que tenemos que detectar donde falta el "/". Una vez corregido el formato tendríamos que corregir el año. Aquí ya vale la pena usar una macro.
Muchas gracias Jorge ampliaste mi panorama con tu respuesta.
ResponderBorrar