Excel : Introducir Fechas con desplegable calendario (DTPicker)

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)

  1. Comprobar que tenemos el componente DTPicker (Date Picker) habilitado o instalado en Excel, si no es así hay que instalarlo
  2. Instalar el control DTPicker.
  3. 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)

programador excel

Una vez activado, en la pestaña programador insertamos objetos ActiveX  (otros) y comprobamos si está o no:

3 ActiveX

Podemos tenerlo instalado o no, si está instalado, podemos seguir en el paso 3, si no, hay que instalarlo

4 DatePickerNotFound

No está instalado en control fecha

6 DatePickerFound

Sí está instalado el control fecha

 

 

 

 

 

 

 

 

 

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:

https://www.microsoft.com/en-us/download/details.aspx?id=7030&fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True

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:

mscomct2

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/32 o 64/64 ejecutar:
  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
Windows 64 bits, Office 32 bits

Windows 64 bits, Office 32 bits

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:

8 Redimensionar DTpicker

 

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

9 Probar

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…

27 Comments

  1. LINA · miércoles, 25 enero, 2017 Reply

    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.

    • abrazalaweb · jueves, 26 enero, 2017 Reply

      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.

    • Carlos · lunes, 10 abril, 2017 Reply

      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

  2. Cecilio perez · miércoles, 1 marzo, 2017 Reply

    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

    • abrazalaweb · miércoles, 1 marzo, 2017 Reply

      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

  3. Juan Montañez · martes, 5 septiembre, 2017 Reply

    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

  4. william parra · miércoles, 18 octubre, 2017 Reply

    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?

    • abrazalaweb · jueves, 19 octubre, 2017 Reply

      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.

  5. Julian Andres · viernes, 27 octubre, 2017 Reply

    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?

    • abrazalaweb · sábado, 28 octubre, 2017 Reply

      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

  6. Anna · lunes, 26 febrero, 2018 Reply

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

  7. ALEJANDRO MENDOZA ARTEAGA · sábado, 14 julio, 2018 Reply

    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.

    • abrazalaweb · domingo, 15 julio, 2018 Reply

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

  8. Paulina · viernes, 3 agosto, 2018 Reply

    Hola, muchas gracias de verdad, probé varias formas de distintos artículos de internet y ninguno había funcionado hasta este y sin problemas.

  9. ian · viernes, 27 septiembre, 2019 Reply

    Super gracias CON HD 4K, me sacó del apuro.

  10. Patxi · martes, 5 noviembre, 2019 Reply

    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!

  11. Nahuel · lunes, 27 abril, 2020 Reply

    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?

    • abrazalaweb · lunes, 27 abril, 2020 Reply

      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

  12. Pablo Kloster · lunes, 15 junio, 2020 Reply

    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?

    • abrazalaweb · martes, 16 junio, 2020 Reply

      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

  13. Alejandro · martes, 14 septiembre, 2021 Reply

    buenas Tardes, funciona casi perfecto. No se porque cuando seleeciono 2/9/21 me aparece 2/9/21 1.

    alguien me podra ayudar?

    • abrazalaweb · martes, 14 septiembre, 2021 Reply

      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…

  14. Alejandro · miércoles, 15 septiembre, 2021 Reply

    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

    • abrazalaweb · miércoles, 15 septiembre, 2021 Reply

      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

  15. Alejandro · jueves, 16 septiembre, 2021 Reply

    Muchas Gracias Funciona perfecto ahora!!!

Responder a abrazalaweb Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.