Fecha y día de la semana desde el numero de semana en vba

Me podríais ayudar cara sacar la fecha y el día desde el numero de semana.

Ejemplo:

La semana nº 13 que es la actual que nos retorne

Lunes 25-03-19

Martes 26-03-19

Miércoles 27-03-19

Jueves 28-03-19

Viernes 29-03-19

Sábado 30-03-19

Domingo 31-03-19

2 Respuestas

Respuesta
2

Por si te sirve

Supongamos que tengo un formulario

Si escribo la semana 13 y pulso Enter

El código del evento Después de actualizar del cuadro de texto al que llamo Semana es

Private Sub Semana_AfterUpdate()
Dim d As Date, e As Byte, c As Integer
d = DateSerial(Year(Date), 1, 1) + (Semana - 1) * 7
c = Weekday(DateSerial(Year(Date), 1, 1), vbMonday)
For e = 1 To 7
DoCmd.RunSQL "insert into tabla1(idcliente,diafecha)values(" & Me.IdCliente & ",#" & d & "# - " & c & " + " & e & ")"
DoCmd.RunSQL "update tabla1 set dialetra=format([diafecha],""dddd"")"
Next e
Tabla1.Form.Requery
End Sub

Lo de weekday es para que "averigue" que día de la semana era el primer día del año, y también le digo que las semanas empiecen en lunes(como Dios manda)

Hola Julián González Cabarcos e Isaac Reyes,

Primero daros gracias a los dos. Habéis hecho un gran trabajo, a mí me habría costado mucho sacar este código porque es sencillo pero complicado. Estoy adaptando los dos códigos para aprender de las dos formas.

He empezado con el código de Icue y  no logro hacerlo funcionar ni tampoco logro interpretarlo.

Private Sub cbBox_SemHm_Change()
'Filtramos el subForm para que cuando el cbBox cambie tb lo haga el subForm
[Form_Plan IntoHorasMaq_Sub].Form.Filter = "n_Sem= cbBox_SemHm"
[Form_Plan IntoHorasMaq_Sub].Form.FilterOn = True
[Form_Plan IntoHorasMaq_Sub].Requery

Semana
End Sub

Sub Semana()

Dim d As Date, e As Byte, c As Integer
d = DateSerial(Year(Date), 1, 1) + (Me.cbBox_SemHm.Value - 1) * 7
c = Weekday(DateSerial(Year(Date), 1, 1), vbMonday)
For e = 1 To 7
     Select Case e
           Case Is = 2
                 [Form_Plan IntoHorasMaq_Sub].txt_Lunes.Caption = "#" & d & "# - " & c & " + " & e
     End Select
     'DoCmd.RunSQL "insert into tabla1(idcliente,diafecha)values(" & Me.IdCliente & ",#" & d & "# - '       ' "       &  c & " + " & e & ")"
     'DoCmd.RunSQL "update tabla1 set dialetra=format([diafecha],""dddd"")"
Next e
End Sub

Hola Isaac Reyes,

Tu sentencia me funciona a la primera, pero me cuesta interpretarla me podrías ayudar a desglosarla. Me ha gustado la utilización del MsgBox para imprimir todos los resultado, muy buena idea

No iba a responder pero...

Primero, el código funciona porque antes de mostrar nada lo pruebo.

Segundo, Los filtros o los criterios, en todo caso se ponen en el evento Después de actualizar y se usaría

me.nombredel subform.form.recordsource="select......

Tercero, en ningún momento he definido una función semana(), sino que semana es el nombre de un control donde escribo la semana

Cuarto, si al dia 01/01/2019 le sumo lo 91 días que suman 13 semanas, me empezaría a contar a partir de ese día, pero como resulta que el día 01/01/2019 puedes ser martes, miércoles, etc tengo que calcular que número de día de la semana es y luego restárselo a 91 para que empiece la semana en lunes.

Quinto, la instrucción Docmd.runsql"insert... está mal

Por cierto, para hacer lo que pretendes, no son necesarios tantos campos

Sólo he puesto 6 turnos porque no quiero trabajar más.

Si elijo una semana

Cuando elijo, por ejemplo, el 3

El cuadro de la derecha hace la suma de horas

Respuesta
1

Supongamos que en A1 tienes el número de la semana y en A2 tienes el año al que pertenece esa semana.

Las fórmulas para calcular los días del 1 al 7 serían los siguientes (considerando el lunes como inicio de la semana)

=FECHA($A$2;1;1)+(($A$1-1)*7)-DIASEM(FECHA($A$2;1;1);2)+1

=FECHA($A$2;1;1)+(($A$1-1)*7)-DIASEM(FECHA($A$2;1;1);2)+2

=FECHA($A$2;1;1)+(($A$1-1)*7)-DIASEM(FECHA($A$2;1;1);2)+3

=FECHA($A$2;1;1)+(($A$1-1)*7)-DIASEM(FECHA($A$2;1;1);2)+4

=FECHA($A$2;1;1)+(($A$1-1)*7)-DIASEM(FECHA($A$2;1;1);2)+5

=FECHA($A$2;1;1)+(($A$1-1)*7)-DIASEM(FECHA($A$2;1;1);2)+6

=FECHA($A$2;1;1)+(($A$1-1)*7)-DIASEM(FECHA($A$2;1;1);2)+7

Me comentas si te sirve.

S@lu2

Mis disculpas, lo pedías en VBA. Coméntame si te sirve así o necesitas que sea obligatoriamente con VBA.

S@lu2

Disculpa lo necesito el vba para pasarlo a un txt de access (muchas gracias) 

Ya que tus requisitos no son muy explícitos, tendrías que adaptar este procedimiento a tus necesidades.

Sub SubDiasSemanaN()
    anio = 2019
    semana_n = 13
    inicio_anio = DateSerial(anio, 1, 1)
    fin_semana_ant = ((semana_n - 1) * 7) - Weekday(inicio_anio, vbMonday)
    dias_semana_n = ""
    For i = 1 To 7
        dias_semana_n = dias_semana_n & vbNewLine
        'Aquí se va asignando cada día calculado por el DateAdd'
        dias_semana_n = dias_semana_n & DateAdd("d", fin_semana_ant + i, inicio_anio)
    Next
    MsgBox "Los días de la semana " & semana_n & " son: " & dias_semana_n
End Sub

S@lu2

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas