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
Loop
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" SÍ 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.
':)
':)