Traducir el blog

Google Sheets Calendar with a Pivot Table

First of all, HAPPY NEW YEAR 2021 !!!

My wishes for the year that begins is that only good things happen to us and that we soon forget the fateful 2020.

My first New Year's resolution is to dedicate this blog post to the good know-how of Google, from which Microsoft should learn, so it does not contain an Excel template, as is usual in this blog, but a  Google Sheets template that I have shared on the following link, and that you can copy and edit with a Google account:

Dynamic Calendar Google Sheets PW1


The voice of the Excel user

Excel UserVoice is Microsoft's forum so that Excel users, like you and me, can have a voice and comment on suggestions and vote for them so that Microsoft improves its flagship tool: Excel !!! If you didn't know, you already know just now!

One of the best suggestions that I have voted and commented on, and that I suggest you do the same so that Microsoft will listen to us as soon as possible -ASAP, is to be  able to use dates with a negative serial number in the cells , so that 1900 is not the first year that can be used in Excel cells and functions. Access this excellent suggestion from this link:

Microsoft Excel UserVoice: Dates prior to 1900

The suggestion has been published since September 27, 2015. In 5 years Microsoft Excel has not said a peep, when the competition of  Google SheetsLibreOffice Calc work perfectly with all the years of the  Gregorian Calendar,

Update 2022-06-06: That page causes Error 404: Page Not Found.

Microsoft has intentionally deleted UserVoice, and the entire history of suggestions submitted by Office users has disappeared, thereby losing all votes from the last few years.

For 7 months Microsoft has created a new Feedback portal (in English), where you can share comments and help make improvements and create new products, so I have returned to write a comment and vote for this suggestion:

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


Dates in Google Sheets

To show that the Microsoft Excel competence is more advanced, I have designed a calendar based on a pivot table in Google Sheets, with the same idea that I published in the following article:

Calendar in Excel with a pivot table (in Spanish)

That calendar in Excel purposely begins on January 1, 1901, the beginning of the  20th century , since it has been shown that the months of January and February 1900 are incorrectly calculated, a bug in  Excel incorrectly assumes that the year 1900 is a year leap, and we have already said that it is not capable of calculating dates before the year 1900 either.

Google spreadsheets work with negative serial numbers since the year 100, no less!

Excel forces us to program dates before 1900 in VBA language, as I have commented in the following article on this blog:

Perpetual Calendar from before 1900 (in Spanish)


Calendar in Google Sheets with a pivot table

In this image I show the appearance of the calendar in Google Sheets, made with a dynamic table that acts as a calendar, and with a table of event dates, for example holidays: 


As you will see, I have hidden the essential column C, with the number of the week (essential as a row in the pivot table), to give more visibility to the calendar. 

As you understand, there is no problem in showing it.

A Gregorian calendar can be generated by editing cell B2 from the year 100, which is not very rigorous since the Gregorian Calendar was imposed from the year 1582, and until the year 9999.

If the month in G2 cell is left blank, the calendar will be for all months. If a month is chosen, only that month will be shown.

The 'Dates' sheet contains 3 tables, two are auxiliary for the 7 days of the week and the 12 months of the year, and the other is the data source of the pivot table with which this calendar is generated.

The date table contains 366 rows to look at all the days of an entire year, including leap years, with 5 fields:

  • Date: There are 366 days in column A: First day of the year in cell A2 with the formula:
    • =DATEVALUE(Calendar_Year & "-01-01")
    • The remaining days are added one day to the previous one: = A2 + 1
  • Day of the week: Column B with the number and 3 letters of the day of the week with the formula:
    • = INDEX(Days_Week, MATCH(SUBSTITUTE("*" & TEXT (A2, "ddd"), "."; ""), Days_Week, 0))
  • # Week: It is the week number with System 1 numbering:
    • Cell C2: = 1
    • Other cells in column C: = C2 + IF(MATCH(SUBSTITUTE("*" & TEXT (A3, "ddd"), ".", ""), Days_Week, 0) = 1, 1, 0)
  • Num. Week: It will be a zero if the selected year or month does not match:
    • = IF(AND(TEXT(A2, "yyyy") = TEXT($A$2, "yyyy"), OR (Calendar_Month = "", TEXT(A2, "mm") = LEFT(Calendar_Month, 2))), C2, 0)
  • Month: Month number with 2 digits and 3 letters of the name of the month:
    • = SUBSTITUTE(TEXT(A2, "mm-mmm"), ".", "")

With the SUBSTITUTE(text, ".", "") function I remove the period "." that appears in the days of the week or months, for example: "Mon." or "Jan."


The calculation of dates with a negative serial number prevents the use of the WEEKDAY and WEEKNUMBER functions, since they only allow positive days and zero, which is 12-30-1899.

For negative dates the WEEKDAY function returns Error # NUM !, for example for the day 1-1-1800: = WEEKDAY(-36522, 2)

For negative dates, the WEEKNUMBER function returns Error #NUM!, for example for the day 12-29-1899: = WEEKNUMBER(-1, 2)

The DATE function cannot be used either, since with negative dates it produces a curious effect, for example: = DATE(1899, 1, 1) returns the positive serial number corresponding to the day 01-01-3799.

For years 0 to 1899, the DATE function adds that value to 1900 to calculate the year.
For example, DATE(119, 2, 1) returns the date 1/2/2019.

In this calendar, formulas are used that replace the two that return Error #NUM!, WEEKDAY and WEEKNUMBER, and the DATE function, as seen above in the fields of the 'Dates' sheet

This calendar is embedded as "read only" in the following box:


How to create the pivot table

The pivot table is defined with:

  • Data source in range: Dates!A1:E367
  • Rows: with the fields: Month and No. Week (Week)
  • Columns: with the field: Day Week (Day)
  • Values: with the field: Date(Calendar). Add by: Max
  • Filters: with the field: Week No. - The value is greater than 0


Conditional formats

In the sheet ' Dynamic Calendar ' a table of dates and their events, for example holidays, has been added in columns L: M, with dynamic formulas to calculate holidays, of the type:

= DATEVALUE(Calendar_Year & "-01-01")

As I already mentioned, it is not possible to use the DATE function for years before 1900, so I have used the above function.

I explained the formulas to obtain the days of Holy Week in the following link, and I have proven that the formula is correct between the years 1894 and 2203:

How to make the Easter dates

To color today and Saturdays, Sundays and holidays, 4 conditional formats have been defined in the range D6:J74

  • Orange color for days of events -festivities- with the formula:
    • = IF.ERROR(MATCH(D6, $L$6:$L$74, 0), 0)> 0
  • Yellow color for today: = D6 = TODAY()
  • Dark red color for Sundays with the formula:
    • = AND (SUBSTITUTE(TEXT(D6, "ddd"), ".", "") = "Sun", ISNUMBER(D6))
  • Light red color for Saturdays with the formula:
    • >= AND (SUBSTITUTE(TEXT(D6, "ddd"), ".", "") = "Sat", ISNUMBER(D6))


CONCLUSIONS

It is shown that Google spreadsheets allow calculating with negative dates before the year 1900, which is not possible with Microsoft Excel that only supports positive dates from 1900.

In addition, Google Sheets automatically refreshes the pivot tables, which is very practical, since Excel forces you to manually refresh the pivot tables from the menu: Data - Update all, which is sometimes forgotten, and generates errors in the generated and reported data.

Who has not happened? Raise your hand!

Calendario en Google Sheets con una Tabla Dinámica

Ante todo ¡¡¡ FELIZ AÑO NUEVO 2021 !!!

Mis deseos para el año que comienza es que sólo nos pasen cosas buenas y que olvidemos pronto el aciago 2020.

Mi primer propósito de Año Nuevo es dedicar esta entrada del blog al buen saber hacer de Google, del que debería aprender Microsoft, por lo que no contiene una plantilla Excel, como es habitual en este blog, sino una plantilla Google Sheets que he compartido en el siguiente enlace, y que podrás copiar y editar con una cuenta de Google:

Calendario Dinámico Google Sheets PW1


Actualización 2021-08-29: El comentario de una desconocida me ha llevado a publicar una 2ª versión de este calendario en la que se puede definir el mes de inicio del calendario y mostrar los 12 meses siguientes, cambiando de año si hace falta. Por ejemplo, para convertirlo en un calendario de uso escolar como solicita una desconocida en un comentario. Es decir, que empiece en septiembre de 2021 y muestre hasta agosto de 2022. Ver el siguiente enlace:

Calendario Dinámico Google Sheets PW2


La voz del usuario de Excel

Excel UserVoice es el foro de Microsoft para que los usuarios de Excel, como tú y como yo, puedan tener voz y comentar sugerencias y votarlas para que Microsoft mejore su herramienta estrella: ¡¡¡ Excel !!!. Si no lo sabías, ¡ya lo sabes!

Una de las mejores sugerencias que he votado y comentado, y que sugiero que hagas lo mismo para que Microsoft nos haga caso cuanto antes -ASAP-, es poder usar fechas con número de serie negativo en las celdas, para que 1900 no sea el primer año que se puede usar en las celdas y funciones de Excel. Accede a esta excelente sugerencia desde este enlace:

Microsoft Excel UserVoice: Dates prior to 1900

La sugerencia lleva publicada 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 todos los años del Calendario Gregoriano.

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)


Fechas en las hojas de cálculo de Google

Para demostrar que la competencia de Microsoft Excel está más avanzada, he diseñado un calendario basado en una tabla dinámica en Google Sheets, con la misma idea que publiqué en el siguiente artículo:

Calendario en Excel con una tabla dinámica

Ese calendario en Excel comienza a propósito el día 1 de enero de 1901, fecha de inicio del Siglo XX, ya que está demostrado que los meses de enero y febrero de 1900 son calculados erróneamente, pues Excel supone incorrectamente que el año 1900 es un año bisiesto, y ya hemos dicho que tampoco es capaz de calcular fechas previas al año 1900.

Las hojas de cálculo de Google trabajan con números de serie negativos desde el año 100 ¡nada menos!

Excel obliga a programar en lenguaje VBA las fechas anteriores a 1900, como he comentado en el siguiente artículo de este blog:

Calendario Perpetuo desde antes de 1900


Calendario en Google Sheets con una tabla dinámica

En esta imagen muestro el aspecto del calendario en Google Sheets, hecho con una tabla dinámica que hace de calendario, y con una tabla de fechas de eventos, por ejemplo de días festivos: 


Como verás, he ocultado la esencial columna C, con el número de la semana (imprescindible como fila de la tabla dinámica), para dar más visibilidad al calendario. Como comprenderás, no hay ningún problema en mostrarla.

Se puede generar un calendario gregoriano editando la celda B2 desde el año 100, cosa que no es muy rigurosa pues el Calendario Gregoriano se impuso a partir del año 1582, y hasta el año 9999.

Si el mes de la celda G2 se deja en blanco, el calendario será de todos los meses. Si se elige un mes, solamente se mostrará ese mes.

La hoja 'Fechas' contiene 3 tablas, dos son auxiliares para los 7 días de la semana y los 12 meses del año, y la otra es el origen de datos de la tabla dinámica con la que se genera este calendario.

La tabla de fechas contiene 366 filas para contemplar todos los días de una año completo, incluidos los años bisiestos, con 5 campos:

  • Fecha: Son 366 días en la columna A: Primer día del año en la celda A2 con la fórmula:
    • =FECHANUMERO(Año_Calendario & "-01-01")
    • El resto de días se suma un día al anterior: =A2+1
  • Día Semana: Columna B con el número y 3 letras del día de la semana con la fórmula:
    • =INDICE(Días_Semana;COINCIDIR(SUSTITUIR("*" & TEXTO(A2;"ddd");".";"");Días_Semana;0))
  • # Semana: Es el número de semana con el Sistema 1 de numeración:
    • Celda C2: =1
    • Otras celdas de la columna C: =C2+SI(COINCIDIR(SUSTITUIR("*" & TEXTO(A3;"ddd");".";"");Días_Semana;0)=1;1;0)
  • Núm. Semana: Será un cero si no coinciden el año o el mes seleccionados:
    • =SI(Y(TEXTO(A2;"yyyy")=TEXTO($A$2;"yyyy");O(Mes_Calendario="";TEXTO(A2;"mm")=IZQUIERDA(Mes_Calendario;2)));C2;0)
  • Mes: Número de mes con 2 cifras y 3 letras del nombre del mes:
    • =SUSTITUIR(TEXTO(A2;"mm-mmm");".";"")

Con la función SUSTITUIR(texto;".";"") elimino el punto "." que aparece en los días de la semana o los meses, por ejemplo: "lun." o "ene."


El cálculo de fechas con número de serie negativo impide usar las funciones DIASEM y NUM.DE.SEMANA, pues únicamente permiten días positivos y el cero, que es el día 30-12-1899.

Para fechas negativas la función DIASEM devuelve Error #¡NÚM!, por ejemplo para el día 1-1-1800: =DIASEM(-36522;2)

Para fechas negativas la función NUM.DE.SEMANA devuelve Error #¡NÚM!, por ejemplo para el día 29-12-1899: =NUM.DE.SEMANA(-1;2)

Tampoco se puede usar la función FECHA pues con fechas negativas produce un curioso efecto, por ejemplo: =FECHA(1899;1;1) devuelve el número de serie positivo correspondiente al día 1-01-3799.

Para los años comprendidos entre 0 y 1899, la función FECHA añade ese valor a 1900 para calcular el año. Por ejemplo, FECHA(119;2;1) devuelve la fecha 1/2/2019. 

En este calendario se emplean fórmulas que reemplazan a las dos que devuelven Error #¡NÚM!, DIASEM y NUM.DE.SEMANA, y a la función FECHA, como se ha visto más arriba en los campos de la hoja 'Fechas'.


Este calendario está incrustado como "solo lectura" en el siguiente cuadro:


Cómo crear la tabla dinámica

Se define la tabla dinámica con:

  • Origen de datos en el rango: Fechas!A1:E367
  • Filas: con los campos: Mes y Núm. Semana (Semana)
  • Columnas: con el campo: Día Semana (Día)
  • Valores: con el campo: Fecha (Calendario). Sumar por: Máx
  • Filtros: con el campo: Núm. Semana - El valor es mayor que 0


Formatos condicionales

En la hoja 'Calendario Dinámico' se ha añadido una tabla de fechas y sus eventos, por ejemplo de días festivos, en las columnas L:M, con fórmulas dinámicas para calcular los festivos, del tipo:

=FECHANUMERO(Año_Calendario & "-01-01")

Como ya comenté, no es posible usar la función FECHA para años anteriores a 1900, por lo que he usado la función anterior.

Las fórmulas para obtener los días de la Semana Santa las expliqué en el siguiente enlace, y he probado que la fórmula es correcta entre los años 1894 y 2203:

Cómputos que hacen la "Pascua"

Para colorear el día de hoy y los sábados, domingos y festivos, se han definido 4 formatos condicionales en el rango D6:J74

  • Color naranja para los días de eventos -festivos- con la fórmula: 
    • =SI.ERROR(COINCIDIR(D6;$L$6:$L$74;0);0)>0
  • Color amarillo para el día de hoy: =D6=HOY()
  • Color rojo oscuro para los domingos con la fórmula:
    • =Y(SUSTITUIR(TEXTO(D6;"ddd");".";"")="Dom";ESNUMERO(D6))
  • Color rojo claro para los sábados con la fórmula:
    • =Y(SUSTITUIR(TEXTO(D6;"ddd");".";"")="Sáb";ESNUMERO(D6))


CONCLUSIONES

Se demuestra que las hojas de cálculo de Google permiten calcular con fechas negativas anteriores al año 1900, cosa que no es posible con Microsoft Excel que solamente admite fechas positivas desde 1900.

Además Google Sheets refresca automáticamente las tablas dinámicas, lo que es muy práctico, ya que Excel obliga a refrescar manualmente las tablas dinámicas desde el menú: Datos - Actualizar todo, lo que a veces se olvida, y genera incorrecciones en los datos generados y reportados.

¿A quién no le ha pasado? ¡Que levante la mano!

Mi lista de blogs