Algún método es más rápido que .Find¿?

17/10/2007 - 23:32 por Garamond | Informe spam
Hola a tod@s:

Tengo una hoja de Excel, en la que mediante código VBA le pido a Excel
que busque un número en una matriz de números de 15 columnas y 5400
filas (esta matriz está escrita físicamente en el rango e17:s5416 de
una hoja de cálculo). Esta búsqueda la hago empleando el método .Find,
tal que así:

Set c = .Find(NUMERO, LookIn:=xlValues,
lookat:=xlWhole)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Interior.ColorIndex = 4
direccion = c.Address
t = Len(direccion)
direccion = Right(direccion, t - 3)
Range("t" & direccion).Value = Range("t" &
direccion).Value + 1
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <>
firstAddress
End If

El número buscado puede aparecer muchas veces en la matriz y cada vez
que encuentra una coincidencia, la celda dónde está ese número se
ilumina en verde. Recorrer esta matriz le lleva aproximadamente 15
segundos, y necesito que lo haga en menos tiempo. ¿Alguien conoce
alguna manera?

Muchas gracias por adelantado por vuestra atención.

P.S.: He comentado casi todas las líneas del código anterior para
probar si alguna demoraba el programa y la línea que le lleva más
tiempo es, lógicamente, cuando busca la(s) siguiente(s)
coincidencia(s): Set c = .FindNext(c)
 

Leer las respuestas

#1 MRoCFed
18/10/2007 - 00:16 | Informe spam
Dos consejos básicos:
a) incorpora Application.ScreenUpdating = False; y
b) cambia los colores en una sola acción... por ejemplo:

Sub BuscaryColorear()
Dim Celdas As String
Application.ScreenUpdating = False
Set C = [E:S].Find(What:=NUMERO, LookIn:=xlValues,
LookAt:=xlWhole)
If C Is Nothing Then Exit Sub
firstAddress = C.Address
Do
Celdas = Celdas & "," & C.Address
Set C = Cells.FindNext(After:=C)
Loop While C.Address <> firstAddress
Application.ScreenUpdating = True
Range(Mid(Celdas, 2, Len(Celdas))).Interior.ColorIndex = 4
Set C = Nothing
End Sub

Preguntas similares