lunes, 26 de septiembre de 2011

Macro para borrar los renglones que no pertenezcan a una categoría que nos interesa

Es muy común que tenemos una base de este tipo:

Nombre   Calificación   Materia
Juan         10                  Química
Juan           8                  Español
Juan           7                  Ciencias Sociales
Pedro         6                  Química
Pedro         6                  Español
Pedro        10                  Ciencias Sociales
Martha      10                  Química
Martha      10                  Español
Martha      10                  Ciencias Sociales
Juana          6                  Química
Juana          7                   Español
Juana          8                  Ciencias Sociales

Es probable que sólo queremos tener las calificaciones de Juan y Juana. Es decir, esto:


Nombre   Calificación   Materia
Juan         10                  Química
Juan           8                  Español
Juan           7                  Ciencias Sociales
Juana          6                  Química
Juana          7                   Español
Juana          8                  Ciencias Sociales

Para ello se puede hacer una macro. Pondremos un ejemplo más complicado. Tenemos un listado de municipios con su clave (en columna A) que son los únicos que queremos que queden en un listado. Queremos que los municipios que no son alguno de ellos, sean borrados.

Es decir, tenemos algo como esto:

Pero no queremos el 15002, por ejemplo. Al final quisieramos que un filtro nos mostrara no esto:


Sino esto:




 Bien, considerando que hay en esta base 190,490 registros, deberíamos almacenar el siqguiente programa:


-------------------------------------

Sub BorraCasosAjenos()
'
' Macro1 Macro
'
For N = 1 To 190490
'

Valor = ActiveCell.Value
'Adelante los casos que SI queremos
'15002
'15011
'15013
'15020
'15023
'15024
'15025
'15028
'15029
'15030
'15031
'15033
'15037
'15039
'15044
'15053
'15057
'15058
'15059
'15060
'15069
'15070
'15081
'15091
'15092
'15093
'15095
'15099
'15100
'15104
'15108
'15109
'15120
'15121
'15122
'15125


Select Case Valor

Case "15002", "15011", "15013", "15020", "15023", "15024", "15025", "15028", "15029", "15030", "15031", "15033", "15037"
Borra = "NO"

Case "15039", "15044", "15053", "15057", "15058", "15059", "15060", "15069", "15070", "15081", "15091", "15092", "15093"
Borra = "NO"

Case "15095", "15099", "15100", 15104, "15108", "15109", "15120", "15121", "15122", "15125"
Borra = "NO"

Case Else
Borra = "SI"

End Select

If Borra = "SI" Then

    Selection.EntireRow.Delete
    Else
    ActiveCell.Offset(1, 0).Range("A1").Select
   
End If
   

Next

End Sub
-----------------------------------------------



Se apreciará que lo que estamos haciendo es muy sencillo,
1. Primero con el for decimos cuantas veces se repetirá todo l oque está entre For y Next, es decir 190490 veces,
2. La instrucción Valor=ActiveCell.Value, almacena en la variable Valor, lo que esté en ese momento en la celda activa (la que parpadea)
3. Select Case Valor, lo que hace es decirle al programa que tomará en cuenta el lo que está contenido en la variable Valor para comparar los siguientes casos y tomar decisiones con respecto a ello.
4.

Case "15002", "15011", "15013", "15020", "15023", "15024", "15025", "15028", "15029", "15030", "15031", "15033", "15037"
Borra = "NO"
Lo que hace es decir que en caso de que valor valga "15002", "15011",...,"15037" entonces una variable llamada Borra va a valer "NO".

Esto de Case se repite para todos los casos que queremos conservar, podrían estár en el mismo Case pero se haría más confuso.

5. Case Else, hace que cualquier otro caso no previsto haga que Borra="SI"

6.

If Borra = "SI" Then

    Selection.EntireRow.Delete
    Else
    ActiveCell.Offset(1, 0).Range("A1").Select
   
End If

Estas instrucciones lo que hacen es que si Valor ocaiona que Borra sea "SI", es decir, si el valor no es de la lista, lo borre. De lo contrario (luego de Else) la celda activa baja a la casilla inferior.

Al terminar tenemos una base con sólo los valores que nos interesan. Es importante señalar que se debe correr la macro a partir de la casilla de la columna que contiene los valores a comparar.

No hay comentarios:

Publicar un comentario