EXCEL 2010 VBA problema para ejecutar varias veces el select case en una misma fila de datos dispares

Aunque no sé casi nada de macros, estoy intentando cambiar del if/then a selectcase pero no logro que se repita más de una vez. Supongo que en el do until tengo un error. Nuevamente agradezco su paciencia y su tiempo para compartir. Gracias.

El ejemplo sería una lista de letras en la columna a:

Así es como está escrita mi macro:

' Macro1 Macro
'
Sheets("Hoja1").Select
Range("a2").Select
Select Case ActiveCell.Value
Case "A", "B"
ActiveCell.Select
Selection.Copy
Sheets("Hoja2").Select
Range("a1").Select
ActiveSheet.Paste
Case Else
MsgBox "hay escenarios no contemplados"
End Select
Do Until ActiveCell.Row = lastrow + 1
Loop
End Sub

1 respuesta

Respuesta
2

Estas utilizando uno de las tantos bucles posibles: Do Until....Loop

Pero como todo 'bucle' las instrucciones que deben repetirse deben ir 'dentro' del bucle.

En la página 6 de la sección Macros de mi sitio encontrarás varios ejemplos para adaptar a tu caso.

Si luego necesitas algún ajuste escribirme la macro nuevamente. Aclara si la col A tiene fórmulas o podemos considerar que una celda vacía indica fin de rango.

Gracias nuevamente. Leí lo que indicas y encontré una solución menos sencilla pero que funcionó perfecto, no entiendo muy bien porque se requieren las dos últimas líneas pero si las quito se queda dando ciclos sin fin, pero con ellas funcionó. Gracias

Sub Macro1()
'
' Macro1 Macro
'
Sheets("Hoja1").Select
Range("a2").Select
Do While ActiveCell <> ""
If ActiveCell <> "A" And ActiveCell <> "B"  Then
MsgBox ("Falta Considerar algún escenario")
End If
Sheets("Hoja1").Select
ActiveCell.Offset(1, 0).Select
Loop
'
End Sub

Es que los 'bucles' necesitan un inicio y cierre:

For each.... Next

Do......Loop While

Do While......Loop 

Y así con todos los tipos de bucles.

Te dejo tu macro explicada para que sepas qué se ejecuta en cada línea y observes que hay una instrucción totalmente innecesaria.

Sub Macro1()
'
' Macro1 Macro
'
Sheets("Hoja1").Select
Range("a2").Select
'se recorre la col A hasta encontrar una celda vacía.
Do While ActiveCell <> ""
    If ActiveCell <> "A" And ActiveCell <> "B" Then
        MsgBox ("Falta Considerar algún escenario")
    End If
        'Sheets("Hoja1").Select 'no hace falta volver a seleccionar ya que nunca te moviste de la Hoja1
   'se pasa a la fila siguiente para repetir el bucle de compararación
    ActiveCell.Offset(1, 0).Select
'esto 'cierra' el bucle
Loop
'
End Sub

En este modelo que elegiste, al encontrar una NO coincidencia envía un mensaje y sigue con el resto de las filas. Entonces supongamos que en 3 filas no se encuentre ni A ni B te enviará 3 veces el mensaje hasta finalizar.

Si lo que intentas es que se 'detenga' en la primer ocurrencia, por ej en fila 7 se observa G y luego de enviarte el mensaje querés que ya no recorra el resto, tenés que cerrar el bucle con un EXIT DO.

Te dejo la segunda versión donde además le agregué el nro de fila donde se detuvo.

Sub Macro1()
'ajustada x Elsamatilde
' Macro1 Macro
'
Sheets("Hoja1").Select
Range("a2").Select
'se recorre la col A hasta encontrar una celda vacía.
Do While ActiveCell <> ""
    If ActiveCell <> "A" And ActiveCell <> "B" Then
        MsgBox ("Falta Considerar algún escenario en fila " & ActiveCell.Row)
        Exit Do
    End If
   'se pasa a la fila siguiente (de la misma hoja) para repetir el bucle de compararación
    ActiveCell.Offset(1, 0).Select
'esto 'cierra' el bucle
Loop
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas