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
'//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
0