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

#6 Ivan
18/10/2007 - 01:34 | Informe spam
este mensaje no es valido (vaya un diita que llevo) He enviado otro que no se si/cuando aparecera

ivan
Respuesta Responder a este mensaje
#7 MRoCFed
18/10/2007 - 02:26 | 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
#8 Héctor Miguel
18/10/2007 - 03:24 | Informe spam
hola, cesar !

Tengo una hoja... en la que mediante codigo... busque... en una matriz de numeros de 15 columnas y 5400 filas
(... matriz esta... en el rango e17:s5416...)... empleando el metodo .Find (...)
El numero buscado puede aparecer muchas veces en la matriz
y cada vez que encuentra una coincidencia la celda donde esta ese numero se ilumina en verde.
Recorrer esta matriz le lleva aproximadamente 15 segundos, y necesito que lo haga en menos tiempo...



1) si el dato que buscas es del tipo .Find(...xlWhole)... no has probado con los formatos condicionales ?

2) si de un dato anterior resultaron algunas celdas iluminadas de verde... asi las dejas ? (cuando cambias dato a buscar)

3) cuando se tarda esos 15 segundos... cuantas celdas resultan iluminadas ?
(cuanto se tardaria si solamente hubiera dos o tres celdas a iluminar ?)

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#9 Garamond
18/10/2007 - 08:49 | Informe spam
Hola Cacho:

Muchas gracias por tu rápida ayuda. Desgraciadamente no funciona por
tres razones:
a) La variable Celdas se corta debido a que el número de concurrencias
de un número puede ser muy alto. El número 13 (curiosa coincidencia,
probé con ese) se repite 900 veces en la matriz, y el String no puede
albergar tanto caracter.
b) No me viene bien utilizar el ScreenUpdating=False. Me explico: esta
hoja controla un sorteo de tipo bingo. Hay 5400 cartones con 15
números cada uno (de ahí las dimensiones de la matriz). Necesito
saber, en los momentos finales, si alguien tiene un cartón ganador, y
si tengo esa propiedad a False, tardaría unos segundos importantes (en
este momento, aproximadamente 15) en saber si alguien ha sido
premiado.
c) Último y más importante: no noté ninguna diferencia tangible en
cuanto a ahorro de tiempo. Necesito ganar unos 7 u 8 segundos.
Si crees que me he equivocado en algo, por favor, házmelo saber. De
todas maneras, me pareció un código muy bueno y fue una pena que no
funcionara.

Un abrazo y muchas gracias.
Respuesta Responder a este mensaje
#10 Garamond
18/10/2007 - 09:29 | Informe spam
Hola Cacho:

Muchas gracias por tu rápida ayuda. Desgraciadamente no funciona por
tres razones:
a) La variable Celdas se corta debido a que el número de concurrencias
de un número puede ser muy alto. El número 13 (curiosa coincidencia,
probé con ese) se repite 900 veces en la matriz, y el String no puede
albergar tanto caracter.
b) No me viene bien utilizar el ScreenUpdating=False. Me explico: esta
hoja controla un sorteo de tipo bingo. Hay 5400 cartones con 15
números cada uno (de ahí las dimensiones de la matriz). Necesito
saber, en los momentos finales, si alguien tiene un cartón ganador, y
si tengo esa propiedad a False, tardaría unos segundos importantes (en
este momento, aproximadamente 15) en saber si alguien ha sido
premiado.
c) Último y más importante: no noté ninguna diferencia tangible en
cuanto a ahorro de tiempo. Necesito ganar unos 7 u 8 segundos.
Si crees que me he equivocado en algo, por favor, házmelo saber. De
todas maneras, me pareció un código muy bueno y fue una pena que no
funcionara.

Un abrazo y muchas gracias.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida