Como aplicar restricción o condición a este ciclo

En este momento estoy trabajando en un código que va a recorrer el rango A89:P176 donde hay unas celdas pintadas en amarillo y cada vez que el usuario le de click a un botón "siguiente" la macro deberá ir a la siguiente celda en amarillo y hacerla la celda activa y así sucesivamente (adjuntare el código para que este más claro) el problema es que antes de colocar el ciclo me recorría todas las celdas en amarillo de la hoja y con el ciclo no se para en ninguna celda, las recorre infinitamente hasta que yo pare la macro, por lo que necesito de alguna forma aplicar una condición (Creo que seria "If" también adjuntare una idea de como lo trate de hacer) pero no estoy segura de como darle esa condición, si alguien me pudiera ayudar se lo agradecería mucho
Este en el código, el ciclo lo tengo el comentario pero es el que dice "For Each c In..."

Private Sub cmdnext_Click()
    'Buscar caracteristicas en la celda
    'For Each c In worksheets("RED ALDO"). Range("A89:P176"). Cells
    With Application.FindFormat.Interior
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    'Si encnuentra una celda que cumpla con las caracteristicas la hace celda Activa y avanza a la siguiente
    Cells.Find(What:="", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=True).Activate
End Sub

Y así trate de aplicar la condición, pero no me funciona de esta forma

Private Sub cmdnext_Click()
    'DIM clr AS Long
    'Buscar caracteristicas en la celda
'If clr = vbYellow
    'For Each c In worksheets("RED ALDO").Range("A89:P176").Cells
    With Application.FindFormat.Interior
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
Else 
    Next c
    'Si encnuentra una celda que cumpla con las caracteristicas la hace celda Activa y avanza a la siguiente
    Cells.Find(What:="", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=True).Activate
End Sub
1

1 respuesta

Respuesta
1

[Hola

Si mal o te entendí, y suponiendo que NO quieres comenzar a revisar todo el rango ya que siempre se detendría en la primera celda de color de fondo amarillo, sino que realmente quieres que sea la "siguiente", entonces esto te servirá:

Sub Prueba()
Dim Celda As Range
Dim CeldaActual As String
Dim FilaActiva As Long
Let FilaActiva = ActiveCell.Row
'con esto evitamos que pare si justo la celda activa es de la ultima columna
If ActiveCell.Column = 16 Then 'columna P
Let CeldaActual = Range("A" & FilaActiva + 1).Address
    For Each Celda In Worksheets("RED ALDO").Range(CeldaActual & ":P176")
        If Celda.Interior.Color = 65535 Then
            Celda.Select
            Exit Sub
        End If
    Next Celda
    Exit Sub
Else
Let CeldaActual = ActiveCell.Offset(0, 1).Address
End If
'Revisa fila de la celda activa
For Each Celda In Worksheets("RED ALDO").Range(CeldaActual & ":P" & FilaActiva)
    If Celda.Interior.Color = 65535 Then
        Celda.Select
        Exit Sub
    End If
Next Celda
'revisa todo el rango posterior a la fila de la celda activa
For Each Celda In Worksheets("RED ALDO").Range("A" & FilaActiva + 1 & ":P176")
    If Celda.Interior.Color = 65535 Then
        Celda.Select
        Exit Sub
    End If
Next Celda
End Sub

Saludos]

Abraham Valencia

Hola, muchas gracias por la ayuda, el código hace lo que quiero aunque me gustaría saber si es necesario desaparecer el código 

SearchDirection:=xlNext

Es que ese lo necesito ya que también tengo un botón llamado "Anterior" que es para regresar a la celda anterior, el código de ese botón lo tenía igual al de "Siguiente" solo que en la linea por la cual te pregunto en vez de tenerlo de esa forma, lo tenía

SearchDirection:=xlPrevious

Y sería posible que me explicaras un poco acerca de esa propiedad "Let"

[Hola

En tu código tenías tanto "For Each" como "Find" para intentar buscar y era en el primer caso lo más cercano a lo que tú descripción comentaba por lo que elegí que mi ejemplo sea con dicha instrucción.

Si tú tienes otro botón que usa "Find", no hay problema, puedes seguir usándolo, una macro no afecta a otra en este caso.

Sobre la cláusula "Let", lo que hace es asignar valor a las variables. Inlcuso en VBA al no colocarla se está usando:

Let MiVariable = "Hola"

Es igual a:

MiVariable = "Hola"

Saludos]

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas