Jump to content

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


Go to solution Solved by pegones1,

Recommended Posts

Necesito saber el día de la semana (lunes, martes, miércoles...) de fechas anteriores a 1900.

He buscado información en Google a ver si ya había programado algún módulo, de forma tal que introduciendo en una celda la fecha, te dijera automáticamente el día de la semana. La razón es que quiero calcularlo para unas 40 fechas, a las que más adelante espero añadir más, y hacerlo por fórmulas, son demasiados cálculos, y por eso de automatizarlo, de forma que una única fórmula lo calcule.

¿Conocéis algo que me pueda servir?

Gracias. 

Link to post
Share on other sites

Que curioso tema jajajajaajaj!

Si le sumas 28 años (10227 dias) a una fecha debería coincidir el día de la semana (el calendario se repite cada 28 años).

Si la fecha es muy anterior al 1900 podes sumarle 400 años y la fecha caerá siempre en el mismo día de la semana jajajajaja.

Estuve viendo en internet y supuestamente hay un complemento que permite calcular las fechas correctamente pero no pude encontrarlo.

Probá con esta fórmula, la estoy armando ahora

Cita

=DIASEM(FECHA(--DERECHA(A1;4)+400;EXTRAE(A1;4;2);IZQUIERDA(A1;2));2)

La celda A1 debe tener la fecha en formato texto (se alinea automáticamente a la izquierda), sino no va a funcionar.

Link to post
Share on other sites

Genial, estaba comprobandolo por las dudas, detecté un problema con las fechas del año 1900, lo estoy revisando.

Por lo demás parece ir bien.

Fijate en el adjunto.

A partir de la celda B19 incluyo una fórmula alternativa que se puede usar en fechas que tengan solo un digito para los días o para los meses.

Saludos!

 

 

diasem.xlsx

Edited by Cristian 1985
Link to post
Share on other sites

He creado una función en VBA. Aquí la dejo:

Public Function DiaSemana(Fecha As Variant, Certificado As String)
Dim ResultadoFecha As String
    ResultadoFecha = Format(Fecha, "d/m/yyyy")
    DiaSemana = StrConv(Format(Weekday(DateSerial(--Right(ResultadoFecha, 4) + 400, Mid(ResultadoFecha, InStr(1, ResultadoFecha, "/") + 1, InStr(4, ResultadoFecha, "/") - InStr(1, ResultadoFecha, "/") - 1), Mid(ResultadoFecha, 1, InStr(1, ResultadoFecha, "/") - 1)), 2) + 1, "dddd"), vbProperCase)
End If
End Function

 

Link to post
Share on other sites

Sin entrar a valorar las funciones aportadas, solo hacer notar que el año 1900 no fue bisiesto, aunque si múltiplo 4.

Como regla: Son bisiestos lo años múltiplos de 4, excepto los múltiplos de 100 que no son múltiplos de 1.000.

Saludos. 😀😷

 

Link to post
Share on other sites
  • 2 weeks later...
En 5/10/2020 at 21:34 , Cristian 1985 dijo:

No, no la afecta, solo confirma que los resultados son correctos.

Lo que me encantaría es que el gran Antoni nos deleite con una de sus maravilosas macros a las que nos tiene acostumbrados 👍👍👍👍👍

 

Como @Antoni debe estar muy ocupado, adjunto un archivo con 3 macros para obtener el día de la semana desde el 0100-01-01 (aaaa-mm-dd), en formato ISO 8601, que es el primer día admitido por VBA.

La función GetWeekDayName() devuelve el día de la semana si se le pasa una cadena de texto en formato ISO 8601, llamando a las otras dos macros. Es fácil convertir una string con una fecha en formato de texto al formato estándar ISO.

Option Explicit

Function GetWeekDayName(sDate As String) As String
'
' VBA WeekdayName Function
'
    Dim iWeekDay As Integer
    
    iWeekDay = GetWeekDay(sDate)
    
    GetWeekDayName = WeekdayName(iWeekDay, False, vbMonday)

End Function

Function GetWeekDay(sDate As String) As Integer
'
' VBA WeekDay Function
'
    Dim dtDate As Date
    
    dtDate = GetSerialDate(sDate)
    
    GetWeekDay = Weekday(dtDate, vbMonday)

End Function

Function GetSerialDate(sDate As String) As Double
'
' VBA DateSerial Function
'
    Dim iYear As Integer
    Dim iMonth As Integer
    Dim iDay As Integer
    
    iYear = Left$(sDate, 4)
    iMonth = Mid$(sDate, 6, 2)
    iDay = Right$(sDate, 2)
    
    GetSerialDate = DateSerial(iYear, iMonth, iDay)

End Function

En el fichero adjunto he incluido las fechas especiales que:

  1. Fechas incorrectas en Excel inferiores al 1900-03-01
  2. Fecha errónea en Excel y en VBA: 1900-02-29, ya que el año 1900 no es bisiesto.
  3. Primera fecha correcta en VBA: 0100-01-01
  4. Fechas que no han existido en el Calendario Gregoriano, anteriores al 1582-10-15
  5. Último día correcto en Excel y en VBA: 9999-12-31

 @zelarra821 , @isidrod , espero que sea de ayuda y ayude a comprender el mundo pasado, presente y futuro.

Años Menores que 1900 PW1.xlsm

Link to post
Share on other sites
Hace 2 minutos , zelarra821 dijo:

Muchas gracias, @pegones1, ¡qué pasada, y qué curro! Un saludo.

Desde que me dedico en serio a los cálculos me ha apasionado la conversión de fechas. Excel es una herramienta única para tratarlas, sobre todo siendo que VBA permite números de serie negativos para fechas anteriores al año 1900.

