** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Otros de Microsoft: Windows y Office > Excel
  Mensajes nuevos Mensajes nuevos RSS - vba - Do while con dos codiciones
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

vba - Do while con dos codiciones

 Responder Responder
Autor
Mensaje
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 244
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita jfca283 Cita  ResponderRespuesta Enlace directo a este mensaje Tema: vba - Do while con dos codiciones
    Enviado: 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
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: La Gloria
Estado: Sin conexión
Puntos: 3849
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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
Arriba
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 244
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita jfca283 Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.
Arriba
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 244
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita jfca283 Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5970
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.
Arriba
jfca283 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 05/Junio/2008
Localización: Chile
Estado: Sin conexión
Puntos: 244
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita jfca283 Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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


Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable