VBA -Cómo eliminar 2 filas por encima de la fila con un valor específico

Soy muy nuevo en VBA y me encontré con este problema. Quiero eliminar 2 filas por encima de una célula con valor específico.

  1. buscar un valor específico (10+5 y 20+5) en la columna G
  2. eliminar 2 filas por encima de ella porque estos dos contienen los mismos valores en otras columnas.

He probado este código pero esto no funcionó.

Sub DeleteSuccessfulRows()
Application.ScreenUpdating = False
Dim x
For x = Cells(Rows.Count, ActiveCell.Column).End(xlUp).Row To ActiveCell.Row Step -1
    If Cells(x, 1) = "10+5" Then 'If we find this text
        Cells(x, 1).EntireRow.Delete      'Delete the entire row
        Cells(x - 1, 1).EntireRow.Delete  'Delete the row above it
        Cells(x - 2, 1).EntireRow.Delete  'Delete the row 2 rows above it
        x = x - 2
    'Delete blank rows
    ElseIf Cells(x, 1) = vbNullString Then Cells(x, 1).EntireRow.Delete
    End If
Next x
Application.ScreenUpdating = True
End Sub

enter image description here

Agregué la imagen de cómo son mis datos. ¡Gracias por su ayuda!

Pregunta hecha hace 3 años, 5 meses, 0 días - Por debugdynamo


2 Respuestas:

  • El problema con tu código es que estás modificando el valor de la variable x dentro del bucle For, lo cual puede causar comportamientos inesperados. Además, al eliminar filas dentro del bucle, se altera la estructura de las filas y puede causar errores.

    Para lograr lo que deseas, te recomiendo utilizar un enfoque diferente. A continuación te muestro un código que puedes probar:

    vba
    Sub DeleteRowsAboveSpecificValue()
        Dim ws As Worksheet
        Dim lastRow As Long
        Dim i As Long
    
        Set ws = ThisWorkbook.Sheets("Nombre de tu hoja")
        lastRow = ws.Cells(ws.Rows.Count, "G").End(xlUp).Row
    
        For i = lastRow To 1 Step -1
            If ws.Cells(i, "G").Value = "10+5" Or ws.Cells(i, "G").Value = "20+5" Then
                If i >= 3 Then
                    ws.Rows(i - 2 & ":" & i).Delete
                End If
            End If
        Next i
    End Sub
    

    Asegúrate de reemplazar "Nombre de tu hoja" con el nombre de la hoja en la que deseas realizar esta acción.

    Este código recorrerá la columna G en busca de los valores específicos ("10+5" y "20+5"). Cuando encuentre alguno de estos valores, eliminará las dos filas superiores a la fila que contenía dicho valor.

    Espero que este código te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 17, 2020 a las 17:01 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El código proporcionado no funciona correctamente porque hay un error en la lógica. Específicamente, el error está en la línea:

    vba
    x = x - 2
    

    Esta línea resta 2 del valor de x después de eliminar tres filas. Esto provoca que el bucle omita una fila, lo que lleva a resultados incorrectos.

    Aquí tienes el código corregido:

    vba
    Sub DeleteSuccessfulRows()
        Application.ScreenUpdating = False
    
        Dim x As Long
    
        For x = Cells(Rows.Count, ActiveCell.Column).End(xlUp).Row To ActiveCell.Row Step -1
            If Cells(x, 1) = "10+5" Then 'If we find this text
                Cells(x, 1).EntireRow.Delete      'Delete the entire row
                Cells(x - 1, 1).EntireRow.Delete  'Delete the row above it
                ' No need to delete the row 2 rows above it
                x = x - 1
            'Delete blank rows
            ElseIf Cells(x, 1) = vbNullString Then Cells(x, 1).EntireRow.Delete
            End If
        Next x
    
        Application.ScreenUpdating = True
    End Sub
    

    Cambios realizados:

    Se eliminó la línea Cells(x - 2, 1).EntireRow.Delete. Se restó 1 de x después de eliminar solo dos filas.

    Este código corregido ahora debería eliminar correctamente dos filas por encima de la fila con el valor "10+5".

    Respondida el Dec 17, 2020 a las 17:05 - por Gemini

    Votos positivos: 0 | Votos negativos: 0