viernes, mayo 18, 2007

Validar fechas en Excel con un calendario

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_01calendario 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:

84 comentarios:

Anónimo dijo...

Gracias, Jorge era precisamente lo que estaba buscanda.

Att:

Julian P.

Anónimo dijo...

hola que tal, me sirve de mucho este blog, y se lo agradezco
pero 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

Gilberto dijo...

NECESITO AYUDA EN EL CALCULO DEL NUMERO DE CELDAS DENTRO DE COLUMNAS DE DATOS

LES ANEXO TABLA
MUCHAS GRACIAS

Jorge L. Dunkelman dijo...

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.
Por 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.

Jorge L. Dunkelman dijo...

Hola Gilberto,
no entiendo tu pregunta. Para mandarme un adjunto hazlo a dunk@maaganm.co.il

Gabriel dijo...

Como se hace cuando las celdas con fecha van por ejemplo en h21,h31,h41,h51... y no en un rango h21:h51

Jorge L. Dunkelman dijo...

Hola Gabriel,
para crear un rango no continuo mantienes apretada la tecla Ctrl mientras vas seleccionando las celdas con el mouse.

Gabriel dijo...

Muchas gracias Jorge por tu respuesta.Sigo con problemas.
En 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

Jorge L. Dunkelman dijo...

Hola Gabriel,
ciertos 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).

Luis Felipe Cruz Garcia dijo...

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.

Jorge L. Dunkelman dijo...

Hola Luis, gracias por el comentario. Efectivamente, se me paso por alto.

Ariel Escobar dijo...

hola 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.

dejo un un ejemplo.
http://img182.imageshack.us/img182/8140/fehcand0.jpg

Jorge L. Dunkelman dijo...

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"

Ariel Escobar dijo...

gracias por la ayuda solo tengo una consulta mas como extraigo el mes selecionado en el calendario a una celda en excel ejamplo

seleciono 12 junio en el calendaio
y que en una selda apareca el mes que selecione de la fecha

Jorge L. Dunkelman dijo...

Hola Ariel

Seleccionas 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.

Petit Comite dijo...

Necesito tu ayuda para poder agilizar la programación de la un extensa hoja en el caso de insertar el calendario.


He 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 !!!

Petit Comite dijo...

Perdona, este es el fichero bueno:



Hoja Control formulario

Jorge L. Dunkelman dijo...

Hola Petit

no podes adjuntar un archivo en el comentario. Mandamelo a jorgedun@gmail.com

Anónimo dijo...

Sr.

Dunkelman, 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

Jorge L. Dunkelman dijo...

Hola Fernando
fí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

Jair dijo...

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.

Jorge L. Dunkelman dijo...

Hola Jair

tienes 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.

Jair dijo...

Jorge, gracias, cacharreando con las macros, en la macro abrir calendario hice esto y me funcionó:

Sub abrir_calendario()
UserForm1.Calendar1.Value = Now
UserForm1.Show
End Sub


De nuevo muchas gracias.

ana dijo...

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?

Jorge L. Dunkelman dijo...

Hola Ana

para 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")

Anónimo dijo...

Buenas tardes,

Agradezco 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

Jorge L. Dunkelman dijo...

Hola José

siguiendo 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.

Anónimo dijo...

hola disculpa me gustaria saber como realizo un filtro desplegando el calendario

Jorge L. Dunkelman dijo...

Si 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.

alvaro dijo...

hola Jorge
impresionado 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.

Jorge L. Dunkelman dijo...

Hola Álvaro

mandame el archivo con el problema (jorgedun@gmail.com)

Anónimo dijo...

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:

De 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?

Jorge L. Dunkelman dijo...

Fijate si la técnica que muestro en esta nota te ayuda.

Wilson dijo...

Hola Jorge, muy útil tu blog.
Tengo 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

Jorge L. Dunkelman dijo...

Si lees inglés puedes ver esta discusión en el foro Excel de Ozgrid.
Básicamente me parece que la mejor soución es pedirle al usuario que instale el calendario.

Anónimo dijo...

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?
Muchas gracias
Galileo.

Jorge L. Dunkelman dijo...

Supongamos que la celda C1 de la hoja1 contiene la fecha, en el evento UserForm_Activate() puedes poner

Private Sub UserForm_Activate()
Calendar1.Value = Sheets(1).Range("C1").Value
End Sub

Anónimo dijo...

Hola Jorge,

Gracias 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

HUGO28 dijo...

Hola:
Alguien 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").

Jorge L. Dunkelman dijo...

Hola Carlos

progrmando el evento Worksheet_BeforeDoubleClick

cieiyi3 dijo...

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:

Por 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.

Jorge L. Dunkelman dijo...

Hola Carlos

validació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.

cieiyi3 dijo...

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
un 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.

Max dijo...

Que tal sr. Jorge

he 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.

Jorge L. Dunkelman dijo...

Hola Max

puedes 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.

Juan Antonio Martínez (Duke) dijo...

Hola:
El 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.

Jorge L. Dunkelman dijo...

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

target.Interior.ColorIndex = el número del color en la paleta

Juan Antonio Martínez (Duke) dijo...

Gracias. Lo he solucionado de la siguiente manera:

Set 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.?

Anónimo dijo...

Buenos días Sr. Dunkelman,

En 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

Jorge L. Dunkelman dijo...

Una solución es crear tres rangos y luego usar OR para definir los rangos válidos.

HECTOR LEAL dijo...

Buenas tardes

Tengo 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

Jorge L. Dunkelman dijo...

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

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

Jose dijo...

Ante todo, me han servido de mucho todas las explicaciones que ha dado con respecto al calendario.
Una sola cosa, ¿como hago para que introduzca la fecha sin tener que hacer click? solo con pulsar enter, por ejemplo.
Gracias.

Jorge L. Dunkelman dijo...

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í

Private 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.

HECTOR LEAL dijo...

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.
Hector

Anónimo dijo...

buenas

esta 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.

Jorge L. Dunkelman dijo...

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?

Anónimo dijo...

GRacais por su respuesta.

lo 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

Anónimo dijo...

Hola.

yo 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

Anónimo dijo...

Hola

yo 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

Jorge L. Dunkelman dijo...

Puedes descargar el control que te falta aquí

Anónimo dijo...

Jorge: Agradezco su ayuda y el link que me envio. Ahora si puedo utlizar el Control calendar.

Aunque 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)

Jorge L. Dunkelman dijo...

Edu
no 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).

Anónimo dijo...

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

Anónimo dijo...

Jorge

Muchas 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.

Jorge L. Dunkelman dijo...

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

Anónimo dijo...

Buenos días Sr. Dunkelman.

Le 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

Jorge L. Dunkelman dijo...

Fijate en el comentario de Felipe Luis Cruz García, donde sugiere agregar la orden

Calendar1.Value = Now

en el evento Userform_Activate

Esto hara que cada vez que se abra el calendario (activate), aparezca con la fecha corriente.

Anónimo dijo...

Buenos días Sr. Dunkelman.

Tan solo le escribo para darle las gracias por su ayuda.
Ha sido usted muy amable y paciente.

Saludos cordiales.

Sergi

Anónimo dijo...

Al ir a la Opcion Herramientas-> Controles adicionales. Controles adicionales esta desacativada y no puedo elegir el Calendar Control. Que puede estar pasando?

Jorge L. Dunkelman dijo...

Puede ser que falte el control. Fijate en el enlace que puse en mi comentario del 11 de febrero.
¿Qué versión de Excel estás usando?

Anónimo dijo...

SEÑOR JORGE, mil gracias por tantos conocimientos y ayuda que brinda.

Tengo 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

Anónimo dijo...

SEÑOR JORGE, gracias por su tiempo y atención.

Tengo 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

Jorge L. Dunkelman dijo...

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.

Anónimo dijo...

Jorge, 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.

Saludos
Federico

Jorge L. Dunkelman dijo...

Puedes descagar el Calendar de la WEB, pero tmbi[en puedes usar el DTPicker en un Userform como el Calendar.

Grupo Cinco dijo...

Buenas noches: ¿Como se puede hacer para que al elegir una fecha no te permita elegir dias no laborables y feriados? Muchas gracias.

Jorge L. Dunkelman dijo...

No puedes evitar que los feriados aparezcan en el control, peropuedes impedir que sean ingresados en la celda usando validación de datos.

Grupo Cinco dijo...

Muchisimas gracias por su respuesta y su sugerencia Sr Dunkelman. Sólo voy a abusar de su confianza para realizar un par de preguntas adicionales:

- 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.

Jorge L. Dunkelman dijo...

Grupo Cinco
te sugiero que te comuniques conmigo vía privada por mail (la dirección en el enlace en Contacto)

HECTOR LEAL dijo...

HOLA JORGE HACE DIAS NO SOCLICITABA TU AYUDA TENGO LA SIGUIENTE Y ESPERO ME PEUDAS AYUDAR

DEBO 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

Jorge L. Dunkelman dijo...

Hola Héctor,
que me genere qué?
Te sugiero que te pongas en contacto conmigo por mail.

Anónimo dijo...

Hola.

Tengo 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

Jorge L. Dunkelman dijo...

Hay varias formas. Por ejemplo, en la celda C27 puedes poner esta fórmula
=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"...