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

 

Espero que sirva a alguien…

11 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

Leave a Reply

Tu dirección de correo electrónico no será publicada.