Вы находитесь на странице: 1из 90

PROGRAMACION VBA PARA EXCEL

INTRODUCCION:
Si bien la grabadora de macros es muy til y genera un cdigo siempre correcto, tiene dos
desventajas:

1. genera mas cdigo que el necesario.


2. slo puede hacer macros con instrucciones secuenciales y sin nada de lgica, o sea que no
pueden tomar desiciones ante un evento.
Ambas desventajas se pueden solucionar con la programacin VBA que quiere decir
programacin 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 programacin que est ntimamente relacionada con los libros y las hojas de clculo y
para esto Excel cuenta con un editor de programacin donde se pone el cdigo, a este se puede
acceder, en Excel 2007, yendo a la pestaa programador y luego a la seccin cdigo 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 cdigo

se escribe entre "Sub" y "End Sub" y que el nombre

no tiene espacios y termina con "( )" . Para ejecutar este cdigo 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, luego pulsamos en "ejecutar"

y despues en el icono , o seleccionando " Alta + F5 que nos lleva a la pantalla con el
resultado

que es la seleccin de la celda B5.


Otro cdigo muy simple es escribir un valor en una celda.
Escribamos el valor 2007 en la elda D8

y si lo queremos borrar

A estas alturas estamos en condiciones de explicar estos sencillos cdigos:


En la programacin VBA se trabaja con OBJETOS ( Hojas, celdas, Rangos, etc) que como todo
objeto, tiene propiedades, por ejemplo el objeto celda pude tener la propiedad de alto, ancho,
estar seleccionada, tener un valor, o no tener ninguno, etc
En los cdigos 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 nmero
(2007) y despues estar vaca.

CODIGOS MAS SIMPLES PARA EMPEZAR


1-Seleccionar una Celda
Range("A1").Select

2-Escribir en la celda que est seleccionada en el momento actual


Activecell.FormulaR1C1="Pedro"
la combinacin los cdigos 1 y 2 es equivalente a esta sola lnea:
Range("A1").Value=" pedro"
El uso de FormulaR1C1 sera explicado mas adelante

3-Letra Negrita
Selection.Font.Bold = True

4-Letra Cursiva
Selection.Font.Italic = True

5-Letra Subrayada
Selection.Font.Underline = xlUnderlineStyleSingle

6-Centrar Texto
With Selection
.HorizontalAlignment = xlCenter
End With

7-Alinear a la izquierda
With Selection
.HorizontalAlignment = xlLeft
End With

8-Alinear a la Derecha
With Selection
.HorizontalAlignment = xlRight
End With

9-Tipo de Letra(Fuente)
With Selection
.Font .Name = "Arial"
End With

10-Tamao de Letra(Tamao de Fuente)


With Selection.Font .Size = 12
End With

11-Copiar
Selection.Copy

12-Pegar
ActiveSheet.Paste

13-Cortar
Selection.Cut

14-Ordenar Ascendente
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1,
MatchCase:=False, Orientation:=xlTopToBottom

15-Orden Descendente
Selection.Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1,
MatchCase:=False, Orientation:=xlTopToBottom

16-Buscar
Cells.Find(What:="Csar", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart,
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False).Activate

17-Insertar Fila
Selection.EntireRow.Insert

18-Eliminar Fila
Selection.EntireRow.Delete

19-Insertar Columna
Selection.EntireColumn.Insert

20-Eliminar Columna
Selection.EntireColumn.Delete

21-Abrir un Libro
Workbooks.Open Filename:="C:\Mis documentos\Tablas dinamicas.xls"

22-Grabar un Libro
ActiveWorkbook.SaveAs Filename:="C:\Mis documentos\tablas.xls", FileFormat _ :=xlNormal,
Password:="", WriteResPassword:="", ReadOnlyRecommended:= _ False, CreateBackup:=False
La mayoria de estos cdigos se pueden verificar con la grabadora de Macros.

Significado de la FORMULA R1C1


La FORMULA R1C1 se emplea para colocar el resultado de una lnea de cdigo en la celda que
actualmente est activa.
Veamos el siguiente caso

supongamos que queremos sumar los nmeros de de la columna D y que el resultado aparezca en
la celda F6 que es la que est seleccionada, el cdigo que se debera escribir es el siguiente
El parntesis destacado en rojo tiene por objetivo cubrir el tango donde estn los nmeros a
sumar, o sea, 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 - si nos
desplazamos hacia la izquierda o hacia arriba. Cuando escribimos una funcin, como en el caso
anterior, siempre debe ser escrita ActiveCell.FormulaR1C1 = "=SUM(R[]C[]:R[]C[])", pues el
segundo igual es que caracteriza a la funcin y el parntesis el rango donde se aplica. 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 , pero una cosa
fundamental es entender las estructuras de control de flujo de programa, lo que haremos mediante
ejemplos

Estructuras de iteracion
Frecuentemente algunas lneas de cdigo de repiten muchas veces con el consiguiente aumento
del tamao del programa. Esto se solucionado mediante los llamados estructuras de iteracin,
tambin llamadas ciclos de repeticin o bucles.
Estos son:
While - Wend
Do - While - Loop
Do - Until --Loop
For - Next
For-Each-in-Next
Estructuras de desicion:
.If - Then - Else
Select - Case
Tipos de datos, funciones y subrutinas:
Tipos de datos
Funciones
Funciones propias de VBA
Eventos
Metodos
Macros
Grficos en VBA
Estructura de iteracin Wile - Wend

INTRODUCCION:
Esta es una iteracin en la que no sabemos de antemano cuantas veces se repetir el ciclo por lo
tanto debe haber una condicin para salir de el ya que en caso contrario el ciclo se repetira en
forma indefinida.
Para explicar While - Wend me parece que lo mejor es dar un ejemplo en el que iremos analizando
cada lnea de cdigo.
Vamos a sumar un rango de nmeros que estn ubicados en una columna. En la hoja de clculo
solo debemos poner los nmeros (sin dejar espacios en blanco) . Luego de aplicar la macro el
resultado deber quedar en la primera celda vaca.
En este caso sumaremos una cantidad indefinida de nmeros naturales los que introducimos en la
columna "D" empezando por la "D1" y finalizando con la introduccin del N 283226 como se ve en
la figura

el programa VBA es
Explicacin del cdigo (los nmeros representan las lneas de cdigo)
1- Siempre se empieza con Sub seguida del nombre de la macro y 2 parntesis (Sum()).
2- Seleccionamos la celda superior. "D1".
3- Asignamos a la variable sum (que es en la que quedar contenido el resultado) el valor de la
celda superior.
4- Esta lnea es la condicin para entrar o salir del While y quiere decir "mientras la celda activa no
este vaca",
5- Aqu ya entramos en el While donde hay 2 lneas que se repiten hasta que la condicin no se
cumpla.
6- La primera lnea dentro del While hace bajar una posicin la celda seleccionada, de esta forma
podemos acceder a su contenido y la segunda agrega este contenido a la variable "sum".
7-Con Wend salimos o volvemos a entrar al ciclo segn se cumpla o no la condicin
8- Una vez que salimos del ciclo colocamos el resultado queda en una celda activa.
9-Tanbien mostramos el resultado mediante un MsgBox (caja de mensajes)
10- Con esta lnea se cierra el programa

Finalmente una vez que aplicamos la macro, la hoja nos queda


Se puede ver que los resultados en la celda activa y en la caja de mensajes coinciden.
Estructura de iteracin Do-While-Loop

INTRODUCCION:
Esta es una iteracin 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 condicin para salir de el ya que en
caso contrario este se repetira en forma indefinida. La evaluacin de la condicin se produce
antes de entrar al ciclo.
Para explicar Do-Wile-Loop utilizaremos el mismo ejemplo que en la estructura While-Wend.
Vamos a sumar un rango de nmeros que estn ubicados en una columna. En la hoja de clculo
solo debemos poner los nmeros (sin dejar espacios en blanco) . Luego de aplicar la macro el
resultado deber quedar en la primera celda vaca.
En este caso sumaremos una cantidad indefinida de nmeros naturales los que introducimos en la
columna "D" empezando por la "D1" y finalizando con la introduccin del N 283226 como se ve en
la figura

el programa VBA es
Explicacin del cdigo (los nmeros representan las lneas de cdigo)
1- Siempre se empieza con Sub seguida del nombre de la macro y 2 parntesis (SumColumna()).
2- Seleccionamos la celda superior. "D1".
3- Asignamos a la variable sum (que es en la que quedar contenido el resultado) el valor de la
celda superior.
4- Esta lnea es la condicin para entrar o salir del While y quiere decir "hacer mientras la celda
activa no este vaca",
5- Aqu ya entramos en el Do-While donde hay 2 lneas que se repiten hasta que la condicin no se
cumpla.
6- La primera lnea dentro del While hace bajar una posicin la celda seleccionada, de esta forma
podemos acceder a su contenido y la segunda agrega este contenido a la variable "sum".
7-Con Loop salimos o volvemos a entrar al ciclo segn se cumpla o no la condicin.
8- Una vez que salimos del ciclo colocamos el resultado queda en una celda activa.
9-Tanbien mostramos el resultado mediante un MsgBox (caja de mensajes).
10- Con esta lnea se cierra el programa.

Cdigo para copiar y pegar


Sub SumaColumna()
Range("D1").Select
Sum = Range("D1")
Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Sum = Sum + ActiveCell.Value
Loop
ActiveCell.Value = Sum
MsgBox Sum
End Sub

Finalmente una vez que aplicamos la macro, la hoja nos queda


Se puede ver que los resultados en la celda activa y en la caja de mensajes coinciden y
lgicamenteal dan el mismo resultado que usando la estructura Wile-Wend.

Estructura de iteracin Do-Until-Loop

INTRODUCCION:
Do-Until-Loop es similar a Do-While-Loop y a While-Wend, 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 Do-Until-Loop seria "ejecutar el
codigo hasta que la celda este vacia".
Para comparar con Do-While-Loop y While-Wend vamos a sumar un rango de nmeros que estn
ubicados en una columna. En la hoja de clculo solo debemos poner los nmeros (sin dejar
espacios en blanco) . Luego de aplicar la macro el resultado deber quedar en la primera celda
vaca.
Tambien en este caso sumaremos los mismos nmeros que en los ejemplos de Do-While-
Loop y While-Wend que introducimos en la columna "D" empezando por la "D1" y finalizando con
la introduccin del N 283226 como se ve en la figura
el programa VBA es

Explicacin del cdigo (los nmeros representan las lneas de cdigo)


1- Siempre se empieza con Sub seguida del nombre de la macro y 2 parntesis (SumaColumna2()).
2- Seleccionamos la celda superior. "D1".
3- Asignamos a la variable sum (que es en la que quedar contenido el resultado) el valor de la
celda superior.
4- Esta lnea es la condicin para entrar o salir del While y quiere decir "ejecutar el codigo hasta
que la celda este vacia",
5- Aqu ya entramos en el While donde hay 2 lneas que se repiten hasta que la condicin no se
cumpla.
6- La primera lnea dentro del While hace bajar una posicin la celda seleccionada, 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 segn se cumpla o no la condicin
8- Una vez que salimos del ciclo colocamos el resultado que queda en una celda activa.
9-Tanbien mostramos el resultado mediante un MsgBox (caja de mensajes)
10- Con esta lnea se cierra el programa

Finalmente una vez que aplicamos la macro, la hoja nos queda

Se puede ver que los resultados en la celda activa y en la caja de mensajes coinciden.

Estructura de iteracin For-Next

INTRODUCCION:
Esta es una iteracin en la que sabemos de antemano cuantas veces se repetir el ciclo, por lo
tanto no hace falta una condicin para salir del mismo.
Para explicar For daremos un ejemplo muy simple:
Vamos a sumar los primeros 10 nmeros naturales. En la hoja de clculo solo debemos poner los
nmeros (sin dejar espacios en blanco) en una columna, que en este caso ser la D. Luego de
aplicar la macro el resultado deber quedar en la primera celda vaca , este debe ser 55 como se
puede verificar haciendo la suma manualmente.
Aprovechando las propiedades de For podemos poner los nmeros desde el cdigo
el programa VBA es

Explicacin del cdigo (los nmeros representan las lneas de cdigo)


1- Siempre se empieza con Sub seguida del nombre de la macro y 2 parntesis (Sum()).
2- El primer For es para colocar en la columna D los diez primeros nmeros naturales y significa:
para la variable i yendo de 1 hasta 10
3-Se coloca en la celda (i,4) el valor actual de i que se repite al entrar nuevamente en el For
4- Con Next i se incrementa i en 1 y se vuelve a entrar al For
5-Se selecciona la celda "D1"
6- 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 lnea hace bajar una posicin la celda seleccionada, de esta forma
podemos acceder a su contenido y la segunda agrega este contenido a la variable "sum".
10-En esta lnea podemos salir o volver a entrar al For segn se haya llegado a 10 o no.
11- En la celda activa colocamos el valor de sum.
12-Tambien mostramos el resultado mediante un MsgBox.
13-Se termina el programa.

Quedando la hoja de calculo como se ve abajo

Estructura de iteracin For-Each-In-Next

Hay dos variantes de esta estructura


1-En el primer tipo debemos especificar el rango en el que se realiza la iteracin
Como ejemplo hallaremos el promedio del rango A1:D4,dejando el resultado en la celda C7, para
este ejemplo pondremos valores enteros

Cdigo:
La parte ms importante del cdigo es

que significa: para cada celda del rango A1:D4 ejecutar el bloque

y cuando se llega a la ltima celda del rango, automticamente se hace la cuenta

luego se coloca el resultado en la celda C8

Cdigo para copiar y pegar


Sub PromedioRango()
Dim cell As range
Dim sum As Integer
Dim cant As Integer
Dim prom As Variant
For Each cell In range("A1:D4").cells
sum = sum + cell.Value
cant = cant + 1
Next cell
prom = sum / cant
range("C8").Select
ActiveCell.Value = prom
End Sub
2-El segundo tipo utiliza la propiedad CurrentRegion, esta propiedad es muy interesante pues nos
permite seleccionar un rango cuyos lmites no se conocen ya que CurrentRegion devuelve el
rango que rodea a una celda seleccionada.
Podemos decir que CurrentRegion es un rango rodeado por filas y columnas en blanco. En la
figura se puede ver dos regiones de este tipo.
Utilizaremos estas regiones para obtener el promedio de las mismas, para lo cual empleamos el
cdigo

Este cdigo sirve para las dos regiones, siempre y cuando se seleccione una celda de una u otra
de acuerdo en cual se quiera calcular el promedio. Por ejemplo si queremos calcular el promedio
del rango de la zona de contorno verde el resultado seria

En este caso hemos seleccionado la celda H3, pero se podra haber seleccionado cualquier otra

La diferencia con el caso 1 es

en la que

devuelve el rango de la regin actual.


Cdigo para copiar y pegar
Sub PromedioRegion()
Dim cell As range
Dim sum As Integer
Dim cant As Integer
Dim prom As Variant
For Each cell In ActiveCell.CurrentRegion.cells
sum = sum + cell.Value
cant = cant + 1
Next
prom = sum / cant
range("D8").Select
ActiveCell.Value = prom
End Sub

Estructura de decisin If - Then - Else

INTRODUCCION:
La estructura de decisin se llama as pues puede, luego de evaluar una condicin, ejecutar un
bloque de cdigo u otro.
Vamos a ver algunos ejemplos;
1- Comparar 2 nmeros ubicados en 2 celdas, y responder, en una tercera celda, 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 cdigo

Explicacin del cdigo


1-Ttulo.
2-Si el valor del N que est en la celda "D1" es igual al que est en la celda "E1" , entonces se
ejercita el cdigo de la lnea 3.
3-Se coloca en la celda "D4" el texto "Los valores de D1 y E1 son iguales"..
4-Sino se da la condicin de la lnea 2 se ejecuta el cdigo de la lnea 5.
5 -Se coloca en la celda "D4" el texto "D1 es distinto que E1".
6-Se cierra el If.
7-Se cierra el Sub
Cdigo para copiar y pegar
Sub Condicional()
If ActiveSheet.Range("D1").Value = ActiveSheet.Range("E1").Value Then
ActiveSheet.Range("D4").Value = "Los Valores de D1 y E1 son iguales"
Else
ActiveSheet.Range("D4").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, lo que quiere decir poner otro If en la lnea 3, 5 o ambas. Esto es
necesario al querer averiguar si los N son mayores, iguales o distintos, para hacerlo generamos
otra macro en el mismo libro que llamaremos, por ejemplo, Anidamiento

Cdigo:
Notar que el segundo If se puso en la parte correspondiente al Else y se cierra antes que el primer
If. Se puede tambin ver que hemos identado el cdigo para mayor claridad (cosa que recomiendo
enfticamente)

Resultado

Cdigo para copiar y pegar:

Sub Anidamiento()
If ActiveSheet.Range("D1").Value = ActiveSheet.Range("E1").Value Then
ActiveSheet.Range("D4").Value = "Los Valores de D1 y E1 son iguales"
Else
If ActiveSheet.Range("D1").Value > ActiveSheet.Range("E1").Value Then
ActiveSheet.Range("D4").Value = "D1 es mayor que E1"
Else
ActiveSheet.Range("D4").Value = "E1 es mayor que D1"
End If
End If
End Sub
Se puede ver que este cdigo no est identado por lo que sugiero hacerlo como ejercicio.

Estructura de desicin Select-Case

INTRODUCCION:
La estructura de decisin If-Then-Else puede anidarse y como este anidamiento se puede repetir
tantas veces como el problema lo exija, a veces el cdigo suele hacerse confuso y frecuentemente
da lugar a errores, en estos casos se puede recurrir a la estructura de decisin Select-Case.
En primer lugar veremos que funciona igual que If-Then-Else, para lo que utilizaremos el mismo
ejemplo que If-Then-Else en la parte en que comparbamos 2 nmeros ubicados en las celdas D1 y
E1 y el programa deba responder si estos son iguales, mayores o menores, ubicando la respuesta
en la celda D4
El cdigo es

escencialmente este cdigo evala el valor actual de la celda "D1" y se escribe un cdigo diferente
de acuerdo al caso de que este valor sea = , > o < que el valor actual de la celda "E1"
CODIGO PARA COPIAR Y PEGAR
Sub SelectCase()
A1 = Range("E1").Value
Select Case Range("D1").Value
Case Is = A1
ActiveSheet.Range("D4").Value = "Los Valores de D1 y E1 son iguales"
Case Is > A1
ActiveSheet.Range("D4").Value = "D1 es mayor que E1"
Case Is < A1
ActiveSheet.Range("D4").Value = "E1 es mayor que D1"
End Select
End Sub

La utilidad esencial de esta estructura se manifiesta cuando los casos que se evalan son mas
numerosos como veremos en el siguiente ejemplo.
Introducir en una celda la nota de un alumno y en otra una leyenda que diga si esta aplazado,
aprobado y en caso de estar aprobado si su nota fue buena, muy buena, distinguida o
sobresaliente, teniendo en cuenta que:
Aplazado= 1,2,3
Aprobado= 4,5
Bueno= 6,7
Muy bueno= 8
Distinguido= 9
Sobresaliente= 10
se puede responder a estas preguntas aplicando este cdigo

CODIGO PARA COPIAR Y PEGAR


Sub SelectCase()
a = Range("A2").Value
Select Case a
Case 1 To 3
ActiveSheet.Range("B2").Value = "APLAZADO"
Range("E1").Select
Case 4 To 5
ActiveSheet.Range("B2").Value = "APROBADO"
Range("E1").Select
Case 6 To 7
ActiveSheet.Range("B2").Value = "BUENO"
Range("E1").Select
Case 8
ActiveSheet.Range("B2").Value = "MUY BUENO"
Range("E1").Select
Case 9
ActiveSheet.Range("B2").Value = "DISTINGUIDO"
Range("E1").Select
Case 10
ActiveSheet.Range("B2").Value = "SOBRESALIENTE"
Range("E1").Select
End Select
End Sub
El resultado final queda como se ve en la figura, en este caso hemos agregado un botn para
disparar la macro, el cual esta sealado por la flecha roja
Variables simples y Tipos de datos

INTRODUCCION:
Una variable simple es una porcin de memoria donde se puede almacenar un valor y se les debe
dar un nombre para identificarlas entre s, tambin estn asociados a un tipo de dato.
Un tipo de dato es el rango de valores que las variables pueden aceptar o, dicho de otra manera, la
cantidad de memoria que se reserva para albergar dicho rango. Por ejemplo la variable de tipo
Integer, puede guardar valores en un entorno de -32.768 a +32.787 ocupando 2 bytes.
Todos los tipos de datos se resumen en la tabla de abajo.

Funciones
INTRODUCCION:
Las funciones son un trozo de cdigo inserto en el programa principal que recibe uno, muchos o
ningn valor (parmetros o argumentos) y que a diferencia de las subrutinas devuelven un nico
valor, por esta razn se debe especificar( aunque no es obligatorio)de qu tipo de dato es dicho
valor. Las funciones deben tener un nombre que las identifique y as poder ser llamadas por el
programa principal. Tambin nos permiten ampliar el listado de las funciones que ya vienen por
defecto en Excel, estas funciones estn asociadas a un libro o una hoja de Excel y las
denominamos Funciones personalizadas, son muy tiles,entre otras cosas, cuando la frmula que
se requiere para resolver un problema usando las funciones propias de las hojas Excel resulta
muy larga y complicada, haciendo casi imposible su comprensin.
Funciones personalizadas:
Empezaremos dando un ejemplo trivial de una funcin personalizada que podramos resolver sin
recurrir a ellas, este ejemplo es solo para mostrar como funcionan.
Supongamos que queremos multiplicar 2 nmeros enteros (en la figura el entero 12 y el 2)que
estn en las celdas A1 y C1 y que el resultado se devuelva en la celda B3, que obviamente se
resuelve con la frmula =A1*C1 ubicada en la celda B3, mentalmente podemos decir que el
resultado es 24

pero lo haremos con una funcin definida por nosotros programada con VBA que llamaremos
MULTIPLICA()

Esta funcin ya esta disponible junto con las dems,(solamente en la hoja donde la definimos)
como se puede ver en el recuadro rojo, tambin puede verse que su definicin est entre Function
y End Function

la usamos poniendo dos nmeros como argumento, tal como puede verse
Ahora daremos un ejemplo de una funcin definida por el usuario que tiene ms utilidad.
La ferretera EL BULON hace el 20% de descuento si las ventas superan las 100 unidades.
Esto se puede resolver con la funcin SI, como se puede ver en la siguiente figura

Resolveremos el mismo problema definiendo una funcin, que llamaremos DESCUENTO, con el
siguiente cdigo
ya definida la funcin DESCUENTO() la podemos aplicar

Se ve que el resultado es el mismo, pero si definimos la funcin DESCUENTO el proceso es mas


rpido.
Como se habr notado en el ejemplo anterior, est permitido omitir el tipo de dato, pero es una
buena costumbre ponerlos, ya que nos puede ahorrar muchos problemas principalmente en la
depuracin del cdigo en programas largos (En otros idiomas, como en C, esto es obligatorio) por
surte VBA tiene la posibilidad de forzar el hecho de tener que poner obligatoriamente los tipos de
datos con la instruccin Opcin xplicit al principio de cada mdulo y mejor an, se puede
configurar el editor de VBA para que se ponga automticamente esta instruccin en todos los
nuevos mdulos, esto se hace yendo a Herramientas->Opciones->Solapa Editor y en ella
tildando la casilla Requerir declaracin de variables, como se puede ver en la siguiente imagen
Ahora dar un ejemplo, que si bien puede resolverse con funciones (mas precisamente funciones
matriciales) les puedo asegurar que la solucin es muy complicada y es aqu donde se ve la
verdadera utilidad de las funciones personalizadas. Se trata de la obtencin de las iniciarles de un
nombre completo.
Su cdigo es el siguiente:

usaremos la funcion recien definida en la siguiente tabla


Llegando a este punto debemos hacer algunas aclaraciones del cdigo
En primer lugar podemos ver que se usan las funciones de librera de VBA (funciones que ya estn
definidas), ms precisamente las funciones de cadena Len(), Asc() y Mid(). Una cadena es una
serie de caracteres tratados como una misma unidad, estos caracteres pueden ser letras, nmeros
o caracteres especiales, como pueden ser /, *, &, %, @ y otros muchos incluido el espacio. A todos
estos caracteres les corresponde un cdigo numrico llamado ASCII . Estas funciones sirven
para el manejo de cadenas, hay otras que iremos analizando cuando sea necesario.

Funcin Len
Esta funcin nos devuelve el nmero de caracteres de una cadena, por lo tanto retorna un nmero
entero y recibe un parmetro que es un tipo de dato string.
Su sintaxis es: Len([cadena de caracteres])
Ejemplo: Si Texto="hola como estas" Len(Texto) devuelve el valor 15.

Funcin Asc
Con la funcin Asc podemos obtener el cdigo ASCII de un caracter

Funcin Mid
Extrae partes de una cadena y recibe 3 parmetros.
Sintaxis: Mid(cadena, inicio, longitud)
El parmetro cadena es la cadena a extraer caracteres.
inicio es el carcter desde donde se comienza la extraccin.
longitud es la cantidad de caracteres devueltos a partir del carcter de inicio.
Dicho esto el cdigo se puede entender mas claramente
1 Function INICIALES(Texto As String) As String
2 Dim strLong As Long, i As Long
3 Dim textTemp As String
5 strLong = Len(Texto)
7 For i = 1 To strLong
8 If Asc(Mid(Texto, i, 1)) >= 65 And Asc(Mid(Texto, i, 1)) <= 90 Then
9 textTemp = textTemp & Mid(Texto, i, 1)
9 End If
10 Next i
12 INICIALES = textTemp

14 End Function
Lnea 1: se da el nombre a la funcin (INICIALES) y se define el nombre (Texto) y el tipo del
parmetro que recibe.

Lneas 2 y 3: se declaran las variables que se van a usar.


Lnea 5: se asigna a la variable strLong la longitud del string Texto, o sea que se cuentan cuantos
caracteres hay en la celda que contiene el nombre
Lnea 7: se entra en un ciclo for-Next que recorre el string Texto, o sea que comienza desde 1 y
termina en strLong.
Lnea 8: esta es la lnea ms importante. ya que en cada ciclo se evala cada carcter y determina
si es una letra mayscula (Asc>=65 o Asc<=90).
Lnea 9: Si es mayscula agrega el carcter a la variable strTemp.
Lnea 12: Al terminar la rutina, la funcin INICIALES recibe el valor de strTemp que es donde se
guardan las iniciales.
Para comprobar que funciona dejo el cdigo para copiar y pegar
Function INICIALES(Texto As String) As String
Dim strLong As Long, i As Long
Dim textTemp As String
strLong = Len(Texto)
For i = 1 To strLong
If Asc(Mid(Texto, i, 1)) >= 65 And Asc(Mid(Texto, i, 1)) <= 90 Then
textTemp = textTemp & Mid(Texto, i, 1)
End If
Next i
INICIALES = textTemp

End Function

FUNCIONES DE HOJA( NATIVAS):


Para definir funciones personalizadas, a dems de las funciones propias de VBA , se pueden usar
las llamadas funciones de hoja ( Work Sheet Functions en ingles) tambin llamadas funciones
nativas, es decir las funciones que normalmente estn disponibles en las hojas de Excel, como
son , SUMA, BUSCARV, MAX, PROMEDIO, COINCIDIR, por nombras algunas. Para usarlas
debemos anteponer al nombre de la funcin( que debe estar en ingles) la expresin
Application.WorkSheetFunction.[nombre de la funcin](parmetros).Si queremos usar la funcin
BUACARV, la expresin debe ser:

Application.WorkSheetFunction.VLookup(Valor a buscar, Matriz de bsqueda; Columna, Valor


lgico)
Alternativamente:
WorkSheetFunction.VLookup() o Function.VLookup()
Como se puede ver los parmetros de la funcin son los mismos que los de las funciones nativas
Empezaremos dando un ejemplo en el que se usa la funcin DESREF que en ingles es Match.
Como todos sabemos la funcin BUACARV solo puede traer valores que estn en la misma fila del
valor buscado pero en columnas a la derecha de este, el problema se podria resolver con un
anidamiento de las funciones INDICE y COINCIDIR, nuestro objetivo es definir una funcin muy
parecida a BUSCARV pero que busque hacia la izquierda, a esta funcin la llamaremos
BUSCARVIZQ
Supongamos que tenemos la siguiente tabla
y queremos:
A) Introducir la tabla en una hoja se Excel
B) Que dado el cdigo de producto se devuelva en dos celdas la herramienta y el precio de la
misma
C) No emplear anidamiento de funciones
Como vemos el cdigo del artculo se encuentra en la columna central, por lo tanto para responder
debemos hacer una bsqueda a la izquierda y otra a la derecha, por lo tanto debemos recurrir a
BUSCARV y a una UDF( funcin definida por el usuario) que como ya dijimos llamaremos
BUSCARIZQ que definimos con el siguiente cdigo:
Function BUSCARVIZQ(valor_a_buscar, matriz_de_busqueda As Range, indice_de_Col As Integer,
ValorExacto As Boolean)
Dim NrFila As Long
NrFila = Application.WorksheetFunction.Match(valor_a_buscar, matriz_de_busqueda.Resize( , 1),
ValorExacto)
BUSCARVIZQ = matriz_de_busqueda(NrFila, 1).Offset(0, indice_de_Col)
End Function
ya estamos en condiciones de itroducir la frmula BUSCARIZQ con sus parmetros

que ubicamos en la celda D16 y BUSCARV

que ubicamos en la celda D15, haciendo esto podemos reponder al punto B) como puede verse en
la figura
marcamos con un recuadro rojo la frmula y el rango introducido, que como se ve es el mismo
para ambas frmulas, no as la columna que para BUSCARIZQ es -1

EXPLICACION DEL CODIGO


Function BUSCARVIZQ(valor_a_buscar, matriz_de_busqueda As Range, indice_de_Col As Integer,
ValorExacto As Boolean)
se da el nombre a la funcin y los parmetros, proporcionando el tipo de dato. Notar que no se da
el tipo de dato del parmetro valor_a_buscar ya que este puede ser una cadena de caracteres, un
nmero o una combinacin de ambos. Lo mismo podemos decir del parmetro que devuelve la
funcin

Dim NrFila As Long


Se define la variable NrFila
NrFila = Application.WorksheetFunction.Match(valor_a_buscar, matriz_de_busqueda.Resize( , 1),
ValorExacto)
Se asigna a NrFila lo que devuelve la funcion Match (COINCIDIR) donde se redimenciona
lamatriz_de_busqueda con Recize
matriz_de_busqueda.Resize( , 1)
esto se hace para que la matriz de bsqueda seleccionada, que es rectangular, se transforme en
una matriz columna, ya que Match solo busca en rangos columna.
Veamos cono funciona:
Selection.Resize(12,4).Select
si el rango seleccionado inicialmente es C4:E12 , o sea 8 filas y 3 columnas, luego aplicar Resize el
Rango queda con 12 filas y 4 columnas
en nuestro caso el rango seleccionado es 11 filas y 2 columnas, como a las filas las queremos
dejar igual no se pone nada como primer parmetro y si,ademas, queremos que el rango final sea
de una columna se pone( ,1) as, el rango seleccionado queda un rango columna
Se podra haber omitido el Resize seleccionando solo el rango central, esto se hizo para que los
parmetros sean iguales a los de la funcin BUSCADV, salvo por el -1 de indice_de_Col
finalmente el cdigo
BUSCARVIZQ = matriz_de_busqueda(NrFila, 1).Offset(0, indice_de_Col)
asigna a BUSCARVIZQ el valor que est en la celda activa matriz_de_busqueda(NrFila,
1)desplazada una celda a la izquierda(indice_de_Col ). Esto se logra con la PROPIEDAD Offset que
seleciona celdas a cierta distancia de la celda activa
por ejemplo:
ActiveCell.Offset(-5,2).Select
selecciona la celda que se encuentra 5 filas hacia arriba y 2 columnas a la derecha de la celda
activa.
de otra manera:
Sheets(1).Range("C2").Offset(2,4).Select
a partir de C2 selecciona 2 filas hacia abajo y 4 columnas a la derecha, es decir C2 pasa a ser
G4(C2 = G4), tener en cuenta que 2 es fila y 4 columna.

como se ve Offset hace lo mismo que DESREF.


La programacin VBA tiene sus propias funciones como Mid y Len, que ya se describieron, estas
permiten trabajar con cadenas de caracteres, con nmeros, fechas, horas, mostrar mensajes por
pantalla y muchas otras que podemos listar por categoras, como sigue:
1-Funciones de conversin de tipos (Conversion)
2-Funciones Financieras (Financial)
3-Funciones de cadenas (Strings)
4-Funciones matemticas (Math)
5-Funciones de comprobacin (Information)
6-Funciones de Interaccin(Interaction)
7-Funciones de Fecha y Hora (DateTime)
8-funciones del sistema (FileSystem)

funciones de conversion de tipo

Estas funciones convierten una proposicion lgica o expresion en un tipo de dato especfico
Su sintxis es:
CBool(expr)
CByte(expr)
CMoneda(expr)
CFecha(expr)
CDoble(expr)
CDec(expr)
CEntero(expr)
CLargo(expr)
CSimple(expr)
CCadena(expr)
CVariante(expr)

Macros
INTRODUCCION:
Las macros son pequeos trozos de cdigo VBA que no deberan tener ms de 15 lneas y no
devuelven un valor en su nombre, como las funciones, sino que hacen tareas especificas, estas
tareas muchas veces pueden realizase manualmente y otras no, en definitiva sirven para
automatizar Excel. Las macros pueden vincularse entre s mediante la palabra recervada Call y de
esta forma unirse para formar cdigos mas grandes
Estos cdigos por lo general se ejecutan a pedido del operador, pero tambin pueden hacerlo
automticamente, una forma es debido a que se produzca algn cambio en una hoja de Excel,
como puede ser el cambio en el valor de una celda. A estos cambios se los denomina EVENTOS y
para que se ejecuten las macros, hay que programar dichos EVENTOS.
La forma ms prctica de poner en accin una macro es mediante botones asociados a ellas. Para
hacerlo vamos a la pestaa programador y de all pulsamos el botn Insertar para que se
desplieguen los controles de formulario, como se ve en la figura

al apretar el cono del botn aparece una cruz, ubicamos esta cruz en el lugar que nos parece
conveniente y arrastrndola, con el botn izquierdo del mouse apretado, podemos darle el tamao
adecuado. Al soltar el mouse tenemos algo parecido a esta imagen

simultneamente aparece un panel donde podemos seleccionar la macro que queremos asociar
al aceptar ya tenemos el botn asociado a la macro, posteriormente lo podemos rotular
convenientemente.
A continuacion daremos un ejemplo prctico simple:
Un banco quiere dar de baja las cuentas que no tuvieron movimientos por 3 o ms aos,
considerndolas inactivas en dicho caso y activas en caso contrario.
El banco tiene un listado con las cuentas activas y no activas

Se quiere actualizar dicho listado, o sea eliminar las cuentas inactivas


Este listado tiene 14 clientes y se lo podra actualizar manualmente, pero si imaginamos que la
lista tiene 5000 o ms clientes, se tardara mucho tiempo, por tal motivo es un problema para
resolver con una macro.
Coloquemos la lista en la hoja 1 de un libro de Excel 2007 o Excel 2003

insetamos el siguiente cdigo

Luego de de oprimir el botn que asociamos a la macro, que llamamos ActualizarListado, el listado
queda
Cdigo para copiar y pegar
Sub ActualizarListado()
Range("E3").Select
Do While ActiveCell.Value <> ""
If ActiveCell.Value = "inactiva" Then
Selection.EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
Range("A1").Select
End Sub

Cuando se dispara una macro no hay vuelta atrs, si se borra un dato, este se pierde(a no ser que
se cierre el archivo no se guarden los cambios y se lo abra otra vez). Muchas veces podemos
necesitar el listado original, por ejemplo para obtener, en el caso que estamos tratando, otro con
los clientes que fueron dados de baja, el que se hara con una macro casi idntica a la dada ms
arriba, que dicho sea de paso la confeccion un empleado del rea de computacin del banco, al
que le pidieron las dos listas a ltimo momento. Cacho (as le dicen al empleado), que por suerte
no haba apretado el botn ACTUALIZAR, decidi hacer las dos cosas al mismo tiempo, es decir:
dejar en la Hoja1un listado con los clientes activos y en la Hoja2 los clientes dados de baja, a esta
hoja la renombro "Bajas", tambin copio como respaldo, el listado original en la Hoja3. Cuando
termin el trabajo le quedaron las siguientes macros
y para el rtulo de "Bajas"

"CopiaRotulo" es llamada por "ActualizarListado2" mediante la palabra reservada "Call"


Las dos listas quedaron como se ve
Lista de los clientes activos

Lista de los clientes dados de baja

Cacho pens que despus de todo, se hubiera tomado menos trabajo cerrando el archivo y
abrindolo otra vez, aunque pensndolo mejor se dijo "ya tengo hecha la macro y seguro que la
voy a volver a usar.
Si, seguro que la iba a volver usar y esta vez todo el trabajo sera ms rpido.
Macros para copiar y pegar
Option Explicit
Sub ActualizarListado2()
Dim i As Integer
Dim k As Integer
k=1
Dim j As Integer
j=1
Call CopiaRotulo
Sheets("Hoja1").Select
Application.CutCopyMode = False
Range("E3").Select
Do While ActiveCell.Value <> ""
If ActiveCell.Value = "inactiva" Then
Sheets("Bajas").Select
Range("E65536").End(xlUp).Offset(1, 0).Select
i = ActiveCell.Row
Range("C" & i).Value = Worksheets("hoja1").Range("C" & i + k - j).Value
Range("C" & i).Interior.ColorIndex = 24
Range("C" & i).Borders(xlEdgeBottom).LineStyle = xlContinuous
Range("C" & i).Borders(xlEdgeLeft).LineStyle = xlContinuous
Range("C" & i).Borders(xlEdgeTop).LineStyle = xlContinuous
Range("D" & i).Value = Worksheets("hoja1").Range("D" & i + k - j).Value
Range("D" & i).Interior.ColorIndex = 24
Range("D" & i).Borders(xlEdgeBottom).LineStyle = xlContinuous
Range("D" & i).Borders(xlEdgeLeft).LineStyle = xlContinuous
Range("D" & i).Borders(xlEdgeTop).LineStyle = xlContinuous
Columns("D:D").EntireColumn.AutoFit
Range("E" & i).Value = Worksheets("hoja1").Range("E" & i + k - j).Value
Range("E" & i).Interior.ColorIndex = 24
Range("E" & i).Borders(xlEdgeBottom).LineStyle = xlContinuous
Range("E" & i).Borders(xlEdgeLeft).LineStyle = xlContinuous
Range("E" & i).Borders(xlEdgeTop).LineStyle = xlContinuous
Range("E" & i).Borders(xlEdgeRight).LineStyle = xlContinuous
j=j+1
Range("A1").Select
Sheets("Hoja1").Select
Selection.EntireRow.Delete
Else
k=k+1
ActiveCell.Offset(1, 0).Select
End If
Loop
Range("A1").Select
End Sub
Option Explicit
Sub CopiaRotulo()
Range("C2:E2").Select
Selection.Copy
Sheets("Bajas").Select
Range("C2").Select
ActiveSheet.Paste
Columns("C:C").EntireColumn.AutoFit
Columns("D:D").EntireColumn.AutoFit
Columns("E:E").EntireColumn.AutoFit

End Sub
Nos podramos preguntar de donde se sac la tabla que uso Cacho, bueno, esta es realidad una
base de datos de la cual se ha obtenido la que tiene el rtulo ESTADO (cuenta activa, cuenta
inactiva). La BASE DE DATOS se obtiene de los FORMULARIOS que tenemos que llenar cuando
decidimos sacar una cuenta corriente en un banco
Este es un modelo real de formulario para la solicitud de una cuenta bancaria de una empresa
De la misma manera, una empresa, podra generar su propia BASE DE DATOS de clientes,
recurriendo a la capacidad que tiene Excel para generar FORMULARIOS, o podramos crear un
directorio telefnico y esto es justamente lo que haremos en el prximo ejemplo de macros pero
sin recurrir a los formularios, tema que dejaremos para despues..
En adelante, como se vio en caso del empleado del banco (Cacho), procurar presentar casos de
la vida cotidiana, con los que se puede encontrar el empleado de una empresa, o de una pyme,
situaciones con las que frecuentemente se ven involucrados profesionales de cualquier
orientacin o de un usuario que en realidad no sabe que esta frente a una aplicacin Excel

EJEMPLOS PRACTICOS DE MACROS Y CODIGO VBA


DIRECTORIO TELEFONICO
Se puede encarar el problema anterior usando formularios, este mtodo tiene la desventaja de que
el cdigo se complica un poco, lo que no debera sorprendernos ya que una celda es un objeto
mas simple, pero como veremos, las ventajas superan a las desventajas
DIRECTORIO TELEFONICO ( USANDO FORMULARIOS)

CONSULTA EN UNA LIBRERIA

CONSULTA EN UNA LIBRERIA (USANDO FORMULARIOS)

TICKET DE COMPRA

COMBOBOX (CUADRO COMBINADO) ORDENADO ALFABRTICAMENTE

ALTAS, BAJAS Y MODIFICACIONES

INFORMES
DIRECTORIO TELEFONICO

Este directorio telefnico se har sin recurrir a formularios, simplemente pasaremos los datos que
introducimos en tres celdas en la Hoja1 y los pasaremos a la Hoja2, que llamaremos DIRECTORIO

Colocamos los rtulos verticalmente en las celdas coloreadas en azul y en las celdas F6,F7,F8 los
datos que sern pasados a la Hoja DIRECTIRIO pero colocados horizontalmente, luego de aplicar
la macro, disparada con el botn INTRODUCIR DATOS, todo debe quedar como se ve en la figura
de abajo

A medida que se van agregando datos, se va formando el directorio


para hacer esto utilizaremos la siguiente macro en el mdulo 1

Para consultar el telfono y la direccin de alguna persona, en esta ocasin lo haremos utilizando
frmulas
colocamos en la celda B6, el apellido y nombre de la persona cuyos datos queremos obtener y en
la celda B7 la frmula

para obtener el telfono y para la direccin la frmula

si la persona no est en el directorio aparece la leyenda "NO ESTA EN EL DIRECTORIO" como


muestra la figura

Descargar DIRECTORIO TELEFONICO


DIRECTORIO TELEFONICO (usando formularios)

Este directorio telefnico se har usando FORMULARIOS


Esta manera de encarar el problema tiene ms ventajas ya que con un solo formulario podremos
introducir los datos de nuestros contactos, consultarlos y darlos de baja. Por otro lado se puede
dar al formulario un aspecto ms profesional, lo que ser de mucha utilidad cuando se encaren
problemas ms complejos
Accedemos al formulario entrando al editor VBA (Alt+F11) luego vamos a Insertar y en el men
desplegable que se abre pulsamos en UserForm

y aparece el formulario y los controles con los que podemos configurarlo


Para nuestro formulario vamos a utilizar los comandos: Etiqueta ( Label) Cuadro de texto
(TextBox) y botn de comando ( CommandButton) marcados en rojo en la imagen, estos
comandos estn numerados segun el orden en que los `pnemos

con cada uno de ellos se insertan objetos cuyas propiedades se pueden cambiar en el explorador
de propiedades ( tambin puede hacerse con cdigo), Para que aparezca las propiedades de cada
objeto solo debemos pulsar en ellos, por ejemplo en la figura pueden verse las propiedades de un
botn al que se le han cambiado las propiedades Name y Caption, cada una de ellas tiene un
nombres por defecto; por ejemplo en la propiedad Caption pusimos" INSERTAR" (pues con este
botn insertaremos los datos) y en nombre "cmdInsertar" . Esto es muy importante a la hora de
programar porque ayuda la claridad del cdigo (aunque ahora que lo pienso, hubiera sido ms
claro poner "btnInsertar", esto es a nuestro criterio), hemos hecho lo mismo son los otros
controles por ejemplo al TextBox1 lo cambiamos por txtApellidoNombre.

Como el formulario en si mismo tambin es un objeto le cambiamos el nombre por "usfDirectorio"


al que le cambiamos la propiedad Caption por "DIRECTORIO TELEFONICO" .

Tambin nos har falta insertar un mdulo al que llamaremos " MostrarFormulario" en el que
pondremos este cdigo

se asignar a un botn en la Hoja1


que disparar la macro Iniciar_Captura y como consecuencia se mostrara el formulario de la
figura

Ahora lo que nos resta hacer es programar todos los botones, que como puede verse no nos
hemos privado a la hora de ponerlos, la razn es que este directorio se puede adaptar para llenar y
mantener una base de datos.
Debemos notar que solo hemos usado tres controles.
Para que los botones funcionen hay que hacer Click en ellos, entonces debeos programar el
evento Click y para hacerlo hay dos maneras: hacer doble click en el objeto "cmdInsertar" o pulsar
en este mismo objeto, con el botn derecho del mouse para que aparezca men en el que
apretamos la tecla ver cdigo
en ambos casos vamos a la siguiente pantalla

donde podemos ver en la parte superior, el nombre del botn y el evento Click y el nombre de la
macro "cmdInsertar_Click" lista para que la programemos. Hay otros eventos a los que podramos
acceder
pero en este caso nos interesa el evento Cick. Tambin podemos ver haciendo doble click en el
formulario( o con el botn derecho del mouse) todos los objetos que tenemos dentro del mismo

de esta manera haciendo doble Click en cada uno de los 6 botones podemos programarlos como
puede verse abajo
En programacin no hay una sola forma de hacer las cosas, y es probable que haya otro algoritmo
ms eficiente, el que est arriba me pareci fcil de entender, pero ms adelante haremos otra
versin

CONSULTA EN UNA LIBRERIA

Una de las tantas veces que fui a una librera, me encontr con una computadora en la que se
podan consultar, entre otras cosas, los libros que haba en existencia, de un determinado autor.
No s cmo lo habrn hecho pero ahora lo vamos a hacer con las macros de Excel en una suerte
de interaccin usuario computadora.
Lo primero que hacemos es renombrar tres hojas como se ve en la figura

"PRINCIPAL" es la pantalla con la que se encuentra el eventual comprador al iniciar su consulta.


Para que tenga un aspecto ms profesional hemos diseado la pgina quitado los encabezados de
fila y columna y puesto la pantalla completa, tambin hemos colocado un cartel que oriente al
cliente y un botn. Luego de poner un color que me pareci adecuado, finalmente la pgina quedo
como se muestra

El BOTON DE CONSLTA tiene adjuntada la macro principal en el mdulo1 y hay otras dos
macros en el mdulo 2 y 3 como se puede ver el inspector de proyectos
"AUTORES" es la hoja donde se debera poner una base de datos con todos los autores sus
respectivos libros y el precio de cada uno. Dije se debera colocar una base de datos yo me voy a
conformar colocando una tabla con algunos autores de ciencia ficcin, genero que, por cierto, me
gusta mucho
TABLA 1

no son muchos datos pero servirn


AUTOR es la pgina donde va a ir una tabla solo con los datos del autor consultado. Por ejemplo si
se pregunta por Ray Bradbury la tabla debera ser
TABLA 2
que es el resultado de la consulta. Si se quiere hacer otra consulta se debe vaciar la tabla anterior
y volver a la pgina principal, esto se hace con un botn que llamaremos NUEVA CONSULTA
que est asociado a una macro ubicada en el mdulo3
TABLA 3

Lo que ve al usuario despus de apretar el BOTON DE CONSULTA es una pantalla que le pide
que introduzca un autor

al aceptar vamos a la pgina "AUTOR", con el resultado de la consulta como se ve en la TASLA 2


Lo que nos resta es decir cul es el cdigo de las macros que van en los mdulos

mdulo1
mdulo2

mdulo3

Como se puede ver, esta no es una macro aislada sino una aplicacin completa con cierto aspecto
profesional, que por cierto, puede mejorarse

CONSULTA EN LIBRERIA (usando formularios)

La consulta de un autor en una librera usando formularios, es una aplicacin completa muy
similar a la que no los usa, podramos decir que es solo la manera en que se muestran los
informes, aun as podremos aprender muchas cosas tiles que nos podrn servir en el futuro
Empezamos cambiando el nombre de tres Hojas como se ve en la figura

El consultante solo va a ver la Hoja "INFORME" que tiene el siguiente aspecto


en esta agregamos un calendario y un reloj en la parte superior, aparte de dos imgenes alusivas a
los libros, por otro lado la pgina se abre en pantalla completa y como se puede ver est el
"BOTON DE CONSULTA" donde al apretarlo aparece la pantalla para ingresar el autor a consultar.

Y aqu viene la diferencia, luego de aceptar aparece otra pantalla con el informe
Esta pantalla no es otra cosa que un formulario que contiene un cuadro de lista y el botn
"VUEVO INFORME" para hacer otra consulta,
Vamos a las macro: en la imagen podemos ver el inspector de proyectos

Como se ve tenemos muchos lugares donde colocar las macros como sin ThisWorkbook,
UserForm1 y los mdulos Copia Rotulo, LimpiaInforme, "MuestraFormulario" y "Principal"

En ThisWorkbook ponemos la macro para la fecha, reloj y pantalla completa seleccionando el


evento open del objeto Workbook (se bebe hacer clik en la pantalla)
En el UserForm1 hay dos objetos:
1- ComandButton1: este objeto es el botn cuya etiqueta es "NUEVO INFORME". En el Inspector
de "Propiedades" se pueden cambiar estos nombres a otros, que por alguna razn, consideremos
convenientes. En este caso dejamos la propiedad (Name) en su valor por defecto y a la propiedad
"caption" le dimos el valor "NUEVO INFORME" , como se puede ver en la figura.

Este objeto pertenece a la clase "CommandButton" como cualquier botn que est en un
formulario
2-ListBox1: pertenece a la clase "ListBox" y no hemos cambiado su nombre por defecto como se
muestra en la figura
Como vemos en la imagen estos dos objetos pertenecen a una clase mas general llamada
UserForm

Lo expuesto es fundamental para programar los objetos y sus eventos

Para programar ComandButton1 lo seleccionamos y elegimos el evento Click

Captamos los datos de la consulta inicializando el "UserForm"

Finalmente las macros quedan as


MODULOS
Se insertaron cuatro mdulos con distintos nombres para mayor claridad
1-MuestraFormulario: esta simple macro ser llamada por Principal, para que mustre la pantalla
con el informe

2- LimpiaInforme : esta macro (Macro1) limoia los datos del rango "LIBROS" que est en la Hoja
"AUTOR"
3 Copia Rotulo: en este ndulo est la macro "CopiaRotulo" cuya funcin es copiar el rtulo de
la base de datos de la Hoja"autores" (en nuestro caso es una tabla) en la Hoja "AUTOR"

4-"Principal": este mdulo tiene la macro "LibrosAutor" que es casi idntica a la macro principal
de CONSULTA EN UNA LIBRERIA , la diferencia es que al final, cuando se sale del while, se
llama a la macro "MostrarFormulario" como se muestra con la flecha
TICKET DE COMPRA
Este es un tutorial que programa los tickets de compra de un supuesto delivey que vende plantas
y flores, llamadoBestFlowers, este negocio pega estos Tickets en las cajas donde pone la
mercadera con el detalle de los productos y su importe antes de enviarlos a destino.
Una caracterstica, general de los tickets es su baja calidad esttica y de impresin, con Excel esto
se mejora ya que se pueden insertar imgenes de logotipos o hacerlos con WordArt y tiene a su
disposicin una amplia variedad de fuentes, por otro lado la impresin se har con una impresora
comn, papel de alta densidad y no con una ticketeadora (que por cierto tiene otras ventajas). Otra
caracterstica de los tickets es que no se dejan filas vacas, como pasa con las facturas, nuestro
ticket cumplir con esto tambin. Veamos dos ejemplos de lo que tenemos que hacer
;
.
como se ve los nmeros de ticket son consecutivos y no hay filas vacas ya que estas se agregan
a medida que se integran nuevos productos. Obviamente para imprimir el segundo ticket hay que
vaciar los contenidos del primero.
Para agregar filas se parte poniendo en la fila 12 las siguientes frmulas:
Celda B12:

Celda D12:

estas frmulas deben ser copiadas, automticamente, a las celdas B13 y D13 al colocar el cdigo
de un producto en la celda A13, completndose la fila al colocar la cantidad de unidades. El
proceso continua a medida que se agregan nuevos cdigos en las filas subsiguientes.
Estas acciones se hacen con la siguientes macros "Copiaformula" (mdulo 1) y "AgregaFila"
(mdulo 2).las cuales deben entrar en accin sin nuestra intervencin, puesto que de lo contrario
se perdera el carcter automtico.
Para hacer esto, "Copiaformula" y "AgregaFila" deben ser llamadas dentro de otra macro que se
activa cuando en un objeto cambia alguna propiedad, En nuestro caso puede ser el cambio de las
celdas D13 a D33 de la Hoja1, que podran cambian de estar vacas a tener el cdigo de un
producto en su interior. A este cambio se lo denomina EVENTO, en este caso nos interesa los
eventos de las Hojas o "Worksheet events" que responden a cambios en una Hoja, como el cambio
en una celda o rango de celdas (en nuestro caso sera el rango D13 : D33), pero este no es el nico
evento. Podemos unvestigar todos los eventos disponibles para Worksheet, para esto hacemos
doble click en la Hoja1 del esplorador de proyectos veremos que si desplegamos la ventana
"General" aparecer el objeto Worksheet asociado solo a esta Hoja, como se ve en la imagen

y haciendo click en el botn desplegable de la ventana que est al lado podemos elegir entre todos
los eventos del objeto Worksheet
por defecto est "SelectionChange", que es el evento que se produce cuando se selecciona una
celda o un rango de celdas. Pero podramos haber usado cualquier otro de la lista que
considerasemos conveniente, en nuestro caso elegimos Change y automticamente se genera la
macro "Workseet_Change"

que es la que tiene que llamar a "Copiaformula" y "AgregaFila". Finalmente la macro


Worcksheet_Change es la siguiente, una vez que se le inserta el cdigo

Nos falta hacer dos cosas, indispensables para que nuestro Ticket este preparado para un prximo
cliente, vaciar su contenido e incrementar su numeracin en una unidad.

Vaciar el contenido del Ticket


Para vaciar el contenido, vamos a la pestaa "Programador" y en la seccin "Controles" pulsamos
"ModoDiseo y luego "Insertar" para insertar un botn Active x.
que colocamos en el lugar que nos parezca conveniente

Pulsando en "propiedades" podemos cambiar la propiedad Caption por Borrar y tambin cambiar
el nombre con que se lo identifica por "cmdBorrar" en lugar de "CommandButton1", esto ltimo es
una buena costumbre ya que si hubieran muchos botones(cosa que ocurre con mucha frecuencia)
podramos identificar rpidamente su funcin
El "cmdBorrar" es un objeto y est disponible en la ventana de objetos, luego haciendo click en el
botn desplegable lo seleccionamos y elegimos el evento Click.

Como antes aparece una macro "cmdBorrar_Click" automticamente

en la que se llama a la macro "Borrar", cuyo cdigo es


Incrementar automaticamente el N del Ticket
Aqu tambin recurrimos a objetos y eventos. El objeto es el libro que contiene la "Hoja1" donde
est el ticket, por lo tanto hacemos doble click en "ThisWorkBook" seleccionamos el objeto"
WorkBook" y como evento "beforePrint", como se puede ver en el editor VBA, o sea que despus
de imprimir el Ticket, este cambia la numeracin

Finalmente el cdigo que ponemos es


Una cosa importante es no olvidarse, despus de imprimir, de vaciar los contenidos con el botn
Borrar.

COMBOBOX(CUADRO COMBINADO)ORDENADO
ALFABETICAMENTE

Es muy til ordenar un ComboBox alfabticamente, porque nos facilita enormemente encontrar los
datos, espacialmente cuando estos son muchos.
Supongamos que una agencia de alquiler de autos tiene todo su stock cargado en un ComboBox
inserto en un FORMULARIO, de manera tal que cuando se elige un marca aparezcan todas sus
caractersticas, tales como: estado, ao, kilometraje, color, si esta en servicio o en el taller, si tiene
aire acondicionado, etc. Las marcas y modelos se buscaran por orden alfabtico en un cuadro
combinado, apareciendo las caractersticas en los respectivos cuadros de texto (textBox). Para
esto la agencia disponen de una planilla con los datos antes mencionados que sern la fuente de
donde se cargar el ComboBox, como se muestra en la figura
el listado podra ser mucho ms extenso amplindolo mediante otro formulario.
Como se puede ver la planilla tiene 7 columnas, por lo tanto debemos elegir por cul de ellas se
har el orden. En este caso nos decidimos por la columna "B" en orden ascendente.
Empezamos abriendo el editor de VBA (Alt+F11) y diseamos un Formulario al que renombramos
"usfMarcasyModelos", asimismo insertamos el modulo1 y el modulo2. El Formulario deber ser
semejante al de la figura.

Luego cambiamos los nombres de los objetosTextBox1, TextBox2, TextBox3, TextBox4, TextBox5,
TextBox6 por txtCodigo, txtAo, txtColor, txtAire, txtDisponibilidad, txtUbicacion respectivamente
y al ComboBox1 por cmbMarcaModelo. Estos cambios de nombres son muy tiles para saber qu
es lo que contiene cada TextBox, en especial cuando hay muchos. Lo siguiente es cargar el
ComboBox con la columna
segn la cual queremos hacer el orden, para esto hacemos doble cick en el formulario(que es un
objeto) y nos aparece por defecto lo siguiente

que nos invita a programar el UserForm con el evento click, pero nosotros queremos el evento
initialize, por lo tanto lo buscamos en la parte superior derecha (donde dice click)

apareciendo, una vez borrada la macro "Userform_Click, la macro que tenemos que programar

seguidamente insertamos el siguiente cdigo


a estas alturas ya tenemos cargado nuestro Cuadro Combinado pero sin estar ordenado
alfabeticamente

Para que esto ocurra debemos llamar a la macro ordenar_arrastre, sealada por la flecha(ubicada
en el mdulo2)
descomentando la lnea de la flecha roja. Ahora s aparece ordenado

Casi lo nico que nos falta es programar una macro para que aparezca el estado del vehculo con
sus caractersticas, esta macro involucra al objeto "cmbMarcaModelo" y al evento "change"
Lo que viene es asignar una macro a un boton ( en la Hoja1) para que aparezca el Formulario

y para terminar progra mar el botn "SALIR"

Esto es todo, en el prximo TUTORIAL veremos cmo agregar datos a la planilla y que estos sigan
ordenados.
ALTAS, BAJAS Y MODIFICACIONES

No se me ocurre que una empresa puede no necesitar una aplicacin de ALTAS, BAJAS Y
MODIFICACIONES, en nuestro caso continuaremos con la empresa de renta de autos, que
apropsito se llama RODANDO RENTA CAR.
La descripcin de la aplicacin consiste en cuatro botones que al oprimirlos hacen surgir cuatro
pantallas (formularios), el primero muestra en que situacin se encuentra cada vehculo en el
momento presente. El segundo es el formulario de ALTAS, el tercero el de MODIFICACIONES y por
ltimo el de BAJAS, como se muestra

FLOTA DE VEHICULOS (consulta)


En esta pantalla se busca la marca y modelo del vehculo que aparece en una lista ordenada
alfabticamente en forma descendente en un comboBox, luego de seleccionar un vehculo,
aparecen algunas caractersticas del mismo que le pueden interesar al cliente; entre otras, una
foto y si esta disponible para ser alquilado( textBox DISPONIBLE) etc.
AGREGAR VEHICULOS
En esta pantalla se agregan nuevas unidades, en este punto se existe la posibilidad de agregar una
misma marca y modelo, pudiendo surgir un problema si no se los diferencia de alguna manera ya
que al buscarlos y querer hacer una consulta sobre ellos, solo aparecer el primero que este en la
lista. La solucin es muy simple, tomemos como ejemplo el SALEEN S331, si quisiramos agrega
el mismo modelo podramos diferenciarlo ponindole el nombre SALEEN S331-2, como se ve en la
imagen

.de esta manera aparecen las dos unidades.


CAMBIAR ESTADO DE UN VEHICULO
Aqu el vehculo ha cambiado el estado de estar en disposicin de ser alquilado a lo contrario.

SACAR VEHICULO DE LA FLOTA

Esta es la pantalla en la que por mltiples motivos se considera que el vehculo ya no puede
pertenecer a la flota (destruccin total, mucho kilometraje, modelo antiguo, etc.)
Es de fundamental importancia que cuando se haga algn cambio en las pantallas de ALTAS,
BAJAS o MODIFICACIONES, este se actualice inmediatamente en cualquiera de los formularios.
Tambin hay una advertencia en la pantalla de altas que nos alerta si algn campo quedo sin
llenar, otra advertencia en la pantalla de modificaciones que tambin nos advierte si estamos
seguros de las modificaciones que hicimos y por ltimo una advertencia en la pantalla de bajas
que nos dice si estamos seguros de la eliminacin.
Debo aclarar que las fotos de los autos se deben colocar en este caso en una carpeta junto con el
archivo de la aplicacin, esto no sera necesario si ponemos la ruta completa donde se encuentra
la carpeta con los vehculos siendo muy sencilla la modificacin del cdigo.
Por ltimo podramos insertar la totalidad de la flota desde el formulario de ALTAS.
Ahora vamos a mostrar los cdigos correspondientes a cada uno de los FORMULARIOS, con
algunos comentarios
CODIGO DE FLOTA DE VEHICULOS (INFORME)
CODIGO DE ALTAS
CODIGO DE BAJAS
CODIGO DE MODIFICACIONES
Como ya se dijo, al descargar el archivo, poner las imgenes en la misma carpeta que la
aplicacin. He puesto muchas imgines para que se puedan agregar y eliminar.

INFORME SOLICITADO POR UN USUARIO

Una de las cosas ms importantes que una buena aplicacin puede brindarnos es una correcta y
abundante informacin, en la que juega un papel central la correcta actualizacin de los datos
(ALTAS BAJA Y MODIFICACIONES).
Vamos a hacer un informe solicitado por un usuario: si un cliente desea alquilar un SEDAN, el
programa debera poder informar si hay disponibilidad de algn vehculo de este tipo y de no
haberla, la fecha ms cercana para la cual podremos disponer de uno (este informe no lo daremos
aqu), solo por dar un ejemplo de las preguntas que se pueden formular y las respuestas que el
programa puede dar.
Siguiendo el ejemplo, un cliente podra solicitar un SEDAN de cualquier marca, sera interesante
que se desplegara una pantalla informando si hay uno o no; pues esto, no muy complicado, es lo
que ser nuestro primer informe, en este caso los datos estn en la hoja Flota.

PANTALLA PRINCIPAL: al apretar el botn "TIPO DE VEHICULO EN AGENCIA" aparecer la


pantalla emergente donde quien maneja el programa puede introducir el tipo de vehculo
solicitado, en este caso un SEDAN, luego de oprimir el botn aceptar

debe aparecer una pantalla con la informacin


para suerte del cliente hay 2 SEDANES disponibles, uno gris y otro rojo. Podamos haber incluido
en la pantalla el modelo, que es una informacin que podra Interesar. Si apareciera la pantalla en
blanco significa que no hay ningn SEDAN en la agencia, aunque sera mas prolijo que apareciera
la leyenda " EL MODELO SOLICITADO NO ESTA DOSPONIBLE" o " LA AGENCIA NO DIPONE DE
ESE MODELO" o mejor an " LO SENTIMOS, EN LA AGENCIA NO HAY UN MODELO SEDAN", nos
decidimos por esta ltima leyenda. Hacer esto es muy simple, solo hay que modificar un poco el
cdigo que ya existente.
Cambiamos el siguiente trozo de cdigo cuando se sale del Loop

por este otro


Tambin debemos agregar un userform2 codificado como sigue

Con estos cabios cuando preguntamos por un modelo que la agencia no tiene, por ejemplo
"RURAL", aparece la siguiente pantalla

que queda mucho mejor que una pantalla vaca

Вам также может понравиться