Este "curro" han sido 3 horas que ya están bien pagadas al recibir tu pronta respuesta, además de servirme para añadir un nuevo artículo a mi blog que titularé:

"Cómo calcular fechas anteriores a 1900 en Excel"

@zelarra821, ¿se te ocurre un título mejor?

Link to post
Share on other sites

No, ese es perfecto. Yo esto solo no necesito a modo informativo. He sacado el árbol genealógico de mi familia, y quería calcular la edad y el día de la semana en que nacieron, se casaron o murieron. Para no tener que hacerlo a mano, porque Excel no permite fechas anteriores a 1900, busqué la manera de hacerlo por VBA, pero no encontraba nada en Internet, de ahí que viniese aquí a preguntar.

Así que se agradece mucho tu aportación.

Un saludo.

Link to post
Share on other sites
Hace 16 minutos , zelarra821 dijo:

No, ese es perfecto. Yo esto solo no necesito a modo informativo. He sacado el árbol genealógico de mi familia, y quería calcular la edad y el día de la semana en que nacieron, se casaron o murieron. Para no tener que hacerlo a mano, porque Excel no permite fechas anteriores a 1900, busqué la manera de hacerlo por VBA, pero no encontraba nada en Internet, de ahí que viniese aquí a preguntar.

Así que se agradece mucho tu aportación.

Un saludo.

Solo te falta darle al corazón de abajo a la derecha en el primer mensaje que respondí en este hilo con mi aportación. Gracias anticipadas por hacer clic en ese corazón...

Link to post
Share on other sites

Tres preguntas:

  1. Para sacar el nombre del día de la semana, tengo que utilizar la función WeekdayName(), ¿verdad?
  2. ¿Cómo puedo hacer para restar dos fechas, independientemente que sean anteriores o no a 1900?
  3. Para exportar esto a otra hoja de cálculo, ¿basta con copiar el módulo? ¿o tengo que hacer algo más?

¡Gracias!

Edited by zelarra821
Link to post
Share on other sites

@zelarra821,

  1. Para sacar el nombre del día de la semana, tengo que utilizar la función WeekdayName(), ¿verdad? SI. Mira el archivo que adjunté donde se usa esa función.
  2.  
  3. Para exportar esto a otra hoja de cálculo, ¿basta con copiar el módulo? ¿o tengo que hacer algo más? Para usarlo en otra hoja del mismo libro ya existe el módulo. Para usarlo en otro libro de trabajo debes exportar ese módulo e importarlo en el nuevo libro.

El resto de preguntas te las contesto mañana que hoy ya tengo que dejarlo.

Si no puedes esperar, pregunta a los demás participantes de este bendito foro que tanto he consultado desde hace 100 años.

Edited by pegones1
Link to post
Share on other sites

Aunque me contestes mañana, pero te digo lo que he probado.

Para la fecha que coge tu módulo, he convertido la fecha así:

Dim FechaFormateada As String
FechaFormateada = Format(sDate, "d/m/yyyy")

y me da error. Por eso te pedía que me dijeras cómo convertir la fecha en un formato que funcione con tus funciones. Además de cómo puedo aprovechar lo que has compartido para restar dos fechas, y obtener la edad.

¡Muchas gracias!

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Crear macros Excel

  • Posts

    • Hola, podrían ayudarme con una formula simple para poder sumar desde una posición a otra, gracias sumas desde hasta.xlsx
    • Buenas noches. Maestros quisiera saber si se puede volver dinámico el rango a la derecha la propiedad RowSource de un ListBox. Es que tengo una base de datos a la cual de vez en cuando se le agregan columnas nuevas y quisiera se ampliara la selección a la derecha como lo hace hacia abajo. Ejemplo  ListBox1.RowSource = "A4:End(xlToRight)" & Range("A3").End(xlDown).Row Algo así, no se si se podrá.
    • Hola amigos, alguién tendrá un videotutorial o tutorial de como usar EXCEL VBA y MySQL para realizar insertar, guardar, borrar, modificar y actualizar desde formularios en vba o formularios en hojas de excel? he buscado ya por mucho en la web, y solo existe poca información y no me da claridad en el proceso de aprendizaje, si uds me pudieran brindar algún proyecto de ejemplo, o enlazarme o compartime un videotutorial, sería bueno para iniciar mi proyecto. Quedo abierto a sus comentarios y sugerencias
    • Buenas chicos tengo el siguiente problemilla. Mediante una macro intento acceder a un archivo csv. delimtado con puntos y comas. y al usar  Workbooks.Open Filename:="C:\Users\pc\Desktop\stock.csv"   me la abre mal    Si la abro normal me la abre perfectamente, he intentado un par de cosillas pero nada fracaso total. Si podéis arrojarme un poco de luz sobre esto os lo agradecería mucho. Un saludo.      
    • Hola amigos, espero se encuentren bien, quiero comentarles que acabo de realizar un pequeño archivo donde en una hoja tengo una tabla (pudiendo contener mas de 10,000 registros) que deseo imprimir en etiquetas, es un registro por etiqueta, para lo cuál usé la función CICLO FOR en vba y generar así la impresión. Mi impresora actual es una TSC ttp244pro,  según lo que sé es que esta impresora no tiene mucha capacidad de memoria para guardar o para imprimir, por lo que las impresiones salen lentas. Me gustaría saber si alguien sabe como mejorar la macros para que pueda imprimir más rápido ya que en la cola de impresión un trabajo por etiqueta, no sé si exista forma de enviar un solo trabajo y que pueda así imprimir más rápido. Mil disculpas si las macros que verán tiene demasiado código para lo que hago. Saludos Cordial Walter   proyecto.xlsm
  • Recently Browsing

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Privacy Policy