¿Cómo haces un bucle con pausa?

Tengo que generar una lista de 30 números, que logre hacerlo viendo ejemplos en algún lugar de este sitio, pero no logro darle la pausa para que los pegue uno a uno, a la velocidad de milisegundos, y aparte como borro el contenido de las celdas cada vez que presiono el botón que ejecuta la macro.

1 respuesta

Respuesta
1

Aquí te dejo el código:

#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
#End If
Sub ListarNumeros()
Range("E1:E30").Value = vbNullString
Dim contador As Integer
For contador = 1 To 30
    Cells(contador, 5).Value = contador
    Sleep (10)
Next contador
End Sub

Aquí te explico como funciona:

Para esperar un tiempo en una macro normalmente se usaría la función Application. Wait(), pero hasta donde sé, esta no permite trabajar con valores menores a 1 segundo. Así que para esperar milisegundos, usamos la función Sleep del sistema y hay que declararla antes. (Esto es un tema más avanzado que aprenderás en el camino)

Para borrar lo que hay escrito he usado la línea: Range("E1:E30").Value = vbNullString otras personas quizas usen . ClearContents pero yo prefiero usar vbNullString (es mas rápido y adecuado para lo que quieres)

Luego el for que ya tienes pero mejorado. No necesitas ir hasta 31 y luego chequear si el contador es 31 y entonces salir; eso es innecesario y mala práctica. Simplemente haces un bucle de 1 a 30 y cuando llega a 30 ahí termina, no hay más nada.

Y luego lo que tanto necesitas. La función Sleep que recibe como parámetro un valor long que representa los milisegundos, 1 segundo = 1000, medio segundo (0.5) = 500 por lo tanto, 1 milisegundo (0.1 segundos) = 10. De ahí la línea Sleep(10)

Andy M.

Andy,  probe con el codigo que me dejaste, y me dio como respuesta este error que te muestro a continuacion.  cuando presione el boton, me pego el uno luego el error este.

Por cierto Andy yo por el poco conocimiento que tengo en este tema de códigos, dije milisegundos, pero no se si existe manera alguna de generar esa misma velocidad pegando los números.

Te agradezco por tu tiempo.

Un saludo.

Ya veo, pues borra lo que esta en rojo, tambien borra el IF, ELSE y END IF. Que te quede de la siguiente manera:

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
Sub ListarNumeros()
Range("E1:E30").Value = vbNullString
Dim contador As Integer
For contador = 1 To 30
    Cells(contador, 5).Value = contador
    Sleep (10)
Next contador
End Sub

Pruebalo y me avisas.

Me Arroja el mismo error (en amarillo la línea sleep)

Hombre, mirando el código en tu imagen veo que no lo has copiado y pegado, tal cual te lo puse. SLeep va con mayúscula, tanto en la declaración como en el llamado. Me has vuelto loco pensando por que es ese error, y creo que es por eso. Prueba, cambia la s por S.

O mejor no cambies nada, simplemente copia y pega lo que te he dado. No se por que has alterado el código. Normalmente los lenguajes de programación son "Case-sensitive" osea que distinguen entre mayúsculas y minúsculas, si bien VBA es benevolente con esto, C++ si que no lo es, y por lo regular los DLL se escriben en C++

Como recomendación, no alteres esos detalles en los códigos que te compartimos por aqui.

Acepto el regaño a ojos cerrados.  No es excusa pero mi pc no está conectada a internet, por lo que me tome el atrevimiento a escribirlo viendo tu código desde mi móvil.

Acabo de corregirlo y función de manera perfecta.

Andy, Discúlpame por enredarte en este mi error.  

Te agradesco.

Un Saludo. 

Jajaja tranquilo, no te juzgo, estamos para ayudar. Cualquier otra duda a la orden.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas