vba eliminar filas en function de múltiples criterios: al código le faltan algunos de los criterios

Tengo un código vba que elimina filas según múltiples criterios. Funciona muy bien y me gusta lo breve y simple que es el código. Sin embargo, he notado que de alguna manera falla algunas de las celdas que contienen los criterios. Normalmente, solo tres o más de los criterios enumerados me gustaría eliminar. ¿Alguna pista de por qué esto puede estar pasando?

Aquí está el código:

Sub DeleteMyRows() Dim Rng As Range, Cell As Range Set Rng = Range(Range("B2"), Range("B" & Rows.Count).End(xlUp)) With Application .ScreenUpdating = False .EnableEvents = False For Each Cell In Rng If Cell = "ADD" Or Cell = "ANFR" Or Cell = "CADV" Or Cell = "DEF" Or Cell = "DEFD" Or Cell = "OIL" Or Cell = "PROP" Or Cell = "STAX" Or Cell = "UREA" Or Cell = "WWFL" Or Cell = "NGAS" Then Cell.EntireRow.Delete End If Next Cell End With End Sub 

¡Gracias!

[Respuesta tomada de una pregunta anterior aquí: IF-THEN con strings en VBA ]

¿Qué tan "idénticas" son las dos strings? ¿Está uno en mayúscula y el otro no? ¿Tiene uno los ceros al principio / al final? ¿Uno tiene caracteres no imprimibles?

Pruebe esto, que convierte a Cell en CleanedCell antes de usarlo como comparación:

 CleanedCell = AllCleanedUp(Cell) If CleanedCell = "ADD" Or CleanedCell = "ANFR" Or CleanedCell = "CADV" Or CleanedCell = "DEF" Or CleanedCell = "DEFD" Or CleanedCell = "OIL" Or CleanedCell = "PROP" Or CleanedCell = "STAX" Or CleanedCell = "UREA" Or CleanedCell = "WWFL" Or CleanedCell = "NGAS" Then Cell.EntireRow.Delete End If 

Lo cual se refiere a la siguiente function:

 Function AllCleanedUp (DirtyString byVal) As String AllCleanedUp = Trim(Application.Clean(Ucase(DirtyString))) End Function 

puede ser que los valores en Cell estén en un caso diferente o tengan espacios iniciales o finales. (A menudo encuentro este problema en datos de input manual)

Intenta usar:

 If UCase(Trim(Cell.Value)) = "ADD" Or UCase(Trim(Cell.Value)) = "ANFR" Or ....... Then 

Podría ser una de las otras respuestas, pero creo que el problema es que cuando eliminas una fila, "celda" se convierte en la siguiente y luego presionas "siguiente" y omites esta fila por completo. Por ejemplo, si lo hace:

 Sub test() Dim cell For Each cell In Range("A1", "A10") cell.EntireRow.Delete Next cell End Sub 

Solo eliminará las filas 1,3,5,7,9

Debería realizar un bucle en reversa, que por lo que yo sé no es posible con un ciclo para cada celda en el range (…), pero se puede hacer al iterar sobre los numbers de la siguiente manera:

 for i=cells(rows.count,"B").end(xlup).row to 2 step -1 If Cells(i,"B") = "ADD" Or Cells(i,"B") = "ANFR" Or Cells(i,"B") = "CADV" Or Cells(i,"B") = "DEF" Or Cells(i,"B") = "DEFD" Or Cells(i,"B") = "OIL" Or Cells(i,"B") = "PROP" Or Cells(i,"B") = "STAX" Or Cells(i,"B") = "UREA" Or Cells(i,"B") = "WWFL" Or Cells(i,"B") = "NGAS" Then Cell.EntireRow.Delete End If next i 

me gusta hacer :

 If Cell LIKE "*ADD*" Or Cell LIKE "*ANFR*" Or Cell LIKE "*CADV*" Or Cell LIKE "*DEF*" Or Cell LIKE "*DEFD*" Or Cell LIKE "*OIL*" Or Cell LIKE "*PROP*" Or Cell LIKE "*STAX*" Or Cell LIKE "*UREA*" Or Cell LIKE "*WWFL*" Or Cell LIKE "*NGAS*" Then Cell.EntireRow.Delete End If 

la estrella (*) significa cualquier letra, número, espacio … puede ser anterior o posterior (en mi ejemplo) a tus valores dados.

  • este es un caso insensible, ¡es por eso que me gusta!

Espero que esto ayude.