Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

419 views
Skip to first unread message

Garamond

unread,
Oct 17, 2007, 5:32:37 PM10/17/07
to
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)

MRo...@gmail.com

unread,
Oct 17, 2007, 6:16:33 PM10/17/07
to
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

MRo...@gmail.com

unread,
Oct 17, 2007, 6:18:38 PM10/17/07
to
Dos sugerencias básicas:
a) Incorpora Application.ScreenUpdating = False; y
b) Cambia los colores en una sola acción... por ejemplo:

MRo...@gmail.com

unread,
Oct 17, 2007, 6:24:40 PM10/17/07
to
Message has been deleted

Ivan

unread,
Oct 17, 2007, 7:30:34 PM10/17/07
to

>>> 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:=252
End Sub'-------------------------------------


un saludo
Ivan

Ivan

unread,
Oct 17, 2007, 7:34:37 PM10/17/07
to
este mensaje no es valido (vaya un diita que llevo) He enviado otro que no se si/cuando aparecera

ivan


MRo...@gmail.com

unread,
Oct 17, 2007, 8:26:05 PM10/17/07
to
Dos sugerencias básicas:
a) incorpora Application.ScreenUpdating = False; y
b) cambia los colores en una sola acción... por ejemplo:

Héctor Miguel

unread,
Oct 17, 2007, 9:24:36 PM10/17/07
to
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.


Garamond

unread,
Oct 18, 2007, 2:49:07 AM10/18/07
to
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.


Garamond

unread,
Oct 18, 2007, 3:29:48 AM10/18/07
to

Garamond

unread,
Oct 18, 2007, 3:30:42 AM10/18/07
to
Hola a tod@s:

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 tod@s.

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.

Héctor Miguel

unread,
Oct 18, 2007, 8:52:47 AM10/18/07
to
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)))=15
(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))=15

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) ;)

MRo...@gmail.com

unread,
Oct 18, 2007, 6:40:11 PM10/18/07
to


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

Garamond

unread,
Oct 19, 2007, 6:50:59 AM10/19/07
to
Hola a tod@s:

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.

Ivan

unread,
Oct 19, 2007, 10:41:47 AM10/19/07
to

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

0 new messages