bucles anidados

07/05/2004 - 11:01 por Jesús Román | Informe spam
Hola !!
Despues de mucho meneo y exfuerzo he conseguido anidar bucles... joels! y
ahora parece tan sencillo...

pero despues de los bucles me doy cuenta de que la macro aun siendo casi
perfecta no cumple con los requisitos que deseo y no se como prantearlos.
abajo planteo dos ejemplos y tambien despues expongo la macro.
La cuestion es la siguiente:
la cifra 49.79 da señal porque hay un numero negativo en el "ejemplo 1",
pero en el ejemplo 2 aunque tenemos tambien tenemos un numero negativo, pues
me gustaria que no diera señal pues tenemos antes del negativo un numero
superior a 25 que segun la macro seria falso

los dos bucles van del 1 al 13, y la cuestion seria que si el bucle primero
(en distancia del 1 al 13) da falso, antes que el otro, pues el verdadero
del segundo no me valga.

como no se si aun me he dado a enteder, pues ni yo mismo se si me entiendo,
lo explico de otra forma mas
Si los dos bucles fueran simultaneos (cosa que creo que no) que se me
ejecutara solo el que llegue antes a la solucion en tiempo de contador. Si
bucle 1 cumple condicion en fila 3 y bucle 2 cumple condicion en fila 10,
que sea el bucle 1 el que nos de la razon.

Gracias.-


ejemplo1


Km/h.
49,78
20,13
17,68
9,59
4,10
-2,85
10,11
22,70
25,61
33,13
30,06
10,07
13,09

******************
******************
ejemplo2


Km/h.
49,78
25,33
17,68
9,59
4,10
-2,85
10,11
22,70
25,61
33,13
30,06
10,07
13,09






Sub KilometrosHora25(ByVal i As Integer)
Dim EsValido As Boolean
Dim j As Integer
Dim k As Integer
If Range("CN" & i).Value > 25 Then
EsValido = True
For j = 1 To 13
If Range("CN" & i + j).Value > 25 Then
EsValido = False
End If
For k = 1 To 13
If Range("CN" & i + k).Value < 0 Then
EsValido = True
End If
Next k
Next j
If EsValido = True Then
Call bordecelda("CN" & i, "grueso", "morado")
Call ponercomentario("25 Km/h. Vender", "CN", i)
Selection.Interior.ColorIndex = 7
Range("D1").Select
Selection.Interior.ColorIndex = 7
End If
End If
End Sub

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
07/05/2004 - 21:16 | Informe spam
hola, Jesús !

... he conseguido anidar bucles... joels! y ahora parece tan sencillo...
... la macro aun siendo casi perfecta no cumple con los requisitos que deseo [...]
... los dos bucles van del 1 al 13 ... que si el bucle primero ... da falso ... el ... segundo no me valga [...]
... que se me ejecutara solo el que llegue antes a la solucion en tiempo de contador [...]



=> 'aprovechando' que la variable booleana [EsValido] se establece en 'True' al 'arrancar' los bucles...
=> cambia la 'comparacion' para 'buscar' SOLO cuando se 'deba' evaluar como =>falso< 1.- en el primer bucle [el 'j'], =>despues<= de establecer la variable como falso...
=>agrega una 'salida' del bucle ->'Exit For'<- [para que NO se 'ejecute' ya el segundo]
2.- en el segundo bucle [el 'i']...
a) cambia la 'comparacion' para cuando 'deba' evaluarse como falso [p.e. If...Value >= 0 Then]
b) =>agrega [tambien] una 'salida' del bucle ->'Exit For'<- [para que NO 'tenga que'... seguir hasta el final]

¿comentas?
saludos,
hector.
Respuesta Responder a este mensaje
#2 Jesús Román
08/05/2004 - 09:01 | Informe spam
No me vale de esta forma.
Di tantas explicaciones que al final la he liado.
Km/h. Km/h.
a1) 49,78 a1) 49,78
20,13 25,33
17,68 17,68
9,59 9,59
4,10 4,10
-2,85 -2,85
10,11 10,11
22,70 22,70
25,61 25,61
33,13 33,13
30,06 30,06
10,07 10,07
13,09 13,09

Se trata de que sea señal valida cuando en a1) tengamos cifra superior a 25
como es el caso, pero que la anule cuando de los 13 anteriores alguno de
ellos haya sido superior a 25 (en las dos columnas la señal seria pues nula,
ya que existen numeros superiores a 25). Por último desearia que la señal
fuese valida en el caso de que hubiese entre los 13 anteriores un numero
negativo pero sólo en el caso de que entre el numero inicial a1) y el
negativo no existiera ninguno superior a 25. He aqui la dificultad, pues en
la primera columna tendriamos señal valida y en la segundo invalida, pues
tanto el numero inicial como el primero de los 13 serian superiores a 25.

Creo que mi explicacion de ahora es mas certera. Dudo como siempre de que se
encuentre una solucion adecuada a mi problema, no obstante mantengo mi
esperanza de que me sorprendas con alguna genialidad, segun tu costumbre.


Gracias por lo anterior, ya de por si me ha ayudado a aprender y practicar
con cosas que no conocía y que de desguró me van a ser de utilidad.
un cordial saludo.




"Héctor Miguel" escribió en el mensaje
news:
hola, Jesús !

> ... he conseguido anidar bucles... joels! y ahora parece tan sencillo...
> ... la macro aun siendo casi perfecta no cumple con los requisitos que


deseo [...]
> ... los dos bucles van del 1 al 13 ... que si el bucle primero ... da


falso ... el ... segundo no me valga [...]
> ... que se me ejecutara solo el que llegue antes a la solucion en tiempo


de contador [...]

=> 'aprovechando' que la variable booleana [EsValido] se establece en


'True' al 'arrancar' los bucles...
=> cambia la 'comparacion' para 'buscar' SOLO cuando se 'deba'


evaluar como =>falso<> 1.- en el primer bucle [el 'j'], =>despues<= de establecer la
variable como falso...
=>agrega una 'salida' del bucle ->'Exit For'<- [para que NO se


'ejecute' ya el segundo]
2.- en el segundo bucle [el 'i']...
a) cambia la 'comparacion' para cuando 'deba' evaluarse como


falso [p.e. If...Value >= 0 Then]
b) =>agrega [tambien] una 'salida' del bucle ->'Exit For'<-


[para que NO 'tenga que'... seguir hasta el final]

¿comentas?
saludos,
hector.

Respuesta Responder a este mensaje
#3 Héctor Miguel
09/05/2004 - 12:43 | Informe spam
hola, Jesús !

... que sea señal valida cuando en a1) tengamos cifra superior a 25
... que la anule cuando de los 13 anteriores alguno ... superior a 25
... que ... fuese valida [si] ... entre los 13 anteriores un numero negativo
pero solo [si] ... entre el ... inicial ... y el negativo no existiera ninguno superior a 25 [...]



[segun entiendo...] las 'condiciones' para que la 'señal' sea valida son...
1.- que el 'inicial' sea mayor a 25
2.- que si existe alguno 'negativo'... se encuentre =>antes<= que alguno mayor a 25 [si hubiera alguno]
[si he entendido mal :(( ... ya me diras 'en donde'] ;)
para evitar los bucles [y 'agilizar' el codigo] puedes 'evaluar' =>todas<= las condiciones 'de golpe' :))
[solo se requiere 'construir' el rango 'a evaluar'] con una macro +/- como la siguiente:
=>REVISA si 'efectivamente' se debe 'avanzar' 12... o 13 filas =>despues<= de la 'inicial'<[creo que aqui me 'perdi' porque 'ejemplificas' 13 valores =>incluyendo<= el 'inicial'] ;)

saludos,
hector.
=Sub KilometrosHora25(ByVal i As Integer)
Dim Rango As String
Rango = "cn" & i + 1 & ":cn" & i + 12
If Range("cn" & i) > 25 And _
Evaluate("If(CountIf(" & Rango & ",""<0"")>0,Match(True," & Rango & "<0,0),12)") < _
Evaluate("If(CountIf(" & Rango & ","">25"")>0,Match(True," & Rango & ">25,0),13)") Then
Call bordecelda("cn" & i, "grueso", "morado")
Call ponercomentario("25 Km/h. Vender", "cn", i)
Selection.Interior.ColorIndex = 7
Range("d1").Select
Selection.Interior.ColorIndex = 7
End If
End Sub
Respuesta Responder a este mensaje
#4 Jesús Román
09/05/2004 - 23:59 | Informe spam
Genialidad es la palabra que se me ocurre.
La macro es perfecta.

Por supuesto, y a pesar de que se con claridad lo que hace, la sigo viendo
como un autentico jeroglífico chino.
Si aún existiera la "Santa inquisición" correrías peligro de acabar en una
hoguera.¿o no es brujería lo tuyo? . Gracias!!!

por cierto tengo planteada otra cuestión que se podría abordar en esta misma
pregunta y que no es otra que evitar:
Range("d1").Select
Selection.Interior.ColorIndex = 7
que cada vez que la señal sea correcta, pues la paso a toda la hoja que
tiene como 15 mil líneas me esté poniendo una y otra vez el color en la
celda D1, cuando yo solo deseo que lo haga si la señal es correcta en la
línea primera.

Ya me comentas...
Gracias de nuevo y saludos!



"Héctor Miguel" escribió en el mensaje
news:
hola, Jesús !

> ... que sea señal valida cuando en a1) tengamos cifra superior a 25
> ... que la anule cuando de los 13 anteriores alguno ... superior a 25
> ... que ... fuese valida [si] ... entre los 13 anteriores un numero


negativo
> pero solo [si] ... entre el ... inicial ... y el negativo no existiera


ninguno superior a 25 [...]

[segun entiendo...] las 'condiciones' para que la 'señal' sea valida


son...
1.- que el 'inicial' sea mayor a 25
2.- que si existe alguno 'negativo'... se encuentre =>antes<= que alguno


mayor a 25 [si hubiera alguno]
[si he entendido mal :(( ... ya me diras 'en donde'] ;)
para evitar los bucles [y 'agilizar' el codigo] puedes 'evaluar' =>todas<las condiciones 'de golpe' :))
[solo se requiere 'construir' el rango 'a evaluar'] con una macro +/- como


la siguiente:
=>REVISA si 'efectivamente' se debe 'avanzar' 12... o 13 filas =>despues<de la 'inicial'<> [creo que aqui me 'perdi' porque 'ejemplificas' 13 valores =>incluyendo<el 'inicial'] ;)

saludos,
hector.
=> Sub KilometrosHora25(ByVal i As Integer)
Dim Rango As String
Rango = "cn" & i + 1 & ":cn" & i + 12
If Range("cn" & i) > 25 And _
Evaluate("If(CountIf(" & Rango & ",""<0"")>0,Match(True," & Rango &


"<0,0),12)") < _
Evaluate("If(CountIf(" & Rango & ","">25"")>0,Match(True," & Rango &


">25,0),13)") Then
Call bordecelda("cn" & i, "grueso", "morado")
Call ponercomentario("25 Km/h. Vender", "cn", i)
Selection.Interior.ColorIndex = 7
Range("d1").Select
Selection.Interior.ColorIndex = 7
End If
End Sub

Respuesta Responder a este mensaje
#5 Héctor Miguel
10/05/2004 - 05:51 | Informe spam
hola, Jesús !

Genialidad [???] [...] Gracias!!!


[y yo que siempre 'crei' que se trataba de un poco de logica 'mezclada' con una 'pizca' de sentido comun] :))
y gracias a ti [por el 'feed-back'] ;)

... otra cuestion ... que no es otra que evitar:
Range("d1").Select
Selection.Interior.ColorIndex = 7
que cada vez que la señal sea correcta ... la paso a ... como 15 mil lineas
este poniendo una y otra vez el color en la celda D1 ... solo ... que lo haga si ... es correcta en la linea primera.



1.- podrias usar una sola linea [en lugar de las dos 'actuales'] como...
Range("d1").Interior.ColorIndex = 7
2.- para evitar la 'machacadera' de colores en la celda 'd1' y aprovechando que la macro 'recibe' parametros
[supongo que 'la llamas' desde otra/s macro/s usando -posiblemente- bucles]
a) agregar un parametro de tipo 'boolean' para 'notificarle' a la macro si se trata de la primera linea [del bucle]
b) utilizar ese parametro para 'omitir' las llamadas 'posteriores'
c) [obviamente] agregar el 'nuevo' parametro en las 'llamadas' a la macro
[ejemplos]
en la macro 'en cuestion'...
__________
Sub KilometrosHora25(ByVal i As Integer, ByVal L1 As Boolean)
Dim Rango As String
Rango = "cn" & i + 1 & ":cn" & i + 12
If Range("cn" & i) > 25 And _
Evaluate("If(CountIf(" & Rango & ",""<0"")>0,Match(True," & Rango & "<0,0),12)") < _
Evaluate("If(CountIf(" & Rango & ","">25"")>0,Match(True," & Rango & ">25,0),13)") Then
If L1 Then Range("d1").Interior.ColorIndex = 7
Call bordecelda("cn" & i, "grueso", "morado")
Call ponercomentario("25 Km/h. Vender", "cn", i)
Selection.Interior.ColorIndex = 7
End If
End Sub
¨¨¨¨¨¨¨¨¨¨¨¨
en [los bucles de] las 'llamadas' desde otra/s macro/s...
=>antes<= del bucle haces la 'primer' llamada con 'ese' parametro como verdadero y...
en lugar de 'buclear' [p.e.] de 1 a 20, 'metes' al bucle del 2 al 20 [con 'ese' parametro como falso] ;)
____________
Sub OtrasMacros(..)
' declaracion de variables ... '
Call KilometrosHora25(1, True)
For j = 2 To 20
Call KilometrosHora25(j, False)
Next
End Sub

[son solo ejemplos de 'posibles' alternativas de solucion, pero...] ¿comentas?
saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida