Botón en userform para detener bucle (Excel)

Tengo una macro que hace un efecto internitente en un label:

Dim n As Integer
Dim m As Integer
c = 0
Repetir:
For i = 1 To 2000
VBA.DoEvents
Next i
c = c + 1
If c = 1 Then Controls("Label" & X).BackColor = vbYellow
If c = 2 Then Controls("Label" & X).BackColor = vbRed
If c = 3 Then Controls("Label" & X).BackColor = &HFF00&
If c > 3 Then c = 0
GoTo Repetir

Pero ahora necesito un botón con una instrucción que detenga este bucle en cualquier momento. Po r favor su ayuda.

2 Respuestas

Respuesta
1

El CommandButton1 es para hacer intermitente el Label.

El CommandButton2 es para detener.

Puedes presionar nuevamente el CommandButton1, para iniciar la intermitencia.


Nota: No pusiste completo tu código, así que no sé cuál valor de "x", en el código puse

x=1

Dato curioso, en tu código tienes declaradas las variables n y m, pero no las utilizas, en cambio utilizas las variables c, i, x, pero no las declaraste.


Prueba lo siguiente, debes copiar todo el código.


La declaración de la variable "detener" debe ir al inicio de todo el código.

Dim detener As Boolean
Private Sub CommandButton1_Click()
  Dim c As Long, i As Long, x As Long
  x = 1
  c = 0
  If detener Then detener = False
  Do While detener = False
    For i = 1 To 5000
      VBA.DoEvents
    Next i
    c = c + 1
    If c = 1 Then Controls("Label" & x).BackColor = vbYellow
    If c = 2 Then Controls("Label" & x).BackColor = vbRed
    If c = 3 Then Controls("Label" & x).BackColor = &HFF00&
    If c > 3 Then c = 0
  Loop
End Sub
Private Sub CommandButton2_Click()
  detener = True
End Sub

Hola Dante, la macro recorre los label del 2 al 76 y cuando encuentra al que coincida con el caption del Label1 entonces lo pone intermitente. El asunto es que no puedo detenerlo con los ajustes que me has indicado. Creo que tiene que ver con el Next al final.

Dim c As Long, m As Long, x As Long
For x = 2 To 76
If Controls("Label" & x) = Label1 Then
c = 0
If detener Then detener = False
Do While detener = False
For m = 1 To 5000
VBA.DoEvents
Next m
c = c + 1
If c = 1 Then Controls("Label" & x).BackColor = vbYellow
If c = 2 Then Controls("Label" & x).BackColor = vbRed
If c = 3 Then Controls("Label" & x).BackColor = &HFF00&
If c > 3 Then c = 0
Loop
End If
Next

Puedes poner todo tu código.

Para insertar el código aquí en el foro, utiliza el icono para insertar código.

Este es el código:

Private Sub CommandButton1_Click()
Dim u As Long, i As Long
uf = Range("A100").End(xlUp).Row
  For i = 2 To uf
    Label1 = Sheets("Bingo").Cells(i, 2)
    Sleep (50)
    DoEvents
  Next
Num = WorksheetFunction.RandBetween(1, uf)
Label1 = Application.VLookup(Num, Range("A1:B100"), 2, 0)
ub = WorksheetFunction.Match(Num, Range("A:A"), 0)
Cells(ub, 1).EntireRow.Delete
If detener Then detener = False
'*****Pone el fondo intermitente del label encontrado*********
Dim c As Long, m As Long, x As Long
For x = 2 To 76
If Controls("Label" & x) = Label1 Then
  c = 0
  Do While detener = False
    For m = 1 To 5000
      VBA.DoEvents
    Next m
    c = c + 1
    If c = 1 Then Controls("Label" & x).BackColor = vbYellow
    If c = 2 Then Controls("Label" & x).BackColor = vbRed
    If c = 3 Then Controls("Label" & x).BackColor = &HFF00&
    If c > 3 Then c = 0
  Loop
End If
Next
End Sub

Por favor me ayudas. 

La declaración de la variable "detener" debe ir al inicio de todo el código.

Te falta poner esta variable al inicio de todo el código:

No pusiste todo el código completo.

También te faltó esto:

Private Sub CommandButton2_Click()
  detener = True
End Sub

Necesito que pongas todo el código.

Respuesta
1

De Excel no tengo ni idea pero quizá te pueda servir de inspiración. Dices que estás en un formulario. Pues si tengo un formulario, donde tengo una etiqueta que de momento tiene el fondo en blanco, un cuadro de texto llamado C(que estaría oculto) que lo pongo para que veas como va contando y dos botones( dices que tienes dos)

Cuando pulso el botón Iniciar, empieza a contar y cuando C vale 1

Cuando C vale 2

Cuando C vale 3

Y cuando C vale 4, vuelve a 0

Y si pulso el botón de Parar, se queda donde estuviera, hasta que volviera a pulsar el botón de Iniciar

El código del botón Iniciar( que supongo que tendrás que ponerlo en una macro) es

Private Sub Iniciar_Click()
Me.TimerInterval = 2000
End Sub

El código del botón Parar es

Private Sub Parar_Click()
Me.TimerInterval = 0
End Sub

Y el código del evento Al cronómetro es

Private Sub Form_Timer()
C = Nz([C]) + 1
If C = 1 Then
L1.BackColor = vbRed
ElseIf C = 2 Then
L1.BackColor = vbGreen
ElseIf C = 3 Then
L1.BackColor = vbBlue
ElseIf C = 4 Then
C = 0
L1.BackColor = vbWhite
End If
End Sub

Yo le he puesto que el fondo de la etiqueta cambie cada dos segundos, pero tu puedes ponerle el tiempo que quieras.

De todas formas, te insisto en que el Excel no es lo mío. Para eso están los maestros Dante y Elsa.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas