Mejorar el tiempo de ejecución de un For Each c In Me.Controls

Tengo un formularios con varios objetos y 231 son txt que les quiero pasar por parámetro un valor. Esto lo consigo pero la ejecución es de 4 seg. Se podría agilizar el tiempo de ejecución os envío el código.

'Congelamos la pantalla hasta que termine el procedimiento
Me.Painting = False

tipoMaq = ""
T = "M"
i = 0
j = 0

For j = 1 To 12
  'Pasamos el tipo de maq si es (8 y 9) vertical u (resto) horizontal
  If j = 8 Or j = 9 Then
        tipoMaq = "V"
  Else
        tipoMaq = "M"
  End If
  For i = 1 To 3
     Select Case i
         Case Is = 1
               T = "M"
         Case Is = 2
                T = "T"
         Case Is = 3
                T = "N"
     End Select
  'recorremos los controles
  For Each c In Me.Controls
      ' 'Si el contro es =
      Select Case c.name
             Case Is = "txt_" & tipoMaq & j & "_" & dia & "_" & T
                       'ponemos el foco en el control para poder usarlo
                       c.SetFocus
                      Select Case T
                                  'Nos situamos en el txt posición turno
                                  Case Is = "M"
                                            c.Text = txtHoras
                                  Case Is = "T"
                                            c.Text = txtHoras
                                  Case Is = "N"
                                           c.Text = txtHoras
                       End Select
              Exit For
       End Select
     Next
   Next i
Next j

Me.Painting = True

1 respuesta

Respuesta
1

Lo que veo raro es el ciclo que tienes con la variable 'i' ya que, resumido, tendrías el siguiente código...

For j = 1 To 12
  For i = 1 To 3
     For Each c In Me.Controls
...
     Next
   Next i
Next j

O sea que en realidad la cantidad de controles la estás recorriendo 36 veces, ya que el ciclo de la variable 'c' se ejecuta 3 veces (de la variable 'i') que a su vez se ejecuta 12 veces (de la variable 'j')

Salu2

Esta instrucción rellena las horas de un cuadrante semanal de tres turnos y por 12 maquinas. La variable i indica los turnos. Para localizar los controles txt le paso de forma dinámica el "tipoMaq", con "J" le paso el nº de máquina, el "dia" día de la semana (lo paso por parámetros al pulsar el btn) y el turno "T" con el bucle que recorre la "i" . Podría reducir el tiempo de ejecución de alguna forma? Gracias,

 For Each c In Me.Controls
      ' 'Si el contro es =
      Select Case c.name
             Case Is = "txt_" & tipoMaq & j & "_" & dia & "_" & T

Pues por lo que dices está bien que los ciclos estén anidados, así que no creo que puedas bajar mucho los tiempos de ejecución.

Lo único que tal vez puedas cambiar es que si estás buscando un tipo de control específico, en lugar de ver por el nombre, uses la función TypeOf, te dejo una página con un ejemplo...

https://social.msdn.microsoft.com/Forums/es-ES/6de2545c-7187-40ef-9b51-8d1257775a3a/recorrer-coleccin-de-controles-existentes-en-un-formulario 

Salu2

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas