Imprimir página | Cerrar ventana

vba - Do while con dos codiciones

Impreso de: Foro de Access y VBA
Categoría: Otros de Microsoft: Windows y Office
Nombre del foro: Excel
Descripción del foro: Foro de Excel y VBA de Excel
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=85718
Fecha de impresión: 16/Abril/2024 a las 08:11


Tema: vba - Do while con dos codiciones
Publicado por: jfca283
Asunto: vba - Do while con dos codiciones
Fecha de publicación: 04/Enero/2021 a las 01:32
Hola,
Traté de hacer un loop con while usando dos condiciones uniendo con AND.

Private Sub bucle_wh()
Range("E2").Select
Do While (ActiveCell.Offset(0, -1) <> 4) And (ActiveCell.Value <> "Este")
If ActiveCell.Value = "" Then Exit Do
ActiveCell.Offset(0, -4).Interior.ColorIndex = 1
ActiveCell.Offset(0, 3).Value = "Estearn"
ActiveCell.Offset(1, 0).Select

Loop

End Sub

Sin embargo, no me funciona. No tengo problemas con hacer uno con until.
Tampoco en hacer que funcione aplicando una sola condición. Pero tomando en cuenta ambas, nunca corre.¿Qué estoy haciendo mal?
De antemano, muchas gracias por su ayuda.

Acá el set de datos al que quiero aplicar esto para generalizar.
R ZX GH QQ Zone
1 1 7 2 Este
6 2 6 2 Este
1 1 8 1 Oeste
15 2 4 1 Sur
14 1 1 4 Este
13 1 4 4 Este
15 1 5 1 Oeste
14 1 3 1 Oeste
4 1 6 4 Delta
7 1 10 3 Norte
14 2 1 4 Norte
6 2 3 4 Norte



Respuestas:
Publicado por: Mihura
Fecha de publicación: 04/Enero/2021 a las 08:39
¿Y si unificas la condición?

Do While ((ActiveCell.Offset(0, -1) <> 4) And (ActiveCell.Value <> "Este"))


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: lbauluz
Fecha de publicación: 04/Enero/2021 a las 08:48
Muy buenas,

Por lo que veo es que la condición nunca se cumple, CREO que lo que deberías poner es

 Do While  (ActiveCell.Offset(0, -1) <> 4) And (ActiveCell.Value = "Este")

Pero solo es lo que yo entiendo.

Luis


-------------
El Búho es un pajarraco


Publicado por: jfca283
Fecha de publicación: 04/Enero/2021 a las 13:16
Publicado originalmente por Mihura Mihura escribió:

¿Y si unificas la condición?

Do While ((ActiveCell.Offset(0, -1) <> 4) And (ActiveCell.Value <> "Este"))


He tratado y no funciona esa sintax.


Publicado por: jfca283
Fecha de publicación: 04/Enero/2021 a las 13:17
Publicado originalmente por lbauluz lbauluz escribió:

Muy buenas,

Por lo que veo es que la condición nunca se cumple, CREO que lo que deberías poner es

 Do While  (ActiveCell.Offset(0, -1) <> 4) And (ActiveCell.Value = "Este")

Pero solo es lo que yo entiendo.

Luis


Traté y tampoco funciona.


Publicado por: AnSanVal
Fecha de publicación: 04/Enero/2021 a las 15:40
- El incremento de fila  (ActiveCell.Offset(1, 0).Select) no debe ir dentro de la condición, pues cundo no cumpla no habrá incremento (ni bucle).
- No es necesario (ni conveniente) seleccionar celdas para realizar las acciones.
- Sin entrar a valorar las condiciones, prueba con:

Private Sub bucle_wh()
  Dim celda As Range
  For Each celda In Range("E2:E13")
    If (celda.Offset(0, -1) <> 4) And (celda.Value <> "Este") And (celda.Value <> "") Then
      celda.Offset(0, -4).Interior.ColorIndex = 1
      celda.Offset(0, 3).Value = "Estearn"
    End If
  Next celda
End Sub




-------------
Saludos desde Tenerife.


Publicado por: jfca283
Fecha de publicación: 04/Enero/2021 a las 17:38
Buenas,
Usando Do Until no presenta problemas el bucle.
Cuando no cumple la condición,simplemente se detiene.
El usar For y Next me funciona. El tema es que no logro apilar dos condiciones con ActiveCell y Do While. Si dejo solo una de ella, el Do While corre sin problemas.

Publicado originalmente por AnSanVal AnSanVal escribió:

- El incremento de fila  (ActiveCell.Offset(1, 0).Select) no debe ir dentro de la condición, pues cundo no cumpla no habrá incremento (ni bucle).
- No es necesario (ni conveniente) seleccionar celdas para realizar las acciones.
- Sin entrar a valorar las condiciones, prueba con:

Private Sub bucle_wh()
  Dim celda As Range
  For Each celda In Range("E2:E13")
    If (celda.Offset(0, -1) <> 4) And (celda.Value <> "Este") And (celda.Value <> "") Then
      celda.Offset(0, -4).Interior.ColorIndex = 1
      celda.Offset(0, 3).Value = "Estearn"
    End If
  Next celda
End Sub




Publicado por: pitxiku
Fecha de publicación: 04/Enero/2021 a las 20:04
Los bucles Do While, primero comprueban las condiciones, y si se cumplen, permiten que se ejecute lo que haya dentro.

En tu caso, primero te colocas en la celda E2. Después, verificas si tienes los valores 4 y "Este" en 2 columnas de la fila de la celda activa. Como el valor "Este" se cumple, no entras en el bucle y vas directamente a la primera instrucción después del bucle.

Por todo ello, te están dando otras posibilidades para que entres en el bucle.



Imprimir página | Cerrar ventana