Me preguntaron cómo hacer en Excel para que una determinada columna que representa fechas, al pinchar en cada celda (fila) se abriera un calendario para seleccionar la fecha fácilmente. A pesar de que para ciertas utilidades es mejor usar Access que Excel (una hoja de cálculo es lo que es), la tarea es sencilla. Para ello (usando MS Office 2010)
Antes de nada hay que crear un archivo excel y guardarlo como hoja habilitada para macros (extensión xlsm)
- Comprobar que tenemos el componente DTPicker (Date Picker) habilitado o instalado en Excel, si no es así hay que instalarlo
- Instalar el control DTPicker.
- En vista de programador, insertar un control DTPicker y escribir un poco de código VBA para que en las celdas que queramos nos abra ese control para seleccionar la fecha.
Nota: Sólo válido para Office de 32 bits. Office 64 bits no soporta controles ocx de 32 bits
Para Office 64 bits es necesario acudir a soluciones de terceros, p. ej.
https://sites.google.com/site/e90e50/calendar-control-class
http://www.fontstuff.com/vba/vbatut07.htm
1. Control DTPicker en Excel
No está por defecto en todas las instalacciones de Office, y además hay que tener en cuenta algunas peculiaridades si nuestro Windows / Office son de 32 o 64 bits (en mi caso Windows 10 de 64 bits con Ofiice 2010 de 32 bits).
Comprobar que tenemos el control DTPicker
Este control forma parte de la librería ActiveX mscomct2.ocx. En Excel tenemos que ir a la pestaña Programador (si no la tenemos, en opciones de Excel hay que activarla)
Una vez activado, en la pestaña programador insertamos objetos ActiveX (otros) y comprobamos si está o no:
Podemos tenerlo instalado o no, si está instalado, podemos seguir en el paso 3, si no, hay que instalarlo
2. Instalar el Control DTPicker
Tenemos dos posibilidades:
La web de microsoft proporciona un enlace roto para la descarga del componente mscomct2.ocx:
web de soporte: https://support.microsoft.com/es-es/kb/297381en ella el enlace de descarga no funciona: http://activex.microsoft.com/controls/vb6/MSCOMCT2.CAB
Sin embargo, acudiendo a la webarchive, cualquiera de las copias de 2014 o anterior encontrada nos permite descargar el archivo:
http://web.archive.org/web/20141012205821/http://activex.microsoft.com/controls/vb6/mscomct2.cab El archivo .cab es como un comprimido y dentro tenemos el que buscamos mscomct2.ocx
La otra opción es descargarse todo un paquete de controles de microsoft:
Nos descargamos el archivo VB60SP6-KB2708437-x86-ENU.msi, que de nuevo abriéndolo con un descompresor (7zip, winrar, winzip) encontramos el archivo que queremos dentro:
Ahora sólo queda instalarlo, para ello, hay que copiar el archivo a C:\windows\system32 si nuestro windows y el office son ambos de 32 bits o bien ambos son de 64 bits. El otro caso posible es que nuestro windows sea de 64 bits y el office de 32 bits, en ese caso hay que copiarlo a C:\windows\SysWOW64. Una vez copiado hay que registrarlo en el sistema, para ello abrimos una consola de comandos como administrador y ejecutamos según el caso:
Para sistemas Windows/Ofiice 32/32o 64/64ejecutar: c:\windows\system32\regsvr32.exe c:\windows\system32\mscomct2.ocx Para sistemas Windows/Office 64/32 ejecutar: c:\windows\system32\regsvr32.exe c:\windows\SysWOW64\mscomct2.ocx
Arrancamos de nuevo office y el control DatePicker ya estará disponible.
3. Hoja Excel
Ahora suponiendo una hoja excel con dos columnas donde tenemos que insertar las fechas, abrimos la pestaña programador, insertamos un control DatePicker , lo ubicamos y adaptamos al tamaño de la celda. Es imortante selecionar el formato de celdas de las columnas donde van a ir las fechas de tipo Texto, ya que si no excel escribirá números o cosas raras:
Ahora queda escribir el código VBA para que todo funcione, Pulsamos en el menú Ver código o bien Visual Basic y escribimos el siguiente código (muy sencillo). Tenemos que cambiar las columnas donde queremos que aparezcan las fechas, que se indican por números y no por letras (A->1, B->2…) en el ejemplo, columnas C y F (nColum=3 y 6 respectivamente)
Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) ' La columna con las fechas tiene que ser de tipo Texto ' Guardar la fila y columna de la selección actual nRow = Selection.Row nColumn = Selection.Column ' ocultamos el dtpicker por defecto y asignamos la fecha actual DTPicker1.Visible = False DTPicker1.Value = Now ' Sólo activar en celdas que no forman parte del título (fila 1 p.ej) If nRow > 1 Then ' Sólo activar el Datepicker en las columnas que interese ' ojo que va por números y no letras ' Columna A ->1,B->;2...etc If nColumn = 3 Or nColumn = 6 Then ' mostrar el datepicker y colocarlo en la celda activa DTPicker1.Visible = True DTPicker1.Left = ActiveCell.Left DTPicker1.Top = ActiveCell.Top 'asignar el valor que tenga la celda si es que tiene un valor If ActiveCell.Value <> "" Then DTPicker1.Value = ActiveCell.Value End If End If ' columna con fecha End If ' saltar primera fila, con los títulos End Sub Private Sub DTPicker1_Change() ' guarda en la celda activa el valor de la fecha cuando el datepicker cambia, ' para el día de hoy, si se pulsa en el día en el calendario no se guarda porque ' no lanza este evento Change (la fecha no cambia) hay que pinchar en el círculo ' inferior que indica today ActiveCell.Value = Left(DTPicker1.Value, 10) ' sólo dd/mm/aaaa End Sub |
Desactivamos el modo de diseño y probamos…
Nota: si queremos seleccionar el día de hoy, hay que pinchar abajo donde indica «today», para lanzar el evento Change del control
Adjunto los archivos: el excel de prueba y el control ocx:
fechas.xlsm (Nota: teniendo en cuenta el comportamiento de Excel con archivos de internet,es posible que no funcione correctamente, por ello es mejor crear uno nuevo en local, copiando/pegando)
mscomct2.zip
NOTA (actualización): la función que escribe la fecha en la celda toma los 10 primeros caracteres de la fecha seleccionada en el DatePicker, las fechas de esta manera están formadas por la fecha propiamente dicha y la hora, en formato shortDarte es del tipo ‘dd/mm/aaaa hh:mm:ss’, de modo que los 10 primeros caracteres son justamente dd/mm/aaaa. Pero a veces, por la configuración de Windows u Office no proporciona estos resultados, por lo que puede tomarse la primera parte que está separada por espacios con la hora. Para ello, en la función DTPicker1_Change() se tiene que sustituri por lo siguiente:
Private Sub DTPicker1_Change() Dim i As Integer ' el valor de i corresponde a la posición donde está el primer espacio en la fecha i = InStr(1, DTPicker1.Value, " ") ActiveCell.Value = Left(DTPicker1.Value, i) ' Poner en la celda el valor de la fecha hasta el primer espacio End Sub |
Espero que sirva a alguien…
Te agradezco este aporte, pero tengo un problema, si escojo 01/02/2017 sale 2 de enero del 2017.
Quisiera saber si puedes ayudarme con ello.
Hola, es un problema del formato inglés/español.
En modo diseño de la vista de Programador de Visual Basic, si haces click con el botón derecho en el objeto DTPicker, aparece una opción «Objeto DTPicker»-> Propiedades.
Ahí puedes seleccionar un modo «custom» para la fecha (formato dd/mm/yyyy)
Espero que resuelva el problema
Por cierto, he notado que según la configuración de Excel, la descarga del archivo xlsm, al provenir de internet, hace que no funcione adecuadamente, por lo que es mejor crear uno nuevo desde cero siguendo los pasos.
Hola yo tenia el mismo problema y no lo pude solucionar como lo comentaba abrazalaweb, yo lo solucione cambiando el formato de celda, puse que tiene que ser texto y no formato fecha.
en codigo VBA dice al comienzo esto:
Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
‘ La columna con las fechas tiene que ser de tipo Texto
saludos
carlos
ya lo intenté tengo el windows 10, segui paso a paso y al ejecutarc:\windows\system32\regsvr32.exe c:\windows\SysWOW64\mscomct2.ocx (64/32) primero me dice que se registró correctamente luego me da el siguiente mensaje
No se pudo cargar el modulo «(64/32)».
Asegurese de que el archivo binario este almacenado en la ruta de acceso especificado o depurelo para comprobar si hay problemas en el archivo binario o los archivos.DLL dependientes.
No se puede encontrar el modulo especificado.
Por favor necesito ayuda todos los dias capturo datos de fechas y es un problema cuando uno se equivoca, necesito el Control DTPicker. XXXXXX e-mail borrado por privacidad xxxxx
Hola, la parte entre paréntesis (32/32 – 64/64) o (64/32) no hay que ponerla en el comando, sólo indican el comando que ha de ejecutarse según la versión de Windows/Office. Por eso indica error, ya que «(64/32)» no es ningún módulo…
He editado la entrada para que quede más claro
Buenas noches, he seguido tus pasos para instalar los dos archivos (mscomctl.ocx y mscomct2.ocx), abro excel y el control no aparece por ningún lado, le doy a personalizadas, lo busco y me dice que ese archivo no tiene ningún contenido de activex.
Qué ocurre?
Windows y Office de 64 bits.
Gracias
Lamento mi error, parece que los controles ocx de 32 bits NO funcionan en Office de 64 bits, por tanto no es posible (he corregido el post).
Existen soluciones de terceros, p.ej: http://www.fontstuff.com/vba/vbatut07.htm
Office 64 bits no es una buena opción para el uso habitual…
buenas tardes. gracias por la información.
tengo un problema y es que no me aparece el data picker ya lo instale pero sigue sin aparecer.
que puede estar ocurriendo?
Hola, comprueba exactamente los pasos y repítelo por si acaso. Si la versión de Office es de 64 bits, entonces no se puede instalar.
Buenas tardes, una inquietud… como podría colocar el formato en una sola celda y no en toda la columna, ya que al configurar el VBo, se toda selecciona la columna 3 y 6?
Hola, simplemente hay que cambiar el código vba por los valores de las filas/columnas, en el ejemplo está así:
If nRow > 1 Then
' Sólo activar el Datepicker en las columnas que interese
' ojo que va por números y no letras
' Columna A ->1,B->2...etc
If nColumn = 3 Or nColumn = 6 Then
EL valor de la fila viene dado por nRow, y la columna por nCol. Para la fila se está indicando cualquier valor mayor que 1. Pot tanto para poner el selector de calendario en una fila determinada en una sola celda basta con modificar el código así:
If nRow = 10 Then ' FILA 10
' Sólo activar el Datepicker en las columnas que interese
' ojo que va por números y no letras
' Columna A ->1,B->2...etc
If nColumn = 3 Then ' COLUMNA 3
Muchas gracias, me ha sido de gran utilidad.
He conseguido poner 3 columnas con calendarios en una hoja que uso a menudo, muy práctico!!
Lo había intentado otras veces y no lo conseguí, pero con el código que has puesto es muy fácil.
Una aportación genial!!
Buen dia, funciono a la perfección, el calendario se despliega en las columnas que se indican, pero tengo un formato donde solo requiero la fecha en la columna F pero solo a partir de cierta celda, mas especifico a partir de la celda F42 hasta F52. Como puedo modificar el codigo.
Saludos.
Hola, tan sólo tienes que modificar las líneas del código donde se especifican las filas y columnas. El código del del ejempplo y el calendario se muestra en todas las filas (nRow > 1) y las columnas C y F (If nColumn = 3 Or nColumn = 6 Then).
En tu caso tienes que indicar que nRow esté comprendido entre 42 y 52, y que la columna nColumn sea la 6 (letra F). El código quedaría:
———————————————————————————-
‘ Sólo activar en celdas que no forman parte del título (fila 1 p.ej)
If nRow < 53 And nRow> 41 Then
‘ Sólo activar el Datepicker en las columnas que interese
‘ ojo que va por números y no letras
‘ Columna A ->1,B->;2…etc
If nColumn = 6 Then
———————————————————————-
Hola, muchas gracias de verdad, probé varias formas de distintos artículos de internet y ninguno había funcionado hasta este y sin problemas.
Super gracias CON HD 4K, me sacó del apuro.
Buenas tardes,
Todo genial hasta que registro «mscomct2.ocx» en el sistema. En mi caso Windows/Office 64/32
Aparece el mensaje de error:
RegSvr32
Se cargó el módulo «c:\windows\SysWOW64\mscomct2.ocx», pero se produjo un error en la llamada a DIIRegisterServer (código de error: 0x8002801c).
Podrías ayudarme¿?
Muchas gracias!
Hola, todo parece indicar que no estás ejecutando la ventana de comandos (cmd.exe) como Administrador, que es imprescindible (en el icono de cmd.exe, botón derecho del ratón y ejecutar como administrador).
Buscando por internet el error que indicas, esa es la solución:
https://answers.microsoft.com/es-es/windows/forum/all/windows-10-error-0x8002801c/17c9d78a-e12c-4581-bdc6-7c1f94c892e0
Tengo el oficce 2019 y realice todos los pasos pero no funcionó, no encuentra el DTPicker en la lista de controles, tambien intente agregarlo desde la carpeta de sysWOW64 pero nome deja agregarlo…. Si me dejo ejecutarlo con el cmd y hasta ahi llegue pero al abrir excel no encuentra ni pude agregar el dtpicker. Alguna otra solucion?
Comprueba que tu Office es el de 32 bits, sólo funciona con 32 bits. Si el Office es de 64 bits no funciona, aunque hay alguna alternativa como indicaba justo al principio del post
En un formulario utilizo DTPicker para ingresar fechas pero la fecha que aparece es la que está puesta en Value, Propiedades DTPicker. Cómo puedo modificarlo para que cada vez que habra el formulario aparezca la fecha actual?
Hola,
tan solo hay que asignarle el valor de la función Now (fecha/hora actual), si el control se llama DTPicker1 pues con la instrucción siguiente, dentro del evento que abre el formulario (Form_load en Access) o Initialize (en un UserForm de Excel)
Private Sub UserForm_Initialize()
DTPicker1.Value = Now
End Sub
buenas Tardes, funciona casi perfecto. No se porque cuando seleeciono 2/9/21 me aparece 2/9/21 1.
alguien me podra ayudar?
Hola,
¿podrías dar más detalles?. En la celda, cuando seleccionas 2/9/21 ¿aparece el texto «2/9/21 1» así tal cual, con ese ‘1’ al final?.
Tendría que aparecer tan sólo la fecha corta, y tendría que salir «02/09/2021» pues en el código se indica que la celda tome sólo esa forma (10 caracteres).
¿Sólo ocurre con esa fecha y en esa celda, o en otras también? ¿qué indica exactamente la barra de fórmulas en esa celda?
Mira la respuesta al primer comentario, por si acaso hay algo en el formato del DatePicker que está dando la lata…
Buenas abrazalaweb, si en todas las fechas que selecciono que sean de menos de 10 caracteres me aparece un espacio y un numero al final. Pasa en todas las celdas. Ya probe con la configuraciones de Celda ( esta en texto) y en las propiedades del DTpick esta en short Data
Vale.
Tiene pinta de ser algo con el formato de las fechas (por lo que ponías no te pone los «0» en días o meses menores de 10). Eso es algo de la configuración de Office o de Windows, pero tiene una sencilla solución, al menos según lo que me parece que está pasando (la pongo después de explicar lo que está ocurriendo).
Explico lo que ocurre:
Una fecha tiene dos componentes, la parte de la fecha propiamente dicha y la hora. P.ej: 15/09/2021 17:02:34
Si la fecha tiene el formato corto (shortData) entonces tendría que representarla como «XX/XX/XXXX yy:yy:yy». El código de la aplicación que pone el valor en la celda está en la función DTPicker1_Change():
ActiveCell.Value = Left(DTPicker1.Value, 10) ' sólo dd/mm/aaaa
La función Left lo que hace es justamente poner en la Celda del Excel los 10 primeros caracteres de la fecha seleccionada, que al estar en formato corto (ShortDate) coincide justo con «XX/XX/XXXX». En tu caso, algunas fechas las representa como «X/X/XX», pero hay que añadirle la hora, por lo que tu valor de fecha será «X/X/XX yy:yy:yy», y entonces los primeros 10 caracteres incluyen un espacio y números detrás (quizá sólo ves un número porque está tapado por el tamaño de la celda)
Solución:
En lugar de coger los 10 primeros caracteres de la fecha, puede cogerse la primera parte que está separada por espacios con la hora. Para ello, en la función DTPicker1_Change() tienes que sustituir:
ActiveCell.Value = Left(DTPicker1.Value, 10) ' sólo dd/mm/aaaa
Por lo siguiente:
Dim i As Integer
i = InStr(1, DTPicker1.Value, " ") ' el valor de i corresponde a la posición donde está el primer espacio en la fecha
ActiveCell.Value = Left(DTPicker1.Value, i) ' Poner en la celda el valor de la fecha hasta el primer espacio
Espero que esto resuelva el problema, si no es así, vuelve a preguntar
Muchas Gracias Funciona perfecto ahora!!!