Error de compilación: Procedimiento demasiado largo

Antes de describir mi problema he de aclarar que no tengo muchos conocimientos de access, estoy intentando crear un formulario donde pueda registrar las horas trabajadas en un mes, los campos que he creado son ID, mes, año, trabajador, obra y los días del 1 al 31, mi intención es que cuando seleccione en el formulario principal un mes y un año me aparezcan en un subformulario sombreados los días que son fines de semana y festivos, en los campos del 1 al 31 introduzco las horas, como he comentado antes no tengo muchos conocimientos y lo he hecho de la siguiente forma y funciona:

El problema ocurre que cuando ejecuto el formulario en mi pc, todo funciona perfecto, pero cuando lo hago en otro ordenador me da el mensaje de error de compilación, Procedimiento demasiado largo y es que el procedimiento que he puesto es el siguiente, existe alguna forma de crear alguna variable que pueda solucionarme el problema, ya que ahora al no saber he creado un formulario con subformulario para cada año.

Private Sub C_MES_AfterUpdate()
Dim DD As Long, SS As Long, FF As Long
FF = RGB(255, 1, 0)
SS = RGB(179, 179, 179)
DD = RGB(255, 153, 51)
NN = RGB(255, 255, 255)
NL = RGB(153, 205, 153)
If Me.C_MES = "ENERO" Then
[S-Calendario].Form![D1].BackColor = FF
[S-Calendario].Form![T1].BackColor = FF
[S-Calendario].Form![D2].BackColor = SS
[S-Calendario].Form![T2].BackColor = SS
[S-Calendario].Form![D3].BackColor = DD
[S-Calendario].Form![T3].BackColor = DD
[S-Calendario].Form![D4].BackColor = NN
[S-Calendario].Form![T4].BackColor = NN
[S-Calendario].Form![D5].BackColor = NN
[S-Calendario].Form![T5].BackColor = NN
[S-Calendario].Form![D6].BackColor = FF
[S-Calendario].Form![T6].BackColor = FF
[S-Calendario].Form![D7].BackColor = NN
[S-Calendario].Form![T7].BackColor = NN
[S-Calendario].Form![D8].BackColor = NN
[S-Calendario].Form![T8].BackColor = NN
[S-Calendario].Form![D9].BackColor = SS
[S-Calendario].Form![T9].BackColor = SS
[S-Calendario].Form![D10].BackColor = DD
[S-Calendario].Form![T10].BackColor = DD
[S-Calendario].Form![D11].BackColor = NN
[S-Calendario].Form![T11].BackColor = NN
[S-Calendario].Form![D12].BackColor = NN
[S-Calendario].Form![T12].BackColor = NN
[S-Calendario].Form![D13].BackColor = NN
[S-Calendario].Form![T13].BackColor = NN
[S-Calendario].Form![D14].BackColor = NN
[S-Calendario].Form![T14].BackColor = NN
[S-Calendario].Form![D15].BackColor = NN
[S-Calendario].Form![T15].BackColor = NN
[S-Calendario].Form![D16].BackColor = SS
[S-Calendario].Form![T16].BackColor = SS
[S-Calendario].Form![D17].BackColor = DD
[S-Calendario].Form![T17].BackColor = DD
[S-CALENDARIO].Form![D18].BackColor = NN
[S-CALENDARIO].Form![T18].BackColor = NN
[S-CALENDARIO].Form![D19].BackColor = NN
[S-CALENDARIO].Form![T19].BackColor = NN
[S-CALENDARIO].Form![D20].BackColor = NN
[S-CALENDARIO].Form![T20].BackColor = NN
[S-CALENDARIO].Form![D21].BackColor = NN
[S-CALENDARIO].Form![T21].BackColor = NN
[S-CALENDARIO].Form![D22].BackColor = NN
[S-CALENDARIO].Form![T22].BackColor = NN
[S-CALENDARIO].Form![D23].BackColor = SS
[S-CALENDARIO].Form![T23].BackColor = SS
[S-CALENDARIO].Form![D24].BackColor = DD
[S-CALENDARIO].Form![T24].BackColor = DD
[S-CALENDARIO].Form![D25].BackColor = NN
[S-CALENDARIO].Form![T25].BackColor = NN
[S-CALENDARIO].Form![D26].BackColor = NN
[S-CALENDARIO].Form![T26].BackColor = NN
[S-CALENDARIO].Form![D27].BackColor = NN
[S-CALENDARIO].Form![T27].BackColor = NN
[S-CALENDARIO].Form![D28].BackColor = NN
[S-CALENDARIO].Form![T28].BackColor = NN
[S-CALENDARIO].Form![D29].BackColor = NN
[S-CALENDARIO].Form![T29].BackColor = NN
[S-CALENDARIO].Form![D30].BackColor = SS
[S-CALENDARIO].Form![T30].BackColor = SS
[S-CALENDARIO].Form![D31].BackColor = DD
[S-CALENDARIO].Form![T31].BackColor = DD
[S-CALENDARIO].Form![L].Visible = False
[S-CALENDARIO].Form![M].Visible = False
[S-CALENDARIO].Form![X].Visible = False
[S-CALENDARIO].Form![J].Visible = False
[S-CALENDARIO].Form![V].Visible = True
[S-CALENDARIO].Form![S].Visible = False
[S-CALENDARIO].Form![D].Visible = False
[S-CALENDARIO].Form![D29].Visible = True
[S-CALENDARIO].Form![T29].Visible = True
[S-CALENDARIO].Form![D30].Visible = True
[S-CALENDARIO].Form![T30].Visible = True
[S-CALENDARIO].Form![D31].Visible = True
[S-CALENDARIO].Form![T31].Visible = True
[S-CALENDARIO].Form![X28].Visible = False
[S-CALENDARIO].Form![X31].Visible = False
ElseIf Me.C_MES = "FEBRERO" Then
[S-CALENDARIO].Form![D1].BackColor = NN
[S-CALENDARIO].Form![T1].BackColor = NN
etc....
ElseIf Me.C_MES = "MARZO" Then

Y así hasta Diciembre

2 Respuestas

Respuesta
1

! No ! De esta forma no debe trabajar imagínese fijar todos los controles para un año, trate de nombrar los controles de tal forma que pueda recorrerlos con FOR EACH, esto disminuye totalmente el código a una tercera parte. Esto se hace con formularios dinámicos, no obstante, se requiere buenos conocimientos de VBA. Personalmente elaboré un ejemplo que subí a Youtube para fijar y liquidar turnos de vigilantes, creo que hoy no está. Si le interesa escríbame a [email protected] y le envío el ejemplo.

NOTA: Los festivos los calculo mediante código nada de tablas y menos Excel. Sería conveniente me indique el país sobre el cual se aplicará la función e indique los festivos, cuáles son trasladables o no.

Le dejo estas imágenes de mi programa para programar turnos de vigilantes en Colombia, en donde en algunos casos las fechas festivas son trasladadas al siguiente lunes.

Esta imagen corresponde a la programación de turnos para la primera semana de octubre, observe como se cambian los encabezados de las fechas para los días y como fija en color rojo el domingo o festivo y el día sábado lo deja en azul. Este es un formulario dinámico lo mismo con el reporte.

Esta imagen corresponde a la segunda semana de octubre. Resumiendo todo esto se hace EN UN SOLO formulario, los festivos como le mencioné los determino con código sin necesidad de tablas de festivos. Si quiere este ejemplo puede solicitarlo a [email protected] favor en el asunto anotar la consulta.

Respuesta
1

El trabajo que has realizado es encomiable, pero estoy de acuerdo en que no es necesario. El que debe de trabajador es el procesador del ordenador no el programador. Por ejemplo, si tengo la tabla Reservas, donde Habitación sería la obra y el Idcliente sería las horas trabajadas

Si tengo un formulario donde le digo el mes que quiero que me cree y pongo una fecha, por ejemplo 01/10/2021(La pongo así, porque aprovecho un ejemplo que ya tenía) y pulso el botón de crear

Me introduce en la tabla tantos días como tiene ese mes con su habitación correspondiente( en mi ejemplo son 10 habitaciones). Por tanto son 310 registros. Si abajo eligiera un mes( sólo muestra los meses creados) y una habitación, que como te digo, en tu caso, sería una obra

Cuando selecciono el 4

Puedes comprobar que el 1 de octubre de 2021 es viernes y la habitación es la 4, que sería la obra que has elegido. Y en vez del combinado donde elijo un cliente, podrías poner un cuadro de texto donde escribieras las horas.

El código del botón de crear el mes es

Private Sub Comando375_Click()
DoCmd.SetWarnings False
If DCount("*", "reservas", "fechareserva=forms!Inicio!dias") >= 1 Then
MsgBox " Nene, ¿No te has dado cuenta de que ese mes ya está creado?", vbOKOnly + vbExclamation, "Que paciencia hay que tener"
DoCmd.CancelEvent
Dias = ""
Dias.SetFocus
Else
Dim b As Integer, c As Byte
For b = 1 To DateSerial(Year([Dias]), Month([Dias]) + 1, 0) + 1 - DateSerial(Year([Dias]), Month([Dias]), 1)
For c = 1 To 10
DoCmd.RunSQL "insert into reservas(habitacion,fechareserva)values(" & c & ",forms!Inicio!dias+" & b & "-1)"
Next c
Next b
End If
End Sub

Pero hasta donde pone Dim... es para controlar que no intentes crear un mes ya creado. Así que fíjate si la instrucción es corta.

Es decir, el consejo es que trabajes por obras y no por meses.

Y si quieres el ejemplo, repito, si quieres, mándame un mensaje(sólo el mensaje) a [email protected] y te mando el ejemplo. Si lo haces, en el asunto del mensaje pon tu alias Javier Perez, ya que si no sé quien me escribe ni los abro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas