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

#11 Garamond
18/10/2007 - 09:30 | Informe spam
Hola a :

Perdonad que ayer sólo respondiera a Cacho, pero debe de haber un
problema con el Grupo, ya que ayer sólo tenía la respuesta de Cacho.
Envié mi segundo mensaje hará unas 10 horas y ahora apareció de
último.
Iván, probaré tu código por la tarde (ahora son las 09:25 de la mañana
en España) y ya te contaré. En cuanto a Héctor, no me es posible
utilizar el formato condicional porque se efectúa una especie de
sorteo. Es un poco largo de explicar, te copio lo que le respondí a
Cacho:

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

El código ejecuta un sorteo aleatorio. Si el primer número es el 13,
se iluminan en verde las posiciones de esos números. Sucesivamente
sigue otro número, y otro, y otro... hasta que algún cartón ha sido
premiado (sus quince números han salido en el sorteo y por tanto están
en verde).

Muchas gracias a

P.S.: Espero que no sigan los problemas y este mensaje entre en el
Servidor sin problemas. En España son las 09:30 h.
Respuesta Responder a este mensaje
#12 Héctor Miguel
18/10/2007 - 14:52 | Informe spam
hola, cesr !

... no me es posible utilizar el formato condicional porque se efectua una especie de sorteo.
Es un poco largo de explicar, te copio lo que le respondi a Cacho:
b) No me viene bien utilizar el ScreenUpdating=False. Me explico: esta hoja controla un sorteo de tipo bingo.
Hay 5400 cartones con 15 numeros cada uno (de ahi las dimensiones de la matriz).
Necesito saber, en los momentos finales, si alguien tiene un carton 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
El codigo ejecuta un sorteo aleatorio. Si el primer numero es el 13, se iluminan en verde las posiciones de esos numeros.
Sucesivamente sigue otro numero, y otro, y otro... hasta que algun carton ha sido premiado
(sus quince numeros han salido en el sorteo y por tanto estan en verde)...



(dejame insistir en los formatos condicionales)...
de acuerdo con la matriz de tu primer mensaje: -> "... matriz esta... en el rango e17:s5416...)..."

si suponemos que el codigo que ejecuta el corteo aleatorio "deposita" cada numero en la fila 1 (E1:S1)

1) selecciona el rango E16:S5416 <= la celda E16 debera ser la celda "activa"

2) ve a (menu) formato / formato condicional...

3) con la condicion de formula, utiliza alguna de las siguientes:

a) si no importa el orden del sorteo y el orden de cada numero en las columnas de cada "carton" (fila ?)
=sumaproducto(--(contar.si($e$1:$s$1,$e17:$s17)))
(ojo con el separador de argumentos, yo uso la coma)

b) si el orden es importante (el primero sorteado en la primera columna y asi sicesivamente)...
=sumaproducto(--($e17:$s17=$e$1:$s$1))

4) aplicas los formatos de tu preferencia (color, trama, borde, etc.)

OJO: veras "iluminada" la fila hasta que se complete la ronda de 15 numeros sorteados y solo en las filas "ganadoras"
y en cuanto a tiempo que te tardes en comprobar... (ya comentaras despues) ;)

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#13 MRoCFed
19/10/2007 - 00:40 | Informe spam
On 17 oct, 18:32, Garamond wrote:
Hola a :

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)




Pido disculpas si este mensaje está repetido... pero -ya saben- no
está funcionando bien este Foro.

Quizás la idea del formato condicional sea la mejor idea, como propone
"Héctor Miguel".
Te he dejado en el enlace: http://www.savefile.com/files/1132059 una
opción de ello.

Observa que los números sorteados se ingresan en la columna A... Y si -
por ejemplo- ingresas el Nº "49", muy rápidamente se "iluminarán"
todos los "49".

Evalúa entonces:
a) El código de la hoja (que re-define el nombre "NumerosSorteados"; y
b) Las características del Formato Condicional.

Espero que te sea útil.
Saludos a todos
Respuesta Responder a este mensaje
#14 Garamond
19/10/2007 - 12:50 | Informe spam
Hola a :

Perdonad por no haber contestado antes, pero estoy un poco liado.
Probaré el formato condicional cuanto antes, y ya os diré.
He notado una cosa curiosa: la hoja trata de controlar los números que
salgan en un sorteo y marcarlos en los cartones correspondientes. El
retardo de 15 segundos de la función Find ocurre cuando los datos del
sorteo se introducen a mano (es decir, el niño canta una bola y yo la
anoto en el ordenador). Cuando el ordenador realiza un sorteo
aleatorio, la función find apenas tarda dos segundos.

Ya os diré en que acaba todo esto.

Muchas gracias, un abrazo.
Respuesta Responder a este mensaje
#15 Ivan
19/10/2007 - 16:41 | Informe spam
hola,

Ya os diré en que acaba todo esto.



solo por curiosidad, ¿has probado mi macro?

es solo por saber hasta que punto agilizaria. Mis pruebas no creo que
se puedan comparar a tu caso real, y me gustaria saber si debo
descartar esta posibilidad para casos similares en un futuro..

Si comentas el resultado.te lo agradezco.

un saludo
Ivan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida