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, tengo un problema para crear unos turnos rotativos aleatorios(mañana, tarde y noche), que al cambiar de mes los turnos cambien automáticamente según el mes, he intentado hacerlo con función SI pero no me queda aleatorios, me podrían ayudar con esta pequeña duda
    • Buenas noche amigos de Excel Ayuda quisiera que me ayuden completando mi amplicación con la ayuda de ustedes e creado una aplicación que ingresa datos para analizar en varios perìodos, los datos estan en un hoja BBDD, mi objetivo es que al analizar los productos cada periodo y culminarlos quiero pintarlos de acuerdo a dos criteros "suspendido" o "culminado" utilizando el buscador yo digito el "Lote" y doy clik en la lupa y busca el producto pero quiero que al ubicar el "Producto1, Produco2 etc" al selecionar uno de los dos botones de opción "verde o rojo" se pinten automaticamente en la base de datos BBDD todas las filas que buscó. Les agradezco por darme un tiempo en terminar mi proyecto. ModificarPintandoFila.xlsb
    • Hola a todos. De nuevo por aquí pidiendo ayuda. Nos han cambiado las licencias de Office a Office 365. He revisado las macros y las que me fallan tienen que ver con las que envío correos automatizados. He podido arreglar todas, cambiando el código porque de Office 2013 a Office 365 cambia el código, se usa el objeto CDO.Message. Pero se me resiste esta macro, que envía un correo e incluye como parte del cuerpo del correo un rango de celdas donde hay un gráfico. Os pego el código para ver si me podéis ayudar. Después de la instrucción "ActiveWorkbook.EnvelopeVisible = True" el programa ya no ejecuta nada más. He probado con F8 paso a paso y ahí se detiene. Necesito que el cuerpo del correo inserte las celdas  A2:T49 de la hoja "Tablero".  Si veis que así no se me entiende puedo crear un archivo y pegar la macro, pero como el código no es muy largo lo he puesto así.   Sub EnviarTableroInsertado() ApplicationOff 'variables Dim iMsg As Object, iConf As Object Dim cuerpo As String, schema As String, spie As String, mail As String Dim Flds As Variant Set iMsg = CreateObject("CDO.Message"): Set iConf = CreateObject("CDO.Configuration") iConf.Load -1 Set Flds = iConf.Fields schema = "http://schemas.microsoft.com/cdo/configuration/" With Flds Flds.Item(schema & "sendusing") = 2 Flds.Item(schema & "smtpserver") = "smtp.office365.com" Flds.Item(schema & "smtpserverport") = 25 Flds.Item(schema & "smtpauthenticate") = 1 Flds.Item(schema & "sendusername") = "micorreo" Flds.Item(schema & "sendpassword") = "micontraseña" Flds.Item(schema & "smtpusessl") = True Flds.Update End With Set tb = Sheets("Tablero") tb.Select mail = tb.Range("Y2") tb.Range("A2:T49").Select ' ActiveWorkbook.EnvelopeVisible = True ' With iMsg Set .Configuration = iConf .From = "micorreo" With ActiveSheet.MailEnvelope .Item.Subject = "Produccion Tablero - Personal Propio I+M - " & tb.Range("M2") .Item.To = mail '.Item.CC = "" '.Item.Introduction = "Adjuntamos Produccion Tablero - Personal Propio I+M -" & tb.Range("M2") .Item.Send End With End With Sheets("TOTAL").Select Set iMsg = Nothing: Set iConf = Nothing: Set Flds = Nothing Set tb = Nothing ' ApplicationOn End Sub Gracias. Moisés.
    • Gerson Pineda, si lo he intentado cambiando de muchas formas el formato y no e logrado de solucionar
    • Hola No he visto tu archivo, pero solo es cosa que le cambies el formato a fecha   Saludos 
  • Recently Browsing

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Privacy Policy