Modificar Parpadeo dependiendo de lo diga la Celda

Luis, estaba practicando con una de tus respuestas de parpadeo y el código lo he modificado, pero necesito saber como hago para que los resultados que hay en la Columna 03:O1000, solamente me parpadee las que tienen estas respuestas y me cambie de colores según los días que faltan para vencimiento de términos o si se esta venciendo hoy.

'''Esta PETICIÓN se está Venciendo HOY
'''Faltan : 1 DÍAS para el VENCIMIENTO DE TERMINOS
'''Faltan : 2 DÍAS para el VENCIMIENTO DE TERMINOS
'''Faltan : 3 DÍAS para el VENCIMIENTO DE TERMINOS

Modifique un poco con la escasa sabiduría que tengo en excel, pero me Parpadea toda la Columna...

De antemano muy agradecido por tus respuestas atte, Andres.(Este es el código:

Sub nuevo()
'por luismondelo
If Range("O3").Value = ("Esta PETICIÓN se está Venciendo HOY") Then '''Or Range("b3").Value = "" Then
If Range("O3:O100").Interior.ColorIndex = 46 Then
Range("O3:O100").Interior.ColorIndex = 6
Else

Range("O3:O100").Interior.ColorIndex = 46

End If
End If
Application.OnTime Now + TimeValue("00:00:01"), "nuevo", , True
End Sub

...

2 Respuestas

Respuesta
2

El método Application. OnTime es útil, como todo en programación, pero tiene un defecto que se comentan hace años en el mundo del Excel: Es probablemente de lo más inestable del VBA. Ah, y más aún cuando se le usa en ciclos repetitivos.

Por cierto, lo idóneo es detener sus ciclos haciendo uso de su parámetro "Schedule" dándole un valor de "False". Algo así:

Application.OnTime EarliestTime:=Now + TimeValue("00:00:01"), _
    Procedure:="Nuevo", Schedule:=False

Claro, con eso de la "inestabilidad", y sobre todo si tienen más libros/archivos abiertos, probablemente noten un parpadeo continuo a pesar de, teóricamente, haber detenido el método o incluso, quizá, al cerrar algún libro/archivo, se vuelva a abrir.

¿Cómo evitamos todo eso?

La sugerencia, en este tipo de casos es recurrir a una función de la API de Windos: Sleep

¿Qué hace "Sleep"? Suspende la ejecución de un procedimiento hasta que transcurra el intervalo de tiempo de espera que le hemos dado. Dicho tiempo se mide en milisegundos.

Un ejemplo muy simple al respecto:

Option Explicit
#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 Parpadeo()
Dim x As Integer
For x = 1 To 25
Range("A1").Interior.ColorIndex = x
DoEvents
Sleep 300
Next x
End Sub

Pör supuesto que podemos usarlo con condicionales (IF - THEN, CASE - SELECT, etc.) o como querramos, es cuestión de adaptarlo a nuestras necesidades.

Si me queda una gran duda ¿quieres el "parpadeo" activandolo tú o tu idea es que se active automáticamente? De ser lo segundo, debes usar algún evento de tu hoja basado en algún criterio de, quizá, una celda que vaya cambiando

Comentas

Abraham Valencia

¡Gracias!  Abraham, mil gracias hermano, por haber estado pendiente y guiarme... muy agradecido y que Dios te Bendiga y estoy pendiente del foro. Gracias.

De nada estimado, felices fiestas.

Abraham Valencia

Respuesta
2

Me voy a tomar el atrevimiento de contestar, ya que hace un tiempo no contesta Luis.

Te anexo la macro actualizada

Sub nuevo()
'por luismondelo
'Act.Por.Dante Amor
    'If Range("P1") <> "" Then Exit Sub
    '
    For i = 3 To 100
        actual = Cells(i, "O").Interior.ColorIndex
        Select Case Cells(i, "O")
            Case "Esta PETICIÓN se está Venciendo HOY":             wcolor = 6
            Case "Faltan : 1 DÍAS para el VENCIMIENTO DE TERMINOS": wcolor = 5
            Case "Faltan : 2 DÍAS para el VENCIMIENTO DE TERMINOS": wcolor = 4
            Case "Faltan : 3 DÍAS para el VENCIMIENTO DE TERMINOS": wcolor = 3
            Case Else: wcolor = 46
        End Select
        If actual <> wcolor Then
            Cells(i, "O").Interior.ColorIndex = wcolor
        Else
            Cells(i, "O").Interior.ColorIndex = 46
        End If
    Next
    Application.OnTime Now + TimeValue("00:00:02"), "nuevo", , True
End Sub

Tienes que realizar los siguientes ajustes:

- Si quieres que la macro se detenga, habilita la línea de la macro y cambia "P1" por la celda que desees, solamente escribe un dato en dicha celda y la macro se detendrá.

    'If Range("P1") <> "" Then Exit Sub

- Cambia 5,4,3 por los colores que desees según el texto

- Cambia "00:00:02" por 01 si quieres que el parpadeo se más rápido.

- Antes de ejecutar la macro cambia toda la columna a un solo color. Puedes utilizar lo siguiente:

Sub cambia_color()
    Range("O3:O100").Interior.ColorIndex = 46
End Sub

Listo, ejecuta la macro para que veas los parpadeos de los diferentes colores.


.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

¡Gracias!  !Excelente...¡ eso era lo que estaba buscando, mil gracias hermano y que Dios te Bendiga...

Una ultima cosa como hacer para para la macro, tengo esto pero no funciona correctamente 

Sub FinalParpadeo(): On Error Resume Next
Application.OnTime Now + TimeValue("00:00:03"), "nuevo", Schedule:=False
End Sub

La línea para detener la macro es correcta. El truco es lo siguiente:

Para detener la macro que inició con Application. OnTime se debe detener con la misma hora con la que inició. Para ello vamos a ocupar una variable global "Ahora".

El código quedaría así:

Dim Ahora
'
Sub nuevo()
'por luismondelo
'Act.Por.Dante Amor
    'If Range("P1") <> "" Then Exit Sub
    '
    For i = 3 To 100
        actual = Cells(i, "O").Interior.ColorIndex
        Select Case Cells(i, "O")
            Case "Esta PETICIÓN se está Venciendo HOY":             wcolor = 6
            Case "Faltan : 1 DÍAS para el VENCIMIENTO DE TERMINOS": wcolor = 5
            Case "Faltan : 2 DÍAS para el VENCIMIENTO DE TERMINOS": wcolor = 4
            Case "Faltan : 3 DÍAS para el VENCIMIENTO DE TERMINOS": wcolor = 3
            Case Else: wcolor = 46
        End Select
        If actual <> wcolor Then
            Cells(i, "O").Interior.ColorIndex = wcolor
        Else
            Cells(i, "O").Interior.ColorIndex = 46
        End If
    Next
    Ahora = Now
    Application.OnTime Ahora + TimeValue("00:00:02"), "nuevo", , True
End Sub
'
Sub FinalParpadeo()
    On Error Resume Next
    Application.OnTime Ahora + TimeValue("00:00:02"), "nuevo", Schedule:=False
End Sub

Entonces, cuando inicia la ejecución, se almacena en la variable Ahora la fecha y hora, por ejemplo: 21/12/2017 12:34:15

Si decides detener la macro, después de un minuto o una hora, se va a detener con el contenido de la variable Ahora que es : 21/12/2017 12:34:15

Anteriormente sucedía esto, iniciabas la macro con 21/12/2017 12:34:15, pasado un minuto o más lo detienes con 21/12/2017 12:47:39, ahí te envía el error.


Al final de mi respuesta hay dos opciones para valorar la respuesta: "Votar" y "Excelente", si no tienes más dudas, apreciaría que cambiaras la valoración. Sal u dos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas