sábado, 18 de febrero de 2012

Unir nombre y apellido con macros en Excel 2007

Visual Basic para Aplicaciones (o VBA) es especialmente diseñado en un modo que permite a las personas que no tienen experiencia en programacion usarlo - y mejorar su experiencia en el uso de Office inmensamente.
VBA para Excel puede ser dominado a un cierto nivel con lecciones semanales paso a paso por cualquiera. Incluso si tu no haz estudiado ningun lenguaje de computacion no deberias tener dificultades con VBA.
Variables
En este ejemplo se introduciran algunos conceptos de programacion - despues de todo VBA es un lenguaje de programacion. Un concepto muy basico es el de variable. Tecnicamente, este es un espacio en la memoria de la computadora para almacenar cierta data. De este modo, cuando tu accedes a este lugar tu consigues la data actualizada.
Ejemplo.
En la columna C queremos tener el nombre completo de estas personas.
Para esto construiremos una macro. Para esto iremos a Vista->Macros->Ver Macros.
En esta ventana escribimos fullname y le damos click a Crear.
Les aparecera el Editor de Visual Basic y escribiremos los comandos.
Lo que haremos sera reunir los valores de la celda A1 y B1 y colocarlo en C1.
Sub fullname()
Range("A1").Select
fname = ActiveCell.Value
Range("B1").Select
surname = ActiveCell.Value
Range("C1").Select
ActiveCell.Value = fname & surname
End Sub
Como se ve en el codigo de arriba asignamos el valor de las celdas activas a una variable (fname, surname). Luego, en la ultima fila, rellamamos la data de las variables. El signo "&" es usado para separar entre variables y texto. Vamos a ejecutar nuestra macro (F5)y ver el resultado en la ventana Excel.
Como vemos todo salio OK, pero queremos tener un espacio entre el primer nombre y el apellido, asi que vamos a actualizar la ultima fila del codigo
Sub fullname()
Range("A1").Select
fname = ActiveCell.Value
Range("B1").Select
surname = ActiveCell.Value
Range("C1").Select
ActiveCell.Value = fname & " " & surname
End Sub
ejecutamos la macro nuevamente:
Ahora salio OK, pero si cambias el nombre o apellido, la celda C1 no se actualiza. Para cambiarlo, tienes que ejecutar la macro otra vez (aunque no sea muy dificil de hacer). Esto es muy importante de recordar, las celdas las cuales se les asignan valores via macro solo cambian cuando la macro es ejecutada.
Ahora vamos a hacer lo mismo para las filas 2-5. Sin embargo, antes de copiar y pegar el codigo 5 veces vamos a hacerlo un poco mas corto, utilizando la coleccion Cells.
Sub fullname()
fname = Cells(1, 1).Value
surname = Cells(1, 2).Value
Cells(1, 3).Value = fname & " " & surname
End Sub
En Excel VBA, "Cell" es un objeto dentro de la coleccion Cells, el cual tiene ciertas propiedades. Una de tales propiedades es "Value" - el valor de la celda. Recuerda, no la formula, no el formato - solo el valor. Accediendo a una valor de la celda se hace gracias a partir de su ubicacion en su fila y su columna. Cells(1, 1) accedera a la primera fila y la primera columna - A1. Si utilizamos Cells tenemos que indicar primero la fila y luego la columna, asi Cells(1, 2) accedera a B1 y no a A2.
Ahora vamos a copiar y pegar el codigo para cambiar la segunda fila:
Sub fullname()
fname = Cells(1, 1).Value
surname = Cells(1, 2).Value
Cells(1, 3).Value = fname & " " & surname
fname = Cells(2, 1).Value
surname = Cells(2, 2).Value
Cells(2, 3).Value = fname & " " & surname
End Sub
Como puedes ver, hemos cambiado los indices de los objetos de las celdas. Pero como vemos el valor de la variable fname, almacena primero el contenido de la celda A1 (Jhon) y despues de ejecutar la 3 fila, almacena la celda A2 (Sidney).
Para ver esto de otra manera, utilizaremos la ventana de inspecciones.
En tu editor de Visual Basic, vamos a ir al menu principal->Ver->Ventana de Inspecciones.
Veras una ventana nueva en la parte inferior de tu pantalla, la cual se le llama "inspecciones". En esta ventana podemos observar los valores de ciertas variables durante la ejecucion de nuestro codigo. Vamos a agregar nuestra variable. Para hacer eso, click derecho en una variable (fname) y elegir Agregar Inspeccion. Presionan OK en la ventana que aparecera.
Hagan lo mismo con la variable surname.
Al final deberias tener las 2 variables en la ventana de inspecciones.
Ahora vamos a ejecutar el codigo linea por linea (F8). Despues de ejecutar la segunda linea de codigo, mira los valores de las variables.


Sigue presionando F8 hasta llegar al final de la linea y veras que los valores de las variables cambian.
Ahora cuando regresen a la hoja de Excel veran esto.
La segunda fila esta OK.
Ahora una vez que hemos comprendido como trabajan las variables, vamos a copiar y pegar el codigo para todas las 5 variables.
Sub fullname()
fname = Cells(1, 1).Value
surname = Cells(1, 2).Value
Cells(1, 3).Value = fname & " " & surname
fname = Cells(2, 1).Value
surname = Cells(2, 2).Value
Cells(2, 3).Value = fname & " " & surname
fname = Cells(3, 1).Value
surname = Cells(3, 2).Value
Cells(3, 3).Value = fname & " " & surname
fname = Cells(4, 1).Value
surname = Cells(4, 2).Value
Cells(4, 3).Value = fname & " " & surname
fname = Cells(5, 1).Value
surname = Cells(5, 2).Value
Cells(5, 3).Value = fname & " " & surname
End Sub
Pero como puedes ver es una mala idea para escribir un codigo. En estos casos se utiliza un "looping", eso ya lo explicare en otro post.
Ejecuta el codigo y mira el resultado.
pero que sucede si alguien agrega una columna nueva, algo como esto:
Lo que debemos hacer, es establecer una celda activa. Para esto cambiamos nuestra macro agregando la columna inicial:
startcol = ActiveCell.Column
Esto significa que empezaremos numerando la columna de la celda activa. En nuestro caso sera 2(puedes comprobar agregando la variable startcol a la ventana de inspecciones). El codigo de la primera fila lucira asi:
Estamos utilizando la variable startcol para definir la columna del primer nombre (el cual es startcol), columna apellido(el cual es startcol + 1) y la columna de nombre completo (startcol + 2). Ejecutamos el codigo para comprenderlo mejor:
Sub fullname()
startcol = ActiveCell.Column
fname = Cells(1, startcol).Value
surname = Cells(1, startcol + 1).Value
Cells(1, startcol + 2).Value = fname & " " & surname
fname = Cells(2, startcol).Value
surname = Cells(2, startcol + 1).Value
Cells(2, startcol + 2).Value = fname & " " & surname
fname = Cells(3, startcol).Value
surname = Cells(3, startcol + 1).Value
Cells(3, startcol + 2).Value = fname & " " & surname
fname = Cells(4, startcol).Value
surname = Cells(4, startcol + 1).Value
Cells(4, startcol + 2).Value = fname & " " & surname
fname = Cells(5, startcol).Value
surname = Cells(5, startcol + 1).Value
Cells(5, startcol + 2).Value = fname & " " & surname
End Sub
Ojo que la celda active la ponemos en B1. Ejecutamos el codigo y aparecera esto:

0 comentarios:

Publicar un comentario