Está en la página 1de 89

ej

Aprende a crear macros


desde 0
Parte del Método M1M

QUIQUE ARRANZ
Director de ExcelyVBA.com
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

A mi mujer, que me aguanta cuando me


pongo a programar y se me olvida todo lo
que tengo alrededor.

A mi padre, que me metió "el gusanillo" de


la programación en Excel.

A Vanesa, que me dio la oportunidad de


usar VBA en el trabajo cuando todavía era
un "niño".

A Ignacio "El Gurú", que me animó mucho


a seguir aprendiendo, aunque fuera
trabajando a las 4 de la mañana.

1
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

ÍNDICE

Introducción __________________________________________________________________ 3

Trabajar con VBA ______________________________________________________________ 5

Hablar con Excel ______________________________________________________________ 13

Las variables _________________________________________________________________ 18

Las claves de la programación ___________________________________________________ 30

Operaciones con celdas ________________________________________________________ 49

Objeto Application ____________________________________________________________ 56

Objeto WorkbookS ____________________________________________________________ 61

Objeto Worksheet_____________________________________________________________ 67

Instrucción Set________________________________________________________________ 73

Eventos en VBA _______________________________________________________________ 76

Crear funciones _______________________________________________________________ 84

Conclusión ___________________________________________________________________ 87

2
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

INTRODUCCIÓN
¡Enhorabuena! La compra del método M1M “Macros en 1 mes” te va a abrir "nuevos
horizontes" en tu día a día con Excel. Pero antes de nada tienes que saber que trabajar
con Visual Basic Applications (VBA) puede parecer muy difícil al principio, pero en muy
poco tiempo se convertirá en algo mágico. Durante este periodo de aprendizaje vas a
pasar por tres etapas que son consecutivas y que de ti depende que se conviertan
rápidamente en la última:

Rápido
Emoción Frustración
aprendizaje

Una pequeña y breve definición de estas etapas te ayudará durante las próximas semanas:

• Emoción: al principio querrás aprender rápido y mucho. Estarás emocionado con


cada nuevo descubrimiento.
• Frustración: poco después te darás cuenta de que no es tan sencillo aprender a
programar en VBA. Al principio, cuando empiezas a hacer tus propias macros, todo
parece dificilísimo. Tardas un montón en hacer pequeñas tareas que manualmente
harías más rápido. Estás todo el día buscando información en libros e Internet y es
frustrante porque no entiendes casi nada y todo te parece chino.
• Rápido aprendizaje: pero después de superar la frustración te darás cuenta de que
ya has aprendido los fundamentos de VBA y de que ya estás aprendiendo a hacer
cosas más complejas sin problemas. Es un momento de gran satisfacción. Es aquí
donde tienes que llegar cuanto antes.

3
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Pero, ¿cómo consigo un rápido aprendizaje?


Si sigues el método M1M punto por punto estoy convencido de que en menos de lo que
piensas vas a aprender a programar en VBA con un muy buen nivel. Trabaja duro durante
los primeros capítulos y sigue los ejercicios propuestos. Sin esos ejercicios, por mucho que
leas, no te servirá de nada este manual.

Para aquellos que tienen formación en programación será mucho más rápido llegar a la
etapa de "Rápido aprendizaje". Para los que, como yo, no tienen esa formación, os costará
un poco más pero vuestro esfuerzo merecerá la pena.

Una pequeña anécdota


Durante mi primer trabajo no me hicieron mucho caso y me encargaban pocas tareas.
Algunas de ellas eran con Excel y eran tan aburridas que mentalmente me resistía a
hacerlas. Como eran tan repetitivas pensé: "¿y si diseño algo en Excel que lo haga
automáticamente?". Y me lancé a la tarea. Estuve varios días para hacer esta primera
macro, pero su resultado valió la pena y me permitió adentrarme en este increíble mundo.

La satisfacción que obtienes cuando empiezas a programar es inmensa. Bueno, programar


puede que no te satisfaga, pero sí que lo hará ver que el fruto de tu esfuerzo es muy dulce.
Que lo que acabas de programar, ya sea copiar unas celdas o una tarea mucho más
compleja, funciona y lo hace exactamente como tú quieres.

Pero recuerda que nada se obtiene sin sacrificio. Para llegar a aprender a usar VBA con un
buen nivel vas a tener que dedicar un montón de ratos y luchar y luchar por encontrar la
solución a los problemas que se te plantean. La única manera de aprender VBA es
mediante la práctica así que ya sabes, remángate y a practicar.

Pero no quiero hacerte esperar más. Creo que con esta breve introducción estás más que
preparado para las semanas o meses que vienen. Mucha suerte y mucho ánimo en tu
aprendizaje.

4
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

TRABAJAR CON VBA

El editor de VBA
El editor de VBA, también llamado VBE (Visual Basic Editor), es la pantalla donde,
fundamentalmente, vamos a trabajar en los próximos días. Esta pantalla es donde
podremos organizar nuestro código y donde nos dedicaremos a programar, probar,
ejecutar y corregir los posibles errores.

La ventana de VBA es la siguiente:

• En la parte superior de la pantalla podemos ver la barra de opciones del editor de


VBA.
• En las barras que están por debajo veremos los diferentes accesos rápidos.
• El recuadro de la izquierda es el listado de los diferentes Proyectos de VBA que
tenemos abiertos: pueden ser Add-Ins (como los dos primeros que se ven) o un
libro cualquiera como el siguiente.

5
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

• En la parte de la derecha tendremos las propiedades de los objetos que tenemos


seleccionados en el área de proyectos. En este caso, una hoja de Excel.
• Finalmente, en la parte central tenemos el área de escritura donde podremos
programar el código que necesitemos.

Si no lo tienes exactamente así, no te preocupes. Es cuestión de que habilites estas


opciones. Para ello ve a la opción "Ver" de la barra de opciones de la parte superior.

Añadir un nuevo módulo


Antes de nada, vamos a describir qué es un módulo. Un módulo en VBA es una especie de
"carpeta" donde vamos a guardar los "trocitos de código" que necesitemos para
componer nuestro programa en VBA.

Para añadir un nuevo módulo puedes hacerlo a través de la lista de Opciones de la barra
superior seleccionando la opción "Insertar" y después "Módulo". De esta manera, se
creará un nuevo módulo en el libro que tengamos seleccionado.

El módulo que hemos añadido aparecerá en la ventana de la izquierda tal y cómo vemos
en la siguiente imagen con el nombre "Módulo 1".

6
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Al insertar un módulo automáticamente se habilita la pantalla central para poder escribir


nuestro código.

Mi primera macro
En el lenguaje de programación llamamos macro a un conjunto de líneas de código que
nos permiten realizar ciertas tareas.

Un ejemplo de macro sería el siguiente:

Sub Primera_Macro()
Código de la macro
End Sub

Donde, como podemos ver, hay varios elementos. Los diferentes elementos que vemos
son:

7
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

• Sub: Todas las macros empiezan por Sub. Bueno, no es exactamente así pero ya
explicaremos cómo empiezan y por qué empiezan diferente.
• Nombre: Después de Sub escribimos el nombre de nuestra macro. Podemos
escribir cualquier nombre, pero no podremos usar espacios entre palabras ni
caracteres especiales (/.,?...) y en general todo lo que se salga de letras, números y
una barra baja ( _ ).
• Paréntesis: Después del nombre insertaremos unos paréntesis (abierto y cerrado).
Esto tienen su significado, no pienses que es una tontería. Pero lo veremos más
adelante.
• Código: Después escribimos el código de la macro.
• End Sub: Finalmente debemos escribir End Sub para que VBA entienda que hemos
terminado nuestra macro.

Lo bueno y lo malo de la programación es que debemos escribir las cosas de la manera


exacta y no vale si nos desviamos un poco. De ser así, al cometer pequeños errores, el
sistema los detectará y nos animará a corregirlos. Y deberemos corregirlos porque si no lo
hacemos el código no funcionará.

Por ejemplo, si olvido poner la palabra "Sub" después de la palabra "End" al final de la
macro aparecerá un mensaje como el siguiente cuando intento ejecutar una macro.

8
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

El programa ha detectado que la macro no está completamente escrita, en este caso falta
escribir la palabra Sub al final de la macro. Como lo interpreta como un error, nos da un
mensaje y nos señala donde está el error para que podamos corregirlo.

Crear una macro


Vamos a escribir la macro más sencilla del mundo para comenzar. Una macro que nos
mostrará un mensaje en pantalla.

Para escribir tu macro puedes copiar este texto de aquí debajo:

Sub Saludo()
Msgbox "Hola amigo"
End Sub

Para ejecutarla debes hacer clic sobre el botón de "Play" que hay en la ventana superior
de VBE.

También puedes ejecutar una macro más rápidamente colocando el cursor dentro de la
macro y después pulsando la tecla F5 de tu teclado. Te recomiendo que lo hagas con las
dos la primera vez, pero después acostúmbrate a usar el atajo del teclado F5.

El resultado de ejecutar esta macro es muy sencillo. Aparecerá una ventana en Excel como
esta:

9
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

¿A que es chulo verdad? Pues ya verás, sigue avanzando, te va a encantar.

Pero antes de nada quiero dedicarte un aplauso largo y sonado. Has llegado hasta aquí,
has leído unas pocas páginas. Es un poco rollo el principio, pero ten fe en mí y hazme caso.
Te va a encantar, pero todavía estamos en la fase de "Emoción" como te comentaba en el
capítulo de Introducción. Nos queda mucho que pasar y espero que lo podamos hacer
juntos.

Añadir comentarios
Es fundamental cuando estás programando que añadas comentarios a tu código. Pero,
¿por qué es fundamental? Pues bien, te lo voy a explicar muy sencillamente. Lo que hoy
hagas y te parezca muy intuitivo, quizás dentro de un mes te va a sonar a chino. Sí, sí, tal
cual… yo he reutilizado códigos que había escrito hace ya bastante tiempo y no había
comentado y he tardado casi más en entender lo que había escrito que en haberlo escrito
de nuevo.

Pero sé que no te he convencido y que no vas a añadir comentarios porque todos somos
así… no nos fiamos de lo que nos dicen hasta que uno mismo experimenta lo difícil que es
retomar el código o entender un código de 1.000 líneas sin ninguna explicación. Y si,
aunque pienses que tú no vas a escribir mil líneas de código ya verás cómo lo acabas
haciendo.

10
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Aun así, yo te lo cuento, que nunca está de más, y como es muy sencillo estoy seguro de
que te vas a acordar. De todas formas, en los diferentes ejercicios de este libro vas a ver
como el código está plagado de comentarios. Y lo hago para que aprendas que es muy
importante y porque a mí mismo me viene muy bien.

Los comentarios se pueden añadir en una línea de manera solitaria o después de una línea
de código. Para insertar un comentario simplemente tienes que añadir un apóstrofe
simple antes del comentario. Esto es un apóstrofe simple: (‘).

Sub Comentario_solo()
MsgBox "Hola amigo"
'Comentario
End Sub

En el ejemplo anterior hemos añadido el comentario en una línea él solo y en este segundo
ejemplo vemos el comentario justo detrás de una línea.

Sub Comentario_en_línea()
MsgBox "Hola amigo" 'Comentario
End Sub

Pero ojo, si escribimos el comentario justo delante de la línea, VBA interpreta que toda la
línea es un comentario. Al fin y al cabo, lo que delimita donde comienza el comentario es
la comilla simple (‘) y si esta está al principio de la frase pues toda la frase se convierte en
un comentario… pero te dejo una macro para que lo compruebes tú mismo.

Sub Comentario_en_línea()
'MsgBox "Hola amigo" Comentario
End Sub

Además, los comentarios son muy útiles para separar el código con un poco de
imaginación. Puedes utilizar este tipo de comentario para introducir una macro:

11
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Sub Macro1()

End Sub

'***********************************
'
' Macro escrita por Quique
'
'***********************************

Sub Macro2()

End Sub

Como puedes ver, los comentarios usados así son muy útiles para introducir un texto entre
dos macros que te permita diferenciar visualmente de manera muy rápida y además,
podrás añadir comentarios útiles acerca del uso que se le a dar o algo más complejo como
para qué se usa una variable o una función.

12
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

HABLAR CON EXCEL


En este capítulo ya vamos a "mancharnos" las manos y practicar mucho. Es un capítulo
fundamental. Te recomiendo que te lo leas con tranquilidad y con el ordenador delante.
Si vas en el metro, en el autobús o en el avión, o como sea que te desplaces, léelo despacio.
Vas a tener que practicar después, así que más vale que no se te olvide lo que lees.

Vamos a empezar el "show". Atenúa las luces, baja un poco la música, siéntate bien que
empezamos.

Referencias a celdas
Como ya sabrás a estas alturas de tu trabajo con Excel una celda es la mínima expresión
organizativa en Excel. Una celda es en lo que todo se resume. Una celda es donde
insertamos una función, escribimos un texto o número o damos formato. En inglés una
celda es cell, lo que coincide con célula, como la parte más pequeña de la que se compone
un organismo vivo.

Por lo tanto, en este caso vamos a empezar por lo más pequeño, por las celdas.

Para hablar con las celdas en Excel usaremos la palabra mágica "Cells". Esta palabra es un
miembro del objeto "Range", pero no me quiero entretener en estas cosas porque esto
no es una clase de universidad de la Escuela de Informática sino un curso rápido y ameno
para aprender a programar VBA con Excel.

Volviendo al tema, esta palabrita, "Cells" tiene dos argumentos muy sencillos. La fila y la
columna. Es decir, es:

Cells(Fila,Columna)

Donde:

13
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

• Fila: es la fila dentro de una hoja donde queremos apuntar.


• Columna: es la columna dentro de una hoja donde queremos apuntar.

No te olvides de separarlos por una coma.

Estos dos argumentos pueden ser números, por ejemplo:

Cells(1, 1)

Donde estaríamos haciendo referencia a la celda A1. Si a la celda A1 quisiéramos darle un


valor, por ejemplo 8, entonces escribiríamos:

Cells(1, 1) = 8

No hace falta que separes el igual entre espacios, VBE lo hará automáticamente por ti.

O, si quisiéramos escribir un texto, escribiríamos lo siguiente:

Cells(1, 1) = "Hola"

Pero ten en cuenta que para escribir cualquier texto, con o sin espacios, debemos
comenzar por comillas dobles y terminar de la misma manera. Estas comillas, en un
teclado en castellano, se encuentran en la tecla 2, justo encima de la tecla W.

Pero hay más maneras de referenciar a celdas. Por ejemplo, podemos usar la letra de una
columna. En efecto, si quisiéramos referirnos a la celda B2 podríamos escribir:

Cells(2, "B")

Referencias a rangos
Si antes hablábamos de las celdas ahora hablaremos de la unidad organizativa superior:
los rangos.

14
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

¿Qué es un rango? Un rango es un conjunto de celdas continuas. Una fila es un rango


donde todas las celdas tienen en común que están en la misma fila. Dicho de otra manera,
un rango es un conjunto de celdas que están pegadas, es decir, no hay huecos entre
medias. Aunque un rango también puede ser de una única celda, siendo el rango más
pequeño que puede existir.

Para referirnos a un rango de una sola celda usaremos el código:

Range("A1")

Donde hemos escrito exactamente la dirección de la celda a la que estamos apuntando.


Al igual que en el apartado anterior, para pasar un valor numérico a la celda A1
escribiremos:

Range("A1") = 8

También podremos traspasar el valor de una cadena de texto, poniendo dicho texto entre
comillas dobles, como puedes ver en el siguiente ejemplo:

Range("A1") = "Hola amigos"

Para los rangos que son de más de una celda deberemos señalar la esquina superior
izquierda y la esquina inferior derecha dentro del objeto Range.

Range("B2:C11") = 3

En la sentencia (frase de código) anterior hemos escrito las dos celdas de referencia del
rango de celdas separadas por dos puntos (:) y entre paréntesis. De esta manera Excel
interpreta que nos estamos dirigiendo a todo el rango que ocupan las celdas que están en
el rectángulo que va desde la celda B2 hasta la celda C11.

15
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

En la imagen anterior puedes ver el recuadro al que nos estamos dirigiendo.

Todas estas celdas dentro del recuadro pueden rellenarse con el mismo valor con una
sencilla macro teniendo en cuenta que, si damos un valor a un rango, este valor lo tomarán
cada una de las celdas de dicho rango.

La macro que debemos ejecutar es:

Sub Referencias_range()
Range("B2:C11") = "Hola"
End Sub

El resultado de esta operación es el que puedes ver en la siguiente imagen:

Pero esta no es la única forma de referirnos a los rangos. También lo podremos hacer
mediante la propiedad Cells como comentábamos previamente. La propiedad Cells del

16
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

objeto Range nos permite dirigirnos a Excel con el mismo objetivo, pero de una manera
mucho más flexible.

Usaremos la propiedad Cells dentro del objeto Range de la siguiente manera:

Range(Cells(2, 2), Cells(11, 3)) = "Hola"

Como puedes ver en el ejemplo anterior nos hemos referido a cada una de las celdas que
delimitan el rectángulo del rango mediante celdas y a cada una de las celdas les hemos
dado un valor de fila y columna.

Al principio esto puede ser un poco lioso, pero date tiempo, te acostumbrarás, es
simplemente una manera más de hablar.

¿Pero, para qué sirve esta manera tan complicada de referencia a las celdas? Básicamente
esto te permite mucha más flexibilidad a la hora de referenciar celdas puesto que puedes
sustituir los números de las celdas por variables que vayan cambiando en función de algo
que hayas determinado.

17
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

LAS VARIABLES
Poco a poco hemos ido avanzando en nuestro aprendizaje con Excel y ya sabemos cómo
hablar a las celdas de Excel. Es un gran paso para nosotros. Hemos aprendido a
comunicarnos con las celdas y esto es fundamental en el mundo de la programación con
Excel.

En este capítulo te voy a hablar de las variables en VBA. No hace falta que te explique
todos los tipos, pero creo que es conveniente que entiendas qué son las variables, así que
antes de meternos en materia quiero darte una breve explicación para que no te sientas
perdido.

Una variable en el lenguaje de programación es un espacio en el sistema de


almacenamiento y un nombre con el que hacer referencia a dicho espacio. En un lenguaje
un poco más de "andar por casa" una variable es una cajita donde puedo guardar cosas
que me vendrán bien durante la ejecución de mi programa.

Tipos de variables
Las variables pueden ser de varios tipos y se clasifican según la información que
contengan. Es importante que aprendas la diferencia, pues no todas las variables valen
para todos los tipos de información y no todas las variables ocupan lo mismo.

¿Y a mí qué más me da lo que ocupe una variable? Pues te va a importar si quieres que
tus macros vayan rápido y no te desesperes. Créeme, te va a acabar importando. De todas
formas, si no te importa es como si estuvieras en un curso de pintura y no hablamos de
los diferentes tipos de pinceles. Aunque vayas a pintar con brocha gorda te vendrá bien
conocer los diferentes tipos de pinceles y brochas que existen.

18
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Tipo entero (Integer)

Para una variable numérica de valores de -32.768 a 32.767. Para ello usaremos el tipo de
variable Integer.

Tipo entero largo (Long)

El tipo Long de una variable es para valores enteros positivos o negativos, pero con la
diferencia de que puede almacenar valores mucho mayores, en concreto entre -
2.147.483.648 y 2.147.483.648.

Tipo decimal (Single y Double)

Para almacenar valores numéricos decimales usaremos la variable tipo Single, aunque si
requerimos una mayor precisión usaremos variables tipo Double. Normalmente yo uso
directamente la variable tipo Double necesite o no precisión.

Tipo texto (String)

Para almacenar valores de cadenas de texto, es decir, uniones de cualquier tipo de


carácter, ya sea numérico o no numérico (alfanumérico) usaremos el tipo String.

Tipo verdadero o falso (Boolean)

Nos permite almacenar valores de variables del tipo verdadero o falso. Para ello usaremos
el tipo Boolean.

Tipo polivalente (Variant)

Este tipo nos permite almacenar cualquier tipo de información, ya sea numérica, de texto
o del tipo verdadero o falso o cualquier otro que se nos ocurra. En definitiva, cuando no

19
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

sabemos qué tipo de variable vamos a tener usaremos el tipo Variant, donde entran todos
los tipos posibles. El inconveniente es que ocupa una gran cantidad de memoria.

Declaración de variables
Antes de usar las variables tenemos que aprender a declararlas. Pero, ¿qué es declarar
variables?

Pues bien, es decirle a Excel que una palabra en concreto es un identificador de tipo de
variable y no otro. Por ejemplo, si queremos declarar la variable "Nombre_Apellido" y en
ella guardaremos el nombre de una persona la declararemos como tipo String de la
siguiente manera:

Dim Nombre_Apellido As String

Como se puede ver, la declaración de Variables tiene 4 partes:

• Dim: que viene de la palabra dimensionar.


• Nombre_Apellido: identificador (nombre) de la variable donde queremos
almacenar el texto del nombre de una persona.
• As: lo ponemos entre el identificador de la variable y el tipo de variable.
• String: tipo de variable que queramos que sea "Nombre_Apellido".

Es muy importante saber que no podemos declarar cualquier palabra como una variable.
Hay palabras reservadas que no se pueden usar: If, Else, Case, Select,… y así un buen
montón de palabras. Estas palabras son los propios identificadores del lenguaje de VBA.
Pero no te preocupes, no necesitas sabértelos, simplemente saltará un aviso cuando
intentes usarlos. Además, tampoco podremos usar caracteres especiales, sólo cadenas de
texto con números.

Los tipos de variables que veíamos en el epígrafe anterior se declaran de la siguiente


manera:

20
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Tipo entero (Integer)

Esta variable se conoce como Integer (entero en inglés). Su declaración es:

Dim Num_entero As Integer

Tipo entero largo (Long)

La variable Long se usa para enteros más largos que la anterior. Su declaración es:

Dim Num_largo As Long

Tipo Decimal (Single)

Para almacenar valores numéricos decimales usamos la variable tipo Single. Su


declaración es:

Dim Num_decimal as Single

Pero si queremos almacenar valores numéricos decimales con más precisión (es decir, con
más decimales) usaremos la variable tipo Double. Su declaración es:

Dim Num_decimal_precision As Double

Tipo texto (String)

Para almacenar valores de cadenas de texto, es decir, uniones de cualquier tipo de


carácter, ya sea numérico o no numérico, conocido como alfanumérico, usaremos la
variable tipo String. Su declaración sería la siguiente:

Dim Cadena_texto As String

21
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Tipo verdadero o falso (Boolean)

Nos permite almacenar valores de variables del tipo verdadero o falso mediante la
variable Boolean. Esta variable tiene la siguiente sintaxis para su declaración:

Dim Verd_falso As Boolean

Tipo polivalente (Variant)

Esta es la variable tipo Variant cuya declaración es:

Dim Polivalente as Variant

¿Cuándo y cómo declaro las variables?


La respuesta a esta pregunta tiene muchas respuestas y todas pueden ser acertadas.
Vayamos paso a paso, pero antes de nada debes saber que declarar variables no es
obligatorio, pero sí muy conveniente.

Las variables se pueden declarar al comienzo de un módulo o dentro de una macro. Si


declaramos las variables al comienzo del módulo estaremos diciendo que estas variables
son globales y las podremos usar en cualquier macro que tengamos en dicho módulo. En
cambio, si usamos las variables dentro de una macro estaremos indicando a Excel que
dichas variables son sólo propias de dicha macro y no de cualquier otra.

Veamos unos ejemplos sencillos.

Si queremos declarar tres variables tipo entero al comienzo del módulo las escribiremos
en la parte superior:

22
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

En la imagen anterior puedes ver cómo hemos declarado tres variables en la parte
superior. Estas tres variables, al estar fuera de la Macro1, se consideran variables
globales y pueden usarse en cualquier lado.

Estas tres variables, también podríamos haberlas declarado en una misma línea
separadas por comas como puedes ver en la siguiente línea de código:

Dim Num1, Num2, Num3 as Integer

Normalmente yo prefiero usar esta forma. Parece más ordenada y ocupa menos espacio.

Aunque también podríamos haber declarado las variables dentro de la Macro1 y entonces
sólo las tendríamos declaradas para ser usadas dentro de esta macro.

Oblígate a declarar las variables


Hay mucha gente como yo que somos un poco perezosos a la hora de declarar variables.
En Excel podemos declarar unas variables y otras no, no declarar ninguna o declararlas
todas. Para animarte a que declares todas las variables hay una breve sentencia de código
que puede ayudarte. Esta sentencia es el comando Option Explicit.

23
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Mediante el comando Option Explicit escrito al comienzo de tu módulo Excel interpretará


que quieres declarar todas las variables e irá buscando su declaración a lo largo del código.
Si encuentra que una variable no está declarada no te permitirá ejecutar la macro y
tendrás que declarar la variable previamente.

Un ejemplo de código con Option Explicit sería:

Option Explicit

Dim Num1 As Integer


Dim Num2 As Integer
Dim Num3 As Integer

Sub Macro1()
Num1 = Num2 + Num3
End Sub

Pero, ¿qué pasa si no lo pongo? Pues la buena noticia es que no pasa nada, pero puede
que no estés declarando todas las variables.

¿Y cuál es el problema? Pues el problema es que Excel interpreta que todas las variables
son tipo Variant a no ser que en la declaración de variables indiquemos otra cosa y esto
ocupa una enorme cantidad de memoria lo que ralentiza el proceso enormemente.

Si quieres, copia estas dos macros y ejecútalas y lo verás con tus propios ojos.

Macro sin variables

Sub Macro_Sin_variables()

Tiempo_inicial = Timer

For i = 1 To 1000
For j = 1 To 100

24
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Cells(j, 1) = j
Next
Next

MsgBox Timer - Tiempo_inicial

End Sub

Macro con variables

Sub Macro_con_variables()

Dim Tiempo_inicial As Double


Dim i, j As Integer

Tiempo_inicial = Timer

For i = 1 To 1000
For j = 1 To 100
Cells(j, 1) = j
Next
Next

MsgBox Timer - Tiempo_inicial

End Sub

Ambas macros son iguales, exactamente iguales, la diferencia es que en la primera no


hemos declarado las variables y la segunda sí.

En mi ordenador la primera macro tarda en ejecutarse 2,0 segundos. La segunda 2,7


segundos. No es una diferencia muy grande, apenas 0,7 segundos, pero esto implica que
la segunda tarda un 35% más de tiempo en ejecutarse que la primera… y eso sí que es
tiempo, y puede llegar a ser mucho más.

25
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Pero tampoco te "comas" mucho la cabeza. A no ser que vayas a hacer programas muy
pesados, con declarar las variables es más que suficiente. La diferencia entre declarar
como Integer o Double es prácticamente despreciable, aunque nunca está demás hacer
las cosas bien.

Ejemplos
Las variables en programación "dan mucho juego". Te permiten guardar información para
usarla posteriormente, hacer operaciones matemáticas y guardar su resultado, capturar
información…

Pero bueno, lo mejor para aprender es ver algunos ejemplos así que pon atención y
prepárate para ver ideas.

Ejemplo 1
En esta primera macro vamos a ver cómo capturar el valor de una celda en Excel, guardarlo
en una variable y después traspasar el valor de dicha variable a otra celda. Para ello, en la
celda A1 de la hoja en la que nos encontremos escribiremos un número entero cualquiera,
por ejemplo 10. Después, volvemos al editor de VBA y escribimos la siguiente macro y la
ejecutamos.

Sub Variables_ejemplo1()

Dim NUM As Long

NUM = Range("A1")

Range("B2") = NUM

End Sub

Como puedes ver, ahora en la celda B2 pone el número que hayas escrito. Esto lo hemos
conseguido gracias a la variable NUM.

26
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

El racional de esta macro es:

• Declaro la variable con su identificador NUM.


• A NUM le paso el valor de la celda A1.
• A la celda B2 le devuelvo el valor de NUM.

Ejemplo 2
En esta macro vamos a dar un valor inicial a nuestra variable NUM y después la vamos a
traspasar al rango A2:A4. Es decir, quiero que en las 3 celdas del rango se escriba el mismo
número.

Sub Variables_ejemplo2()

Dim NUM As Integer

NUM = 25

Range("A2:A4") = NUM

End Sub

Ejemplo 3
En este ejemplo vamos a utilizar tres variables. Las dos primeras serán los valores que
obtengamos de las celdas A1 y A2 (en mi caso serán 10 y 25) y las vamos a sumar dentro
de una variable NUM_suma. Después, las traspasaremos a la celda C3.

Sub Variables_ejemplo3()

Dim NUM_1, NUM_2, NUM_suma As Integer

NUM_1 = Range("A1")
NUM_2 = Range("A2")

NUM_suma = NUM_1 + NUM_2

27
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Range("C3") = NUM_suma

End Sub

Ejemplo 4
Para poder realizar este ejemplo necesito un poco de tu colaboración. En la celda C2
escribe tu nombre y en la celda C3 escribe tu apellido. El objetivo de esta macro será
capturar ambos valores de texto y devolverlos en un mensaje en pantalla a través de un
MsgBox.

Sub Variables_ejemplo4()

Dim Nombre, Apellido, Nom_ap As String

Nombre = Range("C2")
Apellido = Range("C3")

Nom_ap = Nombre & " " & Apellido

MsgBox Nom_ap

End Sub

Ejemplo 5
Construimos un rango de celdas a través de la esquina superior izquierda y la esquina
inferior derecha tomando los valores de diferentes celdas. Después, a dicho rango le
damos un valor numérico obtenido de otra celda.

Sub Variables_ejemplo5()
Dim Fil1, Fil2, Col1, Col2 as Integer
Dim Valor_celda as Variant

Fil1 = Range("A1")

28
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Col1 = Range("B1")
Fil2 = Range("A2")
Col2 = Range("B2")

Valor_celda = Range("C1")

Range(Cells(Fil1, Col1), Cells(Fil2, Col2)) = Valor_celda

End Sub

29
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

LAS CLAVES DE LA PROGRAMACIÓN


En programación hay dos cosas que son fundamentales y que sin ellas no se puede hacer
prácticamente nada. Estas dos cosas son:

• Condicional If
• Los bucles

En casi todas las macros o funciones que creemos con VBA usaremos estas dos
funcionalidades que harán el 90% del trabajo que queremos que nuestra macro haga.

Condicional If
Los condicionales son un tipo de instrucción muy utilizada en la programación que nos
permiten hacer una comprobación de una condición y después nos arrojarán un resultado
dependiendo de dicha condición.

Pero esto se entiende mucho mejor con una imagen, así que vamos a por ello:

Como puede verse en la imagen anterior esta instrucción condicional es muy parecida a
la que tenemos en Excel, pero con algunas diferencias y con algunas complicaciones más.
En la imagen anterior se muestra como se ejecuta la Instrucción 1 (es decir, unas líneas de
código o una sola) si se cumple que la Condición es verdadera y si es falsa se ejecutará la
Instrucción 2.

30
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Introducción al condicional If

El condicional que antes comentábamos se llama instrucción If y es de lo más importante


que tienes que aprender en VBA, así que fíjate bien en este apartado.

La sintaxis básica de esta instrucción es la siguiente:

If Condicion1 Then
'aquí pongo las instrucciones que quiero
End If

Esta instrucción siempre empieza con If y después escribimos la condición que queramos
verificar. Este caso que acabamos de ver es el más sencillo de todos los que podemos
tener, aunque podemos simplificar aún más su sintaxis si escribimos todo en la misma fila
como podemos ver en el siguiente ejemplo:

Sub Instruccion_SI_Ejemplo()

If 1 < 10 Then MsgBox "¡Correcto!"

End Sub

Donde, como se puede ver, estamos comprobando la condición 1 < 10 y, si es cierta,


entonces usaremos la función MsgBox para mandar el mensaje "¡Correcto!".

Complicando el condicional If

Pero no sólo podemos hacer algo tan rudimentario como hacer una comprobación y
ejecutar unas líneas si se cumple. También podremos poner una instrucción o conjunto
de instrucciones cuando no se cumpla la condición.

La lógica que subyace es:

1. Evaluar la condición

31
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

2. Si es verdadero ejecuto las sentencias A


3. Y si no lo es, ejecuto las sentencias B

La sintaxis en este caso añade una pequeñísima palabra, Else. Esta pequeña nos permite
identificar que, si la condición no se cumple, entonces se ejecuten las sentencias B. Su
sintaxis es:

If condicion Then
Sentencias A
Else
Sentencias B
End If

Pero como casi todo en esta vida se entiende mejor con un ejemplo. Vamos a poner uno
que sea infalible y lo puedas entender a la perfección. En el siguiente ejemplo lo que vas
a ver es una pequeña macro que tiene la capacidad de enviar un mensaje al usuario si se
cumple la condición y un mensaje diferente si no se cumple.

Sub Instruccion_SI_Ejemplo2()

If 1 > 2 Then
MsgBox "Mensaje A"
Else
MsgBox "Mensaje B"
End If

End Sub

Como puedes ver este caso es mucho más útil que el anterior, pero no siempre necesario
pues no siempre necesitamos que nuestra macro haga algo si no se cumple la condición
inicial.

32
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Otra forma de indicar el mismo código es hacerlo en una sóla línea. La desventaja es que
su legibilidad empeora, pero, dependiendo del caso, puede venirnos bien ponerlo así:

If 1 > 2 Then MsgBox "A" Else MsgBox "B"

Esta sintaxis de una única línea que acabamos de ver puede ser muy útil cuando las
instrucciones que tengamos que ejecutar son muy cortas como las que vemos en el bloque
anterior. En caso de que fueran varias instrucciones o fueran instrucciones largas
deberíamos hacerlo en diferentes líneas para aumentar la legibilidad de nuestra macro.

Añadir una nueva condición

En ocasiones necesitamos verificar que se cumple alguna condición adicional dentro de


nuestro condicional If. Es decir, podemos querer hacer una macro que verifique
inicialmente la condición 1, pero después, si no es verdadero, que verifique la condición 2
antes de ejecutar las líneas de código de falso.

Hum… vaya lío ¿no? Mira, seguro que lo entiendes mejor con este diagrama.

Como puedes ver en el diagrama anterior lo que está sucediendo es que si la Condición 1
es falsa entonces pasamos a la condición 2. Que si es falsa entonces no pasará nada, pero
si es verdadera se ejecutará la Instrucción 2.

33
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Para poder hacer esto usaremos la sentencia ElseIf + condición 2 + Then. La sintaxis
entonces será:

If condición1 Then
'sentencias A
ElseIf condicion2 Then
'sentencias B
End If

Además, a esta sintaxis le podemos añadir un nuevo Else después de la segunda condición
para que ejecute una sentencia en caso de que tanto la condición 1 como la condición 2
sean falsas. Para ello la sintaxis sería:

If condición1 Then
'sentencias A
ElseIf condicion2 Then
'sentencias B
Else
'sentencias C
End If

Ejemplos

Para entender mejor estos conceptos vamos a explicar algunos ejemplos:

Ejemplo 1
En este ejemplo vamos a explicar cómo usar el condicional If a partir del valor de una
celda.

Sub Ejemplo1()

If Range("A1") > 10 Then


MsgBox "Valor mayor que 10"

34
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

End If

End Sub

Ejemplo 2
En este ejemplo vamos a explicar cómo usar el condicional If a partir del valor de una celda
con dos condiciones y con opción de Verdadero y Falso.

Sub Ejemplo2()

MiValor = Range("A1")

If MiValor > 10 Then

If MiValor < 20 Then


MsgBox "Valor menor de 20"

ElseIf MiValor < 30 Then


MsgBox "Valor menor de 30"

End If

End If

End Sub

Como puedes ver en este ejemplo hemos anidado dos funciones tipo If. En la función
primera evaluamos si la variable MiValor tiene un valor mayor que 10. En el If que se
encuentra dentro evaluamos si es menor que 20 y si no lo es, después, evaluamos si es
menor que 30.

Ejemplo 3
Este ejemplo nos sirve para entender como anidar dos condicionales If mediante el
operador And.

35
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Sub Ejemplo3()

If Range("A1") > 10 And Range("A1") > 30 Then


MsgBox "Valor mayor que 10 y menor que 30"
End If

End Sub

Como puedes ver, es mucho más sencillo de entender y leer cuando tienes dos
condiciones que quieres anidar. No es necesario usar dos condicionales If.

Definición de bucle
Para el que nunca se ha acercado a la programación los bucles pueden dar cierto miedo,
pero son muy sencillos de entender pasados dos minutos. Los bucles son tan útiles que
cualquier adjetivo superlativo se quedaría corto hablando de ellos.

Vamos a hacer una breve introducción a cada uno de ellos, pero antes definiremos qué es
un bucle y daremos algunos ejemplos de cómo se usan y para qué.

Definición: un bucle en programación es una repetición de una parte del código hasta que
la condición del bucle deje de cumplirse.

Pongamos un ejemplo para que se entienda mejor. Imagina que tienes un libro con 10
hojas de Excel. Si quieres que tu macro recorra cada una de las hojas y que cambie el zoom
de cada hoja al 100% necesitarás un bucle que vaya recorriendo cada una de las hojas y,
en cada paso del bucle, ejecute la sentencia de modificar el zoom.

Hum… ¿Ahora ya es más interesante verdad? Pues estoy seguro de que ya te "pica el
gusanillo", pero te pondré algunos ejemplos más de para qué te pueden servir los bucles
para que no te saltes este capítulo que es importantísimo.

Algunos ejemplos son:

36
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

• Recorrer todas las hojas de un libro y poner la celda activa la celda A1.
• Recorrer todas las hojas de un libro y quitar la cuadrícula (a mí me parece muy fea).
• Recorrer ciertas filas de una hoja y aplicar el color negrita (por ejemplo, cada tres
filas).
• Recorrer una tabla de datos desde el final hasta el principio y eliminar las filas que
cumplan una o varias condiciones.
• Recorrer una tabla de datos y copiar ciertos elementos de la tabla a otra hoja.
• Copiar los datos de una tabla a otra hoja hasta que se cumpla una cierta condición.
• Colorear el fondo de una serie de celdas hasta que se deje de cumplir una
condición.

Y podríamos seguir con muchos, muchísimos de ellos… pero lo bueno de los bucles es que
son muy flexibles y podemos usarlos en casi cualquier ocasión.

Bucle For Next


Este tipo de bucle es quizás el más sencillo y el más conocido. Pero que sea sencillo no
implica que no haya que mirarlo con mimo y detenimiento.

¿Qué es lo que hace este tipo de bucle? Pues es muy sencillo de entender, como te decía.
Este bucle nos permitirá repetir una acción (o conjunto de acciones) un número
determinado de veces.

De lo más sencillo…

La sintaxis de este bucle en VBA es:

For Contador = COMIENZO To FINAL


'código que queremos repetir
Next

37
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Donde:

• Para comenzar el bucle usaremos la palabra For.


• Después pondremos el nombre de nuestro Contador (que será cualquier variable
de tipo numérico que queramos).
• Dicho contador tendrá un COMIENZO y un FINAL y para indicarlo lo haremos con la
palabra To (que en inglés significa hasta).
• Y terminaremos el bucle con la palabra Next para indicar que una vez que llegue
aquí la macro seguiremos avanzando al siguiente valor del contador hasta llegar al
FINAL.

… a lo más complejo

Pero como te decía al principio, la sintaxis que acabamos de ver es la más básica para este
bucle. Si queremos que el contador avance de COMIENZO a FINAL, pero dando saltos (es
decir, no de uno en uno), por ejemplo, de dos en dos, usaremos la palabra Step seguida
del número que queremos utilizar.

La sintaxis que en este caso utilizaremos será la siguiente:

For Contador = COMIENZO To FINAL Step Num_salto


'código que queremos repetir
Next

Donde Num_salto es el valor que queremos utilizar para ir saltando desde el COMIENZO
hasta el FINAL.

Por ejemplo, si usamos la siguiente instrucción:

For i = 1 To 30 Step 3

38
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

La variable i que vamos a usar como contador irá tomando los valores: 1, 4, 7, 10… y así
sucesivamente, es decir, es una serie aritmética donde siempre sumamos 3 al valor
anterior.

Salir del bucle For Next

En ocasiones puede que nos interese, por el motivo que sea, terminar un bucle antes de
que se recorra entero. Esta práctica es muy útil cuando, dadas unas determinadas
circunstancias, queremos que bucle termine y siga con la macro. En este caso, lo que
haremos será colocar dentro del bucle la instrucción:

Exit For

Esta instrucción no es obligatoria y puede que no la necesites casi nunca, pero te vendrá
bien conocerla para el futuro.

Ejemplos

Como mejor se entienden las cosas es mediante ejemplos, así que vamos a poner varios
para que lo puedas entender mejor.

Ejemplo 1
En este ejemplo tenemos el bucle For Next en VBA más sencillo. El bucle cuenta de 1 a 10
y va poniendo en una columna el valor de diez veces el contador.

For CONTADOR = 1 To 10
fila = CONTADOR
Cells(fila, 1) = CONTADOR * 10
Next

39
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Es decir, la acción que repite es de guardar el número del contador en la variable "fila" y
después va escribiendo en cada celda que le corresponde el valor del CONTADOR
multiplicado por 10.

Ejemplo 2
En este ejemplo añadimos la propiedad Step que incrementará el contador de 2 en 2. Es
decir, inicialmente el contador valdrá 1, luego 3, luego 5 y así sucesivamente hasta que
llegue a 9 porque el siguiente valor será el 11 que está fuera del bucle (estamos indicando
que el valor FINAL es el 10).

For Contador = 1 To 10 Step 2


fila = CONTADOR
Cells(fila, 2) = CONTADOR
Next

Ejemplo 3
En este ejemplo, el bucle For Next va contando hacia atrás gracias al Step -1 y al contador
que empieza en vez de en 1 en 10 y acaba en 1. Es decir, es un bucle inverso.

For Contador = 10 To 1 Step -1


fila = Contador
Cells(fila, 3) = Contador
Next

¿Y para qué me sirve esto a mí? Por ejemplo, este ejemplo es muy útil cuando recorremos
una hoja y vamos eliminando ciertas filas. De esta manera, podemos indicar con el
contador la fila en la que situarnos e ir eliminando las filas desde abajo hacia arriba sin
que vayan cambiando de orden las filas que se encuentran por encima de la fila
seleccionada.

40
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Ejemplo 4
En este ejemplo utilizamos la expresión Exit For cuando el contador llega hasta el número
50 y lanzamos un mensaje en pantalla en este momento.

For Contador = 10 To 100


If Contador = 50 Then
MsgBox "El contador ha llegado al número " & Contador
Exit For
End If
Next

Como puedes ver en la macro anterior, lo que hemos hecho ha sido utilizar el condicional
If que veíamos previamente para poder localizar el valor de Contador = 50, es decir, esta
es nuestra condición.

Después, cuando se cumple dicha condición terminamos el bucle mediante la sentencia


Exit For.

Bucle Do While
Este tipo de bucle, como todos los bucles, se parece al anterior pero la diferencia es que
se ejecuta hasta que se cumpla una condición… o deje de cumplirse que es lo mismo.

Cómo se usa

La sintaxis de este bucle tiene dos variantes que sirven para lo mismo pero que tienen una
pequeña diferencia. Esta diferencia es cuándo se comprueba la condición que queremos
evaluar para que se repita el bucle. Esta comprobación puede realizarse al comienzo del
bucle o al final del mismo.

Si la condición está al principio usaremos la siguiente sintaxis:

Do While Mi_condición

41
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

‘ejecutar sentencias
Loop

Es decir, lo que estoy haciendo con este bucle es repetir una serie de sentencias de código,
pero antes de nada evalúo que se cumpla la condición.

Pongamos el siguiente ejemplo para explicarlo mejor:

Mi_Variable=1
Do While Mi_Variable < 100
Mi_Variable = Mi_Variable + 1
‘ejecución de otras sentencias
Loop

Lo que hace esta macro es que asigna un valor a la variable Mi_Variable. Después
comienza el bucle y se repite tantas veces mientras se cumpla la condición Mi_Variable <
100. Esto implica que cuando Mi_Variable es 99 la condición se cumple y avanzamos
dentro del bucle. Dentro del bucle sumamos + 1 a Mi_Variable así que el nuevo valor será
100. Después, al volver a intentar pasar por el bucle la condición de que Mi_Variable sea
menor de 100 ya no se cumple así que terminaremos el bucle.

Pero si la condición la ponemos al final la sintaxis será la siguiente:

Do
‘ejecutar sentencias
Loop While Mi_condición

Es decir, la condición se evalúa al final de haber ejecutado nuestras líneas de código.

Las condiciones que puedo usar entro del bucle serán todas las que nos podamos
imaginar, aunque fundamentalmente usaremos los operadores aritméticos.

42
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Salir del bucle Do While

Para salir de este bucle usaremos la expresión Exit Do cuando llegue el momento en el
que queramos que no continúe aún sin evaluar la condición.

Por ejemplo, podríamos usarlo de la siguiente manera:

Mi_Variable=1
Do While Mi_Variable < 100
Mi_Variable = Mi_Variable + 1
If Mi_Variable + Mi_Variable2 = 200
Exit Do
End if
Loop

Donde Mi_Variable2 es cualquier variable con valor numérico que se sumará a


Mi_Variable. Cuando la suma de estas dos variables sea exactamente 200 entonces se
cumplirá la condición del If y saldremos del bucle.

Ejemplos

Para que puedas entender mejor lo que hemos visto en este apartado vamos a explicarlo
en 4 sencillos ejemplos que te ayudarán a entender con más claridad el bucle Do While.

Ejemplo 1
En este ejemplo vamos a sombrear en amarillo las celdas del rango cuyo valor sea igual a
1 hasta que dejen de serlo.

I = 1

Do While Cells(I,1) = 1
Cells(I,1).Interior.Color = vbYellow
I = I + 1

43
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Loop

Ejemplo 2
En el siguiente ejemplo vamos a sombrear en amarillo todas las celdas que sean menores
que 100, pero si encontramos una celda menor que 50 saldremos del bucle:

I = 1
Do While Cells(I,1).Value < 100
If Cells(I,1).Value < 50 Then Exit Do 'salgo del bucle
Cells(I,1).Interior.Color = vbYellow
I = I + 1
Loop

En este ejemplo hemos usado las propiedades de color de fondo de las celdas que
explicaremos un poco más adelante.

Ejemplo 3
En este tercer ejemplo vamos a poner a la derecha de la celda que se está evaluando un
OK si evaluamos que su valor es menor que 100 y mayor que 50. Esto nos permitirá ver
que en la condición lógica que vamos a evaluar podemos utilizar el operador And para
hacer una doble evaluación. Además, hemos usado la propiedad Offset que nos permite
seleccionar una celda en función de unos parámetros de fila y columna dados y de una
celda que actúe como punto de partida.

I = 1
Do
Cells(I,1).Offset(0, 1) = "OK"
I = I + 1
Loop While Cells(I,1).Value < 100 And Range(I,1).Value > 50

44
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Ejemplo 4
En el siguiente ejemplo vamos a ver cómo se puede también utilizar una expresión
anidada con Or para evaluar una condición.

I = 1
Do While Cells(I,1).Value > 60 Or Cells(I,1).Value < 20
Cells(I,1).Offset(0, 1) = "OK"
I = I + 1
Loop

Bucle For Each


El bucle For Each es un bucle poco conocido pero muy útil a la hora de trabajar con un
número desconocido de objetos, ya sean celdas, hojas, gráficos, tablas dinámicas o libros.

Este bucle recorre cada uno de los elementos y va ejecutando las sentencias que hayamos
indicado dentro del bucle.

Cómo se usa

Este bucle es muy similar al resto de los bucles en cuanto a su sintaxis. La sintaxis es:

For Each Mi_variable In Conjunto_objetos


'código que queremos repetir
Next

Donde:

• Mi_variable es el objeto en concreto que vamos a ir recorriendo uno a uno y que


debe estar guardado como una variable.
• Conjunto_objetos es el conjunto de los objetos que queremos recorrer.

Pero un ejemplo vale más que mil explicaciones así que mira con atención estas líneas de
código:

45
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Dim c As Range
For Each c In ActiveSheet.Range("A1:A10")
c.Interior.Color = vbYellow
Next c

Como puedes ver, en este ejemplo, lo primero que hemos hecho ha sido crear una variable
"c" de tipo Range.

Después hemos puesto el bucle For Each. Lo que hace este bucle es recorrer cada una de
las celdas del rango "A1:A10" y para cada una de las celdas cambia el color de fondo.

Salir del bucle For Each

Pero en algunas circunstancias querremos que la macro termine en medio de un bucle,


para ello usaremos la sentencia Exit For como puede verse en el siguiente ejemplo:

Dim c As Range
For Each c In ActiveSheet.Range("A1:A10")
If c.Value = 5 Then Exit For 'salimos del bucle
c.Interior.Color = vbYellow
Next c

Es decir, antes de cambiar el color de la celda, si detectamos que el valor de la celda que
se está recorriendo en este momento es igual a 5 entonces terminamos el bucle. Esta
comprobación la hacemos con la instrucción If.

Ejemplos

Para poder entender mejor estos conceptos vamos a ver unos sencillos ejemplos.

Ejemplo 1
El primer ejemplo que vamos a ver es una pequeña macro que recorre todas las hojas de
un libro y poner el zoom de cada hoja al 80%.

46
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Dim sht As Worksheet

For Each sht In Worksheets


sht.Activate
ActiveWindow.Zoom = 80
Next

Para ello, lo primero que hacemos es declarar la variable "sht" como tipo Worksheet.
Después recorreremos todas las hojas del libro una por una activándolas y modificando el
zoom de cada una. Recuerda, si hay alguna operación de la que no recuerdas su sintaxis
puedes grabar una macro y elegir el código que necesites para después modificarlo a tu
gusto.

Ejemplo 2
En este ejemplo vamos a recorrer todos los gráficos de una hoja y vamos a cambiar el
ancho de cada uno para ponerlos a todos iguales.

Dim chrt As ChartObject

For Each chrt In ActiveSheet.ChartObjects

chrt.Width = 400

Next

Como puedes ver, lo que hemos hecho ha sido crear una variable de tipo objeto gráfico
ChartObject que hemos llamado "chrt". Después vamos a recorrer todos los gráficos de la
hoja activa y cambiaremos su ancho.

Ejemplo 3
En este ejemplo usamos el bucle For Each para recorrer todas las celdas de un rango de
celdas seleccionadas. Después, lo que haremos será comprobar que están vacías, y si lo
están, entonces les pondremos el fondo rojo.

47
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Dim c As Range

For Each c In Range


If c.Value <> "" Then
c.Interior.Color = vbRed
End If
Next

48
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

OPERACIONES CON CELDAS


Las operaciones con celdas o rangos en VBA son el "pan de cada día". Casi todas las macros
que inicialmente diseñemos tendrán alguna sentencia de operaciones con celdas.

En una celda podemos llevar a cabo multitud de operaciones: cambiar la tipografía,


modificar el tamaño de letra, añadir una fórmula, copiar una o varias celdas, pegarlas en
otra parte de la hoja, insertar un valor…

La lista es muy grande y no pretendemos en este libro explicaros todo lo que podéis
conseguir con estas operaciones, pero sí queremos que os hagáis una buena idea de todas
las opciones posibles.

Valor
Normalmente, para obtener el valor de una celda, no se necesita la propiedad Value.
Como ya hemos visto anteriormente en el capítulo de Referencias podemos obtener el
valor de una celda simplemente utilizando la referencia a dicha celda. La sintaxis de esta
propiedad es:

Range("…").Value

Copiar y pegar
Una de las operaciones más comunes que se llevan a cabo con macros. Esta operación se
compone de dos partes: la operación de copiar y la operación de pegar.

Para pegar simplemente indicaremos el rango que debemos copiar y añadimos la


instrucción Copy:

Range("A1").Copy

49
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Después, para pegar, deberemos seleccionar la celda donde queremos copiar y después
indicaremos la opción de pegado tal y como sigue (si quisiéramos pegar la celda copiada
en la celda C1, por ejemplo):

Range("C1").Select
ActiveSheet.Paste

Pero esta opción es la más básica y la que obtenemos si grabamos una macro.

Pegado Especial

Hay un método mucho más interesante y que nos permite Copiar y Pegar sin tener que
tener las hojas o celdas donde queremos copiar activas. Es el método SpecialPaste.

Este método es propiedad de un rango y no de una celda cómo veíamos antes. Además,
es mucho más maleable pues podremos usar los diferentes tipos de pegado especial que
vienen con Excel.

La manera de copiar es idéntica a la que veíamos anteriormente, pero para pegar


usaremos el siguiente código:

Range("C1").PasteSpecial xlPasteAll

Como se puede ver, el método de pegado especial para pegar tal y como lo tenemos en
origen en cuanto a fórmulas, valores y formatos usa la propiedad xlPasteAll. Otras
propiedades que podemos usar son:

• xlPasteFormulas: con el que sólo se pegan las fórmulas


• xlPasteValues: con el que sólo se pegan los valores
• xlPasteFormats: con el que sólo se pega el formato de las celdas seleccionadas
• …

50
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Lo bueno del Pegado Especial es que nos da mucha flexibilidad para copiar y pegar entre
hojas e, incluso, libros diferentes de Excel.

Por ejemplo, para copiar un rango de la hoja 1 y llevarlo a la hoja 2 pegando sólo los valores
usaremos la siguiente macro:

Sub Copiar_Valores()

Sheets(1).Range("A1:A10").Copy
Sheets(2).Range("C1").PasteSpecial xlPasteValues

End Sub

CutCopyMode

Un pequeño problema con el que nos encontramos al utilizar los comandos de copiar y
pegar es que las celdas, en la hoja de Excel, se quedan con un recuadro de líneas
discontinuas en torno al área copiada.

Si queremos evitar esto podemos hacerlo mediante la siguiente línea de código:

Application.CutCopyMode = False

51
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Lo que esta sentencia hace es terminar el modo de Copiar y Pegar. El equivalente a darle
a la tecla Escape cuando estamos en Excel.

Formato
Dentro del formato de una celda tenemos un montón de opciones. En este manual
tocaremos sencillamente las opciones de Fuente, Relleno y Borde que son las más
habituales y las más útiles en los comienzos de VBA.

Fuente

Para modificar la fuente de una celda o un conjunto de celdas usaremos las siguientes
sentencias después del rango (ya sea de una celda o de varias celdas):

.Font.Bold = True / False Lo usamos para quitar o poner negritas.


.Font.Underline = True / Para activar o desactivar el subrayado de la
False palabra.
.Font.Italic = True / False Lo usamos para quitar o poner cursivas.
.Font.Size = XX Para cambiar el tamaño de la fuente. Donde XX es
un número entero.
.Font.Color = RGB( Para modificar el color de la letra. Podemos usar el
xxx,xxx,xxx) código RGB que queramos. También podemos usar
las variables xlRed, xlBlue, xlWhite,…

La propiedad Fuente tiene otros atributos, pero los más usados son los que acabamos de
explicar.

A continuación, puedes ver un ejemplo donde se usan todos estos para la creación de un
título:

52
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

With Range("A1").Font
.Size = 16
.Color = RGB(250, 3, 19)
.Bold = True
.Italic = True
.Underline = False
End With

Relleno

Las principales opciones de relleno de una celda o varias celdas se pueden resumir en la
siguiente tabla:

.Interior.Color = Podemos modificar el color de fondo de una


RGB(xxx,xxx,xxx) celda.
.Interior.Pattern = Hay muchos tipos de variables. Entre los más
xlPattern… usados destacan: xlPatternChecker,
xlPatternHorizonta, xlPatternVertical…

Borde

Las opciones de borde pueden ser generales si usamos el método Borders o podemos
particularizarlas indicando a qué borde en concreto nos estamos refiriendo añadiendo el
indicador de borde que necesitemos.

Así pues, para usar la forma más general usaremos el método Borders de la siguiente
manera:

Range("B10:B20").Borders.Color = RGB(255,0,0)

53
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

De esta manera, todos los bordes de las celdas B10:B20 (excepto las diagonales) se
pondrán de color rojo.

Pero si solamente queremos indicar un borde en concreto podremos hacer:

Range("B10:B20").Borders(xlEdgeRight).Color = RGB(255,0,0)

De esta manera, solo el borde derecho tomará el color. El resto de los bordes no se
modificarán.

Para dirigirnos únicamente a un borde usaremos la siguiente sintaxis:

Borde superior de una celda:

Range("A1").Borders(xlEdgeTop)

Borde inferior de una celda:

Range("A1").Borders(xlEdgeBottom)

Borde derecho de una celda:

Range("A1").Borders(xlEdgeRight)

Borde izquierdo de una celda:

Range("A1").Borders(xlEdgeLeft)

Las principales propiedades que podemos utilizar con la propiedad Borders, ya sea para
un borde en concreto o para todos los bordes son:

.Color = RGB(xxx,xxx,xxx) Cambiar el color del borde de una celda usando el


código RGB que queramos.

54
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

.LineStyle = xxxx Tipo de línea del borde. Las variables pueden ser:
xlContinuos, xlDash (guiones), xlDot (puntos),
xlDashDot (guiones y puntos), xlDoubl (línea
doble)…
.Weight = xxx Establece el grosor del borde. Puede ser por orden
de menor a mayor: xlHairLine, xlThin, xlMedium,
xlThick.

Insertar fórmula
Otra operación que podemos realizar con las celdas es insertar una fórmula. Esto puede
ser útil en determinadas circunstancias como, por ejemplo, cuando estemos creando una
plantilla en un libro de Excel desde cero.

Para insertar una fórmula deberemos usar el método Formula. Un ejemplo para insertar
una fórmula es:

Range("B1").Formula = "=A2+A3"

Donde es muy importante que añadamos entre comillas la fórmula que queremos añadir
sin olvidar el símbolo "=" que precede a todas las fórmulas en Excel.

55
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

OBJETO APPLICATION

Preámbulo
Antes de explicar el objeto Application creo que será muy útil hablar del concepto de
jerarquía de objetos en Excel.

Como puede verse en la siguiente imagen, dentro de un objeto Application podemos tener
varios libros diferentes de Excel (Workbook) y dentro de cada libro podemos tener varias
hojas… y así sucesivamente, dentro de una hoja podemos tener diferentes gráficos, o
celdas, o imágenes, o tablas…

En el siguiente gráfico vemos un esquema de ejemplo de la jerarquía de Excel.

Sheet1
Workbook1
Sheet2
Application

Workbook2 Sheet1

Es decir, el objeto Application es una instancia de Excel… y podemos tener varias de estas
instancias abiertas al mismo tiempo, aunque no es lo más común.

En VBA tenemos la suerte de no tener que referenciar toda la jerarquía para referirnos a
un objeto en concreto. Es decir, cuando en una macro estamos escribiendo:

Range("A1").Activate

Estamos activando la celda A1 de la hoja activa del libro activo de la instancia de Excel
activa…, pero si quisiéramos referirnos a otro libro y otra hoja deberíamos escribir el
conjunto de la jerarquía.

56
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Application.Workbooks("Libro1").Sheets("Hoja1").Range("A1")

Dependiendo de qué es lo que quieras hacer puede que en algunas ocasiones tengas que
referenciar las hojas incluso los libros que usas. Hay que tener en cuenta que Excel, por
defecto, piensa que estás trabajando en el libro activo y en la hoja activa. Si quieres hacer
operaciones entre diferentes hojas y diferentes libros te recomiendo que escribas la
referencia más completa posible.

Aunque también, si no escribes dicha referencia conseguirás aligerar el código y aumentar


su legibilidad. Esto es muy importante pues podemos encontrarnos con un código lleno
de referencias innecesarias lo que haría que nuestra macro se ejecutara en un mayor
tiempo del necesario.

Propiedades, métodos y eventos


El objeto Application se refiere al Excel en sí mismo y tiene varias propiedades, eventos y
métodos muy interesantes, pero en esta breve introducción a VBA no merece la pena
entrar a explicar todos los detalles. Las principales propiedades que debes conocer son:

Application.ScreenUpdating

Esta instrucción es muy interesante. Nos permite hacer que, cuando corremos una macro
complicada, la pantalla de Excel no parpadea mientras realiza las diferentes operaciones.
Para ello deberíamos escribir antes de que comience la macro la siguiente sentencia:

Application.ScreenUpdating = False

Y al final de la macro deberíamos escribir:

Application.ScreenUpdating = True

57
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Es decir, que lo que hacemos entre estas dos pantallas es que no se refresque la pantalla
hasta que volvamos a poner Application.ScreenUpdating = True.

Puedes hacer una sencilla comprobación con estas dos macros en un libro que tenga dos
hojas. La primera macro va a hacer que la hoja de Excel parpadee, la segunda macro hará
que la hoja no parpadee y se ejecutará mucho más deprisa que la primera.

Sub Prueba_con_parpadeo()

For i = 1 To 50
Sheets(1).Activate
val1 = Cells(i, 1).Copy
Sheets(2).Activate
Cells(i, 1).Select
ActiveSheet.Paste
Next i

End Sub

Y ahora la macro que ejecuta las mismas sentencias, pero sin parpadear.

Sub Prueba_sin_parpadeo()

Application.ScreenUpdating = False

For i = 1 To 50
Sheets(1).Activate
val1 = Cells(i, 1).Copy
Sheets(2).Activate
Cells(i, 1).Select
ActiveSheet.Paste
Next i

Application.ScreenUpdating = True

58
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

End Sub

Como ves, la diferencia de tiempo entre la primera y la segunda es apreciable…, pero,


sobre todo, lo que notarás, es que no tienes la sensación de que Excel se queda colgado,
es decir, parece que no responde.

Application.GetOpenFilename

Mediante esta sencilla instrucción se abrirá una ventana con la que poder seleccionar un
archivo. Aunque esta instrucción no abre dicho archivo, sino que te permite obtener su
nombre y ruta. La siguiente macro te ayudará a entender mejor a lo que me refiero:

Sub Get_open_file_name()

Nom_Archivo = Application.GetOpenFilename
MsgBox Nom_Archivo

End Sub

Como ves, esta macro nos devuelve en pantalla la variable "Nom_Archivo" a través del
método MsgBox.

Application.Display…

Hemos puesto unos puntos suspensivos porque hay un montón de propiedades que
empiezan por Display. En la siguiente tabla puedes ver las que hemos juzgado de mayor
interés.

True / False. Para permitir o evitar que Microsoft


DisplayAlerts lance algunas alertas mientras se ejecuta una
macro.

59
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

True / False. Para mostrar la barra de fórmulas de


DisplayFormulaBar
Excel.
DisplayFullScreen True para habilitar el modo de pantalla completa.
True / False para mostrar/ocultar la barra de
DisplayScrollBar
desplazamiento de la derecha y de abajo.
True / False para mostrar/ocultar la barra estado
DisplayStatusBar
de la parte inferior de la pantalla de Excel.
Permite usar una función específica de Excel. Por
WorksheetFunction ejemplo: Application.WorksheetFunction.Right()
para usar la función DERECHA de Excel

60
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

OBJETO WORKBOOKS
En la jerarquía de Excel, el objeto Workbook es un objeto de segundo nivel, es decir, por
encima sólo podrá tener el objeto Application.

El objeto Workbook se refiere a un libro de Excel, sus propiedades, métodos y eventos. Es


decir, en general todo lo que podrás hacer con un libro de Excel.

Referencias al objeto Workbooks

Workbooks

La manera más frecuente de llamar a un libro de Excel será a través del objeto Workbooks
y el índice del libro o el nombre del mismo.

Para utilizar el índice deberemos saber el número de libros que se han creado o que hay
abiertos, al igual que pasa con las hojas. Para seleccionar el segundo libro que se ha creado
o abierto en la instancia activa de Excel usaremos la siguiente sintaxis:

Workbooks(2).Activate

Aunque también podríamos usar el nombre del libro si lo conociéramos entre comillas:

Workbooks("Mi libro.xlsx").Activate

Esta segunda manera es más complicada pues no es frecuente que un libro tenga siempre
el mismo nombre y no vaya cambiando de versión. En cualquier caso, puede darse alguna
circunstancia en la que nos venga bien utilizar esta sentencia.

61
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

ActiveWorkbook

Esta instrucción te permite dirigirte directamente al libro que está abierto y activo en el
momento de ejecución de la macro. Es muy útil cuando estás utilizando un primer libro o
cuando no sabes el nombre del libro abierto o cuando no quieres escribir el nombre del
libro entero.

Por ejemplo, para dirigirme a una hoja en concreto del libro activo usaré la sentencia:

ActiveWorkbook.Sheet(1).Activate

ThisWorkbook

Nos permite dirigirnos al libro que contiene la macro que se está utilizando. Por ejemplo,
si quiero saber en qué libro he guardado la macro ejecuto la siguiente sentencia:

ThisWorkbook.Name

Principales propiedades y métodos


Las propiedades más importantes que tendrás que usar con los libros de Excel serán:

Open

Esta propiedad te permitirá abrir un libro en concreto señalando su ruta y su nombre.

Mi_libro = Application.GetOpenFilename

Workbooks.Open Filename:=Mi_libro

Si el nombre lo conoces previamente entonces puedes poner:

Mi_libro = "C:/Libro1.xlsx"

62
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Workbooks.Open Filename:=Mi_libro

Close

Este método permite cerrar un libro de Excel. Además, podremos añadir unas cuantas
propiedades como la ruta en la que queremos guardarlo o si queremos guardar los
cambios…, por ejemplo, en este caso vamos a cerrar el libro activo mediante una sencilla
sentencia y además guardaremos los cambios realizados desde la última vez que se
guardó:

ActiveWorkbook.Close savechanges:=True

Save

Para guardar el libro después de realizar una serie de cambios en el mismo usaremos la
sentencia:

ActiveWorkbook.Save

Una variante de Save es la de SaveAs mediante la cual podemos guardar el libro de Excel
en cuestión con un nombre concreto y en una ruta concreta.

Por ejemplo, podríamos guardar un libro cualquiera usando la siguiente sintaxis:

ActiveWorkbook.SaveAs Filename:="C:\....\Mi libro.xlsx"

Name

Esta propiedad devuelve el nombre de un libro. Puede usarse como en el siguiente


ejemplo donde el nombre del libro se traspasa a la celda A1:

Sub Nomb_libro()

63
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Range("A1") = ThisWorkbook.Name
End Sub

Activate

Permite activar un libro en concreto para tenerlo visible en pantalla. Por ejemplo, si
tenemos varios libros abiertos y ejecutamos el siguiente código, el primer libro que se
abrió se pondrá en la ventana activa.

Workbooks(1).Activate

Como puedes ver, he usado el número 1 para referirme al primer libro que se ha abierto.
Para activar el último libro que se abrió puede utilizarse la siguiente sentencia:

Workbooks(Workbooks.Count).Activate

Ojo, no te confundas con Select. Esta propiedad no existe para los Workbooks, aunque sí
que existe para hojas, celdas, rangos y otros objetos de Excel.

Add

Este método lo usaremos para añadir un nuevo libro dentro de nuestra aplicación de
Excel. Para ello usaremos la siguiente sintaxis

Workbooks.Add

De esta manera añadiremos un nuevo libro. Además, el nuevo libro se colocará en la


posición de libro activo así que nos podremos referir a este libro como ActiveWorkbook.

Ejemplos
Para poder entender mejor este capítulo vamos a ver algunos ejemplos.

64
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Ejemplo 1
En este ejemplo solo tendremos un libro activo y en este libro tendremos una única hoja.
En esta hoja escribiremos los números del 1 al 10 en el rango A1:A10. Lo que haremos
será copiar estos valores y pegarlos en un nuevo libro. Para ello utilizamos la siguiente
macro.

Sub Copiar_en_nuevo_libro()
Sheets(1).Range("A1:A10").Copy
Workbooks.Add
ActiveSheet.Paste
End Sub

Ejemplo 2
En este ejemplo vamos a crear un libro que guardaremos en la ruta "C:\Temp". Si no tienes
una carpeta que se llame "Temp" te recomiendo que la crees para poder hacer pruebas.
En esta carpeta vamos a guardar un libro con el nombre "Libro_prueba.xlsx". En este libro
vamos a dejar una única hoja y en la celda A1 escribiremos el número 1.

La macro que vamos a crear abrirá este libro, copiará el valor de la celda A1 en el libro que
tenemos abierto y lo cerrará.

Sub Abrir_copiar_cerrar()

'Abro el libro que he creado para el ejemplo


Workbooks.Open Filename:="C:/Temp/Libro_prueba.xlsx"

'copio la celda A1
Sheets(1).Range("A1").Copy

'Voy al libro inicial, lo activo y me sitúo en la celda A1


ThisWorkbook.Activate
Sheets(1).Activate
Range("A1").Select

65
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

'Pego la celda que he copiado previamente


ActiveSheet.Paste

'Cierro el libro sin guardar los cambios


Workbooks("Libro_prueba.xlsx").Close savechanges:=False

End Sub

66
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

OBJETO WORKSHEET

Introducción
Este objeto se refiere a las hojas de un libro de Excel. Es decir, está un nivel por debajo del
objeto Workbook y un nivel por encima de los objetos Rango, Columna, Fila, etc.

Hay dos maneras de hacer referencia a una hoja en VBA.

Sheets(1)

Worksheets(1)

Ambas maneras funcionan, básicamente, de la misma manera así que es elección del
usuario una u otra sintaxis.

Yo, en mi caso, me suelo decantar por la forma Sheets puesto que es una manera
abreviada de referirse al objeto Sheets y casi todo en mi vida se basa en buscar una manera
más eficiente de hacer lo mismo.

Referencias a hojas
Para llamar a una hoja hay dos métodos. Uno es a través de su índice y otro es a través de
su nombre.

El índice es una propiedad numérica que tienen las hojas. Esta propiedad es un valor
entero que tiene cada hoja y es único. Este valor se otorga automáticamente a cada hoja
a medida que se van creando. Así, la primera hoja del libro siempre tiene el valor 1.

Para referirnos a la segunda hoja del libro que fue creada usaremos la siguiente sintaxis:

67
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Sheets(2)

El número dos puede sustituirse por una variable si en esta usáramos un valor válido para
referirnos a la hoja, es decir:

Dim Nom_hoja as string


Nom_hoja = "Mi hoja 1"
Sheets(Nom_hoja)…

Por otro lado, una hoja tiene un nombre que puede modificarse a través de VBA o en la
pestaña de Excel de la parte inferior de cada hoja. Así pues, podremos referirnos a cada
hoja mediante su nombre. Si la hoja se llama "Prueba" usaremos el siguiente código para
referirnos a ella.

Sheets("Prueba")

Donde el nombre de la hoja siempre va entre comillas ("") y debe ser exactamente igual
al que nos referimos. Esta propiedad no hace diferencias entre mayúsculas y minúsculas
así que podremos usarlas indistintamente.

ActiveSheet

El método ActiveSheet se refiere a la hoja activa y visible que la aplicación Excel tiene en
el momento. De esta manera siempre nos podremos referir a la hoja activa
independientemente de si no conocemos su nombre o su índice.

Esta manera de usar la referencia a hojas puede resultar particularmente útil cuando
hacemos una llamada a un macro en la que no sabemos en qué hoja puede estar el
usuario, es decir, no sabemos ni el índice de la hoja ni su nombre.

68
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Principales propiedades
Las hojas tienen varias propiedades, pero en esta explicación queremos destacar las
siguientes:

Seleccionar (Select)

Esta propiedad nos permite seleccionar una hoja. Para llevar a cabo esta operación la hoja
tiene que estar visible (es decir, no oculta).

Para ello usaremos la sintaxis:

Sheets(índice).Select

De esta manera, la hoja seleccionada será la hoja activa en nuestra aplicación de Excel. Es
decir, la hoja que estamos viendo a través de la pantalla.

Activar (Activate)

Es muy parecida a la propiedad Select, pero no hacemos que al activarla se convierta en


la hoja activa.

Contar (Count)

Contar el número de hojas que tiene un libro puede resultar útil en algunas circunstancias.
Para ello usaremos la sentencia:

Sheets.Count

Copiar y pegar

Para copiar una hoja entera usaremos el método:

69
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Sheets(índice).Copy

Y la hoja copiada se colocará inmediatamente después de la hoja que hemos copiado.

Si queremos que la hoja copiada se coloque en una posición en concreto usaremos la


propiedad After como puede ver en la siguiente sentencia.

Sheets(índice).Copy After:=Sheets(Sheets.Count)

En este caso, para colocar la nueva hoja al final del libro indicamos que la hoja después de
la que queremos colocarlo tiene el índice de la hoja igual al número de hojas totales del
libro.

Añadir (Add)

Este método nos permite añadir una hoja de Excel en nuestro libro.

Para ello usaremos la siguiente sentencia.

Sheets.Add

Si queremos añadir la hoja en una posición en concreto podremos usar las variables Before
o After indicando la hoja que irá antes o después de la que queremos añadir.

Sheets.Add Before:=Sheets(1)

En el ejemplo anterior, la hoja que añadiremos estará en la primera posición.

Nombre (Name)

Un método muy sencillo y muy utilizado es el método Name. Nos permite identificar el
nombre de una hoja o modificarlo. Nos permite acceder al atributo Name de la hoja. La
sintaxis es:

70
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Sheets(índice).Name

Si queremos guardar el nombre de la hoja en una variable deberemos usar la siguiente


sentencia:

Nombre_hoja = Sheets(índice).Name

Visible

Podemos ocultar o mostrar hojas mediante VBA. Para ello usaremos la propiedad Visible
que nos permitirá cambiar el estado de una hoja de visible a oculta.

Para ocultar una hoja usaremos la siguiente sintaxis:

Sheets(índice).Visible = False

Y para hacerla visible usaremos el siguiente código:

Sheets(índice).Visible = True

Ejemplos
Ejemplo 1

En este ejemplo vamos a ver cómo añadir una hoja de Excel y cambiarle el nombre.

Sub Ejemplo1()

Sheets.Add

ActiveSheet.Name = "Nuevo nombre"

End Sub

71
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Utilizamos el método ActiveSheet porque siempre, al añadir una hoja, la hoja añadida es
la activa y es una manera muy sencilla de saber qué hoja hemos añadido.

Ejemplo 2

En la siguiente macro vamos a seleccionar una celda de una hoja y la vamos a guardar en
una variable. Esta variable la pondremos en otra celda de otra hoja.

Sub Ejemplo2()

Var1 = Sheets(1).Cells(1, 2)

Sheet(2).Select
Cells(2, 3) = Var1

End Sub

72
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

INSTRUCCIÓN SET
La instrucción Set permite atribuir un objeto a una variable. Es decir, guardaremos en una
variable un objeto en concreto, ya sea un libro, una hoja, un gráfico, un rango…

Sintaxis
Su sintaxis es muy sencilla como veremos a continuación:

Set Nom_objeto = Referencia_objeto

Donde:

• Nom_objeto es el nombre de la variable con la que nos queremos referir al objeto


• Referencia_objeto es el objeto o variable del mismo tipo al objeto al que nos
referimos.

Por ejemplo, para asignar una hoja de un libro a una variable en concreto usaremos las
siguientes sentencias de código:

Dim shtDatos as Worksheet

Set shtDatos = ThisWorkbook.Sheets("Hoja de datos")

De esta manera, siempre que hagamos referencia a la hoja "Hoja de datos" podremos
sustituir toda la referencia:

Sheets("Hoja de datos")

Por la variable que hemos creado:

shtDatos

73
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

lo que hará la lectura mucho más sencilla.

Así pues, una vez creada la variable shtDatos podremos referirnos a un rango en concreto
como:

shtDatos.Range("A1:A2")

Por ejemplo, si queremos ahora crear un rango dentro de "Hoja de datos" podremos
escribir lo siguiente:

Dim Mi_rango as Range

Set Mi_rango = shtDatos.Range("A1:A2)

Ejemplos
Los siguientes ejemplos servirán para poder entender mejor los conceptos explicados.

Ejemplo 1
En este ejemplo vamos a crear un rango (Rng1) de una hoja (Sht1) y lo vamos a copiar a la
hoja siguiente (Sht2). Para ello, necesitamos un libro que contenga al menos 2 hojas.

Sub Ejemplo1()

'Declaro las variables del ejemplo


Dim Rng1 As Range
Dim Sht1, Sht2 As Worksheet

'Creo las variables rango y hojas


Set Sht1 = Sheets(1)
Set Rng1 = Sht1.Range("A1:A10")
Set Sht2 = Sheets(2)

'Operaciones de copiar y pegar


Rng1.Copy

74
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Sht2.Activate
ActiveSheet.Paste

End Sub

Ejemplo 2
Creamos un nuevo libro que asignamos a la variable Nuevo_libro

Dim Nuevo_libro as Workbook


Set Nuevo_libro = Application.Workbooks.Add

75
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

EVENTOS EN VBA

Introducción
Los eventos en VBA son aquellos procedimientos de VBA que se ejecutan
automáticamente dadas unas circunstancias

Los eventos son particularmente útiles en ciertas ocasiones cuando no queremos que
haya botones asociados a nuestras macros, sino que dichas macros se ejecuten
automáticamente.

Por ejemplo, mediante eventos, podemos hacer que una macro se ejecute al abrir un libro
o al cerrarlo o cuando cambiamos de hoja.

Tipos de eventos
En VBA orientado a Excel tenemos un montón de eventos que podemos utilizar en nuestro
libro. En este libro no pretendemos explicar todos, pero sí los más relevantes como verás
a continuación.

Los eventos se clasifican en varios tipos dependiendo del objeto al que vayan orientados:

• Aplicación de Excel
• Libro
• Hoja
• Gráfico
• Tabla dinámica
• Hipervínculo

Pero como antes te decía, en este libro, no pretendo explicarlo todo. Los más importantes
son los que puedes ver a continuación.

76
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Eventos del libro

Los eventos de libro son aquellos que se ejecutan cuando se realizan determinadas
operaciones con un libro de Excel. Los más utilizados (y en mi opinión, los más útiles) son:

Workbook_Open

Este evento se utiliza para ejecutar una macro cuando se abre un libro de Excel. Algunos
de sus posibles usos son:

• Lanzar un mensaje al usuario con un MsgBox


• Ir a una celda determinada al abrir el libro
• Proteger un libro para que el usuario que lo abra no pueda hacer modificaciones
• Sincronizar el libro con una base de datos para importar un listado de valores
• ….

La sintaxis de este evento es:

Private Sub Workbook_Open()

End Sub

Workbook_BeforeSave

Este evento se ejecuta justo antes de guardar un libro de Excel. El evento puede ejecutar
cualquier macro, pero algunos de sus ejemplos son:

• Colocar todas las hojas con el mismo zoom


• Asegurarse de que el usuario quiere guardar en la misma versión
• Eliminar ciertos datos de una hoja de Excel
• Copiar ciertos datos como valores a un nuevo libro de Excel
• ….

77
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

La sintaxis de este evento es:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As


Boolean)

End Sub

Ya sé que tiene una serie de argumentos, pero no te preocupes, más adelante te podrás
preocupar por ellos.

Workbook_BeforeClose

Este evento se ejecuta antes de cerrar el libro de Excel y puede servir para:

• Evitar que se cierre un libro de Excel dándole a la "X" de la esquina superior


izquierda
• Guardar el libro si se comprueba que no está guardado
• …

La sintaxis para este tipo de eventos es:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

End Sub

Otros eventos que se pueden usar:

Hay muchos otros eventos que se pueden usar en VBA aplicados a un objeto libro. Aunque
ya te hemos contado los más importantes quizás no esté de más que también puedes usar
estos otros. No es una lista completa, son sólo aquellos que he considerado más
representativos:

• Activate
• AfterSave

78
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

• BeforePrint
• Deactivate
• ….

Eventos de hoja

Los eventos de hoja son, en mi opinión, más interesantes que los eventos de libro pues
nos permiten realizar una serie de operaciones en la propia hoja que tienen un montón
de utilidades. Estos eventos se ejecutan cuando se realiza alguna operación sobre una
hoja en cuestión que actúa como disparador del evento. Algunos de estos eventos más
utilizados son:

Worksheet_SelectionChange

Permite ejecutar una macro cada vez que se selecciona una nueva celda en la hoja. Esta
macro es muy útil porque se puede limitar a un determinado rango de celdas o a única
celda.

Su sintaxis es:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

Donde el argumento Target es el que nos permite identificar la celda que se ha


seleccionado (o el conjunto de celdas).

Worksheet_Change

Este evento nos permite identificar si una celda ha modificado su valor o no lo ha


modificado. De esta manera, podremos ejecutar una macro si dicho valor se ha
modificado.

79
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

La sintaxis de este evento es:

Private Sub Worksheet_Change(ByVal Target As Range)

End Sub

Donde el argumento Target actúa de la misma manera que en el caso anterior.

Worksheet_Calculate

Nos permite ejecutar una macro automáticamente cuando las fórmulas de una hoja se
calculan. La sintaxis de este evento es:

Private Sub Worksheet_Calculate()

End Sub

Crear un evento en VBA


Para crear un evento en VBA deberás ir a la pestaña del editor de VBA. En esta pestaña
seleccionarás una hoja o el libro de Excel de la pestaña Explorador de proyectos haciendo
doble clic sobre el elemento en el que quieras crear el evento. Las hojas, normalmente
vienen indicadas por el nombre "Hoja" y los eventos de tipo libro los encontrarás en
ThisWorkbook. En la siguiente imagen puedes ver los objetos de un libro llamado "Libro
13" en el explorador de proyectos del editor de VBA.

Una vez que hayas hecho la selección del objeto deseado, aparecerá una pantalla en
blanco con los siguientes desplegables en la parte de arriba.

80
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Del desplegable de la izquierda seleccionaremos Worksheet o Workbook dependiendo de


nuestra selección anterior.

Una vez seleccionado, en el desplegable de la derecha podremos seleccionar el tipo de


evento que queremos escribir.

Al hacerlo, se creará automáticamente el código del evento. Esto nos ayudará


enormemente para no tener que recordar la sintaxis de todos ellos.

Una vez hecho esto tan sólo tendrás que crear el código que quieras que se ejecute con
tu evento.

Ejemplos

Ejemplo On Open
En este ejemplo vamos a utilizar el evento OnOpen del libro para poner al usuario un
mensaje de bienvenida:

Private Sub Workbook_Open()

MsgBox "Bienvenido a este libro.", vbInformation + vbOKOnly,


"Bienvenida"

End Sub

81
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

En este ejemplo hemos usado la función MsgBox de manera un poco más elaborada. En
ella hemos indicado:

• El texto del mensaje: "Bienvenido a este libro"


• El tipo de alerta: vbInformation vbOKOnly
• El título de la ventana: "Bienvenida"

Ejemplo Before Close


En este ejemplo vamos a poner todas las hojas con el zoom al 80% antes de guardar el
libro:

Private Sub Workbook_BeforeClose(Cancel As Boolean)


Dim Sht As Worksheet

For Each Sht In ActiveWorkbook.Worksheets


Sht.Activate
ActiveWindow.Zoom = 80
Next
End Sub

Ten en cuenta que en este ejemplo hemos usado el objeto ActiveWindow al que
pertenece la propiedad Zoom. Curiosamente, para cambiar el Zoom de cada hoja
tendremos que hacer referencia a la ventana activa y no a otra propiedad de las hojas.

Ejemplo Worksheet Selection Change


Mediante este evento correspondiente a una hoja vamos a colorear la celda seleccionada
si está dentro de un rango de celdas determinado.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Not Intersect(Target, Range("A1:F20")) Is Nothing Then


Range("A1:F20").Interior.Color = RGB(255, 255, 255)
ActiveCell.Interior.Color = RGB(255, 0, 0)

82
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

End If

End Sub

83
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

CREAR FUNCIONES

¿Qué es una función definida por el usuario?


En VBA se pueden crear funciones que no estén previamente creadas en Excel. Estas
funciones pueden o no utilizarse como fórmulas normales o pueden llevar a cabo otras
operaciones dentro de nuestro libro de Excel como copiar un objeto o llevar a cabo ciertos
cálculos repetitivos.

Una función definida por el usuario o en inglés, por sus siglas UDF, es una función que
creamos en VBA para usar, o bien en nuestro código de VBA y para ello le asignaremos la
propiedad de Private, o para utilizar en nuestro libro de Excel como si de cualquier otra
fórmula se tratara y para ello la denominaremos Public.

Por defecto una función será Public a no ser que indiquemos que sea Private
explícitamente.

Crear una función


Crear una función en VBA es muy sencillo. En un módulo cualquiera de VBA puedes crear
la función de VBA que quieras. La sintaxis de una función es:

Public / Private Function NOMBRE_FUNCION (Argumentos) [as


Tipo_variable]

End Function

Donde:

• Public / Private lo usaremos si queremos que se pueda usar la función en nuestras


celdas de Excel o no respectivamente.

84
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

• Argumentos: es un valor no obligatorio. Dependiendo de para qué sirva nuestra


función podremos pasarle una serie de argumentos como valores de celdas, hojas,
cadenas de texto, valores numéricos… aunque también puede que nuestra función
no lo requiera.
• As Tipo_Variables: es un valor no obligatorio. Podemos definir el tipo de variable
que nos arrojará nuestra propia función. Puede ser tipo Boolean, tipo String… o, si
no ponemos nada, será tipo Variant.

Ejemplos
Como ya hemos dicho previamente, todo se entiende mejor con ejemplos así que vamos
a ver unos cuantos para que se entienda bien.

Ejemplo 1
Este es un ejemplo de función Public que calcula un área a partir de la altura y la longitud
de dos variables que se encuentran en celdas.

Public Function AREA(Lng As Range, Alt As Range) As Double


AREA = Lng.Value * Alt.Value
End Function

Como puedes ver, es una función muy sencilla que sólo está multiplicando dos variables
que obtenemos de dos celdas diferentes. Te animo a que la pruebes tú mismo.

Ejemplo 2
En este ejemplo vamos a crear una función que nos permite sustituir la letra ‘ñ’ por la letra
‘n’ en caso de que encontremos en un texto dicha letra. Es una función de tipo Private. O
sea que no se podrá usar en la hoja de Excel en ninguna celda.

Private Function QUITAR_LETRA(Palabra_original As String) As String

If InStr(1, Palabra_original, "ñ") > 0 Then

85
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

QUITAR_LETRA = WorksheetFunction.Substitute(Palabra_original,
"ñ", "n")
Else
QUITAR_LETRA = Palabra_original
End If

End Function

Esta función devuelve el texto o palabra original si no encuentra la letra ‘ñ’ dentro de ella,
pero si la encuentra la sustituirá por la letra n.

Para poder llevar a cabo este ejemplo hemos usado una función propia de Excel, la
función Substitute (sustituir en español). Para llamar a una función nativa de Excel
deberemos utilizar el método WorksheetFunction tal y como puedes ver en el ejemplo
anterior.

86
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

CONCLUSIÓN
Como has podido ir viendo hasta ahora, las posibilidades de VBA son casi infinitas y eso
que hay muchas cosas que hemos dejado fuera del alcance de este manual de
introducción a VBA: más sobre eventos, uso de funciones de Excel en VBA, explicación
sobre funciones nativas de VBA, introducción a los formularios, etc.

Espero que este método con todos sus ejemplos y sus ejercicios te haya ayudado a mejorar
mucho sobre el uso de esta súper herramienta.

A partir de aquí te recomiendo que no pares de aprender, no te conformes. Puedes


ahorrarte un montón de horas de trabajo si aplicas los conceptos que has aprendido aquí.
No dudes en seguir poniéndote retos a ti mismo para seguir aprendiendo. El mejor camino
es la práctica. Como dice el dicho, "la práctica hace maestros". Así que, practica y practica
para convertirte en un verdadero maestro de VBA.

Si quieres saber más del tema puedes visitar la web www.excelyvba.com y ponerte en
contacto con ellos en www.excelyvba.com/about

87
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.
QUIQUE ARRANZ APRENDE A PROGRAMAR MACROS DESDE 0

Quique Arranz es el fundador del portal de Excel en castellano más


completo. En su página puedes encontrar ejercicios, explicaciones,
cursos y tutoriales para casi cualquier duda que tengas sobre Excel.

Además, Quique tiene una vida paralela al mundo de Excel. Es


padre de tres pequeñajos, marido, amante de los deportes con
algo de riesgo y de las tecnologías digitales.

Puedes encontrarle en LinkedIn y escribirle para comenzar una


conversación sin ningún tipo de problema, estará encantado de
conversar contigo.

88
Todos los derechos reservados. Queda totalmente prohibida su copia o reproducción parcial sin citar la fuente y sin consentimiento del autor.

También podría gustarte