You are on page 1of 31

PROGRAMACION VBA PARA EXCEL

INTRODUCCION:

Si bien la grabadora de macros es muy útil y genera un código siempre correcto, tiene dos desventajas: 1. genera mas código que el necesario. 2. sólo puede hacer macros con instrucciones secuenciales y sin nada de lógica, o sea que no pueden tomar desiciones ante un evento. Ambas desventajas se pueden solucionar con la programación VBA que quiere decir programación visual basic para aplicaciones, lo lamento pero aquí no tenemos mas remedio que aprender a programar y eso es lo que van a ir aprendiendo con los tutorarles de este apartado. VBA es una programación que está íntimamente relacionada con los libros y las hojas de cálculo y para esto Excel cuenta con un editor de programación donde se pone el código, a este se puede acceder, en Excel 2007, yendo a la pestaña programador y luego a la sección código donde hacemos clic en Visual Basic

En Excel 2003 hay que ir al menú desplegable herramientas y de ahí la ruta macros y Editor de Visual Basic

ambas formas nos lleva, luego de hacer doble clic en Hoja1por ejemplo, al editor

las macros que se escriban aquí, estaran relacionadas con la Hoja1. Comencemos por lo mas simple y escribamos una macro que seleccione la celda B5de la Hoja1 del libro VBAProject (Libro2)

donde podemos ver que el código

Para ejecutar este código pulsamos en el icono o en la tecla F5 para que aparezca el panel Macros donde puede verse el nombre de la macro que ya está seleccionada. Otro código muy simple es escribir un valor en una celda.se escribe entre "Sub" y "End Sub" y que el nombre no tiene espacios y termina con "( )" . luego pulsamos en "ejecutar" y despues en el icono pantalla con el resultado . o seleccionando " Alta + F5 que nos lleva a la que es la selección de la celda B5. Escribamos el valor 2007 en la elda D8 .

Value=" pedro" El uso de FormulaR1C1 sera explicado mas adelante 3-Letra Negrita Selection.Font. etc) que como todo objeto. ancho. celdas.Bold = True 4-Letra Cursiva Selection. etc En los códigos que hemos escrito tenemos los objetos Range("B5") ( celda B5) con la propiedad de estar seleccionada y el objeto Range("D8") ( celda D8) con la propiedad de tener un número (2007) y despues estar vacía. por ejemplo el objeto celda pude tener la propiedad de alto. estar seleccionada. Rangos. tener un valor.Italic = True .y si lo queremos borrar A estas alturas estamos en condiciones de explicar estos sencillos códigos: En la programación VBA se trabaja con OBJETOS ( Hojas. o no tener ninguno.Select 2-Escribir en la celda que está seleccionada en el momento actual Activecell. tiene propiedades.Font. CODIGOS MAS SIMPLES PARA EMPEZAR 1-Seleccionar una Celda Range("A1").FormulaR1C1="Pedro" la combinación los códigos 1 y 2 es equivalente a esta sola línea: Range("A1").

Font.5-Letra Subrayada Selection.Font .HorizontalAlignment = xlCenter End With 7-Alinear a la izquierda With Selection .Underline = xlUnderlineStyleSingle 6-Centrar Texto With Selection .HorizontalAlignment = xlLeft End With 8-Alinear a la Derecha With Selection .Paste .Size = 12 End With 11-Copiar Selection.HorizontalAlignment = xlRight End With 9-Tipo de Letra(Fuente) With Selection .Name = "Arial" End With 10-Tamaño de Letra(Tamaño de Fuente) With Selection.Copy 12-Pegar ActiveSheet.Font .

Open Filename:="C:\Mis documentos\Tablas dinamicas. Significado de la FORMULA R1C1 . Order1:=xlAscending. FileFormat _ :=xlNormal. LookIn:=xlFormulas. Orientation:=xlTopToBottom 15-Orden Descendente Selection.Find(What:="César". Orientation:=xlTopToBottom 16-Buscar Cells. SearchDirection:=xlNext.SaveAs Filename:="C:\Mis documentos\tablas.Sort Key1:=Range("A1"). CreateBackup:=False La mayoria de estos códigos se pueden verificar con la grabadora de Macros. MatchCase:=False.EntireRow. LookAt:=xlPart.Delete 19-Insertar Columna Selection. _ OrderCustom:=1.Insert 20-Eliminar Columna Selection.xls" 22-Grabar un Libro ActiveWorkbook.EntireRow.EntireColumn. Order1:=xlDescending.xls". WriteResPassword:="".Sort Key1:=Range("A1"). MatchCase:= _ False). Header:=xlGuess. SearchOrder:=xlByRows.13-Cortar Selection. After:=ActiveCell.Insert 18-Eliminar Fila Selection. _ OrderCustom:=1. ReadOnlyRecommended:= _ False.Cut 14-Ordenar Ascendente Selection. MatchCase:=False. Password:="".Activate 17-Insertar Fila Selection.EntireColumn.Delete 21-Abrir un Libro Workbooks. Header:=xlGuess.

Veamos el siguiente caso supongamos que queremos sumar los números de de la columna D y que el resultado aparezca en la celda F6 que es la que está seleccionada. también llamadas ciclos de repetición o bucles. pero una cosa fundamental es entender las estructuras de control de flujo de programa. o sea. siempre debe ser escrita ActiveCell. el código que se debería escribir es el siguiente El paréntesis destacado en rojo tiene por objetivo cubrir el tango donde están los números a sumar.La FORMULA R1C1 se emplea para colocar el resultado de una línea de código en la celda que actualmente está activa. pues el segundo igual es que caracteriza a la función y el paréntesis el rango donde se aplica.si nos desplazamos hacia la izquierda o hacia arriba. .FormulaR1C1 = "=SUM(R[]C[]:R[]C[])". como en el caso anterior. Esto se solucionado mediante los llamados estructuras de iteración. desplazarme 2 columnas a la izquierda [-2] con 5 y 2 filas hacia arriba es decir [-5] y [-2]. Se entiende que R significan filas y C columnas y que anteponemos un . Cuando escribimos una función. Lo que se acaba de hacer es lo mismo que dolocar =SUMA(D1:D3) en la celda F6 Hasta ahora hemos hecho una breve intrcduccion a la programacion VBA . lo que haremos mediante ejemplos Estructuras de iteracion Frecuentemente algunas líneas de código de repiten muchas veces con el consiguiente aumento del tamaño del programa.

If . Luego de aplicar la macro el resultado deberá quedar en la primera celda vacía. Para explicar While .Next Estructuras de desicion: . Vamos a sumar un rango de números que están ubicados en una columna.Until --Loop For .Then .Wend me parece que lo mejor es dar un ejemplo en el que iremos analizando cada línea de código.While .Else Select . En este caso sumaremos una cantidad indefinida de números naturales los que introducimos en la columna "D" empezando por la "D1" y finalizando con la introducción del Nº 283226 como se ve en la figura . En la hoja de cálculo solo debemos poner los números (sin dejar espacios en blanco) .Estos son: While .Wend INTRODUCCION: Esta es una iteración en la que no sabemos de antemano cuantas veces se repetirá el ciclo por lo tanto debe haber una condición para salir de el ya que en caso contrario el ciclo se repetiría en forma indefinida.Loop Do .Case Estructura de iteración Wile .Wend Do .

Seleccionamos la celda superior. 2.el programa VBA es Explicación del código (los números representan las líneas de código) 1. "D1". .Asignamos a la variable “sum” (que es en la que quedará contenido el resultado) el valor de la celda superior.Siempre se empieza con Sub seguida del nombre de la macro y 2 paréntesis (Sum()). 3.

4. de esta forma podemos acceder a su contenido y la segunda agrega este contenido a la variable "sum". 5.Esta línea es la condición para entrar o salir del While y quiere decir "mientras la celda activa no este vacía". 6.La primera línea dentro del While hace bajar una posición la celda seleccionada.Aquí ya entramos en el While donde hay 2 líneas que se repiten hasta que la condición no se cumpla.Con esta línea se cierra el programa Finalmente una vez que aplicamos la macro.Una vez que salimos del ciclo colocamos el resultado queda en una celda activa. la hoja nos queda Se puede ver que los resultados en la celda activa y en la caja de mensajes coinciden. Estructura de iteración Do-Wile-Loop . 7-Con Wend salimos o volvemos a entrar al ciclo según se cumpla o no la condición 8. 9-Tanbien mostramos el resultado mediante un MsgBox (caja de mensajes) 10.

Para explicar Do-Wile-Loop utilizaremos el mismo ejemplo que en la estructura WhileWend. Luego de aplicar la macro el resultado deberá quedar en la primera celda vacía.INTRODUCCION: Esta es una iteración en la que no sabemos de antemano cuantas veces se repetirá el ciclo al igual en la estructura While-Wend y como en esta debe haber una condición para salir de el ya que en caso contrario este se repetiría en forma indefinida. La evaluación de la condición se produce antes de entrar al ciclo. Vamos a sumar un rango de números que están ubicados en una columna. En este caso sumaremos una cantidad indefinida de números naturales los que introducimos en la columna "D" empezando por la "D1" y finalizando con la introducción del Nº 283226 como se ve en la figura el programa VBA es . En la hoja de cálculo solo debemos poner los números (sin dejar espacios en blanco) .

de esta forma podemos acceder a su contenido y la segunda agrega este contenido a la variable "sum". 4.Aquí ya entramos en el Do-While donde hay 2 líneas que se repiten hasta que la condición no se cumpla. 10.La primera línea dentro del While hace bajar una posición la celda seleccionada.Asignamos a la variable “sum” (que es en la que quedará contenido el resultado) el valor de la celda superior.Select Sum = Range("D1") .Siempre se empieza con Sub seguida del nombre de la macro y 2 paréntesis (SumColumna()). "D1". 5. Código para copiar y pegar Sub SumaColumna() Range("D1"). 2.Con esta línea se cierra el programa. 3.Seleccionamos la celda superior.Explicación del código (los números representan las líneas de código) 1.Una vez que salimos del ciclo colocamos el resultado queda en una celda activa.Esta línea es la condición para entrar o salir del While y quiere decir "hacer mientras la celda activa no este vacía". 9-Tanbien mostramos el resultado mediante un MsgBox (caja de mensajes). 8. 6. 7-Con Loop salimos o volvemos a entrar al ciclo según se cumpla o no la condición.

la hoja nos queda Se puede ver que los resultados en la celda activa y en la caja de mensajes coinciden y lógicamenteal dan el mismo resultado que usando la estructura Wile-Wend.Offset(1.Select Sum = Sum + ActiveCell. Para comparar con Do-While-Loop y While-Wend vamos a sumar un rango de números que están ubicados en una columna. la diferencia esta en la en la forma en que expresamos la condicion: por ejemplo en Do-While-Loop y While-Wend la condicion podria ser " ejecutar el codigo mientras que la celda no este vacia" y en DoUntil-Loop seria "ejecutar el codigo hasta que la celda este vacia".Do While ActiveCell.Value <> "" ActiveCell. 0).Value Loop ActiveCell.Value = Sum MsgBox Sum End Sub Finalmente una vez que aplicamos la macro. Estructura de iteración Do-Until-Loop INTRODUCCION: Do-Until-Loop es similar a Do-While-Loop y a While-Wend. En la hoja de cálculo solo debemos poner los .

números (sin dejar espacios en blanco) . Luego de aplicar la macro el resultado deberá quedar en la primera celda vacía. Tambien en este caso sumaremos los mismos números que en los ejemplos de Do-WhileLoop y While-Wend que introducimos en la columna "D" empezando por la "D1" y finalizando con la introducción del Nº 283226 como se ve en la figura el programa VBA es Explicación del código (los números representan las líneas de código) .

Con esta línea se cierra el programa Finalmente una vez que aplicamos la macro. la hoja nos queda .Una vez que salimos del ciclo colocamos el resultado que queda en una celda activa.Asignamos a la variable “sum” (que es en la que quedará contenido el resultado) el valor de la celda superior. 5. 9-Tanbien mostramos el resultado mediante un MsgBox (caja de mensajes) 10.Aquí ya entramos en el While donde hay 2 líneas que se repiten hasta que la condición no se cumpla. 6. 2. 3.La primera línea dentro del While hace bajar una posición la celda seleccionada.Seleccionamos la celda superior.Esta línea es la condición para entrar o salir del While y quiere decir "ejecutar el codigo hasta que la celda este vacia". 4.Siempre se empieza con Sub seguida del nombre de la macro y 2 paréntesis (SumaColumna2()). "D1". de esta forma podemos acceder a su contenido y la segunda agrega este contenido a la variable "sum". 7-Con Wend Loop salimos o volvemos a entrar al ciclo según se cumpla o no la condición 8.1.

En la hoja de cálculo solo debemos poner los números (sin dejar espacios en blanco) en una celda que en este caso será la D4.Se puede ver que los resultados en la celda activa y en la caja de mensajes coinciden. Aprovechando las propiedades de For podemos poner los números desde el código . Luego de aplicar la macro el resultado deberá quedar en la primera celda vacía . este debe ser 55 como se puede verificar haciendo la suma manualmente. por lo tanto no hace falta una condición para salir del mismo. Estructura de iteración For-Next INTRODUCCION: Esta es una iteración en la que sabemos de antemano cuantas veces se repetirá el ciclo. Para explicar For daremos un ejemplo muy simple: Vamos a sumar los primeros 10 números naturales.

2.El primer For es para colocar en la columna D los diez primeros números naturales y significa: para la variable i yendo de 1 hasta 10 3-Se coloca en la celda (i.Con Next i se incrementa i en 1 y se vuelve a entrar al For .Siempre se empieza con Sub seguida del nombre de la macro y 2 paréntesis (Sum()).4) el valor actual de i que se repite al entrar nuevamente en el For 4.el programa VBA es Explicación del código (los números representan las líneas de código) 1.

luego de evaluar una condición. 13-Se termina el programa. .5-Se selecciona la celda "D1" 6. 12-Tambien mostramos el resultado mediante un MsgBox. ejecutar un bloque de código u otro.Se coloca en la variable sum el contenido de la celda "D1" ( Sum acumula la suma de los 10 primeros nº narutales) 7-Se entra al 2º For 8 y 9-Dentro del For la primera línea hace bajar una posición la celda seleccionada. de esta forma podemos acceder a su contenido y la segunda agrega este contenido a la variable "sum". Quedando la hoja de calculo como se ve abajo Estructura de decisión If .Then . 10-En esta línea podemos salir o volver a entrar al For según se haya llegado a 10 o no. 11.En la celda activa colocamos el valor de sum.Else INTRODUCCION: La estructura de decisión se llama así pues puede.

2-Si el valor del Nº que está en la celda "D1" es igual al que está en la celda "E1" .Comparar 2 números ubicados en 2 celdas. 1. entonces se ejercita el código de la línea 3. 6-Se cierra el If.. 4-Sino se da la condición de la línea 2 se ejecuta el código de la línea 5. si son iguales o no Compararemos los Nº 59 y 63 ubicados en las celdas D1 y E1 respectivamente para responder a la pregunta utilizaremos el siguiente código Explicación del código 1-Título. 7-Se cierra el Sub . 5 -Se coloca en la celda "D4" el texto "D1 es distinto que E1". 3-Se coloca en la celda "D4" el texto "Los valores de D1 y E1 son iguales". en una tercera celda. y responder.Vamos a ver algunos ejemplos.

para hacerlo generamos otra macro en el mismo libro que llamaremos. iguales o distintos. Esto es necesario al querer averiguar si los Nº son mayores. lo que quiere decir poner otro If en la línea 3.Value = "Los Valores de D1 y E1 son iguales" Else ActiveSheet.Range("D4"). por ejemplo.Range("D1").Value = ActiveSheet.Value = "D1 es distinto que E1" End If End Sub En nuestro caso el resultado se tiene que ver como en la figura Esta estructura puede anidarse.Value Then ActiveSheet. Anidamiento Código: .Código para copiar y pegar Sub Condicional() If ActiveSheet. 5 o ambas.Range("E1").Range("D4").

Range("E1").Notar que el segundo If se puso en la parte correspondiente al Else y se cierra antes que el primer If. Se puede también ver que hemos identado el código para mayor claridad (cosa que recomiendo enfáticamente) Resultado Código para copiar y pegar: Sub Anidamiento() If ActiveSheet.Range("D1").Value = "Los Valores de D1 y E1 son iguales" Else If ActiveSheet.Value > ActiveSheet.Value Then .Range("E1").Range("D4").Value = ActiveSheet.Value Then ActiveSheet.Range("D1").

ActiveSheet. > o < que el valor actual de la celda "E1" CODIGO PARA COPIAR Y PEGAR Sub SelectCase() A1 = Range("E1"). En primer lugar veremos que funciona igual que If-Then-Else. ubicando la respuesta en la celda D4 El código es escencialmente este código evalúa el valor actual de la celda "D1" y se escribe un código diferente de acuerdo al caso de que este valor sea = .Value = "D1 es mayor que E1" Else ActiveSheet. mayores o menores. para lo que utilizaremos el mismo ejemplo que If-Then-Else en la parte en que comparábamos 2 números ubicados en las celdas D1 y E1 y el programa debía responder si estos son iguales.Value = "E1 es mayor que D1" End If End If End Sub Se puede ver que este código no está identado por lo que sugiero hacerlo como ejercicio.Range("D4"). en estos casos se puede recurrir a la estructura de decisión Select-Case.Range("D4"). a veces el código suele hacerse confuso y frecuentemente da lugar a errores. Estructura de desición Select-Case INTRODUCCION: La estructura de decisión If-Then-Else puede anidarse y como este anidamiento se puede repetir tantas veces como el problema lo exija.Value .

teniendo en cuenta que: Aplazado= 1. distinguida o sobresaliente.Value = "E1 es mayor que D1" End Select End Sub La utilidad esencial de esta estructura se manifiesta cuando los casos que se evalúan son mas numerosos como veremos en el siguiente ejemplo.Range("D4").5 Bueno= 6. Introducir en una celda la nota de un alumno y en otra una leyenda que diga si esta aplazado.2. muy buena. aprobado y en caso de estar aprobado si su nota fue buena.3 Aprobado= 4.Value = "Los Valores de D1 y E1 son iguales" Case Is > A1 ActiveSheet.7 Muy bueno= 8 Distinguido= 9 Sobresaliente= 10 se puede responder a estas preguntas aplicando este código .Range("D4").Range("D4").Select Case Range("D1").Value = "D1 es mayor que E1" Case Is < A1 ActiveSheet.Value Case Is = A1 ActiveSheet.

Value = "DISTINGUIDO" Range("E1").Range("B2").Select .Value = "BUENO" Range("E1").Value = "APLAZADO" Range("E1").Value = "MUY BUENO" Range("E1").Select Case 8 ActiveSheet.Value = "SOBRESALIENTE" Range("E1").Range("B2").Select Case 10 ActiveSheet.CODIGO PARA COPIAR Y PEGAR Sub SelectCase() a = Range("A2").Range("B2").Select Case 6 To 7 ActiveSheet.Value Select Case a Case 1 To 3 ActiveSheet.Value = "APROBADO" Range("E1").Range("B2").Select Case 4 To 5 ActiveSheet.Range("B2").Range("B2").Select Case 9 ActiveSheet.

End Select End Sub El resultado final queda como se ve en la figura. el cual esta señalado por la flecha roja EJERCICIOS Esta es un recopilación de ejercicios originales de los niveles básico. Dada la factura del comercio " ELEGANT" completar los espacios vacíos . medio y avanzado NIVEL BASICO Ejercicio 1: 1. en este caso hemos agregado un botón para disparar la macro.

Completar los espacios utilizando la función SUMAPRODUCTO Ejercicio 2 Mejorar el aspecto y funcionalidad de la factura del comercio "ELEGANT" . Utilizar la función HOY y ver el tutorial INSERCION DE IMAGENES 1. NIVEL MEDIO Ejercicio 1: Un comercio dispone de la siguiente tabla con las ventas del mes Enero de sus empleados correspondientes a las sucursales A y B .Utilizar FORMULAS y la función SUMA 2. un slogan y un logotipo. incorporando la fecha actual.

2. Cuál fue el empleado que vendió por $ 24. 3. y cual fue el monto Cuál fue el empleado que vendió mas de la sucursal B. ¿Cuál fue la máxima venta de la sucursal A? 10. Cuánto vendieron los empleados de la sucursal A. El promedio de ventas de la sucursal B. 8. 2. 4. ( función SUMAR. averiguar 1.se quiere saber: La cantidad de empleados de cada sucursal (Función CONTAR. ¿Cual fue la máxima venta de la sucursal B? Para los puntos 7.SI) Cuánto vendieron los empleados de la sucursal B.000. 5. y cual fue el monto Ejercicio 4: . Ejercicio 2: Empleando la misma tabla que en el ejercicio anterior. 6. 9. El promedio de ventas de la sucursal A. Cuál fue el empleado que vendió mas de ambas sucursales.9 y 10 usar FORMULAS MATRICIALES 1. Usar la función CONTARA La cantidad total vendida (función SUMA) ¿Cuál fue la mayor venta ( función MAX ) ¿Cuál fue la menor venta ( función MIN ) El promedio de ventas de ambas sucursales ( función PROMEDIO) 7. Cuál fue el empleado que vendió mas de la sucursal A. 3. Ejercicio 3: Con la tabla del ejercicio 1 se quiere saber 1.SI) La cantidad total de empleados. 4.8. 2.

Ejercicio 8 La línea aérea Avianc tiene un monitor. Hacer un gráfico de barras que represente las ventas que hicieron los empleados de ambas sucursales. 1. donde los pasajeros pueden consultar el importe de los diferentes destinos como así también si estos tienen descuentos. Los precios y descuentos están en una lista que está en la hoja llamada “PRECIOS Y DESCUENTOS y los destinos otra llamada DESTINOS DESDE ALICANTE. (Este ejercicio se resuelve con macros). 3. Imprimir el documento. Ponerle el título " Ventas de empleados mes de Enero". Ejercicio 6 A cuales de las preguntas de los Ejercicios 1. Se pide: Hacer los mismos cálculos del ejercicio 1. Ejercicio 5 : Considerando el mismo comercio de los ejercicios anteriores El negocio está prosperando y se ve obligado a contratar nuevos empleados durante el mes de Enero(se pueden colocar los nuevo empleados en cualquier lugar de la tabla). 2. Hacer los gráficos correspondientes( Gráficos con rangos variables) 1. Hacer un gráfico de barras que represente las ventas que hicieron en ambas sucursales. 2. en el aeropuerto de Alicante. Haciendo que los campos de la misma sean variables. Ponerle el título " Ventas de sucursales mes de Enero".Con la tabla del ejercicio 1: 1. 1. 2. 4 y 5 se pueden responder usando Tablas dinámicas 2. 3. Responder las respuestas del punto 1 empleando Tablas Dinámicas. Incorporando el Nº de factura. Ejercicio 7 Mejorar la funcionalidad de la factura del comercio "ELEGANT". Se pide: . pero teniendo en cuenta esta nueva circunstancia( Rangos variables) 2.

donde se muestra un destino como ejemplo y donde se inserta el logotipo de AVIANC (función BUSCARV) . NIVEL BASICO Ejercicio 1 Ejercicio 2-1 En este archivo está la solución final y una carpeta "images" que contiene la imagen "elegant. Las soluciónes se encuentran en archivos que se pueden descargar de la red. Ejercicio 9 Si se introduce un destino que no está en lista de la línea aérea. Se aclara que los diferentes destinos se superponen con el que está escrito. "NO EN DESTINOS" SOLUCIONES A EJERCICIOS Soluciones a los ejercicios propuestos en la pagina correspondiente. la frase. Confeccionar una pantalla como la mostrada en la figura. NIVEL MEDIO .gif" la cual debe ser copiada ( o ponerla en el portapapeles) para luego pegar en algun archivo donde Excel pueda buscarla. deberá aparecer en lugar de "DESCUENTOS". 2.1. Colocar un hipervínculo hacia la página DESTINOS DESDE ALICANTE.

Ejercicio 1 Ejercicio 2 Ejercicio 3 Ejercicio 4 Ejercicio 5-1 Ejercicio 8 5-2 .