Excel - Rápido y ... furioso??!!

 
Vista:

Rápido y ... furioso??!!

Publicado por JuanC (792 intervenciones) el 04/10/2007 23:57:23
'//Bien es sabido que el bucle For Each .. In .. Next
'//es uno -sino el más rápido- de los métodos
'//que mejor anda para procesar muchos datos.
'//En la búsqueda de mejorar el método
'//descubrí algo más que curioso.
'//No sólo encontré algo más rápido para
'//procesar miles de datos sino que el código
'//-y esto es lo que me llamó la atención-
'//es 'más extenso' y 'complejo' que un bucle FE.I.N
'//La lógica sería que un código más breve
'//sea más rápido, pero...

'//Les dejo un ejemplo sencillo para que vean
'//el método y lo apliquen a cualquier situación.
'//Ej.: pintar todas las celdas del rango
'//A1:J10000 que tengan el valor 2
'//(Son algo así como 100.000 datos!)

Option Explicit
Option Base 1

'//By JuanC - Oct. 2007

'//Método I (lento, bucle FE.I.N)

Sub Pinta2()
Dim r As Range
Dim t1!
t1 = Timer
For Each r In [A1:J100]
If r = 2 Then r.Interior.ColorIndex = 3
Next
Set r = Nothing
MsgBox "Elapsed: " & (Timer - t1) & "s"
End Sub

'//Método II (rápido - Con más código!)

Sub Pinta2Ex()
Dim Mx As Variant
Dim i&, j&, m&, n&
Dim r As Range, rng As Range
Dim t1!
t1 = Timer
Set rng = [A1:J100]
With rng
m = .Rows.Count
n = .Columns.Count
Mx = .Value
End With
For i = 1 To m
For j = 1 To n
If Mx(i, j) = 2 Then
If r Is Nothing Then
Set r = rng.Cells(i, j)
Else
Set r = Union(r, rng.Cells(i, j))
End If
End If
Next
Next
If Not r Is Nothing Then r.Interior.ColorIndex = 3
Erase Mx
Set r = Nothing
Set rng = Nothing
MsgBox "Elapsed: " & (Timer - t1) & "s"
End Sub

Saludos desde Baires, JuanC
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Rápido y ... furioso??!!

Publicado por José luis (700 intervenciones) el 05/10/2007 08:37:23
Ostras!, JuanC tienes toda la razón.
Los he ejecutado varias veces y la media de tiempo que obtengo es que el segundo es 5 veces más rápido que el primero.
Cuando comencé a programar en C, me convencieron de que antes que hacer un bucle For Next era mejor hacer un While o un Until, e incrementar una variable. La causa era que el For Next al verificar siempre el tope del Next en cada bucle, si se usa una variable en vez de una constante se vuelve muy lento.

Es muy posible que aquí ocurra algo parecido y que en el código interno de la instrucción se tengan que rehacer los cálculos sobre el máximo del F.E.I.N en cada bucle, lo que ralentizaría el proceso. :-O?

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Abraham Valencia
Val: 313
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

RE:Rápido y ... furioso??!!

Publicado por Abraham Valencia (2415 intervenciones) el 05/10/2007 16:14:11
Me sumo al :-O

Despues de varias pruebas, no deja dudas

Abraham
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Rápido y ... furioso??!!

Publicado por JuanC (792 intervenciones) el 05/10/2007 19:40:53
según 'yo' la clave está en la línea
Mx = .Value
con lo cual -creo- obtenemos un 'rango virtual' pero 'limpio'
es decir, un rango de 'propiedades de objeto' (Value) sin el objeto...
creo que eso es lo que al final produce la diferencia.
ahora me pregunto: se podrá hacer más rápido??!!

Saludos desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Rápido y ... furioso??!!

Publicado por programador (1 intervención) el 11/02/2010 20:46:18
Abraham.

Siempre en los foros, lo unico que haces son comentarios e indicar direcciones, pero soluciones nada. Podrias seguir el ejemplo de JuanC.

Buena JuanC siempre siendo un gran aporte en el foro...!

Programador.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar