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

#6 Jesús Román
11/05/2004 - 01:09 | Informe spam
Hola Héctor!!
Habría jurado haber visto funcionar la macro a la perfección, pero ahora la
he puesto con una señal que justo da hoy y me sale todo bien a excepción de
el color de D1. ¿que hecho alguna burrada? o me falta quizás algo...



Sub KilometrosHora25hector(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



Sub PONERKilometrosHora25hector()
Dim i As Integer
Dim L1 As Boolean
i = 3
Do
If Range("D" & i) = "" Then Exit Do
Range("CN" & i).Select
Call KilometrosHora25hector(i, L1)
i = i + 1
Loop
End Sub



"Héctor Miguel" escribió en el mensaje
news:
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
#7 Héctor Miguel
11/05/2004 - 07:10 | Informe spam
hola, Jesús !

... sale todo bien a excepcion de el color de D1 [...]
Sub KilometrosHora25hector(ByVal i As Integer, ByVal L1 As Boolean)
Dim Rango As String
Rango = "cn" & i + 1 & ":cn" & i + 12 [...]



=> en esta parte de los codigos... [parece que]... no hay 'problema' ;)

Sub PONERKilometrosHora25hector()
Dim i As Integer
Dim L1 As Boolean
i = 3
Do
If Range("D" & i) = "" Then Exit Do
Range("CN" & i).Select
Call KilometrosHora25hector(i, L1)
i = i + 1
Loop
End Sub



=> con respecto al codigo de la macro que 'llama' a la macro anterior...
1.- NO es necesario 'declarar' la variable 'L1' [para 'indicarle' si se trata de la primera linea]
SI es necesario 'pasarle' [el argumento como] 'True' [primera linea] o... 'False' [el 'bucle']
2.- por lo anterior... es necesario 'dejar fuera' [del bucle] la llamada POR la primera linea ;)
3.- haz la prueba [con las 'modificaciones'] como sigue:
__________
Sub PONERKilometrosHora25hector()
Dim i As Integer
If range("d3") <> "" Then Call KilometrosHora25hector(3, True)
i = 4
Do
If Range("d" & i) = "" Then Exit Do
Range("cn" & i).Select
Call KilometrosHora25hector(i, False)
i = i + 1
Loop
End Sub

¿comentas?
saludos,
hector.

p.d. podrias evitar la 'triangulacion' [usando dos macros] con solo la macro 'llamada'
[ya has visto que no es necesario el 'select' -de la celda- para aplicar el 'interior.colorindex'] :))
Respuesta Responder a este mensaje
#8 Jesús Román
11/05/2004 - 10:34 | Informe spam
Nada, que soy un autentico torpedo... Lo siento. No consigo que fragüe.
Ahora mismo tengo la macro así:

Sub KilometrosHora25hector(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

Sub PONERKilometrosHora25hector()
Dim i As Integer
If Range("d3") <> "" Then Call KilometrosHora25hector(3, True)
i = 4
Do
If Range("d" & i) = "" Then Exit Do
Range("cn" & i).Select
Call KilometrosHora25hector(i, False)
i = i + 1
Loop
End Sub

E igual es posible que te tenga que aclarar algunos terminos (o quizas tenga
yo que poner algo mas en la macro y no me entero) como que la macro se
ejecuta con el sub poner... solo cuando quiero mirar historicos es decir,
que no es su uso habitual y es sólo ahí donde quiero que no me toque la
calilla "d1". Lo comun es que la macro sea llamada desde otra con la
siguiente llamada: call kilometroshora25hector(3,true) ???

te expongo de nuevo todo a ver si hay algun mal entendido
la macro funciona a excepcion de cuando la señal cumple las condiones en la
linea 3 (la hoja trabaja el dia a dia en la linea 3), pues inserta cada dia
una linea nueva bajando el resto hacia abajo.
Lo que quiero decir es que en D1, que es donde quiero que me ponga un
relleno de color, no me lo pone nunca (antes lo ponia siempre, lo cual se ha
evitado, pero sin conseguir aun que lo ponga sólo cuando trabaja en la linea
3 recien insertada)

siento mucho si te estoy liando jeje
pero te recuerdo de que aunque las macros que tengo den apariencia de que
entiendo algo de esto, ya ves, que poquito. A veces pienso que retrocedo en
mis conocimientos.

Gracias!!!
saludos.














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

> ... sale todo bien a excepcion de el color de D1 [...]
> Sub KilometrosHora25hector(ByVal i As Integer, ByVal L1 As Boolean)
> Dim Rango As String
> Rango = "cn" & i + 1 & ":cn" & i + 12 [...]

=> en esta parte de los codigos... [parece que]... no hay 'problema' ;)

> Sub PONERKilometrosHora25hector()
> Dim i As Integer
> Dim L1 As Boolean
> i = 3
> Do
> If Range("D" & i) = "" Then Exit Do
> Range("CN" & i).Select
> Call KilometrosHora25hector(i, L1)
> i = i + 1
> Loop
> End Sub

=> con respecto al codigo de la macro que 'llama' a la macro anterior...
1.- NO es necesario 'declarar' la variable 'L1' [para 'indicarle' si se


trata de la primera linea]
SI es necesario 'pasarle' [el argumento como] 'True' [primera linea]


o... 'False' [el 'bucle']
2.- por lo anterior... es necesario 'dejar fuera' [del bucle] la llamada


POR la primera linea ;)
3.- haz la prueba [con las 'modificaciones'] como sigue:
__________
Sub PONERKilometrosHora25hector()
Dim i As Integer
If range("d3") <> "" Then Call KilometrosHora25hector(3, True)
i = 4
Do
If Range("d" & i) = "" Then Exit Do
Range("cn" & i).Select
Call KilometrosHora25hector(i, False)
i = i + 1
Loop
End Sub

¿comentas?
saludos,
hector.

p.d. podrias evitar la 'triangulacion' [usando dos macros] con solo la


macro 'llamada'
[ya has visto que no es necesario el 'select' -de la celda- para


aplicar el 'interior.colorindex'] :))

Respuesta Responder a este mensaje
#9 Jesús Román
11/05/2004 - 21:15 | Informe spam
Hola Héctor!!!
Me fuí a trabajar y como no me sacaba el asunto de la cabeza al final pensé
en una solucion que he puesto en practica y parece ser buena...
La primera señal del bucle pondría el color interior en la celda "CN".
Entonces si el color está en cn3 le pido que me lo ponga tambien en D1:
If Range("cn3").Interior.ColorIndex = 7 Then Range("d1").Interior.ColorIndex
= 7
Como todo lo que yo hago, pues como que tiene su defecto. El cual es que
si paso el bucle y ese dia resulta ser dia clave, pues me repetira el
machaconeo en d1 durante todas las señales que de la hoja, pero bueno...
esas señales no son frecuentes y al menos algo he evitado.
Con esta solucion ya me vale, no obstante, si lo otro lo ves mas adecuado y
consigues hacermelo entrar en esta dura cabeza que tengo, pues aqui la
espero.

Bueno, espero tu comentario...
Gracias por todo!!




"Jesús Román" <CRISONIA3(texto inactivo)@terra.es> escribió en el mensaje
news:Ae0oc.290739$
Nada, que soy un autentico torpedo... Lo siento. No consigo que fragüe.
Ahora mismo tengo la macro así:

Sub KilometrosHora25hector(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

Sub PONERKilometrosHora25hector()
Dim i As Integer
If Range("d3") <> "" Then Call KilometrosHora25hector(3, True)
i = 4
Do
If Range("d" & i) = "" Then Exit Do
Range("cn" & i).Select
Call KilometrosHora25hector(i, False)
i = i + 1
Loop
End Sub

E igual es posible que te tenga que aclarar algunos terminos (o quizas


tenga
yo que poner algo mas en la macro y no me entero) como que la macro se
ejecuta con el sub poner... solo cuando quiero mirar historicos es decir,
que no es su uso habitual y es sólo ahí donde quiero que no me toque la
calilla "d1". Lo comun es que la macro sea llamada desde otra con la
siguiente llamada: call kilometroshora25hector(3,true) ???

te expongo de nuevo todo a ver si hay algun mal entendido
la macro funciona a excepcion de cuando la señal cumple las condiones en


la
linea 3 (la hoja trabaja el dia a dia en la linea 3), pues inserta cada


dia
una linea nueva bajando el resto hacia abajo.
Lo que quiero decir es que en D1, que es donde quiero que me ponga un
relleno de color, no me lo pone nunca (antes lo ponia siempre, lo cual se


ha
evitado, pero sin conseguir aun que lo ponga sólo cuando trabaja en la


linea
3 recien insertada)

siento mucho si te estoy liando jeje
pero te recuerdo de que aunque las macros que tengo den apariencia de que
entiendo algo de esto, ya ves, que poquito. A veces pienso que retrocedo


en
mis conocimientos.

Gracias!!!
saludos.














"Héctor Miguel" escribió en el mensaje
news:
> hola, Jesús !
>
> > ... sale todo bien a excepcion de el color de D1 [...]
> > Sub KilometrosHora25hector(ByVal i As Integer, ByVal L1 As Boolean)
> > Dim Rango As String
> > Rango = "cn" & i + 1 & ":cn" & i + 12 [...]
>
> => en esta parte de los codigos... [parece que]... no hay 'problema'


;)
>
> > Sub PONERKilometrosHora25hector()
> > Dim i As Integer
> > Dim L1 As Boolean
> > i = 3
> > Do
> > If Range("D" & i) = "" Then Exit Do
> > Range("CN" & i).Select
> > Call KilometrosHora25hector(i, L1)
> > i = i + 1
> > Loop
> > End Sub
>
> => con respecto al codigo de la macro que 'llama' a la macro anterior...
> 1.- NO es necesario 'declarar' la variable 'L1' [para 'indicarle' si se
trata de la primera linea]
> SI es necesario 'pasarle' [el argumento como] 'True' [primera


linea]
o... 'False' [el 'bucle']
> 2.- por lo anterior... es necesario 'dejar fuera' [del bucle] la llamada
POR la primera linea ;)
> 3.- haz la prueba [con las 'modificaciones'] como sigue:
> __________
> Sub PONERKilometrosHora25hector()
> Dim i As Integer
> If range("d3") <> "" Then Call KilometrosHora25hector(3, True)
> i = 4
> Do
> If Range("d" & i) = "" Then Exit Do
> Range("cn" & i).Select
> Call KilometrosHora25hector(i, False)
> i = i + 1
> Loop
> End Sub
>
> ¿comentas?
> saludos,
> hector.
>
> p.d. podrias evitar la 'triangulacion' [usando dos macros] con solo la
macro 'llamada'
> [ya has visto que no es necesario el 'select' -de la celda- para
aplicar el 'interior.colorindex'] :))
>


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