# =AYUDA=COMO ELIMINAR



## yra_vj (Mar 29, 2007)

Hola que tal
Estoy tratando de hacer una macro que elimine filas completas atraves de una condicion, solo que en mi lista existen filas vacias, y no me doy idea de como hacer para que solo borre las filas que no necesito, les mostrare un ejemplo de como esta mi informacion:

<table border="1" bordercolor="#C0C0C0"  bordercolordark="#FFFFFF" cellspacing="0" >   <tr valign="top">     <th width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>Tipo</nobr></font></th>     <th width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>Cantidad</nobr></font></th>     <th width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>Precio</nobr></font></th>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>ENB</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>456900</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>809777</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>ENB</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>567</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>5000</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>KG</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>34</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>456</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>PZA</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>567</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>56789</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr></nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr></nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr></nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>ENB</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>678</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>678900</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>PZA</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>777</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>89770</nobr></font></td>   </tr></table>

Yo solo quiero quedarme con todo lo que sea = a ENB, lo demas no me sirve, este es el codigo que estoy usando, pero no me doy idea de como saltarme las filas para que continue borrando lo que no me sirve:

```
Sub Eliminar()
  ActiveCell.Offset(1, 0).Range("A1").Select
    While ActiveCell.Value <> ""
        If ActiveCell.Value = "PZA" Or "KG" Then
           Selection.Delete Shift:=xlUp
        Else
          ActiveCell.Offset(1, 0).Range("A1").Select
        End If
    Wend
End Sub
```
Porfavor cualquier idea sera muy agradecida!! 

<hr />editado por Greg para poner los datos en una tabla y el VBA dentro de etiquetas de "code"


----------



## Greg Truby (Mar 30, 2007)

Bienvenido a MrExcel.com.  Disculpe que no tengo tiempo para explicar bien qué es lo que hace la rutina que le ofrezco, pero estoy ocupadisimo hoy en el trabajo.  Si puedo, regreso con una explicación de los «por qués» la semana entrante.


```
Sub BorrarNoENB()
    Dim rngCorriente As Range, rngColumna As Range, rngNoENB As Range
    
    Set rngCorriente = Range("A1").CurrentRegion
    Set rngColumna = rngCorriente.Columns(1)
    With rngColumna
        Set rngColumna = .Offset(1).Resize(.Rows.Count - 1)
    End With
    
    rngCorriente.AutoFilter Field:=1, Criteria1:="<>ENB"
    
    Set rngNoENB = Nothing
    On Error Resume Next
    Set rngNoENB = rngColumna.SpecialCells(xlCellTypeVisible)
    If Err.Number <> 0 Then
        rngCorriente.AutoFilter
        Exit Sub
    End If
    
    rngNoENB.ClearContents
    With rngCorriente
        .AutoFilter
        .Sort Key1:=Range("A1"), _
              Order1:=xlAscending, _
              Header:=xlYes, _
              Orientation:=xlTopToBottom
    End With
    rngColumna.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub
```


----------



## Greg Truby (Mar 30, 2007)

¡Uy! Díme... ¿sus datos tienen líneas (filas) completamente blancos/vacios como en su ejemplo?


----------



## yra_vj (Apr 2, 2007)

*Hola otra vez*

Q tal
Gracias por darme la bienvenida a este foro, confio en que poco a poco ire aprendiendo nuevas cosas y espero algun dia porder  retribuir un poco de esta ayuda.
Respecto a tu pregunta en mi informacion  se encuentran filas vacias,tal como mi ejemplo,voy a experimentar usando el codigo que me sugieres, gracias por orientarme un poco....


----------



## yra_vj (Apr 3, 2007)

*=Nuevamente Ayuda=*

He probado el codigo que me has sugerido y funciona, solo que al toparse con una fila vacia ya no me es funcional, de que manera puedo eliminar las filas que se encuentren  vacias y las que contengan datos distintos a ENB??

<hr />
Respuesto directo: Sí, yo sabía que el código arriba fallará c/ filas vacias.  Fue por eso que pregunté.  Vea abajo para la solución. 
~Greg


----------



## Greg Truby (Apr 3, 2007)

Si usted va a tener filas vacias entonces el siguiente le sirvería mejor.  Pero sepa que este agarra *todas las celdas usadas* en la hoja.  Entonces si hay filas que no debe de estar incluidas en el proceso (la cabeza está ignorado) entonces hágame saber para buscar una solución que excluye las filas apropriadas
	
	
	
	
	
	



```
Sub BorrarNoIguales()
    Dim rngCorriente As Range, rngColumna As Range, _
        rngNoENB As Range, rngUltima As Range
    
    Set rngUltima = udfLastCell(ActiveSheet)
    Set rngCorriente = Range(Range("A1"), rngUltima)
    Set rngColumna = rngCorriente.Columns(1)
    With rngColumna
        Set rngColumna = .Offset(1).Resize(.Rows.Count - 1)
    End With
    
    rngCorriente.AutoFilter Field:=1, Criteria1:="<>ENB"
    
    Set rngNoENB = Nothing
    On Error Resume Next
    Set rngNoENB = rngColumna.SpecialCells(xlCellTypeVisible)
    If Err.Number <> 0 Then
        rngCorriente.AutoFilter
        Exit Sub
    End If
    
    rngNoENB.ClearContents
    With rngCorriente
        .AutoFilter
        .Sort Key1:=Range("A1"), _
              Order1:=xlAscending, _
              Header:=xlYes, _
              Orientation:=xlTopToBottom
    End With
    rngColumna.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

Function udfLastCell(ws As Worksheet) As Range
    Dim LastRow&, LastCol%
    LastRow = 1: LastCol = 1
    ' Error-handling is here in case there is not any
    ' data in the worksheet
    On Error Resume Next
    With ws
        ' Find the real last row
        LastRow = .Cells.Find(What:="*", _
            SearchDirection:=xlPrevious, _
            SearchOrder:=xlByRows).Row
        ' Find the real last column
        LastCol = .Cells.Find(What:="*", _
            SearchDirection:=xlPrevious, _
            SearchOrder:=xlByColumns).Column
    End With
    Set udfLastCell = ws.Cells(LastRow, LastCol)
End Function
```

comentario: uno sí puede correr un bucle para hacer esto.  Pero es más rápido usar AutoFilter.  Además uno sí puede usar AutoFilter sencillamente y borrar así, pero si hay mucha filas esto también va a ser muy lento porque las filas para conservar están intercalados (mezclados) con las que quiere suprimir.  Lo más rápido es: 
Usar Autofilter para esconder las filas que uno quiere conservar.
Borrar (clearcontents) *los datos* de las celdas claves.
Apagar Autofilter
Sortear en la columna donde acaba de borrar porque celdas vacias se sortea hacia el final
Borrar las filas que ahora están agrupados al final del bloque


----------



## yra_vj (Apr 5, 2007)

*Gracias*

Gracias por la ayuda brindada, me ha sido muy util,podria sugerirme el titulo de algun libro que pueda ayudarme a adentrarme en el desarrollo de macros en vb?? o inclusive algun link ?
Muchas gracias.


----------



## yra_vj (Apr 10, 2007)

*Modificacion a ayuda sugerida*

He probado el codigo que me sugieres pero por cuestiones de diseño se han  movido de columna mis datos, al ejecutar el codigo antes mencionado efectivamente elimina toodo lo que no sea ENB pero ahora que mis datos estan en otra celda me elimina otros datos que si necesito...que debo de modificarle al codigo que me sugieres para que ahora elimine lo que se encuentra a la izquierda??,es decir toda la fila.


----------



## Greg Truby (Apr 11, 2007)

¿Donde están los datos con el criterio (ENB)? ¿Y cuantas columnas a la izquierda tienen datos?


----------



## yra_vj (Apr 11, 2007)

*Columna D*

La columna donde se encuentra mi criterio(ENB) es la columna D.


----------



## yra_vj (Mar 29, 2007)

Hola que tal
Estoy tratando de hacer una macro que elimine filas completas atraves de una condicion, solo que en mi lista existen filas vacias, y no me doy idea de como hacer para que solo borre las filas que no necesito, les mostrare un ejemplo de como esta mi informacion:

<table border="1" bordercolor="#C0C0C0"  bordercolordark="#FFFFFF" cellspacing="0" >   <tr valign="top">     <th width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>Tipo</nobr></font></th>     <th width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>Cantidad</nobr></font></th>     <th width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>Precio</nobr></font></th>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>ENB</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>456900</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>809777</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>ENB</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>567</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>5000</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>KG</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>34</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>456</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>PZA</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>567</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>56789</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr></nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr></nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr></nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>ENB</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>678</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>678900</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>PZA</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>777</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>89770</nobr></font></td>   </tr></table>

Yo solo quiero quedarme con todo lo que sea = a ENB, lo demas no me sirve, este es el codigo que estoy usando, pero no me doy idea de como saltarme las filas para que continue borrando lo que no me sirve:

```
Sub Eliminar()
  ActiveCell.Offset(1, 0).Range("A1").Select
    While ActiveCell.Value <> ""
        If ActiveCell.Value = "PZA" Or "KG" Then
           Selection.Delete Shift:=xlUp
        Else
          ActiveCell.Offset(1, 0).Range("A1").Select
        End If
    Wend
End Sub
```
Porfavor cualquier idea sera muy agradecida!! 

<hr />editado por Greg para poner los datos en una tabla y el VBA dentro de etiquetas de "code"


----------



## yra_vj (Apr 11, 2007)

mis datos ahora estan asi:

 <table border="1" bordercolor="#C0C0C0"  bordercolordark="#FFFFFF" cellspacing="0" align="left">   <tr valign="top">     <th width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>No.</nobr></font></th>     <th width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>Cantidad</nobr></font></th>     <th width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>Precio</nobr></font></th>     <th width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>Tipo</nobr></font></th>   </tr>   <tr valign="top">     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>1</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>456900</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>809777</nobr></font></td>     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>ENB</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>2</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>567</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>5000</nobr></font></td>     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>ENB</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>3</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>34</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>456</nobr></font></td>     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>KG</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>4</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>567</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>56789</nobr></font></td>     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>PZA</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr></nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr></nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr></nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr></nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>5</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>678</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>678900</nobr></font></td>     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>ENB</nobr></font></td>   </tr>   <tr valign="top">     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>6</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>777</nobr></font></td>     <td width="63" height="21" align="right" valign="bottom"><font face="Monospace" size="1"><nobr>89770</nobr></font></td>     <td width="63" height="21" valign="bottom"><font face="Monospace" size="1"><nobr>PZA</nobr></font></td>   </tr></table>


----------



## Greg Truby (Apr 12, 2007)

Tiene que cambiar la línea
	
	
	
	
	
	



```
rngCorriente.AutoFilter Field:=1, Criteria1:="<>ENB"
```
a
	
	
	
	
	
	



```
rngCorriente.AutoFilter Field:=4, Criteria1:="<>ENB"
```
y la línea
	
	
	
	
	
	



```
.Sort Key1:=Range("A1"), _
```
a
	
	
	
	
	
	



```
.Sort Key1:=Range("D1"), _
```
Entonces al final se ve asi:
	
	
	
	
	
	



```
Sub BorrarNoIguales()
    Dim rngCorriente As Range, rngColumna As Range, _
        rngNoENB As Range, rngUltima As Range
    
    Set rngUltima = udfLastCell(ActiveSheet)
    Set rngCorriente = Range(Range("A1"), rngUltima)
    Set rngColumna = rngCorriente.Columns(1)
    With rngColumna
        Set rngColumna = .Offset(1).Resize(.Rows.Count - 1)
    End With
    
    rngCorriente.AutoFilter Field:=4, Criteria1:="<>ENB"
    
    Set rngNoENB = Nothing
    On Error Resume Next
    Set rngNoENB = rngColumna.SpecialCells(xlCellTypeVisible)
    If Err.Number <> 0 Then
        rngCorriente.AutoFilter
        Exit Sub
    End If
    
    rngNoENB.ClearContents
    With rngCorriente
        .AutoFilter
        .Sort Key1:=Range("D1"), _
              Order1:=xlAscending, _
              Header:=xlYes, _
              Orientation:=xlTopToBottom
    End With
    rngColumna.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

Function udfLastCell(ws As Worksheet) As Range
    Dim LastRow&, LastCol%
    LastRow = 1: LastCol = 1
    ' Error-handling is here in case there is not any
    ' data in the worksheet
    On Error Resume Next
    With ws
        ' Find the real last row
        LastRow = .Cells.Find(What:="*", _
            SearchDirection:=xlPrevious, _
            SearchOrder:=xlByRows).Row
        ' Find the real last column
        LastCol = .Cells.Find(What:="*", _
            SearchDirection:=xlPrevious, _
            SearchOrder:=xlByColumns).Column
    End With
    Set udfLastCell = ws.Cells(LastRow, LastCol)
End Function
```


----------



## yra_vj (Apr 20, 2007)

*GRACIAS!!*

 Muchas gracias, esto resuelve mi problema, ahora solo voy a complementar esta macro con unas fomrulas, muchas gracias por la ayuda!!


----------

