Do While - Until Loop - sintaxis

Quería saber si me podían ayudar con este codigo.

(Lo tengo “resuelto”, pero tengo una duda)

.

IDEA: buscar en una columna de datos la última celda vacía y pegar un valor. Se que hay otros métodos para hacer esto, pero era un reto personal.

Mi solución (Nota: soy principiante en programación, apenas dos meses).

Sub ejercicio3()
Dim i As Long
i = 0
‘Se loopea por un rango de celdas hasta que encuentre una celda vacía
    Do Until IsEmpty(Cells(i + 1, 1)) = True
    i = i + 1
        If IsEmpty(Cells(i + 1, 1)) = True Then
            Cells(i + 1, 1).Value = “test”
            Exit Sub
        End If
    Loop
End Sub

MI PREGUNTA:

No me queda claro el porqué cuando incorporo el contador (i = i + 1) al final (entre el END IF y el LOOP), en lugar de al principio (como está ahora, justo luego del DO UNTIL), no funciona el código.

Casi siempre veo que en DO WHILE/UNTIL ponen el contador al final, y no al principio.

No funciona así:

Sub ejercicio3()
Dim i As Long
i = 0
‘Se loopea por un rango de celdas hasta que encuentre una celda vacía
    Do Until IsEmpty(Cells(i + 1, 1)) = True
        If IsEmpty(Cells(i + 1, 1)) = True Then
            Cells(i + 1, 1).Value = “test”
            Exit Sub
        End If
    i = i + 1
    Loop
End Sub

Alguna idea?

1 Respuesta

Respuesta
1

H o l a:

La segunda macro, digamos que "no funciona", es decir, en la celda vacía no te pone la palabra "test" por lo siguiente.

Lo que te voy a mostrar es algo que llamamos "prueba de escritorio", lo que se hace es reemplazar los valores y escribir cada paso que hace la macro.

Suponiendo el siguiente escenario (ver imagen), la celda A2 está vacía:

Empieza la macro:

i = 0
  • Esta instrucción, repite el ciclo hasta que la celda i+1 sea vacía:
Do Until IsEmpty(Cells(i + 1, 1)) = True
  • La celda i + 1, "A" es vacía?
  • Sustituimos i por 0
  • La celda 0+1, "¿A" es vacía?
  • La celda 1, "¿A" es vacía?
  • La celda 1, "A" no es vacía, entonces el ciclo continua, recuerda que el ciclo se va a repetir hasta que la celda sea vacía.
  • Ahora preguntas (otra vez):
If IsEmpty(Cells(i + 1, 1)) = True Then
  • La celda i+1, "A" es vacía?
  • La celda 0+1, "¿A" es vacía?
  • La celda 1, "¿A" es vacía? 
  • La celda 1, "A" no es vacía, entonces No entra al IF
  • Ahora incrementas en 1 el valor de i
i = i + 1
  • i = 0 + 1
  • i = 1
 Loop
  • Regresamos al Do While:
Do Until IsEmpty(Cells(i + 1, 1)) = True
  • La celda i + 1, "A" es vacía?
  • Sustituimos i por 1
  • La celda 1+1, "¿A" es vacía?
  • La celda 2, "¿A" es vacía?
  • La celda 2, "A" SÍ es vacía, entonces el ciclo termina, recuerdas lo que te comenté: el ciclo se iba a repetir hasta encontrar una celda vacía, pues ya encontró la celda vacía y por eso el ciclo terminó; y ya no se ejecutó la siguiente instrucción.

De una vez te explico, por qué la primera macro si funciona, el mismo escenario, la celda A2 está vacía:

Empieza la macro:

i = 0
  • Esta instrucción, repite el ciclo hasta que la celda i+1 sea vacía:
Do Until IsEmpty(Cells(i + 1, 1)) = True
  • La celda i + 1, "A" es vacía?
  • Sustituimos i por 0
  • La celda 0+1, "A" es vacía?
  • La celda 1, "A" no es vacía, entonces el ciclo continua, recuerda que el ciclo se va a repetir hasta que la celda sea vacía.
  • Ahora, incrementas el contador
i = i + 1
  • sustituimos:
  • i = 0 +1
  • i = 1 (esto es importante, ahora i = 1)
  • Ahora preguntas (otra vez):
If IsEmpty(Cells(i + 1, 1)) = True Then
  • La celda i+1, "A" es vacía?
  • La celda 1+1, "A" es vacía?
  • La celda 2, "A" es vacía? 
  • La celda 2, "A"  es vacía, entonces Sí entra al IF
Cells(i + 1, 1).Value = “test”
  • celda i + 1, "A" = "test"
  • celda 1 + 1, "A" = test"
  • celda 2, "A" = test

Es por eso que en la primer macro si te pone la palabra "test" y en la segunda macro no te la pone.


Ahora, revisando la macro, personalmente no me gusta ese método de encontrar la última celda con datos y por su puesto la siguiente celda será la celda vacía.

La que más utilizo para encontrar la última celda con datos

u = range("A" & rows.count).end(xlup).row

Lo que hace es, en la columna "A" del total de registros (rows.count) que existen en la hoja, de abajo (end) hacia arriba (xlup) obtener el número de fila (row).

Es lo que podrías hacer manualmente si te vas a la última fila de la hoja, si tienes excel 2007 sería la celda A1048576, después presionas la tecla "Fin" y después la tecla "Flecha hacia arriba"; lo que hace excel es posicionar en la primer celda que se encuentra en su paso, es decir la última celda con datos.

Luego entonces si le sumas un 1 a la instrucción tendrás la celda que está vacía y entonces ahí pondrías tu palabra "test".

    u = Range("A" & Rows.Count).End(xlUp).Row + 1
    Cells(u, "A") = "test"

Ahora, en ciertos casos hay que buscar de arriba hacia abajo la primera celda vacía, entonces podrías ocupar la macro de esta forma:

Sub macroEjemplo()
'Por.Dante Amor
    i = 1
    Do Until Cells(i, "A") = Empty
        i = i + 1
    Loop
    Cells(i, "A").Value = "test"
End Sub
  • Como ya sabemos que la primera fila es 1, entonces empezamos el contador en 1, no en 0. 
  • Hacemos el ciclo hasta que la celda sea vacía, aquí controlamos cuando es vacía, por lo tanto, ya no es necesario preguntar otra vez si la celda está vacía.
  • Incrementamos el contador.
  • Cuando el ciclo termina es porque ya encontró la celda vacía, entonces ya tenemos en la variable i el número de fila.
  • Entonces escribimos en cells(i, "A") = "test"

Otra recomendación, en la propiedad de cells(fila, columna), en la columna, puedes poner el número o la letra de la columna, entonces para hacerlo más práctico y saber en cuál columna estás escribiendo o leyendo, te recomiendo que pongas la letra:

Cells(i, 1) = cells(i, "A")


Espero que te sea de utilidad la explicación.


':)
':)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas