Alternativa a bucles for…next en Visual Basic

Iniciado por Superbig, 15 Julio 2015, 12:18 PM

0 Miembros y 1 Visitante están viendo este tema.

Superbig

Hola; estoy programando en visual basic una macro para excel, en este bucle,que tiene otros bucles anidados, el problema es el tiempo que tarda en calcularlo(varios dias).
El cometido del bucle es comparar el contenido de la matriz bidimensional "mimatriz(1600000,5)" con el contenido de una columna de una hoja de excel que tiene 80000 elementos, buscando determinadas coincidencias que en caso de encontrarlas las almacenaría en "copmimatriz".
Alguien sabe si hay alguna manera de hacer este tipo de comparaciones sin usar bucles, de manera que sea más rapido?,
gracias y un saludo
For AA = 1 To 1600000
TT = 0
For A = 0 To 79996
T = 0
For C = 1 To 5
For B = A + 1 To 4 + A
If MIMATRIZ(AA, C) = Cells(B, 6).Value Then
T = T + 1
GoTo 5850
End If
Next B
5850 Next C
If T = 4 Then
TT = TT + 1
End If
Next A
If TT > 0 Then
GoTo 5900
End If
AB = AB + 1
For BB = 1 To 5
COPMIMATRIZ(AB, BB) = MIMATRIZ(AA, BB)
Next BB
5900 Next AA

79137913

HOLA!!!

1, indenta tu codigo
2, utiliza geshi
3, sin bucles no se puede pero...
4, podes utilizar funciones de exel integradas para lograr mejor rendimiento, por ejemplo buscar o sumar.si , yo recomiendo sumar.si, es mas rapida, solo agrega una columna con unos cerca de tu base de comparacion y si da mas de uno hay coincidencia
5, Me tome el trabajo de optimizar tu codigo al maximo que vi posible sin quitarle la esencia:
Código (vb) [Seleccionar]
Dim TT As Boolean
   For AA = 1 To 1600000
       For A = 0 To 79996
           T = 0
           For C = 1 To 5
               For B = A + 1 To A + 4
                   If MIMATRIZ(AA, C) = CELLS(B, 6).Value Then
                       T = T + 1
                       Exit For
                   End If
               Next B
           Next C
           If T = 4 Then
               TT = True
               Exit For
           End If
       Next A
       If TT Then
           TT = False
       Else
           AB = AB + 1
           For BB = 1 To 5
               COPMIMATRIZ(AB, BB) = MIMATRIZ(AA, BB)
           Next BB
       End If
   Next AA

6, Probalo y me decis cuanto tiempo te ahorre con el nuevo procedimiento.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*