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)

Preguntas similare

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
Respuesta Responder a este mensaje
#2 MRoCFed
18/10/2007 - 00:18 | Informe spam
Dos sugerencias básicas:
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
Respuesta Responder a este mensaje
#3 MRoCFed
18/10/2007 - 00:24 | Informe spam
Dos sugerencias básicas:
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
Respuesta Responder a este mensaje
#4 Ivan
18/10/2007 - 01:08 | Informe spam
Recorrer esta matriz le lleva aproximadamente 15
segundos, y necesito que lo haga en menos tiempo. ¿Alguien conoce


alguna manera?

mas tiempo es, lógicamente, cuando busca la(s) siguiente(s)




>>coincidencia(s): Set c = .FindNext(c)



hola,

no lo he probado, pero creo que esto lo agilizaria bastante

' ojo esta hecho para buscar en las columnas de la E(5) a la S(19) Y
he supuesto que empiezas la busqueda a partir de la fila 2 (la 1 para
los titulos)
'
Sub pruebaFind()
Dim c As Range, n As Byte, f As Long, ultF As Long, NUMERO As Double
Application.ScreenUpdating = False
For n = 5 To 19
f = 2: ultF = Cells(65536, c).End(xlUp).Row
Do While Application.CountIf(Range(Cells(f, c), Cells(ultF, c)),
NUMERO) > 0 or f>ultf
Set c = .Find(NUMERO, cells(f-1,c), LookIn:=xlValues,
lookat:=xlWhole)
c.Interior.ColorIndex = 4
direccion = c.Address
t = Len(direccion)
direccion = Right(direccion, t - 3)
Range("t" & direccion).Value = Range("t" & direccion).Value + 1
f = c.Row + 1
Loop
Next
If Not c Is Nothing Then c = Nothing
End Sub

un saludo
Ivan
Respuesta Responder a este mensaje
#5 Ivan
18/10/2007 - 01:30 | Informe spam
Recorrer esta matriz le lleva aproximadamente 15
segundos, y necesito que lo haga en menos tiempo. ¿Alguien conoce


alguna manera?
mas tiempo es, lógicamente, cuando busca la(s) siguiente(s)




>>coincidencia(s): Set c = .FindNext(c)




hola,

no lo he probado, pero creo que esto lo agilizaria bastante


' ojo esta hecho para buscar en las columnas de la E(5) a la S(19) Y
he supuesto que empiezas la busqueda a partir de la fila 2 (la 1 para
los titulos) y he dejado lo referido al color (si te vale adaptalo
como creas)

'-
Sub pruebaFind(NUMERO As Double)
Dim c As Range, n As Byte, f As Long, ultF As Long, direccion, t As
Byte
Application.ScreenUpdating = False
For n = 5 To 19
f = 1: ultF = Cells(65536, n).End(xlUp).Row
Do While Application.CountIf(Range(Cells(f, n), Cells(ultF, n)), _
NUMERO) > 0 And f <ultF
Set c = Range(Cells(f, n), Cells(ultF, n)).Find(what:=NUMERO, _
after:=Cells(f, n), LookIn:=xlValues, lookat:=xlWhole)
c.Interior.ColorIndex = 4
f = c.Row + 1
Loop
Next
If Not c Is Nothing Then Set c = Nothing
End Sub
'-
'-n ej de llamada
Sub Test()
pruebaFind NUMERO:%2
End Sub'-


un saludo
Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida