2012-07-23 37 views
6

Estoy tratando de ejecutar una macro que eliminar filas que no contienen un valor particular en la columna B. Aquí está mi código:400 de error de Excel Macro

Sub deleteRows() 
    Dim count As Integer 
    count = Application.WorksheetFunction.CountA(Range("AF:AF")) 
    Dim i As Integer 
    i = 21 
    Do While i <= count 
     If (Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("OSR Platform", Range("B" & i))) = False) Then 
      If (Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("IAM", Range("B" & i))) = False) Then 
       Rows(i).EntireRow.Delete 
       i = i - 1 
       count = count - 1 
      End If 
     End If 
     i = i + 1 
    Loop 
End Sub 

Ahora lo que debería estar haciendo es el siguiente:

1.) encuentra el número de filas para ir a través y establece que a medida que el recuento (esto funciona)

2.) Comience en la fila 21 y busque "Plataforma OSR" y "IAM" en la columna B [este tipo de trabajos (ver a continuación)]

3.) Si no encuentra ninguno, elimine toda la fila y ajuste el recuento y el número de fila según sea necesario (esto funciona)

Por alguna razón, siempre que el código llegue a la primera instrucción If, una ventana de error con aparece una X roja que solo dice "400". Por lo que puedo decir, he escrito todo sintácticamente en voz alta, pero claramente hay algo mal.

+0

No, ese no es el problema. He probado este método con otras condiciones en la declaración If y funciona muy bien. Buena idea, sin embargo. – jrad

+0

@Gaffi - vine aquí para sugerir lo mismo – LittleBobbyTables

+0

Por las dudas, probé lo que Gaffi sugirió (que empiece en la parte inferior de la tabla y gire hacia atrás) y obtuve el mismo error. – jrad

Respuesta

9

Es posible que desee comenzar haciendo un bucle en el otro sentido. Cuando elimina una línea, todas las líneas anteriores se desplazan. Que cuenta para esto, pero un bucle inverso es más simple (para mí de todos modos) de entender que no perder de vista cuando he compensar la posición actual dentro del bucle:

For i = count To 21 Step -1

Además, estás confiar demasiado en Application.WorksheetFunction:

(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("OSR Platform", Range("B" & i))) = False)

a

InStr(Range("B" & i).value, "OSR Platform") > 0

Application.WorksheetFunction toma mucho más poder de procesamiento, y dependiendo de lo que esté tratando de lograr, esto puede llevar una cantidad significativamente mayor de tiempo. También para este cambio sugerido, el tamaño del código se reduce y se vuelve más fácil de leer sin él.

Su count también se puede obtener sin A.WF:

  • Excel 2000/03: count = Range("AF65536").End(xlUp).Row
  • Excel 2007/10: count = Range("AF1048576").End(xlUp).Row
  • versión independiente: count = Range("AF" & Rows.Count).End(xlUp).Row

Una cosa más es que usted puede hacer (y debe hacer en este caso) es combinar sus declaraciones If en una sola.

hacer estos cambios, se termina con:

Sub deleteRows() 
    Dim count As Integer 
    count = Range("AF" & Rows.Count).End(xlUp).Row 
    Dim i As Integer 
    For i = count To 21 Step -1 
     If Len(Range("B" & i).value) > 0 Then 
      If InStr(Range("B" & i).value, "OSR Platform") > 0 Or InStr(Range("B" & i).value, "IAM") > 0 Then 
       Range("B" & i).Interior.Color = RGB(255, 0, 0) 
      End If 
     End If 
    Next i 
End Sub 

Si esto no ayuda, entonces se puede recorrer el código línea por línea. Agregue un punto de interrupción y avance con F8. Resalte las variables en su código, haga clic con el botón derecho, elija "agregar reloj ...", Haga clic en 'Aceptar', (Here's an excellent resource to help you with your debugging in general) y tenga en cuenta lo siguiente:?

  • Qué línea golpea el error
  • ¿Cuál es el valor de i y count cuando esto sucede (añadir un reloj en estas variables a? ayuda)
+0

Tengo un par de comentarios. Primero, ¿no debería el segundo InStr ser 'InStr (" IAM ", Rango (" B "e i) .value) = 0'? En segundo lugar, ¿cuál es el problema de confiar en 'Application.WorksheetFunction'? – jrad

+0

Er, tienes razón sobre el 'InStr', ese fue mi error tipográfico. 'Application.WorksheetFunction' requiere mucho más poder de procesamiento, y dependiendo de lo que esté tratando de lograr, esto puede llevar una cantidad de tiempo significativamente mayor. – Gaffi

+1

Ya veo. Bueno, desafortunadamente, lo que sugirió no funciona, pero sé por qué. Las celdas que contienen o no "Plataforma OSR" e "IAM" se fusionan en unas pocas filas, por lo que no se eliminan todas las filas que necesito eliminar. Intenté evitar esto en lugar de eliminar la fila, cambiando el color de esa celda, así que al menos tengo ALGO por el que pasar. Pero cuando hago 'If InStr (...)> 0 InStr (...)> 0 Then Range (" B "& i) .Interior.Color = 35536', cambia el color de cada celda en lugar de solo los que tienen "Plataforma OSR" o "IAM" como esperaba. ¿Alguna idea de por qué? – jrad

3

Esto funcionó para mí. Se utiliza Autofiltro, no requiere un bucle o funciones de hoja de cálculo.

Sub DeleteRows() 

Dim currentSheet As Excel.Worksheet 
Dim rngfilter As Excel.Range 
Dim lastrow As Long, lastcolumn As Long 

Set currentSheet = ActiveSheet 

' get range 
lastrow = currentSheet.Cells(Excel.Rows.Count, "AF").End(xlUp).Row 
lastcolumn = currentSheet.Cells(1, Excel.Columns.Count).End(xlToLeft).Column 
Set rngfilter = currentSheet.Range("A1", currentSheet.Cells(lastrow, lastcolumn)) 

' filter by column B criteria 
rngfilter.AutoFilter Field:=2, Criteria1:="<>*OSR Platform*", Operator:= _ 
     xlAnd, Criteria2:="<>*IAM*" 

' delete any visible row greater than row 21 which does not meet above criteria 
rngfilter.Offset(21).SpecialCells(xlCellTypeVisible).EntireRow.Delete 

' remove autofilter arrows 
currentSheet.AutoFilterMode = False 
End Sub 

Este código se aplica AutoFilte r a la columna B para ver qué filas no contienen "Plataforma OSR" ni "IAM" en la columna B. Luego, simplemente elimina las filas restantes mayores que 21. Pruébelo primero en una copia de su libro.

Con un gran asentimiento al hilo this OzGrid, porque nunca recuerdo la sintaxis adecuada para seleccionar celdas visibles después de filtrar.

+0

+1 Dado que esto también funciona con las celdas combinadas indicadas por el OP. – Gaffi

+1

@Gaffi LOL ¡No sabía que había células fusionadas! – JimmyPena

Cuestiones relacionadas