miércoles, 31 de agosto de 2011

Macro en Excel para relleno con referencia superior.

Problema:
A veces tenemos lo que algunos llaman base de datos que más que base de datos es como una carta de esas que uno anda pegando para su familia en el refrigerador. Ese tipo de bases son comunes y suscitan varios problemas a la hora de operarlas. Por ejemplo, la cultura informática limitada de la gente les hace creer que la computadora entiende igual que las personas, entonces si pone un dato en un lugar y ninguno abajo, la computadora va a entender fácilmente que el lugar vacío donde no hay dato, el dato correspondiente es el de arriba.

Aquí hay un ejemplo de la vida real


El autor o autora de la base (no se vaya a ofender si es mujer) es un poco descuidado o descuidada, pues quiere decir que la ciudad cuyo número aparece en la columna A, tiene una serie de características en las siquientes columnas. Realmente para una base relacional esto no tiene sentido, simplemente, todos los que no tengan dato en la columna A, no pertenecen a la ciudad de arriba, sino que no tienen ciudad.

A este problema le llamaremos, el problema del dato ausente por el sobreentendido del dato superior.

Solución:
Este viejo problema es muy molesto resolverlo a mano, así que la máquina lo haga. Veamos como:

1. Recordemos que para correr una macro en Excel, hay que indicárselo mediante los iconos como los que se ven en la figura:


Antes que nada tenemos que seleccionar el icono de referencia relativa, cuyo significado algún día explicaremos o algún día el lector entenderá por su cuenta si no que ya lo sabe desde que era chiquito. Pues bien, una vez seleccionada la referencia relativa, procedemos a arrancar la macro con el icono que tiene un puntito rojo. Esto es para versiones 2003.2007, pero incluso en las anteriores que me gustaban más, también había iconos similares.

2. Nos posicionamos en la celda donde está el problema (A1) que es donde empezaremos con el proceso de rellenado. Recuerda (¿te puedo hablar de tu?) que la columna:

1


2
3
4
5


6

La queremos transformar en algo como esto:
1
1
1
2
3
4
5
5
5
6

Si lo logramos estaremos muy alegres porque una "base de datos" de tipo refrigerador, la habremos convertido en una tipo relacional.

3. Una vez en dicha casilla, se activa la macro con  "grabar macro". Entonces el icono que decia grabar se convierte misteriosamente en uno que dice "detener macro" que nos recuerda las viejas grabadoras. Lo primero que debe hacerse es bajar una casilla (exactamente a la A2) y apagar la macro.

Te preguntarás (si no sabes de macros):
¿Oye, (¿te puedo hablar de tú?) ¿Para que bajo una casilla y apago la macro?

Bueno, eso es porque vamos a hacer que la macro haga la tarea más sencilla de todo el proceso y eso lo pasará a un código que aprovecharemos para decirle a nuestro robot que hacer.

4. Cuando apagas la macro, el código ha quedado grabado. Ahora para ver tu creación, te vas a macro, desde donde verás una caja de diálogo y aparecerá el nombre "macro1" (si no has hecho otra) y de ella puedes mostrar el código si oprimes "modificar"


Aparece lo siguiente:


Sub Macro1()
'
' Macro1 Macro
'

ActiveCell.Offset(1, 0).Range("A1").Select

End Sub


Esto significa lo siquiente. Se ha creado una subrutina llamada Macro1() (aunque le puedes cambiar aquí mismo el nombre a uno más bonito); dicha subruttina viene de la macro 1, como dice el comentario "macro1Macro. Observarás que todo lo que viene precedido por una comilla no cuenta. Es como cuando habla alguien que te cae mal, ni lo miras ni oyes. Eso hace la comilla, es para que puedas comentar muchas cosas sin alterar la paz del programa, son cosas que el interprete omitirá.

Luego viene una verdadera instrucción:
ActiveCell.Offset(1, 0).Range("A1").Select

Esto significa que la macro registró que durante la sesión de macro tu bajaste una casilla para posicionarte en la celda activa que esta uno abajo (1) y cero a la derecha (o), es decir a la posición relativa (1,0). Todas las acciones que se refieran a la celda activa (esa que tiene un contorno más obscuro que las otras, se refieren mediante la instrucción ActiveCell. Pero no basta gritar el nombre, por ejemplo tu le quieres llamar a Juan, no sólo le dices "Juaaaan". también le dices que esperas de él. Así Excel, no sólo le llama a la celda activa, sino que le dice que espera de ella. Por ejemplo, si quieres que Juan se quite de enfrente de tu nueva pantalla plana porque no ves ni madres, le dices
Juaaan muevete!

O bien:
Juan.Muevete, en caso de que Juan sea una persona medio robotizada, a consecuencia de la vida moderna.

Excel es medio robotizado a consecuencia de la vida moderna, así que no entiende más que:

ActiveCell.Offett(1,0).Range("A1").Select

Así como le podrías decir a Juan:
Juan.Muevete.Hacia(1paso,2pasos).Desdedondeestabas.Ysientatesiquieres

Le tenemos que dar los detalles del movimiento a Excel. Primero hacia donde, y luego la palabra Range("A1").Select, significa que la nueva posición será relatvia y lista para seleccionar, aunque eso lo veremos a más detalle en otra ocasión.

Pues así las cosas puedes salir del estado de macro y oprimir macro ejecutar y verás como la macro baja una casilla. Ni modo, es lo único que le has pedido. Cuando le llamas a Juan, quizá volte a verte tras haverse movido para apreciar si estás satisfecho y tu le contestes, "sí ahista bien". Lo mismo paa nuestro programa, para decir que la rutina termino le decimos "End Sub". Vamos a pedirle ahora amablemente que haga lo demás.

5. Puedes escribir este programa en la misma área, añádele lo que falta:
--------------------------------------------

Sub Macro1()
'
' Macro1 Macro
'

Bajo = "HOLA"

For N = 1 To 500
Dato = ActiveCell.Value
'
 
 

If Dato = "" Then
ActiveCell.Value = Bajo
Else
Bajo = Dato


End If

 ActiveCell.Offset(1, 0).Range("A1").Select

Next

End Sub

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

Ahora expliquemos que hace:


Sub Macro1()   ' nombre de la macro
'
' Macro1 Macro
'

Bajo = "HOLA"    ' Le asignamos a una variable donde pondremos los valores de la lista un valor de inicio que podría ser lo que quieras, siempre y cuando no esté en la lista. Algunas otras posibilidades son Bajo="PARANGACUTIRIMICUARO", o Bajo="EL SALARIO QUE RECIBO", etc. El único límite es tu imaginación.

For N = 1 To 500    ' con esto le decimos cuantos renglones queremos que repita la tarea
Dato = ActiveCell.Value   ' Aquí le asignamos a una variable el valor que en el que está la celda activa, en nuestro caso, será en el que iniciemos el proceso.
'
 
 

If Dato = "" Then     'La macro extrajo el valor de la celda de inicio, ahora ve si está vacía
ActiveCell.Value = Bajo   ' La celda asigna el valor Bajo a la celda de inicio
Else   ' Si no hace lo siquiente
Bajo = Dato   'Si no es valor nulo, almacena el valor porque lo queremos repetir abajo


End If   'se acabó

 ActiveCell.Offset(1, 0).Range("A1").Select  'baja una celda como hicimos al principio, pues queremos evaluar todas

Next   'repite hasta llegar a 500. O mil, o un millón. O 10 millones... bueno no, porque Excel solo aguanta un millón y cacho.

End Sub  ' este arroz ya se coció


5. El resultado será el buscado. Ahora estudia esto y prepárate para la siquiente lección. 




No hay comentarios:

Publicar un comentario