Hola, en esta macro consigo lo que necesito salvo que no quiero que sea indefinida, necesito que cuando el valor de la celda SD55 es siempre cero, se detenga después de 30 iteraciones, y a la vez si el valor cero cambia antes de llegar a las 30 iteraciones finalizar la macro. Do Range("RN50:SD260").Calculate Loop While Range("SD55").Value = 0
Respuesta de vichufirefox
1
1
vichufirefox, Ing. de Sistemas. Windows XP Office 2003 y 2007 Lenguaje C, C++ y...
Si quieres hacer unas iteraciones de 30 veces, lo mejor es utilizar un For... y para validar utiliza un For i = 1 To 30 If Range("SD55").Value = 0 Then ....Instrucciones... Else End End If Next i Si quieres mandame un archivo de ejemplo de que quieres hacer y te colaboro... [email protected] porque la verdad es que no te entiendo muy bien...
- Anónimoahora mismo
1 respuesta más de otro experto
Respuesta de emoren
1
1
emoren, Con los conocimientos que he adquirido con el manejo de la hoja...
Bueno la verdad no entendí muy bien la consulta, pero creo que lo que necesitas se soluciona con la siguiente macro: For x = 1 To 30 If (Range("SD55").Value <> 0) Then Exit Sub Else Range("RN50:SD260").Calculate End If Next x Espero que esto sea lo que necesita, de lo contrario no finalice la consulta hasta obtener la respuesta adecuada, cualquier inquietud me la puede comunicar en mi perfil, si le ha sido de utilidad mi ayuda NO OLVIDE PUNTUAR Y FINALIZAR LA PREGUNTA, que tenga un feliz día!
Hola, gracias por atenderme, voy a tratar de dar un ejemplo más completo y elaborado, espero que se entienda: La macro que escribo abajo hay que corregirla para que haga lo siguiente: En el rango A no hay problema porque es muy probable encontrar un valor >0, pero si la celda B1 es =0 se debe calcular el rango B1:B10 hasta que B1 sea > que cero, cuando se consigue que B1 sea >0 sigue con la instrucción siguiente en la columna C: Si la celda C1=0 se debe calcular el rango C1:C10 hasta que C1 sea > que cero, luego DE, E y F, lo que yo necesito corregir es que si en B1, C1, D1, E1 o F1 nunca llega a ser >0 luego de 10 iteraciones, comience de nuevo desde el principio (rango A). Digamos que la macro termina cuando se consigue que en A1, B1, C1, D1, E1 y F1 es mayor que cero, y en el caso de que nunca pueda completarse la macro con todos los valores mayores de cero, se termina igual luego de que haya comenzado desde el "rango A" 30 veces en total . Lo explico de otra manera por si es muy rebuscado: Por ejemplo: empieza calculando el rango A y aparece en A1 un valor >0, sigue con el rango B y consigue que B1>0, luego sigue con el rango C pero luego de 10 iteraciones no se cumple la condición C1>0, entonces comienza de nuevo a calcular el rango A, y así se repetirá el proceso, cada vez que vuelva a calcular las otras instrucciones y no consiga en algunas de ellas el ">0" volverá a empezar un máximo de 30 veces y finaliza la macro. Corregir macro: Do Range("A1:A10 ").Calculate ( volver aqui hasta 30 veces en total) Loop While Range("A1").Value = 0 Do Range("B1:B10 ").Calculate Loop While Range("B1").Value = 0 (10 veces) Do Range("C1:C10 ").Calculate Loop While Range("C1").Value = 0 (10 veces) Do Range("D1:D10").Calculate Loop While Range("D1").Value = 0 (10 veces) Do Range("E1:E10 ").Calculate Loop While Range("E1").Value = 0 (10 veces) Do Range("F1:F10").Calculate Loop While Range("F1").Value = 0 (10 veces)
Bueno ya tengo solucionada sumacro, pero no funciona perfectamente debido a que con esta instrucción Range("A1:A10 "). ¿Calculate qué pretende hacer?, por que dicha instrucción lo único que hace es poner en blanco la celda, pero la macro ya esta probada en los diferentes casos que solicita, espero que me aclare prontamente para agregarlo a la macro, estoy atento a su respuesta.
Hola, para poder probar la macro se podría hacer poniendo estas fórmulas: en la celda A1: MIN(A2:A10), en la B1: MIN(B2:B10) y así hasta la F1. En cada celda de este rango A2:A10 : ALEATORIO. ENTRE(1;15). Y en cada celda de estos rangos B2:B10; C2:C10; D2:D10; E2:E10; F2:F10: ALEATORIO.ENTRE(0;15). Estos rangos son a modo de ejemplo porque los originales son 196 rangos y más grandes, concatenados en una hoja con muchísimas fórmulas que tarda mucho en calcular y cada vez que se calcula la hoja solo se modifican 2 o3 rangos, lo que yo consigo con esta macro es optimizar el cálculo para que calcule solamente los rangos que sé con anticipación van a ser modificados, de esta manera va a calcular la hoja como mínimo 50 veces más rápido que si calculo la hoja entera.
Listo ya probé la macro con los datos suministrados y funciona de 10, espero que le sea útil, a continuación la macro: Sub calcular() Sheets("Hoja1").Range("A1").Select Do While Not IsEmpty(ActiveCell) repite: If (ActiveCell.Value > 0) Then ActiveCell.Offset(0, 1).Select Else If (ActiveCell.Value = 0) Then For a = 1 To 10 If (ActiveCell.Value > 0) Then GoTo repite Else b = ActiveCell.Address c = Mid(ActiveCell.Address, 2, 1) d = c & 10 Range("b:d").Calculate End If Next a GoTo inicio End If End If Loop Exit Sub inicio: Sheets("Hoja1").Range("A1").Select Do While Not IsEmpty(ActiveCell) repite1: If (ActiveCell.Value > 0) Then ActiveCell.Offset(0, 1).Select Else If (ActiveCell.Value = 0) Then For a = 1 To 30 If (ActiveCell.Value > 0) Then GoTo repite1 Else b = ActiveCell.Address c = Mid(ActiveCell.Address, 2, 1) d = c & 10 Range("b:d").Calculate End If Next a End If End If Loop End Sub Recuerde que cualquier consulta me la puede comunicar en mi perfil, si le ha sido de utilidad mi ayuda, NO OLVIDE PUNTUAR Y FINALIZAR LA PREGUNTA, de lo contrario no finalice esta consulta hasta obtener la solución adecuada, que tenga un feliz día!