Traducir el blog

Cómo calcular la edad y el día de la semana antes de 1900

Esta entrada del blog es la segunda de la trilogía sobre el cálculo de fechas anteriores al año 1900 con funciones en VBA. La trilogía explica:

A) Cómo calcular fechas antes de 1900 en Excel y VBA

B) Cómo calcular la edad y el día de la semana antes de 1900

C) Calendario Perpetuo desde antes de 1900


En esta entrada explicaré cómo calcular la edad y el día de la semana y a restar fechas anteriores al año 1900:

1) Formatos de celdas con fechas

2) Día de la semana en Excel y en VBA

3) Calcular diferencia de fechas en días

4) Calcular la edad en años

5) Plantilla con fechas Excel y VBA

 

1) Formatos de celdas con fechas

En las celdas de Excel se permiten fechas desde el 1 de enero de 1900 aunque, como ya sabemos por el primer artículo de esta trilogía, la primera fecha válida es el 1 de marzo de 1900.



La competencia se ha adelantado a Excel, pues permite fechas con números de serie negativos en sus celdas:

  • LibreOffice Calc permite fechas desde el día 15 de octubre de 1582, que es el primer día del Calendario Gregoriano.

  • Google Sheets permite las fechas del Calendario Gregoriano y desde el 1 de enero de -1, que deberían ser convertidas al Calendario Juliano.

Excel obliga a usar macros en VBA para poder tratar los números de serie negativos, como variables tipo Date en VBA, como se comentó en el primer artículo de esta trilogía, y es lo que vamos a hacer a continuación.

Para saber más sobre fechas en Excel puedes leer estos dos artículos en inglés:

How to Work with Dates Before 1900 in Excel

How to calculate ages before 1/1/1900 in Excel


Pero lo mejor es seguir leyendo...


2) Día de la semana en Excel y en VBA

Ya sabemos todos que para obtener el nombre del día de la semana en Excel, a partir de una celda con una fecha, la fórmula apropiada es:

=TEXTO(fecha;"dddd")

Pero esta fórmula sólo funciona para fechas a partir del 1 de marzo de 1900.

En el archivo (a descargar en el apartado 5) he preparado un ejercicio con las fechas en Excel y VBA que me sirvió para ayudar a responder sobre este asunto en el foro de ayudaexcel.com:

Calcular el día de la semana en fechas anteriores a 1900

Un usuario necesitaba saber el día de la semana (lunes, martes, miércoles...) de fechas anteriores a 1900, para lo que preparé un archivo con 3 macros en un módulo VBA.

La función ObtenerDíaSemanaISO() devuelve el día de la semana, si se le pasa una cadena de texto en formato ISO 8601, llamando a las funciones ObtenerNúmDíaSemanaISO() y ObtenerSerieFechaISO()

Es fácil convertir una string con una fecha en formato de texto al formato estándar ISO, lo que se puede ver en la hoja 'Fechas' del archivo que se puede descargar en el apartado 5) de esta entrada.

Si la fecha está en formato fecha, o en formato fecha sin convertir a ISO 8601, se deben usar las siguientes funciones:

Para obtener el número de serie de una fecha:

=ObtenerSerieFechaVBA($A2;ESNUMERO($A2))

Para obtener el día de la semana de una fecha:

=ObtenerDíaSemanaVBA($A2;ESNUMERO($A2))

Los cálculos están en la hoja 'Día Semana':

Como el año 1900 no fue bisiesto, devuelve error para el 29 de febrero.


3) Calcular diferencia de fechas en días

Para calcular la diferencia entre dos fechas en días se puede usar una función no documentada, herencia de Lotus 123, que se puede consultar en el siguiente enlace:

Calcular la diferencia entre dos fechas

La función SIFECHA, en inglés DATEDIF, permite calcular la diferencia en días, semanas, meses y años entre dos fechas. Por ejemplo, para calcular los días:

=SIFECHA("1-01-2014";"6-05-2016";"d")

El tercer argumento indica, con la letra "d", que la diferencia está expresada en días.

La forma más fácil de obtener los días es restar las fechas:

=ENTERO(Fecha1 - Fecha2)

De cualquiera de las maneras, si intentamos calcular los días para una o dos fechas anteriores al año 1900, nos dará error de valor: #¡VALOR! pues Excel no funciona con números de serie de fecha negativos.

Para años anteriores a 1900 se deben usar macros en VBA con la función:

= DateDiff("d", dtFecha1, dtFecha2)

Y eso se ha hecho en el archivo descargable, en el módulo "ModRestarFechas1900":

Function RestarFechas(sFecha1 As String, sFecha2 As String) As Long

que usa las funciones DateValue y DateDiff para calcular el número de días entre fechas desde el 1 de enero del año 100 hasta el 31 de diciembre de 9999, como se puede ver en la hoja 'Edad':

En color de fondo naranja, las fechas con dos cifras para el año, que se tranforma en los años 1930 y 1980. En color amarillo la fecha actual con la función: =HOY()

Si "Fecha Final" está vacía, toma esa fecha como la actual.

La columna con el cálculo de la Edad se explica en el siguiente apartado.


4) Calcular la edad en años

El cálculo de la edad en años se puede hacer con la siguiente fórmula para dos celdas de Excel:

=ENTERO(FRAC.AÑO(A1;B1))

Otra fórmula es usar el tercer argumento para años "y" de la función no documentada que ya conocemos:

=SIFECHA(A1;B1;"y")

Pero seguimos teniendo el problema de que las fechas en las celdas sólo sirven para números de serie positivos de fechas. 

Para años anteriores a 1900 se deben usar macros en VBA con la función:

DateDiff("yyyy", dtFecha1, dtFecha2)

Y eso se ha hecho en el archivo descargable, en el módulo "ModRestarFechas1900":

Function ObtenerEdad(sFechaNacimiento As String, sFechaCálculo As String) As Long

que usa las funciones DateValue y DateDiff para calcular el número de años entre fechas, desde el 1 de enero del año 100 hasta el 31 de diciembre de 9999, como se puede ver en la hoja 'Edad'.

Esta función me sirvió para ayudar en el foro de ayudaexcel.com:

Cómo restar dos fechas si alguna es anterior al año 1900


5) Plantilla con fechas Excel y VBA

Descarga la plantilla totalmente gratuita, con las macros visibles y las hojas protegidas sin contraseña, desde Google (con el botón "Excel Download") o desde el enlace a Microsoft OneDrive:

Fechas anteriores a 1900 PW1.xlsm 


La voz del usuario de Excel

He votado y comentado la siguiente sugerencia "Dates prior to 1900" en Excel UserVoice para poder usar fechas con número de serie negativo en las celdas. La sugerencia lleva desde el 27 de septiembre de 2015. En 5 años Microsoft Excel no ha dicho ni pío, cuando la competencia de Google Sheets y LibreOffice Calc funcionan perfectamente con todo el Calendario Gregoriano.

¿Me ayudas a que esta sugerencia sea popular, votando también?

Microsoft Excel UserVoice: Dates prior to 1900

Actualización 2022-06-06: Esa página provoca el Error 404: Page Not Found.

Microsoft ha borrado intencionadamente UserVoice, y ha desaparecido todo el historial de sugerencias enviadas por los usuarios de Office, con lo que se han perdido todos los votos de los últimos años.

Desde hace 7 meses Microsoft ha creado un nuevo portal de Feedback (en inglés), donde compartir comentarios y ayudar a hacer mejoras y crear nuevos productos, con lo que he vuelto a escribir un comentario y votar por esta sugerencia:

Dealing with dates before 1900 · Community (microsoft.com)

Atento a la próxima entrada donde explicaré cómo hacer un calendario para meses anteriores al año 1900.

Cómo calcular fechas antes de 1900 en Excel y VBA

🔝To translate this blog post to your language, select it in the top left Google box.


Desde que me dedico en serio a los cálculos me ha apasionado la conversión de fechas, con sus días y sus horas.

Esta entrada del blog es la primera parte de una trilogía sobre el cálculo de fechas anteriores al año 1900 con funciones en VBA. La trilogía explicará:

A) Cómo calcular fechas antes de 1900 en Excel y VBA

B) Cómo calcular la edad y el día de la semana antes de 1900

C) Calendario Perpetuo desde antes de 1900

En esta entrada explicaré lo que interesa conocer sobre las fechas en Excel y en VBA para poder calcular correctamente las fechas anteriores y posteriores al año 1900:

1) Fechas correctas y erróneas en Excel

2) Fechas correctas y erróneas en VBA

3) Calendario Gregoriano

4) Fechas según norma ISO 8601

5) Listado de fechas curiosas

6) Plantilla con fechas Excel y VBA

En esta imagen se puede ver cómo se pretenden calcular las fechas anteriores y posteriores al 1 de marzo de 1900, tanto con fórmulas en Excel como con macros  en VBA.

Esta tabla está en la hoja 'Fechas' de la plantilla que se puede descargar al final de esta entrada y donde se puede obtener la fórmula que convierte las fechas en formato ISO 8601. Los números de serie y días de la semana de enero y febrero de 1900 con calculados incorrectamente por Excel, lo que se explica si lees más abajo.


1) Fechas correctas y erróneas en Excel

Excel es una herramienta invaluable para calcular fechas, eso sí, para días desde el 1 de marzo de 1900 hasta el 31 de diciembre de 9999.

En una celda de Excel las fechas se guardan como la parte entera positiva de un número decimal y se define como el número de serie de un día, comenzando en el número de serie 1, que corresponde con el día 1 de enero de 1900, que es incorrectamente calculado por Excel.

Los meses de enero y febrero de 1900 no se deben usar en los cálculos, pues hay un error conocido en Excel para esos dos meses, ya que se definió erróneamente 1900 como año bisiesto, por lo que el primer día correcto para usarlo en los cálculos de fechas en las celdas, fórmulas y funciones de Excel es el 1 de marzo de 1900, con el número de serie 61.

Ver el siguiente enlace donde se explica el error cometido por los desarrolladores de Excel:

En esta tabla se muestran los números de serie admitidos por Excel para el rango de fechas correctas:

Las horas se guardan en la parte decimal del número. De las horas no hablaré en esta entrada por lo que, si quieres saber más sobre las horas, abre el siguiente enlace:


2) Fechas correctas y erróneas en VBA

Para calcular fechas anteriores al 1 de marzo de 1900 vienen en nuestra ayuda las funciones de fecha de VBA, ya que permiten cálculos con fechas anteriores al 1 de marzo de 1900, gracias a que trabajan con números de serie negativos para fechas anteriores al año 1900.

El primer número de serie negativo es el -1 que se corresponde con la fecha del 29 de diciembre de 1899.

El último número de serie negativo es el -657.434 que se corresponde con la fecha del 1 de enero del año 100.

El rango de fechas posible de un tipo de dato Date en VBA es desde el 1 de enero de 100 hasta el 31 de diciembre de 9999.

En esta tabla se muestran los números de serie admitidos por VBA para el rango de fechas correctas:

Para calcular el número de serie en VBA he definido la siguiente función:

=ObtenerSerieFechaISO($B2)

Para calcular el nombre del día de la semana en VBA he definido la siguiente función:

=ObtenerDíaSemanaISO($B2)

El formato de fecha en la celda B2 debe ser según norma ISO 8601, explicada en el apartado 4).


3) Calendario Gregoriano

En este artículo en adelante siempre se representarán las fechas en el Calendario Gregoriano (enlace aquí) ya que el Calendario Juliano (enlace aquí) prácticamente sólo lo usan los historiadores.

Para calcular según el Calendario Juliano se puede estudiar el siguiente enlace:


4) Fechas según norma ISO 8601

Desde este momento voy a seguir la norma internacional ISO 8601 para representar las fechas en formato texto, cosa muy recomendable para fechas anteriores al 1 de marzo de 1900. Este formato de fechas se puede consultar en el siguiente enlace:

La norma ISO 8601 ayuda a eliminar las dudas que pueden surgir de las diversas convenciones, culturas y zonas horarias de días y fechas que afectan a una operación global. Ofrece una forma de presentar fechas y horas claramente definidas y comprensibles tanto para las personas como para las máquinas.

El formato de fechas ISO 8601 es así: AAAA-MM-DD 

En inglés: YYYY-MM-DD

Las cifras están separadas por guiones "-" y las letras representan el año, mes y día, rellenadas con ceros por la izquierda:

  • AAAA o YYYY: son las 4 cifras del año.
  • MM: son las 2 cifras del mes.
  • DD: son las 2 cifras de día.

Por ejemplo, el día 2000-02-29 fue el 29 de febrero de 2000.


5) Listado de fechas curiosas

La siguiente tabla está en la hoja 'Año<1900' de la plantilla que se puede descargar al final de esta entrada.

Para no cometer errores, conocidos como bugs en inglés, en el cálculo de fechas se deben tener en cuenta las siguientes fechas, según norma ISO 8601:

  • 9999-12-31 (Nº Serie: 2.958.465) es el último día correcto en Excel y en VBA. A partir de ese día Excel y VBA dejarán de funcionar... (tal y como los conocemos hoy en día).
  • 1900-03-01 (Nº Serie: 61) es el primer día correcto, por lo que puede ser tratado por las funciones de fecha y hora de Excel.
  • 1900-02-29 (Nº Serie: 60 en Excel; 61 en VBA) es una fecha errónea tanto en Excel como en VBA pues el año 1900 no fue bisiesto.
  • 1900-01-01 (Nº Serie: 1 en Excel; 2 en VBA) es el primer día erróneo en Excel y el segundo día correcto en VBA con un número de serie positivo.
  • 1899-12-31 (Nº Serie VBA: 1) es el primer número de serie positivo en VBA. En Excel no existen números de serie negativos.
  • 1899-12-30 (Nº Serie VBA: 0) es el número de serie cero en VBA. 
  • 1899-12-29 (Nº Serie VBA: -1) es el primer número de serie negativo en VBA. 
  • 1752-09-14 (Nº Serie VBA: -53.797) fue el primer día Gregoriano en Inglaterra.
  • 1582-12-20 (Nº Serie VBA: -115.792) fue el primer día Gregoriano en Francia.
  • 1582-10-15 (Nº Serie VBA: -115.858) fue el primer día Gregoriano en España, decretado en Roma por el papa Gregorio XIII, que dio nombre al Calendario Gregoriano.
  • 0100-01-01 (Nº Serie VBA: -657.434)  es el primer día correcto para las funciones de fecha en VBA.
  • 0099-12-31 Fecha interpretada por Excel y VBA por compatibilidad. Cuando el año se representa con 2 cifras de la 30 a la 99 se interpreta como los años 1930 a 1999.
  • 0000-01-01 Fecha interpretada por Excel y VBA por compatibilidad. Cuando el año se representa con 2 cifras de la 00 a la 29 se interpreta como los años 2000 a 2029.

Con estas fechas ¿qué quiero decir?

¡Que no todo vale cuando calculamos con las funciones de fecha!

¡Tanto si hablamos de Excel como de las macros en VBA!

No solo tenemos que tener en cuenta las limitaciones de los números de serie de fechas en Excel, o el límite del año 100 en VBA, sino que debemos asegurar que las fechas se corresponden con fechas del Calendario Gregoriano según el primer día en que se decretó su uso en cada país (en la lista anterior he incluido los 3 días más importantes en que se pasó a usar el Calendario Gregoriano y se dejó de usar el Calendario Juliano.


6) Plantilla con fechas Excel y VBA

Descarga la plantilla totalmente gratuita, con las macros visibles y las hojas protegidas sin contraseña, desde Google (con el botón "Excel Download") o desde el enlace a Microsoft OneDrive:

Fechas anteriores a 1900 PW1.xlsm 

Con ella ya puedes experimentar el placer de dominar las fechas en Excel y en VBA. Puedes escribir un comentario si tienes alguna duda.

Atento a la próxima entrada donde explicaré cómo calcular la edad y el día de la semana si alguna fecha es anterior al año 1900.

Visor de vídeos en Excel

Desde mi auto-jubilación tengo más tiempo para ver vídeo-tutoriales sobre Excel y, por qué no, también vídeos musicales, series, documentales y películas.

En YouTube hay muchos vídeos para ver, como mi propio Canal YouTube Pedro Wave, pero no me gusta no poder controlar mis listas de reproducción y que aparezcan anuncios cuando lo que quiero es ver un vídeo concreto.

Con Excel puedo tener mi propia lista de reproducción de vídeos, filtrarla y ver los vídeos mediante un control WebBrowser, lo que ya hice en una ocasión anterior:

Blog Pedro Wave for Excel Guys - Reproductor de listas de vídeos

Este proyecto va dedicado a todos los Excelentes YouTubers que publican continuamente videos tutoriales sobre Microsoft Excel y sus herramientas Power Query, Power Pivot, Power View, Power BI, con los que he aprendido tanto.

Con este visor incrustado en Excel puedo tener un repositorio de todos los vídeos que me interesa volver a ver de gurús de Excel como: George Lungu, Chandoo, Jordan Goldmeier, Debra Dalgleish, Sergio Alejandro Campos, Carolina de Andrade, Mynda Treacy, Leila Gharani y tantos otros a los que estoy agradecido.



Pero no sólo puedo ver vídeos sobre Excel sino que también puedo crear listas de vídeos musicales y abrir páginas Web.

A partir de ahora puedo reproducir vídeos en un único visor hecho en Excel (pero sin que se note mucho, por eso oculto todo menos el marco del reproductor), con las siguientes características:

  1. Hoja 'Videos' con el Visor generado con un control WebBrowser que permite incrustar páginas Web.
  2. Hoja 'Video_List' separada con una tabla con la lista de vídeos y páginas Web a reproducir. De momento su edición es manual.
  3. Lista de los primeros 50 vídeos filtrados que son los que se pueden reproducir como máximo en el visor.
  4. Posibilidad de ejecutar el vídeo en 3 modos: Pausa, Play y Bucle.
  5. Edición automática de la colección de PlayList en YouTube.
  6. Presentación en dos modos: como Excel o como Ventana independiente sin ninguna barra ni referencia a Excel.
  7. Control para mostrar u ocultar la barra de título de la ventana de Windows.
  8. En modo Ventana se puede cambiar el zoom del visor del 100% al 25% y así ocupar una pequeña porción de la pantalla.
  9. Hoja 'TD_Videos' auxiliar para filtrar la lista con un filtro avanzado por: Título, Web, Puntos y Clase.
  10. Controles para ir al primer vídeo, al anterior, al siguiente y al último vídeo.
  11. Control para enmudecer el altavoz (mute) u oirlo en YouTube.
  12. Hoja 'HTML' auxiliar para editar automáticamente la página HTML a mostrar, que lleva incrustado el vídeo en código con varios TAG.
  13. Tabla con la ayuda de los controles del visor.
  14. Tabla con las teclas de acceso rápido para controlar el reproductor de YouTube.

Para modificar la lista de vídeos y páginas Web, en la hoja 'Video_List' se debe editar manualmente (lo dejo pendiente de una nueva versión para automatizar la introducción de nuevos vídeos en YouTube) la tabla con las listas de reproducción. Deben incluir uno solo de los dos campos: Id o Web. Para indicar que es un vídeo de YouTube sólo se debe introducir su Id. En cualquier otro caso se deja vacío el Id. y se introduce la página Web completa. Son obligatorios los demás campos: Título, Puntos y Clase.


Descarga de la plantilla

Descarga la plantilla totalmente gratuita, con las macros visibles y las hojas protegidas sin contraseña, desde Google (con el botón "Excel Download") o desde el enlace a Microsoft OneDrive: Es una versión Beta probada con Excel 2010 en Windows 7 y con una resolución de pantalla de 1920 x 1080 pixeles, por lo que agradeceré tu ayuda como tester de este nuevo visor hecho en Excel.

Si usas Excel 2013 o superior, por defecto está deshabilitado el control WebBrowser. La siguiente página explica cómo habilitarlo a costa de la seguridad, por lo que este cambio debes hacerlo bajo tu responsabilidad, modificando el registro de Window.

Cannot insert certain scriptable ActiveX controls into Office 2013 documents

En el siguiente vídeo puedes ver una demostración del visor de vídeos:

Mi Carrera Profesional

🔝To translate this blog post to your language, select it in the top left Google box.


Al poco de aprender a hablar aprendemos:

Mi carrera como ingeniero

Todas estas son listas ordenadas como la que he preparado en mi primera semana de ingeniero autojubilado, para simular una escala de tiempos autodinámica y para recordar en el futuro mi carrera profesional en diversas ramas de la ingeniería:
  1. Ingeniero eléctrico durante mis estudios en la Escuela Técnica Superior de Ingenieros Industriales - ETSIIZ de la Universidad de Zaragoza, siendo licenciado de la 2ª promoción de ingenieros.
  2. Ingeniero electrónico diseñando un prototipo de terminal inteligente, entregado como ejercicio práctico de mi proyecto fin de carrera, y que fue dirigido por el gran profesor de electrónica D. Tomás Pollán Santamaría, q.e.p.d. Nunca te olvidaré MAESTRO.
  3. Ingeniero industrial en varias compañías informáticas y departamentos de I+D.
  4. Ingeniero de automatización programando automátas programables.
  5. Ingeniero de software para diseñar equipos electrónicos basados en microcontrolador.
  6. Ingeniero de telecomunicaciones en el departamento de I+D de Electrónica Aragonesa en colaboración con Telefónica I+D.
  7. Ingeniero de sistemas en los departamentos de I+D de Amper y Siemens.
  8. Ingeniero de calidad en un departamento de I+D.
  9. Ingeniero informático desarrollando aplicaciones cliente-servidor como analista-programador.
  10. Ingeniero TIC como consultor de Tecnologías de la Información y las Comunicaciones.
  11. Ingeniero de pruebas de la calidad del software.
  12. Ingeniero de datos para Indra, Alten, Gas Natural Fenosa, IBM y BBVA.
  13. Ingeniero de inteligencia de negocio (BI - Business Intelligence) con herramientas Power.
  14. Ingeniero multimedia desarrollando en Excel múltiples Interfaces Gráficos de Usuario - IGU (GUI - Graphical User Interface) en mi propio blog. Sí, este que estás leyendo ahora mismo: #ExcelPedroWave
La primera es la única formación reglada en ingeniería que he recibido en mi vida profesional, y de eso hace ya más de 40 años y, curiosamente, es la única ingeniería en la que no tengo experiencia. En las demás ingenierías mi formación ha sido vocacional, ocupacional, continua, permanente y autodidacta, y siempre enfocado en obtener los mejores resultados para mi empresa y para mis clientes, y en cumplir los objetivos siguiendo los criterios SMART: específicos; medibles; alcanzables; relevantes y limitados en el tiempo.

Mi carrera profesional

Con esta publicación trato de recordar mi propia carrera profesional en un gráfico en Excel, ¡cómo no!, que muestre los años, las fechas de inicio y fin y los días de cada hito de mi carrera, durante los últimos 45 años, desglosados y filtrados por campos como: Actividad; Cliente; Empresa; Herramientas; Logros; Lugar; Puesto; Sector y Tareas, como se puede ver en esta imagen animada:



Para crearlo han hecho falta 4 hojas:
  • Hoja 'DAT_CARRERA': Con los datos de la carrera en una tabla que se puede editar para introducir tus propios datos profesionales. Antes hay que desproteger la hoja pues está protegida sin contraseña. Observa que la fecha final de un hito está marcada en color de fondo amarillo, con la función =Hoy() pues es el hito actual que aún no ha acabado, seguir publicando en este blog...

  • Hoja 'TD_CARRERA': Con dos tablas dinámicas, una para los campos de cada hito y otra con los datos de la carrera. Las segmentaciones de datos de la hoja 'INF_CARRERA' están conectadas con estas tablas dinámicas.

  • Hoja 'TAB_CARRERA': Con la tabla filtrada asociada al gráfico de barras de la hoja 'INF_CARRERA', y con datos de formato de año y fechas, y con el año mínimo y máximo a mostrar en el gráfico.

  • Hoja 'INF_CARRERA': Con el gráfico de la carrera y las segmentaciones de datos que pueden ser filtradas individualmente o borrados totalmente sus filtros. Cuando por ejemplo se selecciona en la segmentación principal el campo "Empresa", aparece la segmentación de datos secundaria de la "Empresa", para permitir filtrar por empresa. Todos los filtros que se hagan en una segmentación secundaria se mantienen mientras no se borre el filtro de ese campo determinado. Borrando el filtro de la segmentación principal, se borran todos los filtros de las segmentaciones secundarias y la segmentación de los años de inicio.

Descarga de la plantilla

Descarga la plantilla totalmente gratuita, con las macros visibles y las hojas protegidas sin contraseña, desde aquí:

Técnica empleada para la escala de tiempos

Se ha pretendido simular una escala de tiempos autodinámica, para lo que hacen falta unas cuantas macros VBA:
  • Evento Worksheet_SelectionChange en la hoja 'INF_CARRERA' que llama a las macros: ShowHideInitialDate y ShowHideDays, para mostrar u ocultar las fechas y días de cada hito.

  • Evento Worksheet_Change en la hoja 'TD_CARRERA' que llama a las macros: FormatCareerChart y ChangeField, para formater el gráfico y cambiar el campo seleccionado.

  • Evento Worksheet_Change en la hoja 'DAT_CARRERA' que llama a la macro: RefrehPivotTable para refrescar la caché de la tabla dinámica de la hoja 'TD_CARRERA' con los datos de la carrera.

  • Módulo ModCareer con las macros que autodinamizan el gráfico con la carrera y que están suficientemente autoexplicados en los comentarios del código. La función DATE_FORMAT() permite obtener el formato local de las fechas y los años del gráfico.


Agradecimientos

No puedo dejar de agradecer el apoyo y la ayuda que me han ofrecido desinteresadamente todos mis exprofesores y excatedráticos durante 5 años de estudios de ingeniería y todos mis excolegas, excompañeros, excolaboradores, exjefes, exdirectores durante los últimos 40 años de carrera profesional, para conseguir el objetivo de ser un ingeniero autojubilado, con muchas automatizaciones por hacer, muchas rutas que recorrer en autocaravana, como nómada digital, y muchos artículos que escribir en este blog de autoayuda y autoaprendizaje de Excel.

Mis vídeos

🔝To translate this blog post to your language, select it in the top left Google box.



    Mis vídeos

    Puedes seguirme suscribiéndote a mi canal de YouTube, donde puedes ver gratuitamente la lista completa de mis vídeos desde este enlace:

    YouTube - Excel Pedro Wave



    Cuando el presupuesto para hacer un vídeo es inmenso, sin ninguna duda se pueden crear vídeos de mucha más calidad que los míos, hechos de forma casera en una tableta con Windows 10 y con sólo tres herramientas:

    1. Excel para Microsoft 365: para crear las plantillas de ejemplo.
    2. MS PowerPoint: para crear el contenido del vídeo.
    3. Editor de vídeo de MS Fotos: para montar y grabar el vídeo.


    META

    Y si no, que se lo pregunten a Mark Zuckerberg, que en este vídeo presenta su Metaverso en Facebook, hecho con los últimos adelantos tecnológicos:



    Vídeos hechos con IA

    Otros vídeos interesantes hechos con IA:


    Cinaima Films: The Universe


    Cinaima Films: The Moon


    DUST: Cortometraje de ciencia ficción "FTL"


    My whimsical inner world: VIREONEA


    Nébula Station: En otro mundo


    Nébula Station: Otro mundo lleno de peligros


    Nébula Station: El alma de la máquina


    Nébula Station: Un hogar con vistas a la Tierra 🌍🎵


    The Parallel Earth: Moon Mega Hospital 5000 AD


    Universe Civilization: Puesta de sol en la ciberciudad


    Guardianes Elementales: Anuket la diosa egipcia del Nilo


    Mark Vidal: Robot doméstico

    ¿Cuál vídeo te gusta más?

    Redes Sociales

    Mis Foros Excel

    Menús segmentados en un tablero de ajedrez

    No voy a hablar de los miles de menús que me comí en los restaurantes de la capital de España, durante los 9 años que estuve trabajando en varias oficinas de Madrid.

    Voy a hablar de cómo hacer menús interactivos usando la segmentación de datos para filtrar datos de tablas dinámicas (Slicers en inglés), con un ejemplo de un tablero de ajedrez interactivo.

    He intentado que los menús sean intuitivos, vistosos, amigables y fáciles de usar y de aprender, según el principio de acción-reacción, y procurando mejorar la interfaz del usuario (User Interface - UI) y la experiencia del usuario (User eXperience - UX). Aunque no he programado la posiblidad de deshacer ninguna de las acciones con los menús, siempre se puede obtener cualquier posición de las piezas de ajedrez en el tablero o incluso borrarlas todas y comenzar de nuevo.

    En esta entrada del blog aprenderemos a:
    1. Mantener dos tablas dinámicas: una con un único filtro para el menú y otra con un filtro para los submenús.
    2. Mantener dos tablas normales: una para el menú y otra para los submenús.
    3. Mantener una tabla auxiliar para los submenús con su posición, número de filas y de columnas.
    4. Modificar la segmentación de datos del menú.
    5. Modificar la segmentación de datos de los submenús.
    6. Analizar las macros de Excel, en lenguaje VBA, que interactúan con los menús y submenús.
    7. Representar un tablero de ajedrez interactivo dentro de un rango de celdas de una hoja de cálculo.
    Esta es la apariencia que tiene el menú principal y los diferente subménus gráficos, con un ejemplo de cómo animar un tablero de ajedrez en Excel.


    En esta imagen gif animada se muestra un menú principal, numerado del 1 al 7, diseñado con una segmentación de datos. Los 7 submenús están diseñados con una única segmentación de datos con un formato de filas y columnas diferente para cada uno de los submenús. Los submenús se despliegan a la altura de su correspondiente entrada desde el menú principal. Algunos submenús son de texto y otros son gráficos, como las piezas del ajedrez o sus posibles movimientos en vertical, horizontal o diagonal.

    Descarga de la plantilla

    Descarga la plantilla totalmente gratuita, con las macros visibles y las hojas protegidas sin contraseña, desde Google (con el botón "Excel Download") o desde el enlace a Microsoft OneDrive:

    Tablas normales para el menú y los submenús

    Para crear los menús hace falta una hoja auxiliar 'TD_Menu' en la que se han insertado 3 tablas normales, un rango para los submenús y una celda auxiliar:
    1. TablaMenu: Para el menú principal en el rango E4:E11 con la lista de submenús numerados.
    2. TablaSubmenus: Para los submenús en el rango H14:N16 con una columna por cada submenú, con los valores posibles de cada submenú.
    3. TablaSubmenu: Tabla auxiliar con los valores del submenú seleccionado en el menú principal.
    4. Rango de parametrización de cada submenú: Rango F26:N29 con el tope, filas y columnas de la segmentación de datos que sirven para personalizar cada submenú.
    5. Celda auxiliar: En la celda E2 se calcula el número de submenú elegido en el menú principal.
    La tabla para el menú principal se puede personalizar para cambiarlo según las necesidades del usuario final. En este ejemplo, con traducción simultánea a varios idiomas, los valores del menú principal se encuentran en la hoja 'Idiomas', desde donde se deben cambiar:


    En la columna de la izquierda se muestra la tabla con el submenú elegido y las demás columnas son de la tabla de submenús, que se pueden personalizar para formar otro tipo de submenús. Hay que tener en cuenta que, para la traducción a varios idiomas, los valores del submenú 4 (Iniciar; Borrar) y del submenú 7 (SI; NO) están en la tabla de la hoja 'Idiomas':

    En esta imagen se muestra el rango de parametrización de la segmentación de datos de cada submenú. Hay que prestar atención que en la fila de "Columnas" el valor del número de columnas del submenú 6 es fijo:

    Tablas dinámicas para el menú y los submenús

    En la hoja auxiliar 'TD_Menu' se han insertado dos tablas dinámicas:
    1. TD_Menu: Para el menú principal en el rango B4:C4 con origen de datos en la TablaMenu y sólo con un filtro para el campo "Menu".
    2. TD_Submenu: Para el submenú en el rango B14:C14 con origen de datos en la TablaSubmenu y sólo con un filtro para el campo "Submenu".

    Segmentación de datos del menú principal

    La segmentación de datos del menú principal está conectada con la tabla dinámica TD_Menu y está en la hoja 'Tablero'.

    La configuración de la segmentación de datos es la siguiente:
    • Mostrar encabezado en estado sin chequear.
    • Se ha creado un nuevo estilo de segmentación de datos sin bordes.

    Segmentación de datos de los submenús

    La segmentación de datos de los submenús está conectada con la tabla dinámica TD_Submenu y está en la hoja 'Tablero'.

    Se basa en la misma configuración de la segmentación de datos del menú principal, sin mostrar encabezado ni bordes.

    La principal ventaja de está técnica para diseñar menús y submenús es que la misma segmentación de datos de submenús sirve para mostrar cada uno de los submenús, simplemente variando su posición, su número de filas y columnas y los valores del submenú seleccionado con el menú principal, gracias a las tablas de la hoja 'TD_Menu' que ya he descrito más arriba.

    Con una única segmentación de datos se configuran varios submenús, por ejemplo:

    Se puede observar que algunos de ellos están formados por caracteres gráficos, como las piezas de ajedrez o las flechas de movimiento. Para ordenar las flechas de movimiento ha hecho falta definir, en las opciones avanzadas de Excel, una nueva lista personalizada:


    Lo importante es que los submenús cambian dinámicamente cuando se cambia la selección del submenú desde el menú principal y se coloca a la altura del submenú elegido. Lo mejor es verlo en el siguiente vídeo en acción : 


    Al seleccionar en el menú principal la opción "1. Fuente" aparece el submenú con la lista de las dos fuentes programadas:
    • Segoe UI Symbol
    • Times New Roman
    Las figuras de las piezas del ajedrez creo que se llaman trebejos. De la hoja 'Ajedrez' se obtiene la posición inicial de las piezas en una partida de ajedrez y ejemplos de las dos fuentes que pintan las piezas:


    Macros del menú y los submenús

    Cuando se selecciona un menú o un submenú se ejecutan las macros Excel, escritas en lenguaje VBA, que permiten la interacción con el tablero de ajedrez del ejemplo propuesto.

    Para explicar e interpretar las macros de esta aplicación es preciso conocer los nombres definidos que son los que aparecen en el menú:
    Fórmulas --> Administrador de nombres 


    Nombres definidos más relevantes:
    • Rango_TD_Submenu: Es el origen de datos de la tabla dinámica TD_Submenu, creado mediante las funciones INDICE() y CONTAR.SI(), esta última con el argumento "?*" con comodines para contar solamente las filas con datos.
    • Rango_Tabla_Submenu: Con el rango completo de la tabla "TablaSubmenu", que se usa en el nombre definido anteriormente: Rango_TD_Submenu
    • El resto de nombres definidos son rangos o celdas para que sea más clara y fácil su referencia en las fórmulas y macros.

    Módulos de la aplicación

    • Hoja 'Tablero': Se produce el evento SelectionChange cuando cambia la celda seleccionada de la hoja y que representa un escaque del tablero de ajedrez. Se ejecuta la macro GetSubmenu únicamente cuando se ha seleccionado en el menú principal el submenú 2 con las piezas.

    • Hoja 'TD_Menu': Se produce el evento Change cuando cambia el valor de la celda. Si cambia el valor del filtro de la tabla dinámica TD_Menu se ejecuta la macro ChangeSubmenu. Si cambia el valor del filtro de la tabla dinámica TD_Submenu se ejecuta la macro ActionSubmenu.

    • Hoja 'ThisWorkbook': Los eventos Open; BeforeSave y BeforeClose lanzan la macro para proteger las hojas ProtectSheets. Además el evento Open oculta todos los menús y barras de Excel llamando a la macro VisibleExcel.

    • Módulo modChangeMenu: Contiene las macros necesarias para interactuar con el menú principal y con los submenús:

      • ChangeSubmenu: Realiza las acciones que permiten el cambio de un submenú desde el menú principal.
      • GetSubmenu: Obtiene el último valor del submenú seleccionado, por lo que hay que modificar el número de casos si se cambian los submenús.
      • ActionSubmenu: Ejecuta las acciones de un determinado submenú, por lo que hay que modificar el número de casos si se cambian los submenús.
      • Select2Slicer: Llama 2 veces a la macro SelectSlicerItem, pues devuelve un error la primera vez. A tener en cuenta para una mejora.
      • SelectSlicerItem: Selecciona un único valor de la segmentación de datos.
      • TopMenu: Obtiene el tope de la posición de la segmentación de datos del menú principal.
      • RowHeightMenu: Obtiene el alto de la fila de la segmentación de datos del menú principal.
      • SelectFirstValuePivotTable: Cuando se seleccionan múltiples valores en una segmentación de datos, obtiene solamente el primer valor.
      • RefreshAll: Refresca la caché de las 2 tablas dinámicas y las fórmulas de todo el libro de trabajo.
    • Módulo modChangeChessboard: Contiene las macros necesarias para interactuar con el tablero de ajedrez:

      • ChangeChessboard: Borra todas las piezas del tablero o inicializa el tablero con la posición inicial de las piezas en una partida de ajedrez.
      • IniChessboard: inicializa el tablero con la posición inicial de las piezas en una partida de ajedrez.
      • DeleteChessboard: Borra todas las piezas del tablero.
      • ChangeFont: Cambia la fuente de caracteres de las piezas de ajedrez.
      • ChangePiece: Cambia la pieza de ajedrez en una de las celdas que representa un escaque.
      • MovePiece: Mueve una pieza de ajedrez a otro escaque del tablero.
    • Módulo modChangeProtect: Macros para proteger las hojas:

      • ProtectSheets: Protege las hojas sin contraseña.
      • UnprotectSheets: Desprotege las hojas.
      • ProtectOneSheet: Protege una hoja de los usuarios pero no de las macros, gracias al argumento: UserInterfaceOnly:=True
      • UnprotectOneSheet: Desprotege una hoja.
    • Módulo modHideExcel: Macros para ocultar o mostrar los menús y barras propias de Excel. Se puede ocultar todo excepto el título de la aplicacion. Como este módulo es un extra de ejemplo, no voy a explicar cada una de las macros. Quien tenga ganas de estudiarlas que las analice ya que son muy claras y simples, como dice el conocido bloguero Robert Mundigl en su blog Clearly and Simply, del que tanto estoy aprendiendo y que recomiendo desde estas líneas. Si has llegado a leer hasta aquí, lo que si recomiendo es optar por no ocultar Excel desde el menú, ya que quitar la ocultación manualmente es un trabajo arduo.

    Más juegos de ajedrez en este blog

    Desde que uso Excel me gusta escribir publicaciones en el blog sobre ajedrez, aquí tienes unos cuantos ejemplos que espero que te gusten y que hagas comentarios sobre ellos en alguna de las entradas del blog:

    Posdata:

    Cuando escriba el próximo artículo ya estaré felizmente jubilado y mi idea es construir próximamente un tablero con la historia de los 40 años de mi carrera profesional (enlace aquí), en un storyboard dinámico como el que aparece en el siguiente enlace, pero con otra técnica: A practical Example for Dynamic Storyboards

    Si detectas alguna traducción incorrecta al cambiar de idioma, dímelo en un comentario o modifica tú mismo la tabla con los idiomas, a partir de la columna C de la hoja 'Idiomas', donde puedes añadir más columnas si quieres más idiomas...

    Mi lista de blogs