Programacion Vba para Excel
Programacion Vba para Excel
Programacion Vba para Excel
INTRODUCCION:
Si bien la grabadora de macros es muy útil y genera un código siempre correcto, tiene dos
desventajas:
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)
no tiene espacios y termina con "( )" . 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, luego pulsamos en "ejecutar"
y despues en el icono , o seleccionando " Alta + F5 que nos lleva a la pantalla con el
resultado
y si lo queremos borrar
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
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:="César", 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 códigos se pueden verificar con la grabadora de Macros.
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, 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, 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 función, 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 función y el paréntesis 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 líneas de código de repiten muchas veces con el consiguiente aumento
del tamaño del programa. Esto se solucionado mediante los llamados estructuras de iteración,
también llamadas ciclos de repetición 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
Macros
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.
Para explicar While - Wend me parece que lo mejor es dar un ejemplo en el que iremos analizando
cada línea de código.
Vamos a sumar un rango de números que están ubicados en una columna. 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.
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
Se puede ver que los resultados en la celda activa y en la caja de mensajes coinciden.
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.
Para explicar Do-Wile-Loop utilizaremos el mismo ejemplo que en la estructura While-Wend.
Vamos a sumar un rango de números que están ubicados en una columna. 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.
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
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.
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 números que están
ubicados en una columna. 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-While-
Loop 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
Se puede ver que los resultados en la celda activa y en la caja de mensajes coinciden.
INTRODUCCION:
Esta es una iteración en la que sabemos de antemano cuantas veces se repetirá el ciclo, por lo
tanto no hace falta una condición para salir del mismo.
Para explicar For daremos un ejemplo muy simple:
Vamos a sumar los primeros 10 números naturales. En la hoja de cálculo solo debemos poner los
números (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 vacía , este debe ser 55 como se
puede verificar haciendo la suma manualmente.
Aprovechando las propiedades de For podemos poner los números desde el código
el programa VBA es
Código:
La parte más importante del código es
que significa: para cada celda del rango A1:D4 ejecutar el bloque
Este código 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 podría haber seleccionado cualquier otra
en la que
INTRODUCCION:
La estructura de decisión se llama así pues puede, luego de evaluar una condición, ejecutar un
bloque de código u otro.
Vamos a ver algunos ejemplos;
1- Comparar 2 números 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
Esta estructura puede anidarse, lo que quiere decir poner otro If en la línea 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
Código:
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
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 código no está identado por lo que sugiero hacerlo como ejercicio.
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, a veces el código suele hacerse confuso y frecuentemente
da lugar a errores, en estos casos se puede recurrir a la estructura de decisión 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 comparábamos 2 números ubicados en las celdas D1 y
E1 y el programa debía responder si estos son iguales, mayores o menores, 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 = , > 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 evalúan 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 código
INTRODUCCION:
Una variable simple es una porción de memoria donde se puede almacenar un valor y se les debe
dar un nombre para identificarlas entre sí, también están 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 código inserto en el programa principal que recibe uno, muchos o
ningún valor (parámetros o argumentos) y que a diferencia de las subrutinas devuelven un único
valor, por esta razón 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. También nos permiten ampliar el listado de las funciones que ya vienen por
defecto en Excel, estas funciones están asociadas a un libro o una hoja de Excel y las
denominamos Funciones personalizadas, son muy útiles,entre otras cosas, cuando la fórmula que
se requiere para resolver un problema usando las funciones propias de las hojas Excel resulta
muy larga y complicada, haciendo casi imposible su comprensión.
Funciones personalizadas:
Empezaremos dando un ejemplo trivial de una función personalizada que podríamos resolver sin
recurrir a ellas, este ejemplo es solo para mostrar como funcionan.
Supongamos que queremos multiplicar 2 números enteros (en la figura el entero 12 y el 2)que
están en las celdas A1 y C1 y que el resultado se devuelva en la celda B3, que obviamente se
resuelve con la fórmula =A1*C1 ubicada en la celda B3, mentalmente podemos decir que el
resultado es 24
pero lo haremos con una función definida por nosotros programada con VBA que llamaremos
MULTIPLICA()
Esta función ya esta disponible junto con las demás,(solamente en la hoja donde la definimos)
como se puede ver en el recuadro rojo, también puede verse que su definición está entre Function
y End Function
la usamos poniendo dos números como argumento, tal como puede verse
Ahora daremos un ejemplo de una función definida por el usuario que tiene más utilidad.
La ferretería EL BULON hace el 20% de descuento si las ventas superan las 100 unidades.
Esto se puede resolver con la función SI, como se puede ver en la siguiente figura
Resolveremos el mismo problema definiendo una función, que llamaremos DESCUENTO, con el
siguiente código
ya definida la función DESCUENTO() la podemos aplicar
Función Len
Esta función nos devuelve el número de caracteres de una cadena, por lo tanto retorna un número
entero y recibe un parámetro 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.
Función Asc
Con la función Asc podemos obtener el código ASCII de un caracter
Función Mid
Extrae partes de una cadena y recibe 3 parámetros.
Sintaxis: Mid(cadena, inicio, longitud)
El parámetro cadena es la cadena a extraer caracteres.
inicio es el carácter desde donde se comienza la extracción.
longitud es la cantidad de caracteres devueltos a partir del carácter de inicio.
Dicho esto el código 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
Línea 1: se da el nombre a la función (INICIALES) y se define el nombre (Texto) y el tipo del
parámetro que recibe.
End Function
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 fórmula y el rango introducido, que como se ve es el mismo
para ambas fórmulas, no así la columna que para BUSCARIZQ es -1
Macros
INTRODUCCION:
Las macros son pequeños trozos de código VBA que no deberían tener más de 15 líneas 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 códigos mas grandes
Estos códigos por lo general se ejecutan a pedido del operador, pero también pueden hacerlo
automáticamente, una forma es debido a que se produzca algún 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 más práctica de poner en acción una macro es mediante botones asociados a ellas. Para
hacerlo vamos a la pestaña programador y de allí pulsamos el botón Insertar para que se
desplieguen los controles de formulario, como se ve en la figura
al apretar el ícono del botón aparece una cruz, ubicamos esta cruz en el lugar que nos parece
conveniente y arrastrándola, con el botón izquierdo del mouse apretado, podemos darle el tamaño
adecuado. Al soltar el mouse tenemos algo parecido a esta imagen
simultáneamente aparece un panel donde podemos seleccionar la macro que queremos asociar
Luego de de oprimir el botón que asociamos a la macro, que llamamos ActualizarListado, el listado
queda
Cuando se dispara una macro no hay vuelta atrás, 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 haría con una macro casi idéntica a la dada más
arriba, que dicho sea de paso la confeccionó un empleado del área de computación del banco, al
que le pidieron las dos listas a último momento. Cacho (así le dicen al empleado), que por suerte
no había apretado el botón 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", también copio como respaldo, el listado original en la Hoja3. Cuando
terminó el trabajo le quedaron las siguientes macros
y para el rótulo de "Bajas"
Cacho pensó que después de todo, se hubiera tomado menos trabajo cerrando el archivo y
abriéndolo otra vez, aunque pensándolo 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 sería más rápido.
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 podríamos 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 rótulo “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, podría generar su propia BASE DE DATOS de clientes,
recurriendo a la capacidad que tiene Excel para generar FORMULARIOS, o podríamos crear un
directorio telefónico y esto es justamente lo que haremos en el próximo 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
orientación o de un usuario que en realidad no sabe que esta frente a una aplicación Excel
TICKET DE COMPRA
INFORMES
DIRECTORIO TELEFONICO
Este directorio telefónico 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 rótulos verticalmente en las celdas coloreadas en azul y en las celdas F6,F7,F8 los
datos que serán pasados a la Hoja DIRECTIRIO pero colocados horizontalmente, luego de aplicar
la macro, disparada con el botón INTRODUCIR DATOS, todo debe quedar como se ve en la figura
de abajo
Para consultar el teléfono y la dirección de alguna persona, en esta ocasión lo haremos utilizando
fórmulas
colocamos en la celda B6, el apellido y nombre de la persona cuyos datos queremos obtener y en
la celda B7 la fórmula
Para nuestro formulario vamos a utilizar los comandos: Etiqueta ( Label) Cuadro de texto
(TextBox) y botón de comando ( CommandButton) marcados en rojo en la imagen, estos
comandos están 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 ( también puede hacerse con código), Para que aparezca las propiedades de cada
objeto solo debemos pulsar en ellos, por ejemplo en la figura pueden verse las propiedades de un
botón 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
botón insertaremos los datos) y en nombre "cmdInsertar" . Esto es muy importante a la hora de
programar porque ayuda la claridad del código (aunque ahora que lo pienso, hubiera sido más
claro poner "btnInsertar", esto es a nuestro criterio), hemos hecho lo mismo son los otros
controles por ejemplo al “TextBox1” lo cambiamos por “txtApellidoNombre”.
donde podemos ver en la parte superior, el nombre del botón y el evento Click y el nombre de la
macro "cmdInsertar_Click" lista para que la programemos. Hay otros eventos a los que podríamos
acceder
pero en este caso nos interesa el evento Cick. También podemos ver haciendo doble click en el
formulario( o con el botón 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 programación no hay una sola forma de hacer las cosas, y es probable que haya otro algoritmo
más eficiente, el que está arriba me pareció fácil de entender, pero más adelante haremos otra
versión