Hola a todos:
Aunque ya llevo dos post sobre fechas y ya quería dejar de escribir sobre este asunto para entrar en otros temas, recientemente he recibido una consulta que paso a reproducir:
Con las fechas, tengo una pregunta, teniendo, por ejemplo, la semana = 32 y el año = 2021, ¿cuál es la fecha de inicio y finalización de la semana? ¿Es posible tener una UDF (VBA) para esto? Sabiendo que la semana comienza el lunes y que la primera semana del año comienza el 01/01 / año.
Pues bien, como sabéis hace unos días publiqué un post: OBTENER RELACIÓN DE SEMANAS ENTRE DOS FECHAS CON VBA en el que precisamente con una UDF se generaba el listado de todas las semanas entre dos fechas. Y esto, como habréis podido suponer nos ayudará prácticamente a realizar el trabajo.
De hecho, podemos utilizar parte del código de la UDF para crear una nueva que nos ofrezca la información que necesitamos. Únicamente debemos tener en cuenta lo siguiente:
- Debemos modificar el código sustituyendo las referencias a la hoja de cálculo por variables.
- Debemos pasar los datos a una matriz para mostrar la información.
Vamos a suponer el siguiente ejemplo, donde utilizaremos un listado de todas las semanas entre 01/01/2021 y 31/07/2021:
Pues bien, aquí tenemos las la relación de fechas y el número de semanas (esto lo podéis obtener utilizando la función NUM.DE.SEMANA()). Pues bien, este cuadro es únicamente para ilustrar y que podáis ver cómo la función realiza su trabajo correctamente).
Recordemos que lo que estamos buscando es conseguir la fecha inicio y fecha final de una semana a partir del número de la semana. Bien, para hacerlo os propongo este código:
Function FECHA_SEMANAS(inicio As Date, fin As Date, semana As Integer)
Dim i As Long, iniciomas As Variant, fechafin As Date, MiCadena As String
Dim MiArray As Variant, Matriz As Variant, j As Long
If inicio > fin Then Exit Function
i = 0
'Generamos relacion de semanas (fecha inicio y fecha fin)
Do Until iniciomas > fin
If iniciomas <> vbNullString Then inicio = iniciomas
If Year(inicio) <> Year(DateSerial(Year(inicio), Month(inicio), Day(inicio) + IIf(Weekday(inicio, 2) < 7, 7 - Weekday(inicio, 2), 0))) And Month(DateSerial(Year(inicio), Month(inicio), Day(inicio) + IIf(Weekday(inicio, 2) < 7, 7 - Weekday(inicio, 2), 0))) = 1 Then
fechafin = DateSerial(Year(inicio), Month(1), Day(1))
iniciomas = DateSerial(Year(fechafin), Month(fechafin), Day(fechafin) + 1)
Else
fechafin = DateSerial(Year(inicio), Month(inicio), Day(inicio) + IIf(Weekday(inicio, 2) < 7, 7 - Weekday(inicio, 2), 0))
iniciomas = DateSerial(Year(fechafin), Month(fechafin), Day(fechafin) + 1)
End If
i = i + 1
'Si llegamos a la semana indicada, pasamos la información a función
If i = semana Then
MiCadena = inicio & " " & fechafin
Matriz = Split(MiCadena, " ")
ReDim MiArray(0 To UBound(Matriz))
For j = 0 To UBound(Matriz)
MiArray(j) = Matriz(j)
Next j
FECHA_SEMANAS = MiArray
Exit Do
End If
Loop
End Function
Y ahora, por ejemplo, supongamos que queremos los datos de la semana 11 del rango determinado:
Como podéis observar el resultado de la función devuelve el rango de la semana 11 y solo tenéis que introducir fechas de inicio y final del tramo y número de semana para obtener el rango de la semana.
Y esto es todo, espero que sea de interés y utilidad.
Puedes descargar el archivo pulsando aquí: OBTENER FECHA DE INICIO Y FIN DE UNA SEMANA INDICANDO EL NÚMERO DE SEMANA ENTRE DOS FECHAS
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies
Muy bueno.