1º PARTE - Teoría y Programación de Macros (Nivel principiante

Transcripción

1º PARTE - Teoría y Programación de Macros (Nivel principiante
1º PARTE - Teoría y Programación de Macros
(Nivel principiante - intermedio)
Introducción
Bienvenido al Manual de Macros de Exceluciones. Estás por comenzar una de las experiencias más fascinantes
y atractivas de la Hoja de Cálculos Excel.
Con las macros podrás sorprender y sorprenderte porque incrementarás las prestaciones y el potencial de Excel
de forma ilimitada. El único límite que tendrás será tu imaginación.
Excel y Macros
La Hoja de Cálculos Excel es una de las herramientas más poderosas para el tratamiento de datos y su análisis.
Una de las mayores ventajas que posee es la flexibilidad que ofrece y la rapidez con la que podemos construir
plantillas y todo tipo de modelos, para diversos usos y aplicaciones.
Sin embargo, si realmente quieres "exprimir todo el jugo" a Excel, deberás conocer y utilizar una de sus mayores
y más potentes herramientas: las macros.
Si eres usuario principiante de la hoja Excel con este manual darás un salto cuántico y te convertirás
rápidamente en todo un experto. Y si eres un usuario avanzado de Excel y ya tienes conocimientos previos de
macros, este manual te servirá para refrescar algunos conceptos pero también te sorprenderás con nuevos
códigos y secciones especiales que hemos preparado para ti.
Una definición sencilla
Una buena forma de introducirnos al mundo de las macros es con una definición sencilla y directa.
Macro: es un conjunto de instrucciones de código (programado) que permiten realizar una tarea determinada
como así también expandir e incrementar las prestaciones de Excel. Las macros se escriben en lenguaje de
programación VBA (Visual Basic for Applications). El Excel ya trae incorporado un editor de VBA por lo que las
macros se programan dentro del mismo programa Excel.
Mucha gente le tiene un poco de miedo a la palabra "programación". Bueno, si ese es tu caso no debes
preocuparte. Hace unos años nosotros mismos no teníamos la más mínima idea de programación Excel. Pero la
buena noticia es que con un buen manual (confiamos en que este lo es!) podrás aprender y "tomar vuelo"
rápidamente en el mundo de las macros.
Verás que es fácil, divertido y que puedes expandir al infinito los límites de Excel
Utilidad de una macro
Anteriormente definimos a las macros como algo que nos permite expandir e incrementar las prestaciones de la
hoja Excel. ¿Cuáles serían algunos ejemplos de esto? Bueno, los ejemplos los iremos viendo en este manual,
pero a grandes rasgos podemos comentar que las 4 grandes "áreas" donde se aplican las macros son:
1. Automatización de tareas y procesos que involucran muchos pasos
2. Creación de nuevas funciones a medida (aparte de las que ya posee Excel).
3. Creación de nuevos comandos, complementos y menús.
4. Creación de completas aplicaciones a medida.
Como queda en claro, con las macros podemos automatizar y crear. Veamos un poco más en detalle estas 4
áreas donde aplicaremos las macros.
Automatización de procesos: supongamos que todos los días debemos trabajar en nuestro libro Excel en el cual
debemos seleccionar un rango, centrarlo, cambiarle la fuente, poner la fuente en cursiva, aplicarle negrita y
finalmente aplicarle bordes a toda la selección. Estas 6 acciones las hacemos manualmente y no parecen
muchas, ¿pero que tal si hay que hacer esto en repetidas ocasiones y todos los días? Una macro nos permite
ejecutar los 6 pasos automáticamente, tan solo presionando un botón o una tecla. Las tareas ideales para
automatizar son aquellas que se hacen de forma repetida e involucran muchos pasos, por ejemplo: imprimir
informes, configurar la vista de la hoja, actualizar datos de tablas dinámicas, etc...
Creación de funciones a medida: las funciones y fórmulas Excel son quizás la esencia de la hoja de cálculos (si
no se pudieran utilizar funciones y fórmulas no habría cálculos!). Excel trae incorporada unas 330 funciones
estándar las cuales se pueden utilizar en forma aislada o en forma combinada (anidadas). Sin embargo suele
suceder que justo la función que necesitamos no existe. Nuevamente, las macros vienen a nuestra salvación.
Podemos programar funciones a medida que hagan exactamente lo que nosotros queremos. Y esas funciones
se comportarán igual que las de Excel (aparecerán en el menú de funciones en la categoría que nosotros
indiquemos, tendrán sus respectivos argumentos, etc.)
Creación de nuevos comandos, complementos y menús: Excel trae una gran cantidad de comandos y menús
predefinidos que nos asisten para las operaciones más habituales. Las macros nos permiten crear nuestros
propios comandos y menús personalizados, e incorporarlos al Excel. La utilidad de los mismos depende tan solo
de nuestras necesidades. Los complementos Excel también están creados con macros. Si ves en el menú
Herramientas > Complementos verás una lista de los que tienes instalado en tu Excel. Los mismos suelen ser
distribuidos de forma gratuita o también se compran. Su utilidad reside en agregar alguna funcionalidad extra al
Excel.
Creación de aplicaciones a medida: Excel es utilizado en diversos campos y por una gran cantidad de usuarios.
Las macros te permitirán construir complejas y elegantes aplicaciones para cualquier uso que quieras darles. El
límite solo es tu imaginación. Una aplicación Excel consiste en algo más que una simple plantilla con datos y
fórmulas. Una aplicación Excel es un verdadero programa de software con una serie de características que lo
hacen utilizable por cualquier usuario sin que el mismo tenga que entender la lógica "Exceliana" que hay por
detrás.
Objetos, Propiedades y Métodos (OPM)
Cuando hablamos de macros hablamos de Objetos, Propiedades y Métodos (OPM). Estos son los 3 conceptos
generales más importantes que debes conocer a la hora de programar las macros. De momentos solo te
daremos una sencilla definición y luego iremos profundizando más en ellos.
Hay un ejemplo muy práctico para comprender lo que son los Objetos, Propiedades y Métodos (OPM).
Supongamos que tenemos una canasta con frutas. ¿Cuales serían los OPM de la misma?
Objetos: los objetos de la canasta de frutas serían las mismas frutas (manzanas, naranjas, peras…).
Propiedades: las propiedades serían las características de las frutas (color, olor, sabor, textura…).
Métodos: finalmente los métodos son las acciones que podríamos ejercer sobre las frutas (comprarlas,
venderlas, comerlas, almacenarlas, limpiarlas, quitarles la piel,…).
Pasemos ahora a ver un sencillo ejemplo de algunos OPM de Excel.
Objetos: prácticamente cada cosa que veas en Excel es un objeto. Ejemplos de objetos son: un libro Excel, una
hoja, un rango, una celda, un menú, un gráfico, una tabla dinámica, un cuadro de diálogo, las etiquetas de hojas,
las columnas, las filas, etc. En fin, cada partecita de Excel es un objeto. Un objeto es algo que puedes ver e
identificar con un nombre.
Propiedades: las propiedades son las características de los objetos. Por ejemplo, para el objeto "celda" algunas
de sus propiedades serían: alto, ancho, color, bloqueada o desbloqueada, vacía, con un número o con una
fórmula, etc. Por ejemplo para el objeto "hoja" algunas de sus propiedades serían: visible u oculta, con o sin
líneas de división, con o sin barras de desplazamiento vertical y horizontal, etc.
Métodos: un método es una acción que podemos realizar sobre el objeto o una de sus propiedades. Por ejemplo
sobre el objeto "hoja" podemos: activar, mover, copiar o borrar.
De momento estas definiciones son suficientes para empezar a entender algunos conceptos. Recuérdalas bien
porque las usaremos en todo el manual.
En la medida que adquieras mayores conocimientos sobre como programar macros irás manejando y
conociendo cada vez más objetos, con sus propiedades y sus métodos. En definitiva, de eso se trata programar
una macro: conocer el nombre del objeto, conocer el nombre de alguna propiedad del mismo que quieras
modificar y también conocer el nombre de algún método que desees aplicarle.
Lenguaje VBA
Recuerda que la programación de macros se hace a través del lenguaje VBA (Visual Basic for Applications)
desde el editor VBA que trae incorporado Excel. Este tipo de programación también se conoce como
"Programación Orientada a Objetos" (OOP, Objects Oriented Programming). La Programación orientada a
Objetos nos permite trabajar sobre los objetos propios de Excel como así también crear nuestros propios objetos.
Esto se relaciona con lo que te comentábamos en la sección anterior sobre Objetos, Propiedades y Métodos.
Hablar de macros, lenguaje VBA y OPM es lo mismo. El lenguaje VBA es muy fácil de entender y siempre gira en
torno a seleccionar los objetos, cambiar sus propiedades y/o ejecutarles distintos métodos. La única
particularidad es que el lenguaje VBA solo está en inglés. Sin embargo, y para que no te desalientes, conocemos
muchísimos programadores de macros que prácticamente no saben inglés! Esto es así porque solo hay que
conocer la palabra en inglés para cada objeto, propiedad y método. Veamos un sencillo ejemplo de algunos
objetos de Excel y su denominación en inglés, el idioma utilizado por las macros:
Ejemplos de Objetos VBA (entre paréntesis su significado en español)
Cell (celda)
Range (rango)
Worksheet (hoja)
Workbook (libro)
Ejemplos de Propiedades VBA (entre paréntesis su significado en español)
Value (valor)
Color (color)
Format (formato)
Ejemplos de Métodos VBA (entre paréntesis su significado en español)
Copy (copiar)
Protect (proteger)
Delete (borrar)
En la medida que avances con la lectura de este manual te irás familiarizando con la denominación de los
distintos objetos, propiedades y métodos. El lenguaje VBA tiene miles de OPM, y existe una forma muy práctica
de conocerlos todos que es con la grabadora de macros, tema que trataremos más adelante.
Aprender macros es mucho más fácil de lo que tu te imaginas. Es cierto que hay macros muy complicadas que
requieren un conocimiento muy avanzado. Pero es un lenguaje fácil y muy intuitivo. Además Excel posee una
grabadora de macros que las escribe de forma automática. Luego nosotros podemos retocarlas a gusto. Te
aseguramos que en cuanto termines este manual estarás escribiendo tus propias macros y te sorprenderás lo
fácil que es seguir aprendiendo y profundizando tus conocimientos. Nosotros te daremos las herramientas para
que lo consigas!
Como comenzar
Antes de comenzar a programar macros es necesario que conozcas la barra de herramientas VBA y las distintas
formas de acceder al editor de macros, que es la herramienta donde escribirás el código de las mismas.
En las secciones siguientes te enseñaremos ambos conceptos.
Barra de Herramientas VBA
El primer paso para empezar a programar macros es familiarizarnos con las herramientas que nos ofrece Excel
para programarlas.
Excel posee una Barra de Herramientas de Macros o VBA. Puedes acceder a la misma desde el menú
Herramientas > Macros. Dicho menú se ve como en la fotografía a continuación (fíjate que también se indican las
combinaciones de teclas para acceder a dichas opciones).
También tienes la opción de dejar siempre visible dicha barra de herramientas. Puedes hacer esto desde el
menú Ver > Barras de Herramientas > Visual Basic. Verás como aparece una nueva barra de herramientas de
macros. Puedes ubicar esta barra de herramientas donde te sea más cómodo.
Editor VBA
El Editor de Visual Basic es la aplicación que trae Excel desde donde se escriben y guardan las macros. Tienes 3
formas de acceder al editor:
A. Desde el menú Herramientas > Macros > Editor de Visual Basic
B. Desde el botón Editor de Visual Basic de la Barra de Herramientas Visual Basic.
C. Desde el teclado (Teclas de Método Abreviado): ALT+F11
(el acceso a la Barra de Herramientas de la opción 1 y 2 los explicamos en la sección anterior)
Consejo: cualquiera de las 3 formas te abrirá el editor de visual basic (nuestra forma preferida es la número 3,
dado que es más rápido presionar ALT + F11 que abrir los menús desde el ratón).
Una vez que hayas accedido al editor de visual basic verás algo similar a la figura siguiente (no importa si no lo
ves estrictamente similar, eso dependerá de las ventanas que tengas visibles y ocultas).
El editor contiene 3 ventanas principales: la Ventana Proyecto (parte izquierda superior), la Ventana de Código
(parte derecha) y la Ventana Propiedades (parte izquierda inferior).
La Ventana Proyecto - VBA Project: esta ventana muestra los libros Excel (xls) o los complementos (xla)
abiertos. Usualmente verás nombres del tipo "VBAProject" y entre paréntesis el nombre del archivo o
complemento Excel. Veamos el caso de VBAProject (Libro1). Simplemente significa que tienes abierto un libro
Excel llamado Libro 1. Luego cuelgan 3 carpetas más: Hoja1 (Hoja1), ThisWorkbook y Modulo (no importa si ves
todos estos elementos ahora, luego te enseñaremos como activarlos). Estas carpetas es donde habitan las
macros. Haciendo doble clic en ellas activarás la ventana donde se escriben las macros.
Ventana de Código: esta es el lugar donde escribiremos el código propiamente dicho de las macros. Como no
hemos escrito ninguna macro todavía veremos la hoja en blanco. Recuerda bien estas dos ventanas, ya que las
usaremos a continuación para escribir nuestra primera macro.
Como verás el Editor de VB tiene muchas ventanas. Pero de momento solo nos interesan las dos ventanas que
te indicamos anteriormente: la Ventana Proyecto – VBA Project y la Ventana de Código donde se escribe el
código de las macros. La Ventana de Propiedades la dejaremos para más adelante porque de momento no nos
interesa.
Recuerda: presionando las teclas ALT+F11 puedes ir desde Excel al Editor o desde el Editor al Excel de forma
alterna (debes mantener presionada la tecla ALT y presionar F11 repetidas veces, verás como pasas de Excel al
editor y viceversa).
Si estás en el editor y quieres regresar a la hoja Excel también puedes utilizar el ícono de Excel que se encuentra
en el menú superior del editor (primer ícono de la izquierda, con la X de Excel).
Escribir una Macro
A la hora de crear una nueva macro existen 3 métodos.
A. Escribirla manualmente
B. Utilizar la grabadora de macros
C. Combinación de los 2 métodos anteriores
(Grabarla y luego retocarla manualmente)
En cada situación utilizarás un método distinto. Por ejemplo, las macros muy sencillas las puedes escribir
manualmente porque tienen pocas líneas y ya las conoces. En otros casos la podrás crear con la grabadora de
macros y olvidarte del código VBA. Sin embargo, en la medida que progreses con las macros verás que el
método más utilizado suele ser el número 3 mediante el cual primero grabarás y luego harás ajustes manuales
en el código para hacerlo más eficiente y que se ejecute más rápido.
En este capítulo vamos a ver como se escribe una macro manualmente (método 1)
Mi primera Macro
Vamos a escribir manualmente nuestra primera macro ahora!. Es una macro muy sencilla, pero te servirá para
orientarte en el Editor de Visual Basic y reconocer los pasos requeridos para hacer una macro.
Objetivo de nuestra macro
Escribir el valor 1.500 en la celda A1 de la hoja Excel.
¿que significa esto? Que comenzaremos con una hoja Excel vacía y luego de ejecutar la macro verás que
aparece el valor 1.500 en la celda A1. El valor lo pondrá automáticamente la macro cuando nosotros se lo
indiquemos.
Suena demasiado simple, cierto? Sin embargo es suficiente como para comenzar y que aprendas generalidades
que luego aplicarás en todas tus macros. Como es una macro sencilla vamos a escribirla manualmente para que
comiences a empaparte del editor de macros y sus partes.
Escribir la macro
Bueno, es importante que recuerdes el objetivo: esta macro escribirá automáticamente el valor 1.500 en la celda
A1 de tu hoja Excel. Los pasos que debes seguir son los siguientes:
1. Prepara el Editor de Visual Basic
1.1 Crea un nuevo libro Excel y guárdalo con el nombre Libro 1.
1.2 Abre el editor de Visual Basic con las teclas ALT+F11.
1.3 Doble clic en VBAProject (Libro1) para ver las carpetas.
1.4 Doble clic en Hoja1 (Hoja1) para empezar a escribir el código de la macro.
2. Escribiros la macro
2.1 En la ventana de macros escribe textualmente el siguiente código:
' Esta macro escribe el valor 1500 en la celda A1
Sub MiPrimeraMacro()
Range("A1").Value=1500
End Sub
2.2 Si la macro está bien copiada verás que la primera línea queda en color verde y la segunda y cuarta en azul.
Estos colores los asigna automáticamente el editor y te lo explicaremos más adelante.
De momento no te preocupes por el código escrito. Más adelante te enseñaremos a interpretarlo. Ahora que ya
tienes la macro escrita pasemos a la siguiente sección para ver como ejecutarla.
Ejecutar la macro
Si ya tienes escrita la macro en el editor, ahora podrás que ejecutarla, o sea hacer que funcione. Tienes 2 formas
de hacer esto:
A. Ejecutar la macro desde el mismo Editor: si te posicionas en cualquiera de las líneas de código de la macro y
luego presionas la tecla F5 la macro se ejecutará (para ver el resultado puedes volver a la hoja Excel con
ALT+F11).
B. Ejecutar la macro desde Excel: otra forma de ejecutar la macro es desde el mismo Excel. Puedes volver a la
hoja Excel con ALT+F11 e ir al menú Herramientas > Macros > Macro. Se abrirá un cuadro que contiene una lista
con los nombres de las macros creadas. Selecciona MiPrimeraMacro y haz clic en Ejecutar.
Si has seguido cualquiera de los 2 pasos anteriores ya podrás ver el resultado de la macro. ¿Qué hizo la Macro?
Si te fijas en el Libro 1, Hoja 1, Celda A1 verás que se escribió el valor 1.500. Eso es exactamente lo que
queríamos hacer con nuestra macro, así que tarea cumplida. Hemos escrito un valor en una celda Excel desde
una macro !
Comprender la macro
Recuerda que el propósito de nuestra primera macro fue escribir el valor 1500 en la celda A1 de Excel. La macro
ya fue escrita y ejecutada en los pasos anteriores. Ahora vamos a analizar cada una de las líneas de su código.
Recordemos como se veía nuestra macro escrita en el editor:
* los colores del código los asignó automáticamente el editor)
* la primera línea que dice Option Explicit la vamos a ignorar de momento
Esta macro tiene 4 líneas de código, por eso es tan sencilla (cuando termines este manual seguro podrás escribir
macros de cientos o quizás miles de líneas de código!). Veamos que significa cada línea. Las explicaciones que
vienen a continuación suelen aplicarse a todas las macros, así que es importante que las comprendas.
1º línea de código: el comentario
' Esta macro escribe el 1500 en la celda C10
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub
§ La primera línea de una macro suele ser un comentario que hacemos sobre la misma, donde podemos poner lo
que queramos.
§ Los comentarios se pueden poner en cualquier línea y cantidad.
§ En la medida que nuestras macros crecen los comentarios se vuelven muy útiles para nuestra propia
referencia.
§ Un comentario siempre comienza por un signo '. Si tipeamos dicho signo seguido de un texto y luego damos al
Enter, el editor detecta que es un comentario y lo pinta verde automáticamente.
§ Un comentario no tiene efectos sobre la macro, es solo para nuestra referencia.
Recuerda: los comentarios son muy útiles para comentar nuestras macros y siempre deben comenzar con el
signo '. Si has puesto bien dicho signo al comienzo de la línea, el editor detecta automáticamente que es un
comentario y lo pinta de verde luego de darle a Enter.
2º línea de Código: el nombre de la macro
' Esta macro escribe el 1500 en la celda C10
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub
§ Aquí es donde comienza realmente la macro.
§ Toda macro siempre comienza con la palabra Sub, luego un espacio, luego un nombre (sin espacios
intermedios) y finalmente los paréntesis (). Más adelante veremos algunas excepciones a esto.
§ Este nombre luego lo utilizaremos para ejecutar la macro.
§ Luego de escribir esta línea y darle a enter el Editor detectará que es el nombre de la macro y pondrá la
palabra Sub en color azul de forma automática.
Recuerda: el nombre de la macro siempre comienza con la palabra Sub, luego un espacio, luego el nombre que
quieras ponerle a tu macro (SIN espacios intermedios) y finalmente los paréntesis.
3º línea de código: la instrucción de la macro
' Esta macro escribe el 1500 en la celda C10
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub
§ Esta es la instrucción principal de nuestra macro (el corazón de la macro). Con este código logramos nuestro
objetivo (que la macro escriba el valor 1500 en la celda C10).
§ ¿Recuerdas el comienzo del manual donde hablábamos de Objetos (partes de Excel), Propiedades
(características) y Métodos (acciones)?. Aquí tenemos un ejemplo al respecto. Programar macros siempre
consiste en lo mismo: primero hacer referencia al objeto y luego asignarle una propiedad o método. En nuestro
ejemplo:
Range("A1").Value = 1500
Range("A1"). es el objeto
Value es la propiedad
= 1500 es el valor que le damos a la propiedad
§ Esta línea de código se interpreta así: a la celda C10 de Excel asignarle el valor 1500.
Recuerda: siempre debes hacer referencia a un objeto para luego asignarle propiedades o métodos.
4º línea de código: el fin de la macro
' Esta macro escribe el 1500 en la celda C10
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub
§ Una macro siempre termina con la instrucción End Sub.
§ Luego de escribir esto y darle a Enter, el Editor detectará que es el fin de la macro y lo pondrá en color azul de
forma automática.
Recuerda: siempre debes finalizar tu macro con la instrucción End Sub.
Resumen
Nuestro objetivo fue crear una macro que escribiera el valor 1500 en la celda A1 de la Hoja1 de Excel. Como era
una macro sencilla decidimos escribir el código manualmente. Vamos a resumir todos los pasos que hicimos
hasta aquí:
1. Creamos un nuevo libro Excel y lo guardamos con el nombre Libro1.
2. Accedimos el Editor de Visual Basic con las teclas ALT+F11
3. En la Ventana Proyecto, en VBAProject (Libro1), hicimos doble clic en Hoja1 (Hoja1).
4. En la Ventana de Código escribimos textualmente el siguiente código:
' Esta macro escribe el 1500 en la celda A1
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub
Finalmente, todo quedó como se aprecia en la foto...
5. Finalmente ejecutamos la macro desde el menú de Excel Herramientas > Macros > Macro y seleccionando
MiPrimeraMacro desde la lista de nombres y dando clic a Aceptar.
6. El resultado es que en la celda A1 se vuelve a escribir el valor 1500, que fue justamente lo que le indicamos a
la macro que haga.
Recuerda: en estos 5 pasos hemos visto rápidamente como escribir una macro sencilla y ejecutarla. En las
secciones siguientes iremos profundizando más estos temas, sobre todo el referente el código de la macro.
OPM de la macro
Recordemos nuevamente el código de nuestra primera macro:
' Esta macro escribe el valor 1500 en la celda A1
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub
Ahora recordemos brevemente el significado de cada línea de código:
1ª línea: es el comentario de la macro (siempre comienza con el signo ')
2ª línea: es el nombre de la macro (siempre se comienza con Sub)
3ª línea: es la instrucción principal de la macro
4ª línea: es el fin de la macro (siempre termina con End Sub)
La mayoría de las macros llevan una estructura similar, aunque hay algunas excepciones.
El comentario que aparece al comienzo lo ponemos a gusto y sirve para recordarnos lo que queremos hacer con
esa macro. El comentario siempre comienza con el signo ' y no afecta para nada a la macro. Es un simple texto.
El nombre lo pondremos a gusto, anteponiendo la palabra Sub los paréntesis de apertura y cierre al final.
Conviene dar un nombre que nos indique que hace la macro.
La instrucción principal la veremos un par de párrafos más abajo. Este código siempre varía según lo que se
quiera hacer con la macro en cuestión.
El fin siempre es igual, con la frase End Sub.
Así que solo nos queda explicar con más detalle la instrucción principal de la macro. En general, las líneas de
código más importantes y donde debemos usar nuestros conocimientos de objetos, propiedades y métodos son
las que se encuentran entre las instrucciones Sub y End Sub. Es allí donde realmente "se cocina" todo. Ese es el
verdadero corazón de la macro.
Al comienzo del manual te mencionábamos que las macros consisten en operar sobre un Objeto, ya sea
alterando una de sus Propiedades o ejecutando un Método sobre el mismo.
Recuerda: para aprender a programar macros debes aprender cuales son los objetos, propiedades y métodos de
Excel. No olvides la definición de los mismos:
Objeto
- Es una parte de Excel
- Por ej. una celda de Excel, una hoja, un gráfico.
Propiedad
- Es una característica del objeto
- Por ej. el valor de la celda, el nombre de una hoja, el color de un gráfico.
Método > es una acción sobre el objeto > por ej. copiar la celda, borrar la hoja, agrandar el gráfico.
Como te comentábamos al comienzo, la línea de código más importante de nuestra macros es:
Range("A1").Value = 1500
Ahora ya estamos en condiciones de identificar mejor los objetos, propiedades y métodos de la misma.
Range("A1") es el objeto, recuerda que siempre que hacemos macros primero debemos indicar el objeto Excel
sobre el que vamos a operar. En este caso usamos el objeto Range (Rango). El objeto Range es el que se utiliza
para hacer referencia a una celda o rango Excel. Luego se escribe la referencia de la celda Excel (letra de
columna y número de fila) entre comillas y paréntesis. Ya le hemos indicado a la macro que deberá ocuparse de
la celda A1 (objeto). Ahora debemos indicarle que hacer con ella (propiedad o método).
Value = 1500 es la propiedad, que le asignaremos al objeto. Siempre empezamos por el objeto para luego
asignarle una propiedad o método. En este caso usamos la propiedad Value (Valor) que nos permite asignar un
valor al objeto range, anteponiendo un signo igual y luego el valor que deseamos.
Esta macro es muy sencilla y no posee ningún método.
Hasta aquí es suficiente. Hemos visto el ejemplo de un objeto y una de sus propiedades. En la medida que vayas
avanzando con la lectura de este manual irás aprendiendo nuevos objetos, propiedades y métodos.
Grabar una Macro
A la hora de crear una nueva macro existen 3 métodos.
A. Escribirla manualmente
B. Utilizar la grabadora de macros
C. Combinación de los 2 métodos anteriores
(grabarla y luego retocarla manualmente)
En cada situación utilizarás un método distinto. Por ejemplo, las macros muy sencillas las puedes escribir
manualmente porque tienen pocas líneas y ya las conoces. En otros casos la podrás crear con la grabadora de
macros y olvidarte del código VBA. Sin embargo, en la medida que progreses con las macros verás que el
método más utilizado suele ser el número 3 mediante el cual primero grabarás y luego harás ajustes manuales
en el código para hacerlo más eficiente y que se ejecute más rápido.
En el capítulo anterior vimos como se escribía una macro de forma manual. Ahora veremos como utilizar la
grabadora de macros. Como te mencionábamos antes, la ventaja de la grabadora es que prácticamente no
requiere conocimientos de programación y código VBA. Simplemente encendemos la grabadora, ejecutamos las
acciones y listo. La grabadora genera el código automáticamente !
Mi primera Macro
Vamos a grabar nuestra primera macro ahora!. Es la misma macro que hicimos en el capítulo anterior, pero esta
vez la haremos con la grabadora de macros.
Objetivo de nuestra macro
Escribir el valor 1.500 en la celda A1 de tu hoja Excel.
¿que significa esto? Que comenzaremos con una hoja Excel vacía y luego de ejecutar la macro verás que
aparece el valor 1.500 en la celda A1. El valor lo pondrá automáticamente la macro cuando nosotros se lo
indiquemos.
Suena demasiado simple, cierto? Sin embargo es suficiente como para comprender la metodología de
funcionamiento de la grabadora de macros.
Grabando la macro
Excel trae incorporada una grabadora de macros. La misma funciona de forma muy fácil. Encendemos la
grabadora, ejecutamos las acciones que nos interesan sobre la hoja Excel, paramos la grabadora y…listo!. Excel
escribe de forma automática el código VBA de la macro.
Ahora podemos hacer un experimento muy interesante. Repetir nuestra primera macro, pero esta vez haciéndola
con la grabadora de macros. Sigue los pasos a continuación:
1. Vamos a grabar la macro
1.1 Ve al menú Herramientas > Macros
1.2 Selecciona la opción Grabar nueva macro…
1.3 Se abrirá un cuadro de diálogo como el que se muestra a continuación.
1.4 Borra donde dice Macro1 y escribe MiPrimeraMacro. Ese será el nombre que le daremos a nuestra macro.
1.5 Presiona Aceptar y la macro comenzará a grabar todo lo que hagas.
1.6 Posiciónate en la celda A1 y escribe el valor 1500.
2. Cuando comienza a grabar la macro activa una nueva barra de macros como la que se muestra en la foto. El
botón cuadrado de la izquierda te permitirá parar la grabación y finalizar la macro.
Otra forma de detener la grabación de la macro es desde el menú Herramientas > Macros > Detener grabación.
Hazlo ahora para detener la grabación.
3. Veamos como quedó la macro grabada:
3.1 Accede al editor de visual basic con ALT+F11.
3.2 Debes hacer clic en Módulo1 para visualizar el código de la nueva macro grabada. Verás una pantalla como
la siguiente:
* Podrás observar que el código que se grabó es distinto que el código que habíamos escrito cuando hicimos la
macro manualmente. Más adelante en este mismo capítulo analizaremos y explicaremos las diferencias.
4. Vamos a probar la macro
4.1 Vuelve a Excel con ALT+F11.
4.2 Verás que la celda A1 tiene el valor 1500 porque lo escribimos mientras grabábamos la macro.
4.3 Para ver como opera la macro borra dicho valor.
4.4 Abre el menú de macros desde el menú Herramientas > Macro > Macros
4.5 Selecciona MiPrimeraMacro (no te confundas con Hoja1.MiPrimeraMacro que es la que hicimos primero).
4.6 Presiona Aceptar y verás como se escribe nuevamente el valor 1500 en la celda A1.
Resumen
Nuestro objetivo fue grabar una macro que escribiera el valor 1500 en la celda A1 de la Hoja1 de Excel. Los
pasos que seguimos para utilizar la grabadora de macros fueron:
1. Creamos un nuevo libro Excel y lo guardamos con el nombre Libro1.
2. Desde el menú Herramientas > Macros seleccionamos la opción Grabar nueva macro y la macro comenzó a
grabar.
3. En la celda A1 del Libro 1 escribimos el valor 1500.
4. Detuvimos la grabación desde el menú Herramientas > Macros > Detener grabación.
5. Borramos la celda A1 (quedó con el valor 1500 cuando grabamos la macro).
6. Ejecutamos la macro desde el menú Herramientas > Macro > Macros. Seleccionamos de la lista
MiPrimeraMacro y luego Aceptar.
7. El resultado es que en la celda A1 se vuelve a escribir el valor 1500, que fue justamente lo que grabamos con
la macro.
Recuerda: al utilizar la grabadora no accedemos en ningún momento al editor de macros ni tenemos que escribir
código. Todo lo hace automáticamente la grabadora.
Escrita vs. Grabada
Llegados a este punto, interesa ver las diferencias entre la macro escrita manualmente y la grabada
automáticamente.
¿Qué fue lo que hicimos hasta aquí? Hicimos una macro que escribió el valor 1500 en la celda A1 de la Hoja1 de
Excel. Pero recuerda que hicimos esta macro 2 veces:
A. la primera vez la escribimos manualmente
B. la segunda vez la grabamos directamente con la grabadora de macros.
Denominemos Macro Escrita a la primera y Macro Grabada a la segunda para diferenciarlas. Aunque al
ejecutarlas el resultado final fue el mismo, hay algunas diferencias que debemos estudiar.
A continuación veamos una tabla comparativa de ambos métodos utilizados para crear la macro que nos
permitirá revisar el proceso y obtener unas valiosas conclusiones. Las diferencias son analizadas a continuación:
Macro Escrita
Macro Grabada
1. Como la hicimos
1. Como la hicimos
1.1 Creamos un Libro Excel llamado Libro1.
1.1 Utilizamos el mismo Libro1.xls
1.2 Abrimos el editor de macros con
ALT+F11.
1.3 En VBAProject (Libro1) hicimos doble clic
en Hoja1 (Hoja1)
1.2 Encendimos la grabadora de macros
desde el menú Herramientas > Macro >
Grabar nueva macro
1.3 Nos posicionamos en la celda A1 de la
Hoja1 y escribimos el valor 1500.
1.4 Escribimos el código de la macro.
1.4 Detuvimos la grabación de la macro desde
el menú Herramientas > Macro > Detener
grabación.
2. El código de la macro
2. El código de la macro
2.1 Con ALT+F11 accedemos al editor de
macros.
2.2 El código que escribimos manualmente fue
el siguiente:
2.1 Con ALT+F11 accedemos al editor de
macros.
2.2 El código que se grabó automáticamente
fue el siguiente:
Esta macro escribe el valor 1500 en la celda
A1
Sub MiPrimeraMacro()
Sub MiPrimeraMacro()
Range("A1").Value=1500
End Sub
MiPrimeraMacro Macro
Esta macro escribe el valor 1500 en la celda A1
Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub
Recuerda que este código quedó en
VBAProject (Libro1) > Hoja1 (Hoja1)
Recuerda que este código quedó en
VBAProject (Libro1) > Módulo1
3. Ejecución de la macro
3. Ejecución de la macro
Posicionados sobre cualquier línea del código
anterior presionamos F5. Luego con ALT+F11
volvimos a la hoja de Excel y comprobamos
que en la celda A1 de la Hoja1 se escribió el
valor 1500.
Para no confundirnos primero borramos el valor
1500 de la celda A1, Hoja1 (lo habíamos
escrito para grabar la macro). Luego
ejecutamos la macro desde el menú
Herramientas > Macro > Macros.
Seleccionamos de la lista MiPrimeraMacro y
luego Aceptar. De esta forma se volvió a
escribir el valor 1500 en la celda A1 de la Hoja1.
En la sección siguiente analizamos el porqué de estas diferencias.
Diferencias
En nuestro ejemplo, tanto la Macro Escrita como la Macro Grabada logran la misma función de escribir el valor
1500 en la celda A1 de la Hoja1. Sin embargo, si te has fijado bien en los 3 puntos de la tabla de la sección
anterior verás que hay algunas diferencias. El análisis de las mismas nos permitirá ver las ventajas y desventajas
de escribir una macro de forma manual o de grabarla con la grabadora de macros.
Volvamos a poner las tablas comparativas, pero esta vez comentando las diferencias:
Macro Escrita
Macro Grabada
1. Como la hicimos
1. Como la hicimos
Ventaja: no es necesario conocer código
Desventaja: escribir una macro manualmente de programación. La grabadora lo escribe
implica conocer los objetos y propiedades de automáticamente.
Excel. En este caso teníamos que saber
previamente que existía un objeto Range y
una propiedad Value, y también debíamos
saber como era la sintaxis de los mismos >
Range("A1").Value=1500. Para un
principiante esto puede ser difícil de saber
2. El código de la macro
Ventaja: cuando sabemos escribir macros,
podemos hacer el código más eficiente y
escribir solo las líneas que necesitamos.
Recordemos el código que escribimos
manualmente:
2. El código de la macro
Desventaja: generalmente, cuando utilizamos
la grabadora, el código que se escribe
automáticamente suele ser redundante y
excesivo. Recordemos el código que grabó la
macro:
Esta macro escribe 1500 en A1
Sub MiPrimeraMacro()
Range("A1").Value=1500
End Sub
Sub MiPrimeraMacro()
' Esta macro escribe 1500 en A1
Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub
La macro está escrita de forma sintética. Le
indicamos que en la celda A1 escriba el valor
1500. Solo nos llevó 1 línea de código (solo
contamos las que están entre Sub y End
Sub)
La macro grabó nuestras acciones pero
utilizó 3 líneas de código (solo contamos las
que están entre Sub y End Sub). Vemos que
el código es más largo y que aparecen
nuevos objetos, propiedades y métodos. La
macro se interpreta así:
Primero seleccionar el rango A1. Luego en la
celda activa introducir una fórmula con el
valor 1500. Finalmente, como presionamos
Enter, se posiciona en la celda siguiente, la
A2.
El objetivo fue logrado, pero la macro generó
más código del necesario.
El método de la macro grabada parece el preferible, porque lo hace todo de forma automática y nos evita tener
que escribir un código que en esta etapa nos resulta desconocido. Sin embargo, en la sección siguiente veremos
que el método a utilizar dependerá de cada situación particular...
Conclusión
En las 2 secciones anteriores vimos dos tablas comparativas de los 2 métodos que tenemos para crear una
macro:
1. El método de escribir manualmente la macro
2. El método de grabar la macro automáticamente.
En la primera tabla se mostró el proceso de elaborar cada una y en la segunda tabla se mostraron las
diferencias, con sus ventajas y desventajas.
A modo de conclusión podemos decir que la diferencia fundamental está en el código generado. Aunque las
macros grabadas son más sencillas porque no requieren conocer el código necesario (objetos, propiedades y
métodos) sin embargo la cantidad de código que generan suele ser más largo (más líneas).
A pesar que el resultado final es el mismo, un código con más líneas siempre es menos deseable que un código
con menos líneas. Esto es así porque un código largo es más difícil de controlar y de comprender y a la larga
puede ser más propenso a que genere errores o ralentice la velocidad de ejecución de la macro.
Recordemos los dos códigos generados (omitimos los comentarios del comienzo del código). Recuerda que lo
que nos interesa son las líneas entre Sub y End Sub. Ambas macros logran su cometido de escribir el valor 1500
en la celda A1. Sin embargo fíjate que en la macro escrita solo utilizamos una línea de código mientras que la
macro grabada generó 3 líneas de código (solo consideramos las líneas entre Sub y End Sub).
Macro escrita
Sub MiPrimeraMacro()
Range("A1").Value=1500
End Sub
Como conocíamos el objeto y la propiedad fuimos directamente al grano. Al objeto Rango A1 le aplicamos la
propiedad Valor 1500. Solo una línea de código. Rápido y certero.
Macro grabada
Sub MiPrimeraMacro()
Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub
La macro grabada grabó todas nuestras acciones en 3 líneas de código. Cuando seleccionamos el rango A1 se
generó la 1º línea de código, cuando escribimos el valor 1500 se generó la 2º línea de código y cuando dimos al
"enter" luego de escribir el valor 1500 se generó la 3º línea de código.
En la macro grabada verás un nuevo objeto, ActiveCell (celda activa) y una nueva propiedad del mismo,
FormulaR1C1 (fórmula de la celda).
Nuestra recomendación respecto a las macros escritas y grabadas ya te la dimos al comienzo del capítulo.
Lo mejor es escribir las macros manualmente y utilizar la grabadora en aquellos casos donde no tenemos ni idea
sobre cuál es el código que necesitamos o como es el nombre del objeto, propiedad o método.
Lo usual es que si estás comenzando solo utilizarás la grabadora, y en la medida que vas conociendo el lenguaje
VBA, con sus distintos objetos, propiedades y métodos ya te irás animando a escribir tus propias macros. Sin
embargo, como los OPM son tantos, siempre se requiere de la grabadora para descubrirlos.
A esta altura tu puedes pensar que todavía no tienes idea de ningún código. Sin embargo hemos preparado este
manual para hacerte la vida lo más fácil posible. La buena noticia es que este manual tiene una 2º parte con una
gran cantidad de macros ya escritas.
Así que nuestra recomendación final es que primero leas la 1º parte de este manual (la teoría), por lo menos un
par de veces, hasta que te encuentres cómodo con los conceptos. Luego ya podrás leer la 2º parte del manual,
que tiene innumerable cantidad de macros ya escritas, comentadas y listas para que puedas copiar, pegar y
utilizar en tus desarrollos Excel.
Como instancia final, esperamos que con lo que has aprendido aquí junto con la ayuda de la grabadora de
macros, ya puedas crear tus propios códigos, aparte de los que nosotros te facilitamos en la 2º parte del manual.
Ejemplos de Macros
¿Recuerdas el código que habíamos escrito para nuestra primera macro? El objetivo que perseguíamos era
escribir el valor 1500 en la celda A1 de la hoja1. Repasemos rápidamente todo lo que habíamos hecho para
escribir la macro:
1. Creamos un nuevo libro Excel y lo guardamos con el nombre Libro1.
2. Accedimos el Editor de Visual Basic con las teclas ALT+F11.
3. En la Ventana Proyecto, en VBAProject (Libro1), hicimos doble clic en Hoja1 (Hoja1).
4. En la Ventana de Código escribimos textualmente el siguiente código:
' Esta macro escribe el 1500 en la celda A1
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub
5. Finalmente ejecutamos la macro desde el menú de Excel Herramientas > Macros > Macro y luego
seleccionando MiPrimeraMacro desde la lista de nombres y dando clic a Aceptar.
Recordemos nuevamente las reglas de escritura de la mayoría de las macros:
1. La 1º línea de la macro es un comentario que no tiene efecto sobre la misma y que usamos para nuestra
referencia. Siempre comienza con el signo '. En nuestra macro:
' Esta macro escribe el 1500 en la celda A1
2. La 2º línea de la macro es el nombre, que comienza con la palabra Sub, seguida del nombre que queramos
ponerle sin espacios intermedios y finalizando con 2 paréntesis de apertura y cierre (). En nuestra macro:
Sub MiPrimeraMacro()
3. La 3º línea era la instrucción principal que es donde nos referimos a los objetos, propiedades y métodos. Todo
esto va escrito entre Sub y End Sub y podríamos tener muchas líneas de código si la macro fuera más compleja.
Siempre se hace referencia al objeto y luego se le asignan propiedades o métodos.
En nuestro caso el objeto es el rango A1 > Range("A1") y la propiedad que le asignamos fue el valor 1500 >
Value=1500
La línea de la macro quedó así:
Range("A1").Value = 1500
4. La 4º línea representaba el final de la macro. Todas las macros se finalizan con la instrucción End Sub.
También vimos que la macro se puede grabar automáticamente, con la grabadora de macros, pero que
preferimos escribirla para utilizar menos líneas de código y de paso aprender mejor los fundamentos del código.
En la 2º parte de este manual están las macros más importantes que podrás necesitar, escritas, comentadas y
listas para que puedas copiar, pegar y adaptar en tus propios desarrollos. De todas formas, como adelanto,
veremos algunas macros nuevas aquí como para ir calentado motores.
Macro 1
Escribamos manualmente una nueva macro ahora:
1. Crea un nuevo libro Excel y guárdalo con el nombre Libro1.
2. Accede al Editor de visual basic con las teclas ALT+F11
3. Inserta un nuevo Módulo desde el menú Insertar > Módulo
4. Dentro del módulo escribe textualmente el siguiente código:
' Esta macro muestra un texto en una ventana emergente
Sub MostrarTexto ()
Msgbox "Manual de Macros Exceluciones"
End Sub
5. Puedes ejecutar esta macro rápidamente posicionándote en cualquiera de sus líneas de código y luego
presionando la tecla F5 para ver lo que sucede.
También puedes ejecutarla volviendo a Excel con ALT+F11 y desde el menú Herramientas > Macros > Macro,
eligiendo de la lista la macro MostrarTexto y luego Aceptar.
6. Esta macro utiliza la instrucción Msgbox que sirve para abrir una ventana con la información que le
indiquemos. Más adelante verás como puedes mostrar en esa ventana información de celdas Excel u otros
resultados. De momento solo hacemos que muestre el texto que indicamos entre comillas.
Recuerda que esto es tan solo un adelanto. En la 2º parte de este manual están las macros más importantes que
podrás necesitar,
escritas, comentadas y listas para que puedas copiar, pegar y adaptar en tus propios
desarrollos.
Macro 2
Escribamos manualmente otra nueva macro ahora:
1. Puedes utilizar el mismo Libro1 de la macro anterior.
2. Accede al Editor de visual basic con las teclas ALT+F11
3. Puedes utilizar el mismo Módulo de la macro anterior
4. Dentro del módulo escribe textualmente el siguiente código:
' Esta macro oculta las líneas de división de las celdas
Sub OcultarLineas()
ActiveWindow.DisplayGridlines = False
End Sub
5. Puedes ejecutar esta macro rápidamente posicionándote en cualquiera de sus líneas de código y luego
presionando la tecla F5 para ver lo que sucede.
También puedes ejecutarla volviendo a Excel con ALT+F11 y desde el menú Herramientas > Macros > Macro,
eligiendo de la lista la macro OcultarLineas y luego Aceptar.
6. Verás que la macro elimina las líneas de división de las celdas de la hoja activa (algo que también puedes
hacer desde Excel, menú Herramientas > Opciones > pestaña Ver > casilla Líneas de división).
Esta macro utiliza el objeto ActiveWindow (ventana activa).
Luego le asigna la propiedad DisplayGridlines=False (mostrar líneas de división=falso)
Si quisieras volver a ver las líneas de división puedes cambiar la propiedad False por True, tal que:
ActiveWindow.DisplayGridlines = True
Recuerda que esto es tan solo un adelanto. En la 2º parte de este manual están las macros más importantes que
podrás necesitar,
escritas, comentadas y listas para que puedas copiar, pegar y adaptar en tus propios
desarrollos.
Macro 3
Escribamos manualmente otra nueva macro ahora:
1. Puedes utilizar el mismo Libro1 de la macro anterior.
2. Accede al Editor de visual basic con las teclas ALT+F11
3. La escribiremos en un objeto hoja, así que has doble clic en Hoja1 (Hoja1)
4. Escribe textualmente el siguiente código:
' Esta macro copia un rango a la celda activa
Sub CopiaRango()
Range("A1:A5").Copy Destination:=ActiveCell
End Sub
5. Para probar esta macro vuelve a Excel con ALT+F11 y escribe algunos números o palabras a gusto en el
rango A1:A5. Por ejemplo:
5.1 Posiciónate en la celda C1
5.2 Desde el menú Herramientas > Macros > Macro, elige de la lista la macro CopiaRango y luego Aceptar.
5.3 El resultado será que el rango A1:A5 se copiará a partir de la celda C1 que era la celda activa al ejecutar la
macro.
6. Esta macro utiliza algunas OPM (objetos, propiedades y métodos) nuevos:
Range ("A1:A5")
El objeto Range ya lo conocíamos...
Copy
Este es un método (una acción)
Destination:=ActiveCell
Este es otro objeto. Destination se suele utilizar luego de un Copy y ActiveCell hace referencia a la celda activa.
Recuerda que esto es tan solo un adelanto. En la 2º parte de este manual están las macros más importantes que
podrás necesitar,
escritas, comentadas y listas para que puedas copiar, pegar y adaptar en tus propios
desarrollos.
El Editor de macros
Es importante reconocer bien las principales opciones y secciones que tiene el editor de macros (también
conocido como editor de Visual Basic), dado que será la herramienta que utilizaremos para escribir las macros.
En esta sección veremos las distintas partes del editor y estudiaremos sus principales características.
Como acceder
El Editor de Visual Basic es la aplicación que trae Excel desde donde se escriben y guardan las macros. Tienes 3
formas de acceder al editor:
A. Desde el menú Herramientas > Macros > Editor de Visual Basic
B. Desde el botón Editor de Visual Basic de la Barra de Herramientas Visual Basic (*)
C. Desde el teclado (Teclas de Método Abreviado): ALT+F11
(*) Recuerda que puedes habilitar esta barra desde el menú Ver > Barras de Herramientas > Visual Basic.
Nuestra forma preferida de acceder es con ALT+F11. Si estás en Excel y presionas estas teclas se abrirá el
editor. Y al revés, si estás en el editor y presionas las mismas teclas volverás al Excel.
Cuando accedas al editor verás algo como similar a esto:
Las principales ventanas de editor son:
Proyecto (arriba a la izquierda)
Propiedades (abajo a la izquierda)
Inmediato (arriba a la derecha)
Código (abajo a la derecha)
No importa si no ves todas las ventanas, dado que se pueden mostrar u ocultar. En las secciones siguientes te
explicaremos la utilidad de cada una de ellas.
Ventana Proyecto
Veamos una foto para ver como se ve la ventana de Proyecto. Si no la puedes visualizar puedes activarla desde
el menú Ver > Explorador de proyectos, dentro del editor de visual basic.
En la ventana de Proyecto hay carpetas donde se guardarán y escribirán las macros. Hemos presionado el botón
Alternar Carpetas para que se ordenen mejor los elementos, como se ve a continuación:
En un primer nivel tenemos los proyectos. Por regla general, cada libro Excel tiene asociado un proyecto. Por
ejemplo, si creas un nuevo libro Excel desde el menú de Excel Archivo > Nuevo y vuelves al editor de macros
(ALT+F11), verás que aparece el proyecto VBAProject (Libro1). Dentro del paréntesis aparece el nombre de tu
libro Excel y lo de VBAProject podrás cambiarlo luego.
En resumen VBAProject (Libro1) es la carpeta principal, asociada a un libro Excel determinado, donde
insertaremos todo lo referido a las macros para dicho libro.
En un segundo nivel tenemos las carpetas. Estas carpetas nos distinguen entre Objetos, Formularios y Módulos.
Veamos cada una de ellas:
1. Objetos
En esta carpeta vemos que cuelgan dos elementos:
1.1 ThisWorkbook siempre está presente. Si escribimos una macro aquí la misma afectará a todo el libro.
1.2 Hoja1(Hoja1) hace referencia las hojas de Excel (habrá 1 por cada hoja de nuestro libro). Si escribimos una
macro aquí la misma solo afectará a la hoja en cuestión.
2. Formularios
Los formularios son más conocidos como UserForms. Si no lo visualizas puedes agregarlos desde el menú
Insertar > Userform.
2.1 Dentro de la carpeta de Formularios vemos un elemento llamado Userform1.
Todo el tema de formularios lo veremos con más en detalle en el capítulo "Formularios".
3. Módulos
Los módulos sirven para escribir macros a nivel genérico, sin estar relacionadas a la hoja o libro en particular. Si
no visualizas ninguno puedes agregarlos desde el menú Insertar > Módulo.
3.1 Dentro de la carpeta de Módulos vemos que hay un elemento llamado Módulo1. Podemos insertar tantos
módulos como necesitemos. En los módulos podemos escribir macros que operan de forma genérica, sin
distinguir entre hojas o libros.
Haciendo doble clic izquierdo en cualquiera de estos objetos verás que se habilita la Ventana de Código de la
izquierda (una hoja en blanco grande). En la misma es donde se escriben las macros.
Recuerda: antes de escribir una macro debes evaluar donde hacerlo.
1. Si es una macro que solo debe afectar una hoja en particular escríbela en los objetos de Hoja, en el nombre
de Hoja correspondiente.
2. Si la macro debe afectar a todo un libro en particular escríbela en el objeto ThisWorkbook. Estas suelen ser
macros que se ejecutan al abrir, cerrar o guardar el libro.
3. Si la macro es de tipo genérica escríbela en un Módulo.
4. Si quieres hacer un formulario utiliza el objeto Userform.
Ventana Propiedades
Veamos como se ve la Ventana Propiedades. Esta ventana se ubica en la parte inferior izquierda de la pantalla.
Si no la puedes visualizar puedes activarla desde el menú Ver > Ventana propiedades.
Cada objeto tiene sus propiedades. Por ejemplo, si hacemos doble clic en el objeto Módulo1 que vimos en la
sección anterior, podremos ver sus propiedades:
Algunos objetos tienen muchas propiedades (por ej. los Userforms) así que tenemos la opción de ordenar esos
mismos de forma alfabética o por categoría. El objeto Módulo1 solo tiene la propiedad (Name) Módulo1. Si
quisiéramos podríamos reemplazar el nombre de Módulo1 y asignar otro nombre a gusto.
Consejo: en la medida que vamos insertando muchas macros en nuestro proyecto, conviene ir creando nuevos
módulos con nombres apropiados para mantener ordenadas nuestras macros.
El resto de las propiedades de los otros objetos escapa al alcance de esta sección, pero podrás ver algunas en la
2º parte de este manual.
Ventana Código
Veamos una foto para ver como se ve la Ventana de Código. Cada vez que hagas doble clic izquierdo en algún
Objeto de la Ventana Proyecto se activará a la derecha la Ventana de Código. Si no la puedes visualizar puedes
activarla posicionándote en el Objeto en cuestión y luego desde el menú Ver > Código.
Si todavía no has escrito ninguna macro verás la ventana de código en blanco. En nuestro ejemplo hemos escrito
3 macros:
Esta ventana no tiene mayores complicaciones. Lo que interesa es más bien el código que escribamos aquí.
Puedes escribir todas las macros que quieras en esta ventana. Recuerda que el mismo editor asignará
automáticamente los colores al código y además separará con una línea continua cada macro.
Ventana Inmediato
Veamos como se ve la Ventana de Inmediato. Si no la puedes visualizar puedes activarla desde el menú Ver >
Ventana Inmediato.
La ventana inmediato sirve para escribir, ejecutar y probar un código macro rápidamente, sin tener que armar
toda la macro con la estructura que comentamos en secciones anteriores.
Por ejemplo, si quisiéramos averiguar la cantidad de hojas que tiene un Libro podríamos escribir la siguiente
macro en un módulo y ejecutarla:
Sub ContarHojas()
Dim N As Long
N= thisworkbook.Sheets.Count
Msgbox N
End Sub
De momento no importa los objetos, propiedades o métodos que hemos utilizado. Solo te queremos mostrar que
es una macro de 5 líneas. Ahora supongamos que solo nos interesa saber el número de hojas del libro, pero no
queremos armar toda la macro, solo nos interesa obtener el resultado. Entonces, en la ventana inmediato
podemos escribir:
? thisworkbook.Sheets.Count y al presionar Enter en la fila siguiente nos mostrará el número de hojas que posee
el libro. El signo? al comienzo significa que estamos buscando conocer el resultado de algo. El resultado final se
vería así, suponiendo que el libro tiene 1 hoja:
Veamos otro ejemplo. Si el libro fue guardado, podríamos querer averiguar el directorio donde se encuentra.
Podríamos averiguarlo desde la Ventana Inmediato, escribiendo ?thisworkbook.Path y presionando Enter. Al
presionar Enter, en la fila siguiente se mostrará la ruta del libro, por lo que en la Ventana Inmediato veremos algo
así, suponiendo que el libro se encuentra guardado en ese directorio:
En los 3 ejemplos anteriores buscábamos un resultado y anteponíamos el signo ? al comienzo de la instrucción
(buscábamos un nombre o un número). En otros casos podemos ejecutar una acción directamente y por lo tanto
escribimos la macro sin el signo ?. Por ejemplo, si queremos que en la celda A1 aparezca el valor 100 lo
podemos ejecutar desde la Ventana Inmediato como se ve a continuación:
En la celda A1 de la Hoja activa de Excel aparecerá el valor 100.
Recuerda: desde la Ventana Inmediato puedes ejecutar macros de forma inmediata, como su nombre lo indica.
Pero dichas macros solo se ejecutan 1 vez al presiona enter y no quedan disponibles en la lista de macros ni las
puedes utilizar en tus desarrollos (asignándolas a botones o formularios).
Proteger el Código
Así como se pueden proteger los libros, las hojas y las celdas de Excel, también es posible proteger con una
contraseña el código de nuestras macros. Una vez que tengas tus macros escritas en el editor puedes ir al menú
Herramientas > Propiedades de VBAProject... y luego hacer clic en la pestaña de Protección. Verás una ventana
como la de la siguiente:
Para proteger tus macros sigue estos pasos:
1. Tilda la casilla Bloquear proyecto para su visualización
2. Escribe una Contraseña
3. Vuelve e escribir tu contraseña en Confirmar contraseña
De esta forma, cuando alguien acceda al editor, verá la ventana proyecto del libro pero no podrá ver los objetos
donde quedan escritas las macros (módulos, hojas y userforms). Si hace doble clic en el Proyecto aparecerá una
ventana solicitando la clave.
Ejecución de Macros
En varias secciones de este manual te indicamos como se ejecuta una macro. En realidad hay muchas formas
de hacerlo, así que te las explicaremos a todas.
Dependiendo del caso te interesará ejecutar la macro desde un menú, desde un botón o incluso ejecutarla
automáticamente cuando ocurran determinados eventos, como ser al abrir, cerrar o guardar el libro, activar o
desactivar una hoja, etc. Este tipo de macros que se ejecutan automáticamente al ocurrir alguno de los eventos
mencionados se explica en el capítulo "Macros de Eventos".
Desde el código
La forma más rápida de ejecutar una macro es desde el mismo código. Cuando terminas de escribir una macro
puedes posicionarte en cualquiera de sus líneas de código y presionar la tecla F5. Recuerda que puedes acceder
al código de las macros desde el editor de macros, con las teclas ALT+F11.
Desde menu
Otra forma de ejecutar una macro es desde el menú Herramientas > Macro > Macros. Verás que se abre un
cuadro como el siguiente:
Para ejecutar la macro:
1. Elige el Nombre de la macro de la lista
2. Clic en Ejecutar
En la parte inferior figura una lista desplegable donde puedes elegir si quieres listar las macros de Todos los
libros abiertos, solo las de Este libro o las de PERSONAL.XLS
PERSONAL.XLS es un libro Excel que se abre automáticamente cada vez que abres Excel. Este libro
permanece oculto desde Excel, pero es posible verlo desde el editor de macros. Todas las macros que escribas
en PERSONAL.XLS siempre estarán disponibles cada vez que habrás tus libros Excel. Es una opción muy útil
por si tienes macros que quieres utilizar en todos tus libros Excel (solo estarán disponibles en tu PC).
Desde teclado
Otra forma muy práctica de ejecutar una macro es desde el teclado. Esto también se conoce como teclas de
método abreviado. Para configurar las teclas con las cuales ejecutar debes hacer los siguientes:
1. Ir al menú Herramientas > Macro > Macros.
2. Elegir el nombre de la macro de la lista y luego hacer clic en el botón Opciones.
3. Donde dice Tecla de método abreviado presiona la tecla MAYUSC y luego una letra. En nuestro ejemplo la
macro se ejecutará con Ctrl+Mayúsc+Q
Recuerda: la macro siempre se ejecuta con la tecla Ctrl+ la letra que tu escribas en la casilla. Sin embargo, hay
muchas combinaciones de Ctrl+Letra que ya están ocupadas por Excel (Ctrl+C copiar, Ctrl+V pegar, Ctrl+X
guardar, etc) y no se aconsejamos que utilices dichas combinaciones. Por eso lo que se hace es presionar
Mayúsc antes de la letra de tal forma que la macro se ejecutará con Ctrl+Mayús+Letra y de esta forma no alterar
las teclas de método abreviado por defecto de Excel.
Desde objetos
Muchas veces, y sobre todo cuando desarrolles aplicaciones en Excel, te interesará asignar macros a objetos
gráficos insertados en la hoja.
Excel posee una gran cantidad de figuras y dibujos que puedes insertar en la hoja desde el menú Ver > Barra de
Herramientas > Dibujo. Esto te habilita una barra como la siguiente:
Si ya has insertado una figura en tu hoja Excel, podrás asociarle una macro siguiendo estos pasos:
1. Haz clic izquierdo en la figura para desplegar su menú de opciones.
2. Elige la opción Asignar macro...
3. Al elegir la opción de Asignar macro abrirás el el menú de macros. Selecciona de la lista la macro de tu interés
luego Aceptar.
4. Finalmente la figura quedará con la macro asignada, de tal forma que cada vez que hagas un clic encima de la
figura, se ejecutará la macro.
Desde botones
También es posible crear nuevos botones para la barra de herramientas de Excel y asignarle macros a los
mismos. Para hacerlo sigue estos pasos:
1. Ir al menú Ver> Barra de herramientas > Personalizar.
1.1 Desde la pestaña Comandos, en la lista de Categorías, elegimos la opción Macros.
1.2 A la derecha aparecerá una opción de Personalizar botón sobre la cual debemos hacer clic izquierdo y luego
arrastar y soltar ese botón a la barra de botones de Excel.
2. Es importante que mantengas abierto el cuadro de Personalizar, porque si no no podrás editar el botón. Si
hacemos clic izquierdo sobre el botón se desplegará se menú de opciones. Las opciones más importantes son
las de Cambiar imagen del botón y la de Asignar macro. Esta última opción nos permitirá abrir el cuadro de
diálogo con la lista de macros creadas para asignarle una macro determinada (visto en la sección anterior).
Automáticamente
Las macros también se pueden ejecutar automáticamente. Por ejemplo, se pueden hacer macros que se
ejecuten cada cierto tiempo o que se ejecuten solas cada vez que el usuario hace algo como abrir, cerrar,
guardar un libro, activar o desactivar una hoja, etc.
Este tema se trata con más detalle en el capítulo "Macros de Eventos".
Macros de Eventos
Como decíamos en la sección anterior, las macros también se pueden ejecutar automáticamente. En este caso
se las denomina macros de evento, porque ante un determinado evento o acción realizada por el usuario, la
macro se ejecuta automáticamente.
En las secciones siguientes repasaremos los principales eventos que pueden disparar una macro
automáticamente. Existen una gran cantidad de macros de evento así que solo estudiaremos las más utilizadas.
Eventos de libros
Los eventos de libros permiten disparar automáticamente una macro cuando suceden determinadas acciones a
nivel del libro Excel en cuestión, por ejemplo al abrirlo, guardarlo, cerrarlo, imprimirlo, etc.
Instrucciones para insertar una macro de evento a nivel libro:
1. Las macros de eventos se deben escribir en la carpeta ThisWorkbook del editor de macros.
2. Luego en la primera lista desplegable de la ventana de macros elegimos la opción Workbook.
3. Finalmente, en la lista desplegable de la derecha veremos todos los eventos de libro que podemos utilizar para
disparar nuestra macro.
4. Por ejemplo, si haces clic en la opción Activate, verás que en la ventana de macros se escribe
automáticamente el siguiente código:
Private Sub Workbook_Activate()
End Sub
Al seleccionar una macro de evento el editor escribe automáticamente la primera y última línea de su código (no
debes modificar esto). Luego podrás escribir tu código macro entre esas líneas. En este caso, la macro que
escribas se ejecutará cada vez que actives el libro Excel en cuestión. Por ejemplo, puedes hacer una macro que
muestre un mensaje de saludo cada vez que abres el libro:
Private Sub Workbook_Activate ()
Msgbox "Hola, Excel te saluda"
End Sub
Entonces, cada vez que abras el libro, la macro se ejecutará automáticamente y verás el saludo:
En el caso de las macros de evento, siempre aparece la palabra Private. Eso significa que esa macro no la
podrás ver en la lista de macros del menú Herramientas > Macro > Macros. Esto es así porque la macro no se
puede ejecutar manualmente, si no que se ejecuta automáticamente cuando ocurre el evento, en este caso
cuando se activa el libro Excel en cuestión.
Existen más de 20 macros de evento a nivel libro. Puedes insertarlas siguiendo las instrucciones dadas al
comienzo. Las más importantes son:
Private Sub Workbook_BeforeClose (Cancel As Boolean)
' El código que escribas aquí se ejecutará automáticamente al cerrar el libro
End Sub
Private Sub Workbook_BeforePrint(Cancel As Boolean)
' El código que escribas aquí se ejecutará automáticamente al imprimir el libro
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
' El código que escribas aquí se ejecutará automáticamente al guardar el libro
End Sub
Private Sub Workbook_Open()
'El código que escribas aquí se ejecutará automáticamente al abrir el libro
End Sub
Eventos de hojas
Los eventos de hojas permiten disparar automáticamente una macro cuando suceden determinadas acciones a
nivel de hojas Excel, por ejemplo al activarla, desactivarla, calcularla, etc.
Instrucciones para insertar una macro de evento a nivel hoja:
1. Las macros de eventos se deben escribir en la carpeta Hoja1(Nombre) del editor de macros. Fíjate que Hoja1
identifica el número de hoja de Excel y (Nombre) será el nombre que tenga asignado dicha hoja en Excel. Por
ejemplo, si en tu Excel la primera hoja se llama "Gastos", en el editor verías Hoja1(Gastos). En nuestro caso
tenemos Hoja1(Hoja1). Al hacer doble clic en dicha carpeta, la macro que escribamos solo afectará a dicha hoja.
2. Luego en la primera lista desplegable de la ventana de macros elegimos la opción Worksheet.
3. Finalmente, en la lista desplegable de la derecha veremos todos los eventos de hoja que podemos utilizar para
disparar nuestra macro automáticamente.
4. Por ejemplo, si haces clic en la opción Activate, verás que en la ventana de macros se escribe el siguiente
código:
Private Sub Worksheet_Activate()
End Sub
Al seleccionar una macro de evento el editor escribe automáticamente la primera y última línea de su código (no
debes modificar esto). Luego podrás escribir tu código macro entre esas líneas. En este caso, la macro que
escribas se ejecutará cada vez que actives la hoja Excel en cuestión. Por ejemplo, puedes hacer una macro que
muestre un mensaje de saludo cada vez que activas la hoja:
Private Sub Worksheet_Activate()
Msgbox "Hola, Excel te saluda"
End Sub
Entonces, cada vez que actives la hoja, la macro se ejecutará automáticamente y verás el saludo:
En el caso de las macros de evento, siempre aparece la palabra Private. Eso significa que esa macro no la
podrás ver en la lista de macros del menú Herramientas > Macro > Macros. Esto es así porque la macro no se
puede ejecutar manualmente, si no que se ejecuta automáticamente cuando ocurre el evento, en este caso
cuando se activa la hoja Excel en cuestión.
Existen unas 9 macros de evento a nivel hoja. Puedes insertarlas siguiendo las instrucciones dadas al comienzo.
Las más importantes son:
Private Sub Worksheet_Activate ()
' El código que escribas aquí se ejecutará automáticamente al activar la hoja
End Sub
Private Sub Worksheet_Calculate()
' El código que escribas aquí se ejecutará automáticamente al calcular la hoja
End Sub
Private Sub Worksheet_Deactivate()
' El código que escribas aquí se ejecutará automáticamente al desactivar la hoja
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' El código que escribas aquí se ejecutará automáticamente al moverte entre las celdas de la hoja (cada vez que
seleccionas y te posicionas en una nueva celda)
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
' El código que escribas aquí se ejecutará automáticamente al producirse un cambio en la hoja (por ejemplo al
introducir un dato en una celda, seleccionar una opción de una lista desplegable, etc.)
End Sub
Formularios (Userforms)
Un Formulario (o su denominación en inglés Userform) se utiliza para crear un Cuadro de Diálogo donde el
usuario puede introducir información, o realizar otras operaciones. Al ejecutar muchas de las opciones del menú
de Excel se abren formularios. Por ejemplo, desde el menú Herramientas > Opciones se abre un formulario como
el siguiente, desde donde se pueden activar o desactivar distintas opciones de Excel.
Este formulario es muy completo y posee pestañas en la parte superior, casillas de selección (cuadraditos con
tildes), casillas de opciones (círculos con un punto dentro) y listas desplegables (lista con una flechita que
despliega distintas opciones).
Los Userforms se utilizan mucho para crear aplicaciones Excel que luzcan de forma profesional y permitan al
usuario introducir datos o elegir opciones de una forma guiada y más intuitiva.
En este capítulo aprenderemos como construir nuestros propios Userforms !
Crear un Userform
Para crear un Userform debemos hacer lo siguiente:
1. Abrir el editor de macros (por ejemplo, con CTRL+F11).
2. Insertar un objeto Userform. Esto podemos hacerlo fácilmente:
2.1 Seleccionamos el Libro Excel donde trabajaremos, en nuestro caso VBAProject (Libro2).
2.2 Hacemos clic derecho en el mismo y elegimos la opción Insertar > Userform
2.3 Como se ve en la fotografía, veremos que aparece un objeto Userform1 que cuelga de la carpeta Formularios
3. En la ventana de Código de la derecha, veremos que aparece un Userform en blanco, sin controles. Para abrir
su Cuadro de Herramientas puedes hacerlo desde el menú Ver > Cuadro de Herramientas. Ahí figuran los
controles que podremos agregar dentro del Userform. Simplemente hacemos clic izquierdo en el control deseado
y luego clic izquierdo en el Userform, en el sitio donde querramos agregar el control.
La idea es que mediante estos controles podremos tanto capturar como enviar información o datos desde o hacia
las celdas de Excel respectivamente. También podemos asociar macros a los controles que agreguemos al
Userform (todo esto lo veremos en secciones siguientes).
Si te posicionas sobre los Controles del Cuadro de herramientas, verás que aparece su nombre. Simplemente
hacemos clic izquierdo en el control deseado y luego clic izquierdo en el Userform, en el sitio donde querramos
agregar el control. En nuestro caso hemos agregado algunos controles de forma desordenada dentro del
Userform.
Controles de un Userform
Como veíamos anteriormente, tenemos una serie de controles para agregar al Userform, que los podíamos
visualizar desde el menú Ver > Cuadro de Herramientas.
Ahora explicaremos brevemente la utilidad de cada control. Los controles se explican en el mismo orden que
aparecen en el Cuadro de Herramientas y en la figura anterior (de izquierda a derecha y de arriba hacia abajo).
Seleccionar objetos: sirve para seleccionar controles que hayamos insertado en el Userform.
Label: sirve para poner un título o un texto.
Ejemplo: podemos poner un texto del tipo "Complete las opciones a continuación" y ubicarlo en cualquier sitio del
Userform. También podemos agregar títulos o descripciones al resto de comandos que agreguemos en el
Userform.
Textbox: sirve para que un usuario introduzca datos.
Ejemplo: queremos que el usuario introduzca una fecha o un nombre (que luego llevaremos a alguna celda de
Excel).
ComboBox: sirve para que un usuario elija una opción de una lista.
Ejemplo: creamos una lista con los meses de Enero a Diciembre para que el usuario elija uno de ellos.
ListBox: sirve para que un usuario rellene o elija varias opciones de una lista.
Ejemplo: creamos una lista con Regiones o Ciudades y el usuario deberá elegir una o varias de ellas.
CheckBox: sirve para que un usuario active una determinada función.
Ejemplo: podemos hacer que al cerrar el Userform se imprima un reporte solo si la casilla de selección está
tildada.
OptionButton: sirve para que un usuario seleccione una opción determinada entre varias posibilidades.
Ejemplo: queremos que el usuario indique si es de sexo Masculino o Femenino. De todas las opciones solo se
puede seleccionar una de ellas.
ToggleButton: sirve para activar o desactivar alguna funcionalidad. Este botón adopta el modo "Encendido" /
"Apagado".
Ejemplo: queremos que el usuario defina su idioma, en modo encendido español y en modo apagado inglés.
Frame: sirve para agrupar elementos de un Userform (los elementos se deben ubicar dentro del Frame).
Ejemplo: tenemos varias grupos de OptionButton y para distinguirlos los agrupamos con un Frame. Si tenemos
un grupo de opciones tipo masculino/femenino los agrupamos dentro de un frame. Si luego tenemos otro grupo
de opciones del tipo Mayor de Edad / Menor de Edad los agrupamos dentro de otro Frame.
CommandButton: es un simple botón que nos permite ejecutar acciones.
Ejemplo: un botón de Ayuda que ejecuta otro Userform con ayuda para el usuario.
TabStrip: en un mismo Userform se pueden crear distintas secciones.
Ejemplo: un userform con cuatro secciones: Norte, Sur, Este y Oeste. Dentro de cada sección podemos ubicar
distintos controles.
MultiPage: en un mismo Userform se pueden crear distintas páginas.
Ejemplo: un userform con 2 páginas: España y Resto del Mundo. Dentro de cada página podemos ubicar
distintos controles o distintas secciones.
ScrollBar: si tenemos una lista con muchos elementos el scrollbar nos permite navegarlos.
Ejemplo: tenemos una lista con 150 países. Con el ScrollBar podemos subir y bajar por la lista de los mismos
utilizando las flechas de desplazamiento.
SpinButton: permite aumentar o disminuir valores.
Ejemplo: tenemos una lista con tipos de interés y queremos que sean incrementados o disminuidos en
cantidades predeterminadas desde el SpinButton.
Image: permite introducir imágenes en el Userform.
Ejemplo: queremos introducir una fotografía como fondo del Userform para darle un aspecto más profesional.
RefEdit: permite hacer referencia a una celda de Excel.
Ejemplo: queremos que el usuario seleccione un dato que fue introducido previamente en una celda Excel.
Haciendo doble clic en cada control se abrirá una venta donde podremos escribir y asociarle una macro. En la
sección siguiente veremos un ejemplo simple sobre como crear un Userform paso a paso.
Para ver como se verían estos controles dentro del Userform, vamos a crear un Userform que contiene los 15
controles que se pueden agregar. Los hemos agregado en el mismo orden en que aparecen en el Cuadro de
Herramientas.
Ejemplo paso a paso
Antes de crear un Userform debemos pensar bien cual será su objetivo y cuáles son los controles que
utilizaremos.
Objetivo
Crear un Userform para que un usuario complete unos datos personales (Nombre, Edad y Fecha de Nacimiento).
Luego que el usuario complete sus datos al apretar un botón los mismos se volcarán en una tabla de Excel.
Los controles que utilizaremos son:
Textbox: para que el usuario ingrese los datos
Label: para darle el nombre e los Textbox
CommandButton: para proceder con el ingreso de datos o cancelar
1. Creamos la tabla en la hoja Excel
Primero debemos crear un nuevo libro que contenga una tabla Excel donde se volcarán los datos del Userform.
Para esto creamos un nuevo libro llamado Datos.xls y creamos la siguiente tabla:
2. Creamos un Userform (UF)
Los UF se crean desde el editor de visual basic.
2.1 Abrimos el editor con ALT+F11
2.2 Seleccionamos Ver > Explorador de Proyectos para ver la lista de proyectos disponibles (los mismos se
verán en la parte izquierda de la ventana).
2.3 En la venta de Proyectos seleccionamos VBAProject(Datos.xls)
2.4 Desde el menú superior elegimos Insertar > Userform
2.5 Aparecerá un nuevo Userform vacío junto con el Cuadro de Herramientas (si el mismo no aparece se puede
abrir desde el menú Ver > Cuadro de Herramientas)
3. Nombramos el Userform
3.1 Abrimos las propiedades desde el menú Ver > Ventana Propiedades.
3.2 Hacemos doble clic en donde dice (Name) UserForm1, en la parte superior y tipeamos DatosUF, luego Enter
(este es el nombre con el que nos referiremos al Userform desde las macros).
3.3 El nombre del Userform cambió en la Ventana de Proyecto, pero el Userform mismo sigue mostrando
"Userform1" en su barra de su título. Para cambiarlo vamos a la Ventana Propiedades, hacemos doble clic en
Caption, escribimos Datos Personales (encima de Userform1) y luego Enter. Ahora, la barra de título del
Userform es más apropiada para nuestro propósito y para darle mejor información al usuario.
4. Agregamos un Cuadro de Texto
Para permitir que el usuario ingrese datos en el Userform agregamos un control TextBox, desde el Cuadro de
Herramientas.
4.1 Hacemos clic en el control de TextBox
ubicarlo.
y luego hacemos clic en el Userform, en la parte donde queramos
4.2 Con el nuevo TextBox seleccionado hacemos doble clic en la Ventana de Propiedades, propiedad (Name),
tipeamos la palabra UFNombre y luego enter (este es el nombre que le asignamos al objeto para luego referirnos
a él desde las macros).
4.3 Hacemos clic en una parte vacía del Userform, para volver a seleccionar todo el Userform.
5. Agregamos un Texto
Para ayudar al usuario a ingresar sus datos, debemos indicarle que es lo que debe introducir en el Cuadro de
Texto del Paso anterior. Podemos agregar una etiqueta de texto que describa la información que se debe
introducir.
5.1 En el Cuadro de Herramientas hacemos clic en el botón Label
(etiqueta de texto).
5.2 En el Userform hacemos clic a la izquierda del TextBox, para agregar la Etiqueta de texto.
5.3 Si fuera necesario podemos cambiar el tamaño de la etiqueta de texto o del
Cuadro de Texto para que no se superpongan. Se puede hacer clic en sus bordes (pequeños cuadraditos) y
arrastrar para cambiar su tamaño.
5.4. Seleccionamos la nueva etiqueta, hacemos doble clic en la propiedad Caption de la ventana de propiedades,
tipeamos Nombre y luego Enter.
5.5 Hacemos clic en alguna parte vacía del Userform para seleccionarlo y mostrar el cuadro de herramientas.
6. Agregamos los Cuadros de Texto restantes
Agregamos los cuadros de texto y las etiquetas restantes (ya lo hicimos para el nombre así que repetimos para
Edad y Fecha de Nacimiento).
Repetimos los pasos 4 y 5 y agregamos:
* 1 TextBox cuyo (Name) sea UFEdad, con una etiqueta de texto (Label) Edad
* 1 TextBox cuyo (Name) sea UFFecha, con una etiqueta de texto (Label) Fecha Nac.
Es muy importante que no olvides asignar bien los nombres (Name) a los Textbox, si no la macro dará error.
Puedes revisar los pasos 4 y 5 para recordar como hacerlo.
Si los textbox no quedan alineados se pueden alinear de la siguiente forma:
1. Clic en el primer TextBox
2. Manteniendo pulsada la tecla MAYUS, selecciona los otros TextBox
3. Vamos al menú Formato > Alinear > Izquierda
4. Hacemos clic en alguna parte vacía del Userform para seleccionarlo y mostrar el cuadro de herramientas.
7. Agregamos los Botones
Para permitir que el usuario ejecute una acción, se pueden agregar botones de comando o CommandButons.
Nuestro Userform tendrá un botón para Agregar los datos a la tabla Excel y otro botón para Cerrar el Userform.
7.1 En el Cuadro de Herramientas hacemos clic en CommandButton.
7.2 En el Userform hacemos clic en la parte inferior izquierda para agregar el botón.
7.3 Con el nuevo botón seleccionado hacemos doble clic en la propiedad (Nombre) de la Ventana de
Propiedades, tipeamos UFAgregar y luego enter.
7.4 Con el nuevo botón seleccionado hacemos doble clic en su propiedad Caption en la Ventana de
Propiedades, tipeamos Agregar y luego enter.
7.5 Hacemos clic en alguna parte vacía del Userform para seleccionarlo y mostrar el Cuadro de Herramientas.
7.6 Repetimos los pasos anteriores para agregar otro CommandButton llamado UFCerrar y nombre Cerrar.
7.8 Si fuese necesario podemos reubicar los botones dentro del Userform.
Es muy importante que no olvides asignar bien los nombres (Name) a los CommandButtons, si no la macro dará
error. Esto se explica en el paso 7.3 y luego deberás repetirlo para el otro botón, tal cual se indica en el paso 7.6.
8. Agregamos el código al botón Agregar
8.1 Seleccionamos el botón Agregar
8.2 Desde el menú superior elegimos la opción Ver > Código. Esto abrirá una ventana donde podremos escribir
código macro para dicho objeto.
8.3 Donde titila el cursor escribimos lo siguiente:
Private Sub UFAgregar_Click()
'definimos las variables
Dim iFila As Long
Dim ws As Worksheet
Set ws = Worksheets(1)
' Encuentra la siguiente fila vacía
iFila = ws.Cells(Rows.Count, 1) _
.End(xlUp).Offset(1, 0).Row
' Verifica que se ingrese un nombre
If Trim(Me.UFNombre.Value) = "" Then
Me.UFNombre.SetFocus
MsgBox "Debe ingresar un nombre"
Exit Sub
End If
' Copia los datos a la tabla Excel
ws.Cells(iFila, 1).Value = Me.UFNombre.Value
ws.Cells(iFila, 2).Value = Me.UFEdad.Value
ws.Cells(iFila, 3).Value = Me.UFFecha.Value
' Limpia el formulario
Me.UFNombre.Value = ""
Me.UFEdad.Value = ""
Me.UFFecha.Value = ""
Me.UFNombre.SetFocus
End Sub
8.4 En el menú superior elegimos Ver > Objeto para regresar al Userform.
No te preocupes si no comprendes el código. Hay muchos objetos, propiedades y métodos nuevos. Todos ellos
se explican mejor en la 2º parte de este manual.
9. Agregamos el código al botón Cerrar
9.1 Seleccionamos el botón Cerrar
9.2 En el menú superior elegimos Ver > Código
9.3 Donde titila el cursor escribimos el siguiente código:
Private Sub UFCerrar_Click()
Unload Me
End Sub
9.4 En el menú superior elegimos Ver > Objeto para regresar al Userform.
10. Permitir al usuario cerrar el Userform con la tecla ESC
10.1 Seleccionamos el botón Cerrar
10.2 En la Ventana Propiedades cambiamos la propiedad Cancel a True.
Probar el Userform
Ya podemos probar el funcionamiento del Userform !
1. Hacemos clic en alguna parte vacía del Userform para seleccionarlo y mostrar el cuadro de herramientas.
2. En el menú superior elegimos Ejecutar > Ejecutar Sub/Userform
3. Ahora podemos comenzar a completar el primer cuadro del Userform y escribimos un nombre, por ej. Juan.
4. Presionamos la tecla TAB para movernos al siguiente cuadro de texto.
5. Cuando hemos completado todos los cuadros de texto, hacemos clic en el botón de Agregar y los datos se
completarán en la Tabla de Excel.
6. Podemos repetir los pasos anteriores e ir agregando distintos nombres con sus respectivos datos.
7. Hacemos clic en Cerrar para volver al editor de macros.
La tecla TAB sirve para moverse entre los distintos controles de un Userform. Si al presionar TAB el orden del
movimiento no es el correcto, es posible cambiarlo:
1. Clic derecho en una parte vacía del Userform
2. Elegimos Orden de Tabulación.
3. Seleccionamos el control de la lista y con los botones de Mover Arriba o Mover Abajo ajustamos el orden.
4. Hacemos clic en OK
Asignar un botón para ejecutar el Userform
Podemos agregar un botón para que un usuario pueda ejecutar el Userform desde la hoja Excel.
1. Activamos Excel, libro Datos.xls, Hoja 1
2. En la Barra de Dibujo, en el menú Ver > Barras de Herramientas > Dibujo hacemos clic en una figura, por
ejemplo el cuadrado, y lo insertamos en la hoja.
3. Seleccionamos dicha figura y con clic derecho en su borde elegimos Asignar Macro
4. Hacemos clic en el botón Nuevo
5. Donde titila el cursor escribimos: DatosUF.Show
6. Cada vez que hagamos clic en la figura se ejecutará el Userform.
Varios
En este capítulo se comentan temas diversos pero que no dejan de ser importantes sobre macros.
Ejecutar macro desde macro
Muchas veces nos interesa ejecutar o llamar una macro desde otra macro. Esto es muy útil porque si tenemos un
desarrollo muy grande, para mantener ordenado el código conviene dividir la tarea en distintas macros y luego
vamos ejecutando la macro que se necesite en cada momento.
Para llamar una macro desde otra macro simplemente se escribe el nombre de la macro invocada dentro del
código de la macro principal. Por ejemplo, si ejecutamos la Macro1 y queremos que desde la misma se ejecute la
Macro2 lo haríamos así:
Sub Macro1()
'El código de mi Macro1
Macro2
End Sub
Si queremos identificar mejor que estamos llamando una macro desde otra macro podemos anteponer la palabra
Call. El efecto es el mismo, solo que al anteponer la instrucción Call, la misma queda en azul automáticamente, y
nos permite identificar mejor que estamos llamando otra macro.
Sub Macro1()
'El código de mi Macro1
Call Macro2
End Sub
Por ejemplo, tenemos una SuperMacro que realiza la función siguiente:
Sobre el rango seleccionado:
1. Asigna un formato numérico
2. Asigna bordes
3. Asigna color de relleno
El código de la SuperMacro es el siguiente:
Sub SuperMacro()
'Asigna Formato Numérico
Selection.NumberFormat = "#,##0;[Red]#,##0"
'Asigna Bordes
With Selection.Borders
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
'Asigna Color de Relleno
With Selection.Interior
.ColorIndex = 36
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
End Sub
Esta SuperMacro podríamos simplificarla de tal forma que ejecute 3 MiniMacros:
Sub SuperMacro()
Call FormatoN
Call Bordes
Call Relleno
End Sub
La palabra Call se puede omitir pero recomendamos utilizarla para identificar mejor que estamos llamando otras
macros. Como se ve en el código, la SuperMacro ejecuta 3 macros. Estas 3 macros deben estar ubicadas en el
mismo módulo y las escribimos a continuación:
Sub FormatoN()
'Asigna Formato Numérico
Selection.NumberFormat = "#,##0;[Red]#,##0"
End Sub
Sub Bordes()
'Asigna Bordes
With Selection.Borders
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Sub
Sub Relleno()
'Asigna Color de Relleno
With Selection.Interior
.ColorIndex = 36
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
End Sub
Depuración y errores
Es común que cuando ejecutamos una macro la misma tenga algún error. Los errores pueden ser errores de
tipeo o estructuras mal escritas. El editor de macros tiene un autocontrol que permite corregir estos errores
comunes. Veamos algunos casos:
En este primer ejemplo utilizaremos una macro sencilla cuya única función es seleccionar la celda A2. Si
escribimos correctamente la macro, el editor asigna automáticamente los colores azules, lo que significa que ha
reconocido la estructura Sub() - End Sub.
Ejemplo:
'Esta macro selecciona la celda A2
Sub Macro()
Range("A2").Select
End Sub
Si las instrucciones están bien escritas el editor convierte automáticamente las mayúsculas y asigna los colores
azules a las estructuras reconocidas y verde a los comentarios. Las estructuras reconocidas son aquellas que
siempre se deben respetar y se explican mejor en la 2º parte del manual, capítulo "Estructuras".
Si cometiéramos un error al referirnos al objeto "Range" y por ejemplo olvidáramos poner la comilla luego del 2,
al dar enter a dicha línea aparecería un mensaje de error y la línea se pintaría automáticamente de rojo, como se
ve a continuación.
Sub Macro()
range("a2).select
End Sub
Cuando sucede esto aparece un aviso que nos indica el error cometido. Si vemos que la línea está roja es señal
que debemos corregir algo (usualmente falta o sobra algún carácter). En nuestro caso, hemos olvidado poner la
comilla (el objeto Range siempre requiere que la celda esté entre comillas y luego entre paréntesis).
Veamos otro error de tipeo. En ese caso escribimos erróneamente "Sab", en lugar de "Sub". A pesar que no
aparecerá ningún mensaje de error, vemos que el editor no ha pintado de azul la palabra "Sab".
Sab Macro()
Range("A2").Select
End Sub
Al intentar ejecutar esta macro no sucederá nada, porque no se ha respetado la estructura de Sub() - End Sub
con la que debe comenzar y finalizar una macro respectivamente.
En otras ocasiones, la macro arrastra un error pero el mismo no aparece hasta ejecutarla. Veamos el caso de la
siguiente macro. Al escribirla no ha generado error y ninguna línea se ha pintado de rojo. Sin embargo, al
ejecutarla sí aparece un error.
Sub Macro()
If Range("a2").value = 2 Then
MsgBox "Mal"
End Sub
El error que aparece al ejecutarla es un aviso que indica:
"Error de compilación: Bloque If sin End If"
Al hacer clic en aceptar la macro queda en "Modo Interrupción", lo que significa que todo queda en pausa y no se
podrán ejecutar nuevas macros (el modo de interrupción se identifica porque el nombre de la macro queda
resaltado en amarillo). Lo que debemos hacer en esta instancia es salir de modo interrupción desde el mismo
editor, menú Ejecutar > Reestablecer. Luego procedemos a corregir la macro. En este caso el mensaje fue claro:
la estructura estaba incompleta, nos faltó el End If (existe una estructura If - End If que se explica mejor en la 2º
parte del manual, capítulo "Estructuras").
Una vez que se ha interrumpido la macro, tenemos la opción de ejecutarla paso a paso (o línea por línea) y así
determinar en qué línea está el error. Este lo puedes hacer posicionándote en la primera fila de la macro y luego
presionar la tecla F8. De esta forma se irá resaltando con amarillo y ejecutando cada fila, hasta que llegues a la
que produce el error. También puedes hacerlo desde la opción del menú Depuración > Paso a paso por
instrucciones.
Complementos (add-ins)
Una vez que tenemos nuestras macros, es posible "empaquetarlas" bajo la forma de un Complemento, también
conocidos como Add-in, de tal forma que se pueden distribuir a otros usuarios para que lo instalen y tengan
acceso a las macros.
En general, estos complementos no son más que nuevas funcionalidades y opciones para Excel, realizadas con
macros.
Para acceder a los complementos puedes hacerlo desde el menú Herramientas > Complementos de la hoja
Excel, y verás un cuadro similar al que se muestra a continuación:
A la izquierda se ve la lista de complementos disponibles siendo posible activarlos o desactivarlos
(seleccionando o deseleccionando la casilla a la izquierda de su nombre).
Cuando queremos instalar nuevos complementos debemos hacerlo con el botón Examinar. Dicho botón nos
permitirá buscar el directorio donde se encuentra el complemento que deseamos instalar. La extensión de los
archivos de complementos es XLA.
La utilidad de un complemento es que podemos crear nuestras macros y luego guardarlas como complemento.
De esta forma, dichas macros estarán disponibles en todas las hojas Excel que abramos, dado que el
complemento se cargará automáticamente (Excel carga automáticamente todos los complementos que estén
seleccionados al abrirse).
El proceso de creación de un complemento es sencillo:
1. Primero debes crear tus macros normalmente, desde el editor de macros
2. Luego debes guardar dicho archivo Excel desde el menú Archivo > Guardar como...
3. Se abrirá el Cuadro de diálogo de guardar y en la parte inferior hay una lista desplegable llamada Guardar
como tipo. En dicha lista debes elegir la opción Complemento de Microsoft Excel, que suele ser la última de las
opciones.
4. Deberás elegir un nombre para tu complemento y guardarlo normalmente. Dicho archivo se guardará
automáticamente con la extensión XLA.
5. Para instalar el complemento debes hacerlo desde el menú Herramientas > Complementos y luego la opción
Examinar, tal como te señalábamos al comienzo. Deberás buscar el directorio donde guardaste el archivo XLA y
seleccionarlo.
Seguridad de macros
Excel posee 3 niveles de seguridad de macros. Los mismos se pueden definir desde el menú Excel Herramientas
> Opciones > pestaña Seguridad > botón Seguridad de macros. El cuadro de diálogo que se abre se ve así:
Lo recomendable es tener el nivel de seguridad en Medio. De esta forma cada vez que abramos un archivo
tendremos la opción de habilitar o deshabilitar las macros, mediante un mensaje automático de aviso que
aparece. Si el archivo proviene de una fuente segura las podremos habilitar sin problemas.
Firma digital
Cuando se abre un libro Excel que contiene macros, aparece un mensaje de aviso indicando si se desean
habilitar o deshabilitar las mismas.
Si quieres ejecutar las macros y que no vuelva a aparecer dicho mensaje, deberás crear una Firma Digital.
Para crear una firma digital hay que ejecutar un archivo llamado Selfcert.exe (en mi caso particular se encuentra
ubicado en C:\Archivos de programa\Microsoft Office\Office\). Si no lo tienes allí, puedes buscarlo en tu PC con la
opción de buscar archivos.
Al ejecutar Selfcert.exe se abre una pequeña ventana donde se pide el ingreso del texto de la firma digital y
luego aceptar.
Ahora lo que debemos hacer es asociar dicha firma a nuestro archivo xls con macros. Para esto abrimos nuestro
xls con macros, pasamos al editor de macros y elegimos las opciones del menú Herramientas > Firma Digital.
Luego hacemos click en el botón Elegir, escogemos la firma creada, aceptamos y todo listo, macros firmadas.
Cuando abramos el xls con macros nuevamente, Excel indicará que posee macros firmadas por XXXX (nombre
de la persona que creo la firma). Si marcamos la casilla de confiar de esta fuente, ya nunca más aparecerá el
mensaje de macros al abrir dicho archivo. Todos los xls que lleven esa firma se abrirán con sus macros
habilitadas.
Macros privadas
Recuerda que puedes visualizar las macros de tu libro desde el menú Excel Herramientas > Macro > Macros.
Verás que se abre un cuadro como el siguiente:
En el mismo figuran los nombres de las macros creadas, así que solo tienes que seleccionar la macro y luego
hacer clic en el botón de Ejecutar
.
Si por alguna razón no desearas que figuren las macros del libro en dicho cuadro puedes hacerlo utilizando la
instrucción Private cuando escribas tu macro. Debes utilizar dicha instrucción delante de la palabra Sub. De este
modo solo ocultarás la macro en cuestión. Ejemplo:
Private Sub MiMacro()
'Esta macro no aparecerá en la lista de macros
'Código de tu macro aquí
End Sub
Si tienes muchas macros en el módulo y quieres ocultarlas todas, en lugar de escribir la palabra Private en cada
una de ellas, puedes colocar la siguiente instrucción al comienzo de tu módulo:
Option Private Module
De esta forma todas las macros de dicho módulo quedarán ocultas.
Acelerar el código
En la medida que la cantidad de código contenido en las macros se incrementa, es posible que la velocidad de
ejecución de las mismas disminuya. Sin embargo, existen algunas recomendaciones para mantener las macros
rápidas:
1. Evitar actualización de pantalla
Cuando ejecutamos la macro, podemos ir viendo en la pantalla todo lo que sucede, sobre todo en el caso de
macros que activan o desactivan hojas, seleccionan rangos, etc. Esto hace que la macro se ejecute un poco más
lento. Si solo queremos ver el resultado final y ganar velocidad, debemos utilizar la instrucción
Application.ScreenUpdating=False. En general se recomienda incluir siempre esta línea al comienzo de cada
macro, por ejemplo:
Sub SuperMacro()
Application.ScreenUpdating=False
'El código de la macro aquí
End Sub
2. Prevenir cálculos mientras se ejecuta el código
Si nuestra macro realiza cambios en distintas celdas, en cada cambio realizado se recalculará la hoja. Si el libro
tuviera muchas fórmulas y la macro cambiara muchas celdas, esto haría que se ejecute muy lento, porque se
estaría recalculando la hoja repetidas veces. Lo recomendable es deshabilitar el cálculo, ejecutar la macro y
luego volver a activar el modo de cálculo automático. Por ejemplo:
Sub SuperMacro()
Application.Calculation = xlCalculationManual
'El código de la macro aquí
Application.Calculation = xlCalculationAutomatic
End Sub
3. Utilizar la instrucción With
Cuando tenemos que definir muchas propiedades de un único objeto, no es necesario hacer mención al objeto
cada vez, porque esto le quita velocidad de ejecución a la macro. Para ganar velocidad y mantener el código
más simple, conviene hacer mención al objeto una única con la instrucción With y luego definir sus propiedades,
por ejemplo:
Sub CambiarFormatoRango()
With Range("A1")
.Value = 10
.Font.Bold = True
.Interior.ColorIndex = 5
End With
End Sub
Esto se explica mejor en la 2º parte del manual, capítulo "Estructuras".
4. Insertar fórmulas relativas
Si queremos insertar fórmulas en celdas mediante macros, existe una forma más rápido de hacerlo que con
Copiar y pegar. Por ejemplo:
Sub CopiarFormula()
Range("A1:A10").FormulaR1C1 = "=SUM(RC[1]:RC[5])"
End Sub
Para saber como obtener la fórmula podemos hacer lo siguiente:
4.1 Insertamos la fórmula en la celda
4.2 Vamos al menú Herramientas > Macros > Grabar nueva macro
4.3 Desde la celda con la fórmula presionamos la tecla F2 y luego Enter.
4.4 Revisamos la macro grabada para obtener el código
5. Evitar el uso de Copiar, Pegar y Seleccionar
Cuando se utiliza la grabadora de macros, es común que se genere más código del necesario y esto hace que
funcione un poco más lento. Las instrucciones que suelen ser redundantes son Select, Selection.Copy y Paste.
Supongamos que queremos copiar un rango en otro rango. Si utilizamos la grabadora el código será el siguiente:
Sub CopiaRango()
Range("C10:C12").Select
Selection.Copy
Range("E10").Select
ActiveSheet.Paste
End Sub
Sin embargo hay una forma más directa donde evitamos el Select, el Selection y el Paste:
Sub CopiaRango()
Range("C10:C12").Copy Range("E10")
End Sub
Fin
Aquí finaliza la 1º Parte del Manual.
2º PARTE - CODIGO VBA
Importante !
Antes de comenzar con esta 2º parte del manual, es importante que tengas en cuenta lo siguiente:
Dificultad
Esta 2º parte del Manual de Macros está pensada para usuarios Excel con conocimientos intermedios y
avanzados de macros. Por eso te recomendamos previamente tener un buen dominio de la 1º parte de este
manual, que contiene la teoría para principiantes.
Dudas adicionales sobre macros
Si tienes dudas adicionales sobre macros te las responderemos personalmente desde nuestros foros de
Consultas de Macros. Si estás registrado en nuestro portal Exceluciones y has comprado este manual seguro
estarás en la Zona Cliente, así que tus consultas tendrán preferencia de respuesta por nuestros expertos.
400 Recursos y Extras VBA
Este manual contiene una 3º parte que contiene 400 Recursos y Extras VBA, incluídos gran parte de los
ejemplos que acompañan los capítulos del Manual. Por ejemplo, en los Extras hay un xls llamado
"Estructuras.xls", que ya contiene ejemplos didácticos y bién comentados de todo lo explicado en el capítulo
"Estructuras" de este manual. Si estás registrado en nuestro portal Exceluciones y has comprado este manual
seguro estarás en la Zona Cliente, desde donde podrás descargar los 400 Recursos y Extras VBA.
Mosaico vertical y revisión de macros con F8
Un buen método para entender el funcionamiento de las macros consiste en cerrar y minimizar todas las
aplicaciones que tenemos abiertas en nuestro ordenador. Luego
maximizar Excel al igual que el editor de VBA y crear un mosaico vertical con las aplicaciones abiertas y
maximizadas, es decir con Excel y VBA. Esto lo hacemos con el boton derecho del ratón en la parte inferior de la
pantalla (encima de la hora) y seleccionando la opción "Mosaico vertical". Podrás visualizar la hoja cuadriculada
Excel y el editor de VBA al mismo tiempo (muy útil a la hora de revisar lo que hace la macro).
Luego, utilizando la tecla F8 podrás ver como las diferentes macros se ejecutan pausadamante línea a línea
(esto fue explicado en la 1º parte del Manual, capítulo "Varios", sección "Depuración y errores").
Utilizando el Application.Wait
Muchas de las macros adjuntas en los libros, muestran la siguiente línea de código:
Application.Wait Now + TimeValue("00:00:01")
Esto produce que la macro se ejecute de forma más lenta, para poder observar mejor el cometido que está
realizando, pues de lo contrario, y sobre todo en las macros con poco código, la macro finalizaría en apenas
unas décimas de segundo.
Por ejemplo,con
Application.Wait Now + TimeValue("00:00:02")
obligamos a Excel a esperar 2 segundos más que el tiempo actual para continuar con la línea del código que
estuviese a continuación.
Escritura de las macros
En muchos ejemplos las macros no tienen su línea de comienzo (Sub) ni su línea de final (End Sub), como por
ejemplo:
ActiveSheet.PageSetup.PrintArea = "$A$1:$G$22"
Esta línea la podrías utilizar dentro de la ventana Inmediato del editor VBA.
Pero en la mayoría de los casos, la macro está completa, de tal forma que puedas copiarla directamente en el
editor, por ejemplo:
Sub AAA()
ActiveSheet.PageSetup.PrintArea = "$A$1:$G$22"
End Sub
Utilización de los Msgbox
Es común que hagamos uso de los Msgbox para indicar que puedes continuar con tu código. Esto quiere decir
que como el código siguiente dependerá de lo que tú necesites, el Msgbox es una forma de finalizar la macro. Si
quisieras continuar tu macro simplemente deberías eliminar el Msgox y reemplazarlo por el resto de tu código.
Utilización de los Print.Debug
Muchas veces, cuando queremos mostrar un resultado, lo hacemos directamente en la Ventana Inmediato,
utilizando la instrucción de Print.Debug.
Variables
Como prácticamente todas las macros utilizan variables, es importante comenzar a entenderlas. Una variable es
sencillamente un dato o valor que VBA guarda en memoria.
Para definir una variable utilizamos una sintaxis del tipo:
Dim NombreVariable as TipoVariable
Dim: indica que estamos creando una variable
NombreVariable: escribimos el nombre de nuestra variable a gusto (sin espacios)
as: necesario para definir el tipo de variable
TipoVariable: debemos indicar si es una variable texto, fecha, valor, etc.
Veamos un ejemplo sencillo:
Sub MiNombre ()
' Indicamos que "Nombre" es una variable "String" (texto)
Dim Nombre as String
' Le asiganamos un valor a la variable (también podríamos indicarle una celda Excel)
Nombre = "Pedro"
' Mostramos el valor de la variable en un mensaje
Msgbox Nombre
End Sub
La idea es que Excel recordará que la variable "Nombre" tiene asignado el valor "Pedro". Podremos utilizar dicha
variable más adelante en nuestro código.
Definición
Una variable es un lugar de almacenamiento con nombre que puede contener cierto tipo de datos que puede ser
modificado durante la ejecución del programa. Cada variable tiene un nombre único que la identifica dentro de su
nivel de ámbito. Puede especificar un tipo de datos o no. Los nombres de variable deben comenzar con un
carácter alfabético, deben ser únicos dentro del mismo ámbito, no deben contener más de 255 caracteres y no
pueden contener un punto o carácter de declaración de tipo.
Es decir las variables pueden contener caracteres alfanuméricos, pero siempre deben empezar por una letra y no
deben exceder en longitud de 255 caracteres
Se recomienda evitar el uso de caracteres no presentes en nuestro alfabeto para evitar problemas.
A su vez VBA tiene reservados algunos nombres, los cuales ovbiemante no pueden ser utilizados como variables
propias, algunas de estas palabras son: Sub, End, with, do, loop etc, ya que son nombres que tienen un
significado propio dentro de VBA.
Cuando declaramos una variable, por ej:
Dim SALUDOS as String
a medida que utilicemos la variable saludos aún cuando la escribamos en minúsculas VBA nos la corregirá
automáticamente, ya que ha sido creada en mayúsculas.
Es decir no debemos preocuparnos entre mayúsculas o minúsculas salvo en la declaración de variables y solo si
queremos.
Podemos declarar todo tipo evariables, por ello conviene también adquirir la costumbre de hacer que el propio
nombre de nuestras variable resulte descriptivo de la función que cumplirá, por ejemplo:
Sub Macro()
' Definimos una variable numérica TipoCambio, que es el factor de conversión entre el euro y la libra
Dim TipoCambio As Double ' Variable definida como valor con 2 decimales
TipoCambio = 1.45
' Esta macro multiplica el valor de la celda activa por el valor de la variable anterior
ActiveCell.Value = TipoCambio * ActiveCell.Value
End Sub
Si el código de nuestra macro crece mucho, al haber dado un nombre apropiado a la variable nos permitirá
reconocerla fácilmente, mucho mejor que haber hecho:
Sub Macro()
Dim valor As Double
valor = 1.45
ActiveCell.Value = valor * ActiveCell.Value
End Sub
En el caso anterior, si la macro creció mucho, llegaría un punto donde no recordaríamos que había en valor,
porque es un nombre que no nos dice mucho.
La declaración de variables agiliza el consumo de memoria y hace que el código se ejecute mas rápido. Si no
declararamos las variables VBA manipularia todas las variables
como Variant siendo el consumo de memoria bastante mayor.
Declaración
Antes de seguir avanzando con las variables, su uso y sus tipos, conviene preparar nuestro editor de macros,
para que siempre nos veamos en la obligación de declarar todas las variables que podamos ir utilizando en
nuestros módulos (es decir obligarnos a definir nuestras variables de entrada).
Esto lo podemos realizar desde el editor de VBA, a traves del menú Herramientas > Opciones > pestaña Editor >
y seleccionar la casilla Requerir declaración de variables
Con esta acción cada vez que insertamos un nuevo módulo en el editor de Visual Basic, el módulo añadido
incluirá automáticamente la instrucción Option Explicit al comienzo de todo, como se ve a continuación:
¿qué significa la instrucción Option Explicit?
Se usa en el nivel de módulo para forzar declaraciones explícitas de todas las variables en dicho módulo, debe
aparecer en un módulo antes de cualquier procedimiento.
Cuando Option Explicit aparece en un módulo, debemos declarar explícitamente todas las variables mediante las
instrucciones Dim, Private, Public, ReDim o Static.
De hecho si intentamos usar un nombre de variable no declarado, ocurrirá un error en tiempo de compilación o
bien en el momento en el que el código de origen se traduce a código de ejecución.
Cuando no usamos la instrucción Option Explicit todas las variables no declaradas son Variant (pueden tomar
cualquier valor) a menos que el tipo predeterminado esté especificado de otra manera con una instrucción
Deftipo (es decir salvo que luego vayamos definiendo la variables).
La declaración Option Explicit se utiliza para evitar escribir incorrectamente el nombre de una variable existente o
para evitar confusiones en el código, donde el alcance de la variable no está claro.
Ejemplo de la instrucción Option Explicit:
En este ejemplo se utiliza la instrucción Option Explicit para forzar la declaración explícita de todas las variables.
Si se intenta utilizar una variable no declarada se obtiene un error en el tiempo de compilación. Recordar que la
instrucción Option Explicit sólo se utiliza en el nivel de módulo.
' Fuerza la declaración explícita de variables.
Option Explicit
Sub MacroMensaje()
' Declaramos la variable saludo como variable tipo texto
Dim saludo As String
' Damos un valor a la variable declarada
saludo = "Hola que tal"
' Damos un valor a esta otra variable, que NO ha sido declarada
despedida = "Adios"
MsgBox saludo
MsgBox despedida
End Sub
Cuando ejecutamos esta macro obtenemos un error de compilación , en el que se nos dice que la palabra
seleccionada, no ha sido declarada, y VBA selecciona la palabra "despedida", es decir requiere de nosotros la
necesidad de declarar esta variable antes de ser usada. Si corregimos la macro anterior y declaramos ambas
variables, tendríamos:
Sub MacroMensaje()
' Declaramos la variable saludo como variable tipo texto
Dim saludo As String
' Aquí declaramos la variable que habíamos olvidado antes
Dim despedida as String
' Damos un valor a la variable declarada
saludo = "Hola que tal"
' Damos un valor a la variable declarada
despedida = "Adios"
MsgBox saludo
MsgBox despedida
End Sub
La declaración de variables es primordial, totalmente necesaria, pues ayuda a saber el código que estamos
manipulando y utilizar menos memoria, es por ello una buena acción forzar la declaración de variables siempre
(por eso recomendamos seguir los pasos indicados al comienzo de esta sección).
Tipos
La tabla siguiente muestra los tipos de datos compatibles, incluyendo el tamaño de almacenamiento y el
intervalo.
En la 1º columna (Tipo de datos) se define el tipo variables que podemos usar
En la 2º columna (Tamaño) se define cuanto espacio ocupa en memoria
En la 3º columna (Intervalo) se definen los valores que puede adquirir la variable
Lógicamente si sabemos que una variable va a utilizar valores numéricos sin decimales y entre 1 y 25, conviene
que lo declaremos como Byte, como se ve en este ejemplo:
Option Explicit
Sub Macro()
Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
La macro anterior utiliza bastantes menos recursos que esta próxima que no fuerza la declaración de la variable
X (y por lo tanto es considerada como Variant):
Sub Macro()
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
Que incluyamos la declaracion Option Explicit no implica que vayamos a hacer un buen uso de las variables pues
en el siguiente ejemplo, hemos considerado que X es Long, cuando podría utilizar menos recursos siendo Byte:
Option Explicit
Sub Macro()
Dim X as Long ' Aunque sería recomendable Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
Una solución momentánea para saber que tipo de variable deberíamos utilizar podría ser de la siguiente forma.
Observa que hemos eliminado la instrucción Option Explicit, pues nuestro objetivo es descubrir que tipo de
variable necesitaremos:
Sub Macro()
' Dim X As Long
For X = 1 To 65536
Cells(X, 1) = X
Next X
MsgBox TypeName(X)
End Sub
O bien:
Option Explicit
Sub Macro()
' Decimos que es variant, que es lo mismo que no decir nada pero definiendo esa nada y luego…
Dim X
For X = 1 To 65536
Cells(X, 1) = X
Next X
MsgBox TypeName(X)
End Sub
Y en ambos ejemplos obtendríamos el resultado Long, mientras que si hubiéramos puesto:
Option Explicit
Sub Macro()
Dim X
For X = 1 To 1500 ' Aquí escribimos un intervalo menor
Cells(X, 1) = X
Next X
MsgBox TypeName(X)
End Sub
obtendríamos como resultado Integer.
Este método no simpre sirve ya que:
Option Explicit
Sub Macro()
Dim X
For X = 1 To 25
Cells(X, 1) = X
Next X
MsgBox TypeName(X)
End Sub
Daria como resultado Integer, en lugar de Byte, no obstante el ahorro de recursos resulta en cualquier caso
evidente.
Locales
Las variables locales se declaran dentro de cada macro, y solo pueden ser utilizadas dentro de la macro en la
que han sido creadas, cuando la macro termina de ejecutarse, la variable desaparece y Excel libera la memoria
que estaba utilizando recordando a qué hacían referencia.
Una variable se declara como local cuando está declarada dentro de la macro que hará uso de la misma, por ej:
Sub Macro()
Dim X As Single
Dim Y As Single
Dim Z As Single
X=5
Y = 10
Z = 50
ActiveCell = X * Y * Z
End Sub
También se pueden declarar varias variables en la misma línea de código tal que:
Option Explicit
Sub Macro()
Dim x As Byte, y As Single, z As Long, Resultado As Variant
x = 5: y = 2000: z = 50000
Resultado = x * y * z
MsgBox TypeName(Resultado)
' en este caso el resultado seria Double
ActiveCell = Resultado
End Sub
Si una variable es local todas el resto de las macros podrán utilizar el mismo nombre de la variable tal que:
Option Explicit
Sub Macro1()
Dim Autor As String
Autor = "ExceLuciones"
ActiveCell = Autor
End Sub
Sub Macro2()
Dim Autor As String
Autor = "Pedro"
ActiveCell = Autor
End Sub
Sub Macro3()
Dim Autor As String
Autor = "Jose"
ActiveCell = Autor
End Sub
Sub Macro4()
Dim Autor As String
Autor = "Salvador"
ActiveCell = Autor
End Sub
Se recomienda la utilización de variables locales antes que la de variables públicas (las veremos en la sección
siguiente), ya que una vez que la macro termina de ejecutarse, VBA ya no las reconoce de nuevo y libera
memoria, mientras que si son públicas aún cuando la macro termina, el valor al que hacen referencia las
variables sigue vigente y ocupando espacio en memoria.
Públicas
Las variables declaradas mediante la instrucción Public están disponibles para todos los procedimientos en todos
los módulos de todas las aplicaciones, a menos que Option Private Module esté en efecto; en este caso, las
variables sólo son públicas dentro del proyecto en el que residen.
Este tipo de variables son útiles cuando empezamos a trabajar con macros pues facilitan la comprensión, y nos
ahorran el hecho de tener que declarar lo mismo una y otra vez.
Usamos la instrucción Public para declarar el tipo de datos de una variable. Por ejemplo, la instrucción siguiente
declara una variable como de tipo Integer:
Public NúmeroDeEmpleados As Integer
Usamos también la instrucción Public para declarar el tipo de objeto de una variable. La instrucción siguiente
declara una variable para una nueva instancia de una hoja de cálculo:
Public X As New Worksheet
Si no utilizamos la palabra clave New al declarar una variable de objeto, la variable que se refiere a un objeto
debe asignarse a un objeto existente mediante la instrucción Set antes de que se pueda usar. Hasta que se le
asigne un objeto, la variable de objeto declarada tiene el valor especial Nothing, el cual indica que no se refiere a
ninguna instancia en particular de un objeto.
También podemos utilizar una instrucción Public con paréntesis vacíos para declarar matrices dinámicas.
Después de declarar una matriz dinámica, usamos la instrucción ReDim dentro de un procedimiento para definir
el número de dimensiones y elementos de la matriz. Si intentamos volver a declarar un dimensión para una
matriz cuyo tamaño se ha especificado explícitamente en una instrucción Private, Public o Dim, ocurrirá un error.
Si no especificamos un tipo de datos o un tipo de objeto y no existe una instrucción Deftipo en el módulo, la
variable es Variant de manera predeterminada.
Cuando se inicializan las variables, una variable numérica se inicializa a 0, una cadena de longitud variable se
inicializa a una cadena de longitud cero ("") y una cadena de longitud fija se rellena con ceros. Las variables
Variant se inicializan a Empty.
Ejemplo de la instrucción Public
En este ejemplo se utiliza la instrucción Public a nivel de módulo (sección General) de un módulo estándar para
declarar variables como públicas; es decir, disponibles para todos los procedimientos en todos los módulos de
todas las aplicaciones (a menos que Option Private Module esté en vigor).
Cuando una variable es declarada como Public y es colocada al principio del módulo, puede ser utilizada por
cualquier macro, mientras que si fuera una variable no pública deberíamos definir su nombre cada vez que la
necesitemos en cada macro, por ejemplo:
Option Explicit
Public X As Byte
Sub Macro()
For X = 1 To 25
Call Macro2
Next X
End Sub
Sub Macro2()
Cells(X, 1) = X
End Sub
' Aún cuando este ejemplo puede resultar absurdo pues:
Sub Macro()
Dim X as byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
Con el ejemplo anterior tan solo pretendemos hacer referencia a que a veces conviene utilizar variables públicas
pues son variables que van a ser utilizadas ampliamente y es absurdo ir definiéndolas en cada macro.
Que una variable sea pública no significa que su valor deba ser constante, tan solo que no es necesario definirla
en cada macro y que mientras no le asignemos otro valor conserva el que tenía.
En el siguiente ejemplo hemos decidido no definir dos veces la variable Rg, no obstante hemos querido que en
cada macro haga referencia a diferentes rangos:
Public Rg As Range
Sub Macro()
Dim x As Byte
For x = 1 To 25
Set Rg = Cells(x, 1)
Rg.Value = x
Next x
End Sub
Sub Macro2()
Set Rg = Range("A1:A25")
Rg.Interior.ColorIndex = 3
End Sub
Estáticas
Las variables declaradas con la instrucción Static conservan su valor mientras el código se está ejecutando.
Una vez que el código del módulo se está ejecutando, las variables declaradas con la instrucción Static
conservan su valor hasta que se reinicie o restablezca el módulo. En los módulos de clase, las variables
declaradas con la instrucción Static conservan su valor en cada instancia de clase hasta que se destruye la
instancia. En módulos de formulario, las variables estáticas conservan su valor hasta que se cierra el formulario.
Use la instrucción Static en procedimientos no estáticos para declarar explícitamente variables que son visibles
sólo dentro de un procedimiento, pero cuya vida es la misma que la del módulo en la que se definió el
procedimiento.
Usamos una instrucción Static dentro de un procedimiento para declarar el tipo de datos de una variable que
conserva su valor entre llamadas a procedimiento. Se declaran dentro de cada macro, pero retienen el valor que
tenían la última vez que fueron utilizados, se declaran tal que:
Static X as byte, o Static Y as Long
En este ejemplo trabajaremos con dos macros: macro1 y macro2.
Ambas utilizarán una variable común tal que: Public Rg As Range
Utilizaremos Option Explicit para forzar la declaración de variables.
El hecho de que ambas macros utilicen una variable llamada x no significa que hagan referencia a la misma
variable, ta solo se llaman igual, de hecho a medida que la macro1 vaya ejecutándose x en el primera macro ira
desde 1 hasra 25 mientra que en la macro2 desde 10 hasta ¿?, dependiendo de cuantas veces utilicemos esta
macro. Pero en principio si es utilizada solo a través de la macro1 desde 10 hasta 250.
Option Explicit
Public Rg As Range
Sub Macro1()
Dim x As Byte
For x = 1 To 25
Set Rg = Cells(x, 1)
Call Macro2
Next x
End Sub
Sub Macro2()
Static x As Byte
x=x+5
Rg.Select
Rg = x
End Sub
Si una vez ejecutada la macro1, ejecutáramos la macro2 repetidas veces, la celda A25 seguiría seleccionada,
pero su valor aumentaría hasta 255. Y porque no más?
Porque aunque sea static hemos definido x en esta macro como Byte luego cuando x>255 obtendríamos un error
de recompilación, ya que habría un desbordamiento.
Para poder utilizar x>255 deberiamos haber usado en la macro2: Static x As single.
Nota: la instrucción Static y la palabra clave Static son similares, pero se utilizan para conseguir efectos
diferentes. Si declara un procedimiento con la palabra clave Static (como en Static Sub ContarVentas()), el
espacio de almacenamiento correspondiente a todas las variables locales dentro del procedimiento se asigna
una única vez y el valor de las variables se conserva durante todo el tiempo que se esté ejecutando el programa.
Para procedimientos no estáticos, el espacio de almacenamiento para las variables se asigna cada vez que se
llama al procedimiento y se libera cuando se sale del procedimiento. La instrucción Static se usa para declarar
variables específicas dentro de procedimientos no estáticos para conservar su valor mientras el programa se
esté ejecutando.
En este ejemplo se utiliza la instrucción Static para conservar el valor de una variable mientras el código del
módulo se esté ejecutando.
' Definición de función.
Function ConservarTotal(Número)
' Sólo la variable Acumulado conserva su valor entre distintas llamadas.
Static Acumulado
Acumulado = Acumulado + Número
ConservarTotal = Acumulado
End Function
' Definición de una función como Static.
Static Function MiFunción(Arg1, Arg2, Arg3)
' Todas las variables locales conservan su valor entre llamadas a la función.
Acumulado = Arg1 + Arg2 + Arg3
Mitad = Acumulado / 2
MiFunción = Mitad
End Function
Ya sean públicas, locales o estáticas, cuando se inicializan las variables, una variable numérica se inicializa a 0,
una cadena de longitud variable se inicializa a una cadena de longitud cero ("") y una cadena de longitud fija se
rellena con ceros. Las variables Variant se inicializan a Empty. Cada elemento de una variable de un tipo definido
por el usuario se inicializa como si fuera una variable distinta.
Constantes
Por lo general las variables hacen referencia a valores que acostumbran a cambiar tal que, por ej:
Sub Macro()
Dim Rng As Range
Dim x As Byte
For x = 1 To 25
Set Rng = Cells(x, 1)
Rng.Select
Rng = x
Next x
End Sub
Pero a veces queremos que una variable no cambie, es decir que siempre haga referencia al mismo valor,
ejemplo: mi nombre, la capital de Francia etc. Lógicamente carece de sentido declarar variables como constante
si éstas no son públicas.
Para declarar una variable como constante utilizamos la instrucción Const, por ej:
Option Explicit
Const nPaises As Byte = 53
Const UKrate = 1.43, USrate = 0.78
Const autorLibro As String = "ExceLuciones"
En la 1º línea hemos definido una variable como nPaises as byte y su valor sera siempre 53.
La 2º línea de código declara dos variables como constantes pero no especifica si son as double o as, con lo cual
se consideraran as variant.
La 3º linea de código declara autorLibro como una constante de tipo string y le da el valor Exceluciones.
Conversión
Es posible convertir variables de un tipo a otro. Existen distintas funciones que que permiten hacer estas
conversiones, por ej:
CBool(expresión), CByte(expresión), CCur(expresión), CDate(expresión), CDbl(expresión), CDec(expresión),
CInt(expresión), CLng(expresión), CSng(expresión), CStr(expresión), CVar(expresión)
El argumento obligatorio expresión es cualquier expresión de cadena o expresión numérica.
Tipos devueltos: el nombre de la función determina el tipo devuelto, como se muestra a continuación:
Si la expresión del argumento expresión que se pasa a la función está fuera del intervalo del tipo de dato al que
se va a convertir, se produce un error. En general, el código se puede documentar utilizando las funciones de
conversión de tipos de datos para indicar que el resultado de alguna de las operaciones se debería expresar
como un tipo de datos en particular, no como el tipo de datos predeterminado.
Cuando la parte fraccionaria es exactamente 0,5, CInt y CLng siempre redondean al número par más cercano.
Por ejemplo, 0,5 redondea a 0, y 1,5 redondea a 2. CInt y CLng se diferencian de las funciones Fix e Int en que
truncan, en lugar de redondear, la parte fraccionaria de un número. Además, Fix e Int siempre devuelven un valor
del mismo tipo del que se le pasa.
Utilizamos la función IsDate para determinar si se puede convertir date a una fecha o una hora. Si tubiéramos
una cadena de texto tal que:
Sub EjCdate()
Dim QAZ As String
QAZ = "5/5/2008"
If IsDate(QAZ) Then
QAZ = CDate(QAZ)
MsgBox QAZ & " SI es una Fecha."
Else
MsgBox QAZ & " no es una Fecha"
End If
End Sub
CDate reconoce literales de fecha y literales de hora además de números comprendidos dentro del intervalo de
fechas aceptables. Al convertir un número a una fecha, la parte numérica entera se convierte a una fecha.
Cualquier parte fraccionaria del número se convierte a la hora del día, comenzando a medianoche.
CDate reconoce formatos de fecha que se ajusten a la configuración regional de tu sistema. Es posible que no se
determine el orden correcto del día, mes y año si se proporciona en un formato diferente del que reconoce la
configuración de fecha. Además, no se puede reconocer un formato de fecha largo si contiene la cadena del día
de la semana.
Ejemplos
Recordar siempre que antes de utilizar una variable, debemos saber como funciona:
Las variables String siempre deben ir entre comillas:
Sub ejString()
Dim QAZ As String
QAZ = "Exceluciones"
Debug.Print QAZ
' Debug.Print es 1 comodín que solemos utilizar para ver lo que sucede a traves de la ventana inmediata de
VBA
MsgBox QAZ
End Sub
Salvo cuando hacen referencia a algún valor que venga de la misma hoja de Excel tal que:
Sub ejString()
Dim QAZ As String
QAZ = ActiveCell.Value
Debug.Print QAZ
MsgBox QAZ
End Sub
Pero en este caso si ActiveCell.Value=255, QAZ haría referencia a 255 como si de un nombre se tratara y no
como si de una cifra.
Para utilizar este valor 255 guardado como QAZ deberíamos previamente convertirlo a alguna variable que
permita la manipulación de cifras (Byte, Single, Long, Integr, Variant, etc), por ej:
Sub ejString()
Dim QAZ As String
QAZ = ActiveCell.Value
Debug.Print QAZ
MsgBox QAZ
' CInt se utiliza para convertir una variable ej de texto a integer como en este ejemplo
[A1] = CInt(QAZ) + 50
'Range("A1")=[A1] ' Es lo mismo
' La mar = El mar
End Sub
En este otro ejemplo definimos tres variables como String y concatenamos sus valores para mostrarlos en la
celda A1, en la ventana inmediata y en un mensaje tal que:
Sub ejString()
Dim QAZ As String
QAZ = ActiveCell.Value
Dim WSX As String
WSX = "Exceluciones"
Dim EDC As String
Debug.Print QAZ & WSX
MsgBox QAZ & WSX
EDC = QAZ & WSX
[A1] = EDC
End Sub
La fechas se pueden guardar como string pero no pueden ser utilizads en operaciones como fechas salvo que
las convertamos a Date:
Sub EjByte()
Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
Sub EjInteger()
Dim X As Integer, Y As Integer
For X = 1 To 1000
Y = Y + 20
Cells(X, 1) = X + Y
Next X
End Sub
Sub EjLong()
Dim X As Integer, Y As Long
' de haber definido Y as Integer
' obtendríamos un desbordamiento
For X = 1 To 2000
Y = Y + 20
Cells(X, 1) = X + Y
Next X
End Sub
Libros
Mediante macros VBA podemos manipular de distintas formas tanto libros Excel como archivos con otras
extensiones. En este capítulo veremos como hacerlo.
Abrir libros
Para abrir un libro excel utilizamos la instrucción Open. Si queremos abrir un libro determinado podemos utilizar
la siguiente macro:
Sub AbrirLibro()
Dim Nombre As String
Nombre = "C:\MiLibro.xls"
' Si no se encuentra el libro hacemos que salga un mensaje de aviso
If Dir(Nombre) = "" Then
MsgBox Nombre & " no se encuentra"
Else
Workbooks.Open FileName:=Nombre, updateLinks:=False
End If
End Sub
Para abrir un libro cuando tiene clave debemos especificar la contraseña y al mismo tiempo escribirla tal que:
Sub Abrir()
Dim Libro As Workbook
Set Libro = Workbooks.Open(Filename:="C:\Directorio\Libro.xls", Password:="qaz", WriteResPassword:="qaz")
End Sub
Para abrir un libro cuando tiene vínculos deberíamos especificar si queremos actualizar los vínculos o no, tal
como se ve a continuación:
Sub Abrir()
Application.EnableEvents = True
Workbooks.Open Filename:="c:\Directorio\MiLibro.xls", UpdateLinks:=False
End Sub
Para obtener información de un libro:
Sub Informacion ()
ActiveWorkbook.Name
ActiveWorkbook.Path
ActiveWorkbook.FullName
End Sub
' Obtendríamos su nombre, por ej. Libro4.xls
' Obtendríamos la ruta del libro activo, por ej. C:\Windows
' Obtendríamos ruta+nombre, por ej. C:\Windows\Libro4.xls
Para abrir todos los libros de un directorio:
Sub AbrirLibros()
Dim X As Long
Dim Libro As Workbook
Dim Directory As String
Directory = ActiveWorkbook.Path
On Error Resume Next
Application.EnableEvents = False ' Para evitar macros de evento en los libros abiertos
With Application.FileSearch
.NewSearch
.LookIn = Directory
.Filename = "*.Xls" ' si solo quisiéramos abrir libros Excel, extensión = XLS
.SearchSubFolders = False ' Si no quisiéramos abrir los Subdirectorios
.Execute
For X = 1 To .FoundFiles.Count
Set Libro = Workbooks.Open(Filename:=.FoundFiles(X))
Next X
End With
Application.EnableEvents = True ' Para volverlo a su estado natural
End Sub
Cerrar libros
Para cerrar un libro utilizamos la instrucción Close:
Sub Cerrar()
ActiveWorkbook.Close
End Sub
Si queremos cerrarlo sin que nos pregunte si queremos guardar los posibles cambios realizados, debemos
indicar que no queremos que se muestren los mensajes de alerta:
Sub Cerrar()
Application.DisplayAlerts = False
ActiveWorkbook.Close
End Sub
Para cerrar todos los libros abiertos sin que nos pregunte si queremos guardar los posibles cambios registrados
en cada libro si los hubiese:
Sub Cerrar()
Application.DisplayAlerts = False
Application.Workbooks.Close
End Sub
Y dejando que nos pregunte:
Sub Cerrar()
Application.Workbooks.Close
End Sub
Con lo cual si tubiéramos 5 libros abiertos y en cuatro de estos libros hubiéramos cambiado algo obtendríamos 4
mensajes con la pregunta:
microsoft Excel:
Desea guardar los cambios efectuados en...?
Si quisieramos cerrar Excel:
Sub CierraExcel()
Application.Quit
End Sub
Guardar libros
Para guardar un libro utilizamos la instrucción SaveAs. Si queremos guardarlo con un nombre que figura en una
celda (por ej. si en la celda A1 está el nombre "QAZ"):
Sub Macro()
On Error Resume Next
' Ponemos On Error Resume Next, para evitar el error derivado de una celda vacía y/o con un caracter con el que
excel no permite guardar un libro
ActiveWorkbook.SaveAs [A1].Value
' También podríamos poner
' ActiveWorkbook.SaveAs Filename:=Range("A1").Value
End Sub
La macro anterior guardaría el libro activo con el nombre QAZ. Debemos recordar que no todos los caracteres
del alfabeto son válidos para guardar un libro, por ejemplo los caracteres @ ? ¿ . | NO son caracteres válidos.
Para guardar un libro en otra carpeta deberíamos especificar en que carpeta queremos guardarlo tal que :
Sub Macro()
Dim Carpeta As String
On Error Resume Next
Carpeta = "F:\"
ActiveWorkbook.SaveAs Carpeta & [A1].Value ' Si utilizamos el nombre de la celda A1
ActiveWorkbook.SaveAs "F:\Ventas.xls" ' O podríamos especificar este otro nombre
End Sub
Del mismo modo que podemos guardar y abrir un documento desde y donde querramos, también podemos
guardarlo en diferentes formatos. Por defecto cuando guardamos un libro y no especificamos su extensión Excel
lo hace como un .XLS, es decir un libro de Excel. Pero también podríamos especificar el formato como si de otra
propiedad se tratara:
Sub Macro()
Dim Carpeta As String
On Error Resume Next
Carpeta = "F:\"
ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlTemplate
' Lo guardaría como una plantilla es decir con una extensión: XLA
ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlNormal
' Lo guardaría como una hoja normal es decir con una extensión: XLS
ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlHtml
' Lo guardaría como una Hoja Web es decir con una extensión: Htm
ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlUnicodeText
' Lo guardaría como una Hoja de texto es decir con una extensión: TxT
End Sub
Borrar libros
Para borrar un libro utilizamos la instrucción Delete:
Sub BorraLibro ()
Workbooks("C:\TuLibro.xls").Delete
End Sub
Conviene recordar que excel nos pedira confirmación antes de borrarlo.
Ejemplo de la instrucción Kill
En este ejemplo se utiliza la instrucción Kill para borrar un archivo de un disco.
Se supone que PRUEBA es un archivo que contiene información.
Sub Killer ()
' Se elimina el archivo.
Kill "PRUEBA"
' Se eliminan todos los archivos *.TXT del directorio actual
Kill "*.TXT"
End Sub
Para eliminar el libro activo, en caso de que estuviera abierto, primero deberiamos cerrarlo, tal que:
Sub Eliminar()
Dim strFile As String
strFile = ActiveWorkbook.FullName
ActiveWorkbook.Close SaveChanges:=False
Kill strFile
End Sub
o bien:
Kill "C:\Hola.xls"
o bien:
Sub BorrarLibros()
Dim X As Long
Dim Libro As Workbook
Dim Directory As String
Directory = ActiveWorkbook.Path
On Error Resume Next
Application.EnableEvents = False ' Para avitar macros de evento en los libros abiertos
With Application.FileSearch
.NewSearch
.LookIn = Directory
.Filename = "*.Xls" 'si solo quisiéramos borrar los libros Excel, extension = XLS
.SearchSubFolders = False ' Si no quisiéramos borrar los libros de los Subdirectorios
.Execute
For X = 1 To .FoundFiles.Count
kill .FoundFiles(X)
Next X
End With
Application.EnableEvents = True ' Para volverlo a su estado natural
End Sub
Crear libros
Para crear 1 nuevo libro utilizamos la instrucción Add, por ejemplo:
Sub NuevoLibro()
Workbooks.Add
End Sub
Si quisiéramos crear 2 nuevos libros:
Sub NuevoLibro()
Workbooks.Add
Workbooks.Add
End Sub
Abrir un libro en blanco o crear un libro es lo mismo, pero también podemos crear libros basados en plantillas o
en otras hojas de cálculo, es decir en otros libros tal que:
Sub Macro()
Dim Libro1 As Workbook
Dim Libro2 As Workbook
Set Libro1 = Workbooks.Add
Debug.Print Libro1.Name
' Utilizamos la ventana Inmediata del editor de VBA
Set Libro2 = Workbooks.Add
Libro1.Activate
End Sub
Podemos crear 2 nuevos libros y activar el primero de ellos creado, pero la palabra Add permite crear un nuevo
libro y el libro creado no tiene por que estar guardado como una plantilla es decir con la extension xla, puede ser
un libro xls:
Sub Macro()
Dim OtroLibro As Workbook
Dim X As Byte
For X = 1 To 10
Set OtroLibro = Workbooks.Add(template:="C:\QAZ.xls")
Debug.Print OtroLibro.Name
Next X
' Abriríamos 10 libros que saldrían con los siguientes nombres, en la ventana inmediata de VBA
'QAZ2
'QAZ3
'QAZ4
'QAZ5
'QAZ6
'QAZ7
'QAZ8
'QAZ9
'QAZ10
'QAZ11
End Sub
Imprimir libros
Para imprimir libros u hojas utilizamos la instrucción PrintOut, por ejemplo:
Sub Imprimir ()
' Imprime el libro activo
ActiveWorkbook.Printout
End Sub
Si queremos imprimir un libro y hoja determinada:
Sub Imprimir ()
' Imprime el libro y hoja indicados
Workbooks("MiLibro.Xls").Sheets("Hoja1").Printout
End Sub
Calcular libros
Los cálculos se realizan con la instrucción Calculate. Las distintas formas de realizar cálculos con macros son:
Para realizar todos los cálculos que tengan que realizarse en el libro:
Sub CalculaTodo()
Calculate
End Sub
Calcular hoja: calcula la hoja de cálculo activa, así como los gráficos y las hojas de gráfico vinculados a esta
hoja de cálculo:
Sub CalculaHoja()
ActiveSheet.Calculate
End Sub
También podemos especificar las opciones de cálculo para indicarle a Excel como realizar los cálculos. La
configuración de cálculo predeterminada de Excel es Automático, pero también podríamos definir otras formas:
Automático: calcula todas las fórmulas dependientes cada vez que se cambia un valor, una fórmula o un
nombre.
Sub CalculoAutomatico ()
Application.Calculation = xlAutomatic
End Sub
Automático excepto tablas: calcula todas las fórmulas dependientes, salvo las tablas de datos (para calcular las
tablas de datos podemos hacer clic en "Calcular ahora" en la ficha Cálculo del menú Herramientas, Opciones):
Sub CalculoAutomaticoSinTablas ()
Application.Calculation = xlSemiautomatic
End Sub
Manual: sólo calcula los libros abiertos cuando se presiona la tecla F9
Sub CalculoAutomatico ()
Application.Calculation = xlManual
End Sub
Proteger / Desproteger libros
La protección de libros se hace con las instrucciones Protect y Unprotect, por ejemplo:
Sub ProtegeLibro()
With ActiveWorkbook
' Primero protegemos esctuctura (mover, copiar, insertar hojas) y ventana (cambiar tamaño o mover ventana)
.Protect Structure:=True, Windows:=True
' Desprotegemos con clave "Excel"
.Unprotect ("Excel")
' Protegemos con clave "Excel"
.Protect ("Excel")
End With
End Sub
Para proteger un libro primero se debe desproteger con Unprotect y luego se protegemos con Protect. La clave
se pone entre comillas y paréntesis y es sensible a las mayúsculas (si protejo con "Excel" la clave "excel" no
funcionará).
Para desproteger el libro hacemos:
Sub DesprotegeLibro ()
ActiveWorkbook.Unprotect ("Excel")
End Sub
Listar libros
Para listar libros con extensión *.* de un directorio (o con otra extensión) de un directorio y los subdirectorios,
podemos utilizar la siguiente macro:
Sub AbrirLibros()
Dim X As Long
Dim Libro As Workbook
Dim Directory As String
Directory = ActiveWorkbook.Path
On Error Resume Next
Application.EnableEvents = False ' Para evitar macros de evento en los libros abiertos
With Application.FileSearch
.NewSearch
.LookIn = Directory
.Filename = "*.Xls" ' si solo quisiéramos abrir libros Excel, extension = XLS
.SearchSubFolders = False ' Si no quisiéramos abrir los Subdirectorios
.Execute
For X = 1 To .FoundFiles.Count
Set Libro = Workbooks.Open(Filename:=.FoundFiles(X))
Next X
End With
Application.EnableEvents = True ' Para volverlo a su estado natural
End Sub
Hojas
Mediante macros VBA podemos manipular de distintas formas las hojas de los libros Excel. En este capítulo
veremos como hacerlo.
Agregar
Para agregar una nueva hoja al libro utilizamos la instrucción Add. Si queremos agregar una nueva hora al libro
activo utilizamos el siguiente código:
Sub AgregarHoja()
ActiveWorkbook.Worksheets.Add
End Sub
Otra forma de hacerlo es:
Sub AgregarHoja()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add
End Sub
Utilizando los códigos anteriores la nueva hoja creada se colocará justo delante de la hoja activa de nuestro libro
activo.
Si quisiéramos crear una nueva hoja en nuestro libro, y que fuera colocada a la derecha de todas las demas
hojas, podríamos utilizar la siguiente sintaxis:
expresión.Add(Before, After, Count, Type)
expresión (requerida): expresión que devuelve uno de los objetos arriba mencionados, en nuestro caso
Worksheets.
Before Variant (opcional): un objeto que especifica la hoja antes de la cual se agregará la hoja nueva.
After Variant (opcional): un objeto que especifica la hoja después de la cual se agregará la hoja nueva.
Count Variant (opcional): el número de hojas de cálculo que se agregarán. El valor predeterminado es uno.
Type Variant (opcional): especifica el tipo de hoja. Puede ser una de las siguientes constantes XlSheetType:
xlWorksheet, xlChart, xlExcel4MacroSheet o xlExcel4IntlMacroSheet. Si deseas insertar una hoja basada en una
plantilla existente, especifica la ruta de acceso a dicha plantilla. El valor predeterminado es xlWorksheet.
Teniendo en cuenta lo anterior, podríamos hacer:
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets(Worksheets.Count))
End Sub
Esta macro crea una nueva hoja y la coloca despues de la ultima hoja, a la cual hacemos mención con
"Sheets(Worksheets.Count)".
También hubiéramos podido utilizar el siguiente código en base a lo dicho al principio de esta sección:
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets("hoja3"))
End Sub
Es decir crearíamos una hoja después de la hoja llamada "hoja3".
En el caso anterior, podría darse el caso de que el nombre de esta hoja estuviera mal escrito tal que:
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets("oja3")) ' Escribimos "oja" en lugar de "Hoja"
End Sub
Entonces obtendríamos un error de compilación, el cual podemos evitar agregando una instrucción On Error al
comienzo de la macro:
Sub Agregar()
On Error Resume Next
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets("oja3"))
End Sub
En el caso anterior evitaríamos el error de compilación. Como "oja3" no existe, la macro, al no saber que hacer,
continuaría a la siguiente línea de código saltándose las instrucciones dadas y que han provocado el error.
Si quisiéramos crear 5 nuevas hojas antes que la 3º hoja en un libro que contiene 7 hojas:
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(before:=Sheets(3), Count:=10)
End Sub
y si esta 3º hoja se llamara "Ventas":
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(before:=Sheets("Ventas"), Count:=10)
End Sub
Seleccionar hojas
Dentro de los libros de excel, podemos encontrar hojas y gráficos. Para referirnos a una hoja dentro de un libro
tenemos distintas posibilidades. Podemos utilizar las instrucciones Select o Activate (en la sección siguiente
veremos la diferencia).
Seleccionar una hoja utilizando su número de hoja contenida dentro del libro, como se ve a continuación:
Sub Seleccionar()
' para seleccionar la primera hoja del libro activo
ActiveWorkbook.Sheets(1).Select
' para seleccionar la segunda hoja del libro activo
ActiveWorkbook.Sheets(2).Select
' para seleccionar la tercera hoja del libro activo
ActiveWorkbook.Sheets(3).Select
End Sub
Ahora bien, si una hoja esta oculta no podremos seleccionarla ni activarla. Esto lo solucionamos de la siguiente
forma:
Sub Seleccionar()
With ActiveWorkbook.Sheets(1)
.Visible = True
.Select
End With
End Sub
o bien:
Sub Seleccionar()
With Sheets(1)
.Visible = True
.Activate
End With
End Sub
Seleccionar una hoja utilizando el nombre de la hoja contenida dentro del libro, como se ve a continuación:
Sub Seleccionar()
' para seleccionar la segunda hoja del libro activo
ActiveWorkbook.Sheets("Hoja2").Select
End Sub
o lo que es lo mismo en caso de que una hoja este oculta:
Sub Seleccionar()
With ActiveWorkbook.Sheets("Hoja2")
.Visible = True
.Select
End With
End Sub
Para selecionar todas las hojas de un libro utilizaremos la siguiente instruccion:
Sub SeleccionarTodas()
Activeworkbook.Sheets.Select
End Sub
La instrucción anterior a su vez activará una hoja...cual? La primera del libro. La manera de comprobarlo es
sencilla, ya que la hoja activa es aquella que presenta su nombre en negrita.
También se pueden seleccionar hojas mediante la instrucción Array, por ej. creando un array que contenga en
índice de las hojas que querramos selecionar (ver capítulo "Arrays" para más detalle).
Esta instrucción seleccionaría las hojas 3 y 1 en este orden con lo cual la hoja 3 será la hoja activa.
Sub Seleccionar ()
ActiveWorkbook.Sheets(Array(3, 1)).Select
End Sub
Esta instrucción seleccionaría las hojas 1,2,3 y la hoja activa seria la 1
Sub Seleccionar ()
ActiveWorkbook.Sheets(Array(1,2,3)).Select
End Sub
También se puede crear un Array que contenga los nombres de las hojas que queramos selecionar.
Esta instrucción activaría la hoja llamada "hoja3" y selecionaría las hojas llamadas "hoja3" y "pedro":
Sub Seleccionar ()
ActiveWorkbook.Sheets(Array("hoja3", "pedro")).Select
End Sub
Con esta otra instrucción selecionaríamos las hojas cuyos nombres son: "ventas","compras", "resultado" y
activaría la hoja "ventas".
Sub Seleccionar ()
ActiveWorkbook.Sheets(Array("ventas","compras", "resultado")).Select
End Sub
También podemos al mismo tiempo mezclar ambos métodos comentados antes (seleccionar por nombre o por
número de hoja):
Sub Seleccionar ()
ActiveWorkbook.Sheets(Array(1, 2, "ventas")).Select
End Sub
En el ejemplo anterior la hoja activa sería la primera de nuestro libro y las hojas selecionadas serían las 2
primeras y la llamada "ventas".
Recordar que la hoja activa siempre es la que figura como primer miembro del array.
Seleccionar vs. Activar
Conviene recordar la diferencia entre selecionar y activar una hoja (la diferencia es la misma entre seleccionar y
activar una celda). La instrucción para seleccionar es Select y la instrucción para activar es Activate.
Cuando seleccionamos un rango en excel, por ejemplo B2:C15, estamos seleccionando las celdas contenidas en
las columnas B y C y las filas 2 y 15, ambas inclusive, pero entre todas estas celdas seleccionadas tan solo una
de ellas es la Activa, es decir aquella sobre la que observaríamos como escribimos algo cuando tecleamos en
nuestro teclado. Del mismo modo podemos tener tres hojas seleccionadas al mismo tiempo, pero tan solo una de
ellas será la hoja activa.
Lógicamente, cuando operamos solo sobre una hoja y la misma está selecionada, Select o Activate es lo mismo
(es decir seleccionar o activar da igual), tal como se ve en el siguiente ejemplo:
Sub SeleccionarHoja()
'en este caso da igual selecionar que activar
'Selecciona la primera hoja del libro
Sheets(1).Select
'activa la 3 hoja del libro
Sheets(3).Activate
End Sub
Para seleccionar una hoja debemos tener en cuenta si está oculta o no, pues de lo contrario no podemos
selecionarla, por ej:
With ActiveWorkbook.Sheets(1)
.Visible = True
.Select
End With
Para selecionar todas las hojas de un libro utilizaremos la siguiente instruccion:
Sub SeleccionarTodas
activeworkbook.Sheets.select
End Sub
La instrucción anterior a su vez activará una hoja...Cual? La primera del libro !
La manera de comprobarlo es sencilla, ya que la hoja activa es aquella que presenta su nombre en negrita.
Mover hojas
Para mover hojas de un lugar del libro a otro debemos utilizar la instrucción Move, la cual desplaza la hoja de
cálculo a otro lugar del libro.
La sintaxis de esta intrucción es:
expresión.Move(Before, After)
expresión (requerida): expresión que devuelve un objeto de la lista Aplicar a.
Before Variant (opcional): la hoja de cálculo antes de la cual se situará la desplazada. No se puede especificar
Before si se especifica After.
After Variant (opcional): la hoja de cálculo después de la cual se situará la desplazada. No se puede especificar
After si se especifica Before.
Si no se especifica Before o After, Microsoft Excel creará un nuevo libro que contenga la hoja desplazada.
Veamos un ejemplo de cómo mover una hoja:
Sub Mover()
Worksheets("Hoja1").Move after:=Worksheets("Hoja3")
End Sub
En el caso anterior movemos la Hoja1 a la derecha de la Hoja3 (asumiendo que esas hojas se llaman así).
Conviene recordar que si la hoja se llama Hoja3 no significa que su posición sea la tercera dentro del libro, tan
solo que se llama Hoja3 (del mismo modo que mi perro se llama Excel, y dudo que sepa algo sobre Microsoft).
Por ejemplo, nuestro libro podría tener solo 2 hojas (Hoja1 y Hoja3 respectivamente). De tal modo la macro
anterior les cambiaría el orden, poniendo Hoja3 y luego Hoja1.
Si abrimos un libro con 3 hojas (teniendo la hoja 2 como activa) la siguiente macro primero movería la hoja 2
delante de la hoja 1, y después moveria la hoja 2 al final de todo hacia la derecha.
Sub moverHoja()
Dim Hoja As Worksheet
Set Hoja = ActiveSheet
Hoja.Move before:=Sheets(1)
Set Hoja = Sheets(1)
Hoja.Move after:=Sheets(Sheets.Count)
End Sub
La siguiente macro realizaría la misma función en un libro con 3 hojas:
Sub moverHoja()
Dim Hoja As Worksheet
Set Hoja = Sheets(2)
Hoja.Move before:=Sheets(1)
Set Hoja = Sheets(1)
Hoja.Move after:=Sheets(Sheets.Count)
End Sub
La siguiente macro contiene 2 líneas absurdas ya que al ser en principio, Hoja1 la primera hoja cuando abrimos
un nuevo libro, moverla de la posición 1 sería como volver a selecionar una celda que ya estaba selecionada:
Sub moverHoja()
Dim Hoja As Worksheet
Set Hoja = Sheets("Hoja1")
Hoja.Move before:=Sheets(1)
Set Hoja = Sheets(1)
Hoja.Move after:=Sheets(Sheets.Count)
End Sub
Borrar hojas
Cuando se elimina una hoja o un libro, excel siempre nos pide confirmación, del mismo modo que cuando
eliminamos cualquier otro fichero.
Cuando se elimina una hoja o un libro, este método muestra un cuadro de diálogo en el que se nos pide
confirmar la eliminación. Este cuadro de diálogo se muestra de manera predeterminada. Al llamar a este método
en el objeto Workbook o Worksheet, el método Delete devuelve un valor de tipo Boolean, es decir True
(verdadero o sí) o False(falso o no). Este valor es False si el usuario hizo clic en Cancelar en el cuadro de
diálogo o es True si el usuario hizo clic en Eliminar.
En este ejemplo se elimina la hoja llamada "Hoja1" en caso de que confirmemos la opción que observaremos
cuando se ejecute el código:
Sub BorrarHoja()
Sheets("Hoja1").Delete
End Sub
En este otro ejemplo se elimina la hoja1 del libro activo sin mostrar el cuadro de diálogo de confirmación:
Sub borrarHoja()
Application.DisplayAlerts = False
Sheets("Hoja1").Delete
Application.DisplayAlerts = True
End Sub
En este otro ejemplo se elimina la hoja situada en primer lugar del libro activo sin mostrar el cuadro de diálogo
de confirmación:
Sub borrarHoja()
Application.DisplayAlerts = False
Sheets(1).Delete
Application.DisplayAlerts = True
End Sub
Copiar hojas
Para copiar hojas utilizamos la instrucción Copy cuya sintaxis es:
expresión.Copy(Before, After)
expresión (Requerida): expresión que devuelve uno de los objetos arriba mencionados.
Before Variant (opcional): la hoja de cálculo antes de la cual se copiará ésta. No se puede especificar Before si
se especifica After.
After Variant (opcional): la hoja de cálculo después de la cual se copiará ésta. No se puede especificar After si se
especifica Before.
Veamos un ejemplo de cómo copiar una hoja:
Sub Copiar()
' Copiamos la Hoja1 después de la Hoja3
Worksheets("Hoja1").Copy after:=Worksheets("Hoja3")
End Sub
Veamos otro ejemplo de cómo copiar una hoja:
Sub copiarHoja()
Dim Hoja As Worksheet
Set Hoja = ActiveSheet
Hoja.Copy before:=Sheets(1)
Set Hoja = Sheets(1)
Hoja.Copy after:=Sheets(Sheets.Count)
End Sub
Ocultar / Mostrar hojas
La propiedad para mostrar u ocultar es Visible y debemos asignarle True o False en caso de querer mostrar u
ocultar, respectivamente. Todo libro debe tener al menos una hoja visible. Esto implica que si el libro tiene 10
hojas solo podremos ocultar 9, y si el libro solo tiene 1 hoja no la podremos ocultar.
Si tenemos 1 libro con más de 1 hoja, veamos como ocultar la primer hoja del libro (sin importar como se llame):
Sub Ocultar ()
ActiveWorkbook.Sheets(1).Visible=False
End Sub
Y para volver a mostrar la hoja oculta simplemente cambiamos el False por True:
Sub Mostrar ()
ActiveWorkbook.Sheets(1).Visible=True
End Sub
También podemos ocultar varias hojas utilizando la instrucción Array:
Sub Ocultar
ActiveWorkbook.Sheets(Array(1, 2, "ventas")).Visible = False
End Sub
La instrucción anterior oculta las dos primeras hojas como así también la hoja llamada "ventas". Ahora bien, la
intrucción no funcionaría para volver a mostrar, ya que esto debe ser realizado de una en una.
Sub Mostrar()
Sheets(1).Visible = True
Sheets(2).Visible = True
Sheets("ventas").Visible = True
End Sub
Esta manera de ocultar las hojas no evitaría poder saber que existen hojas ocultas. Podríamos saber si hay hojas
ocultas desde el menú Formato > Hojas > Mostrar de Excel y podríamos observar el nombre de las hojas ocultas,
aún cuando estas estuvieran ocultas con una contraseña que nos impidiera mostrarlas. Que no podamos
mostrarlas no implica que no sepamos que algo esta oculto si lo quisiéramos.
Si queremos ocultar hojas y además ocultarlas desde el menú Formato > Hojas > Mostrar de Excel (aún cuando
estas hojas no contengan contraseña para ser desprotegidas) deberíamos hacer:
Sub SuperOcultas()
ActiveWorkbook.Sheets("ventas").Visible = xlSheetVeryHidden
End Sub
Nombrar
Para renombrar una hoja utilizamos la instrucción Name, tal como se ve a continuación:
Sub Renombrar()
Sheets("Ventas").Name = "Compras"
End Sub
En el caso anterior renombraríamos la hoja llamada "Ventas" con el nuevo nombre "Compras".
Si queremos renombrar la primer hoja del libro con el nombre "total":
Sub Renombrar()
Sheets(1).Name = "total"
End Sub
Conviene recordar que da lo mismo que los nombres de las hojas estén escritos en mayúsculas o en minúsculas,
ya que:
Sheets("Ventas").select
Sheets("VenTAs").select
Sheets("ventas").select
sería lo mismo, Excel no diferenciaría mayúsculas o minúsculas y en todos los casos seleccinaría la hoja
"Ventas".
Con la siguiente macro crearíamos una hoja, la situaríamos al final (después de la última hoja del libro) y
finalmente la llamaríamos con el nombre "ventas":
Sub Macro()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets(Worksheets.Count))
Hoja.Name = "Ventas"
End Sub
En la macro anterior, Worksheets.Count devuelve un número que representa la cantidad de hojas que tiene el
libro.
Ante el caso de que otra de nuestras hojas se llamara "ventas" nos encontraríamos ante un error de compilación,
ya que no es posible llamar dos hojas con el mismo nombre. Entonces, primero deberíamos renombrar
previamente.
Proteger / Desproteger hojas
Para proteger y desproteger una hoja sin contraseña, utilizamos el siguiente las intrucciones Protect y Unprotect,
tal como se ve a continuación:
' Para proteger la primera hoja
Sub Proteger ()
Sheets(1).Protect
End Sub
' Para desproteger la primera hoja
Sub Desproteger()
Sheets(1).Unprotect
End Sub
Para realizar lo anterior, pero utilizando como contraseña la palabra "hola", debemos agregar la propiedad
Password, tal que:
' Para proteger la primera hoja con la palabra "hola"
Sub Proteger ()
Sheets(1).Protect Password:="hola"
End Sub
' Para desproteger la primera hoja con la palabra "hola"
Sub Desproteger()
Sheets(1).Unprotect Password:="hola"
End Sub
Desde Excel no podemos proteger varias hojas en simultáneo, nos obliga proteger una a una. Sin embargo
desde una macro sí podemos proteger las hojas que querramos de forma simultánea. La siguiente macro
protegería todas las hojas del libro activo, excepto las hojas que son gráficos. Además las protegería con la
contraseña "hola".
Sub Proteger()
Dim Sht As Worksheet
For Each Sht In ThisWorkbook.Sheets 'If TypeName(Sht) = "worksheet"
With Sht
If TypeName(Sht) = "Worksheet" Then
.Protect Password:="hola"
End If
End With
Next Sht
End Sub
Ahora bien, existen gran cantidad de datos y elementos dentro de las hojas que queremos proteger (y otra gran
cantidad que no queremos proteger). Todas ellas figuran en la lista del menú Excel Herramientas > Proteger >
Proteger hoja.
La siguiente macro explica como proteger todo (podemos cambiar True por False en caso de no querer aplicar
la protección a algún elemento en particular):
Sub ProtegerTodo()
With ActiveSheet
.Protect DrawingObjects:=True
' Protegemos objetos
.Protect Contents:=True
' Protegemos contenidos
.Protect Scenarios:=True
' Protegemos escenarios
.Protect AllowFormattingCells:=True
' Protegemos formato de celdas
.Protect AllowFormattingColumns:=True
' Protegemos formato de columnas
.Protect AllowFormattingRows:=True
' Protegemos formato de filas
.Protect AllowInsertingColumns:=True
' Protegemos la posibilidad que se inserten columnas
.Protect AllowInsertingRows:=True
' Protegemos la posibilidad que se inserten filas
.Protect AllowInsertingHyperlinks:=True
' Protegemos la posibilidad que se inserten hipervícnulos
.Protect AllowDeletingColumns:=True
' Protegemos la posibilidad que se borren columnas
.Protect AllowDeletingRows:=True
' Protegemos la posibilidad que se borren filas
.Protect AllowSorting:=True
' Protegemos la posibilidad que se utilice la opción de Ordenar
.Protect AllowFiltering:=True
' Protegemos la posibilidad que se utilice la opción de Filtrar
.Protect AllowUsingPivotTables:=True
' Protegemos la posibilidad que se utilicen Tablas Dinámicas
.Protect Password:="WW"
' Asignamos la clave de protección "WW"
End With
End Sub
En la macro anterior protegemos todo dentro de la hoja, y lo hacemos con la contraseña "WW" la cual SI que
distingue entre mayúsculas y minúsculas. Recuerda que si no quisiéramos proteger alguna de esas propiedades
bastaría con poner:=False.
No obstante conviene entender que hay propiedades que al ser aplicadas impiden que otras que no han sido
aplicadas puedan ser utilizadas (en este sentido es como si yo te dejara ver un partido en el estadio de fútbol del
Real Madrid, pero te impidiera estar en Madrid). Lógicamente no podrías llegar a ver el partido, pues una de las
restricciones impide otro de los permisos. Lo mismo ocurre en Excel, por lo que debemos tener cuidado y
recordar esto.
Vista previa de hojas
La Vista previa no es una opción muy utilizada, salvo en las macros de evento, las cuales son ejectudas cuando
un ocurre un evento, por ej:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
End Sub
La anterior es una macro que ocurre cuando presionamos el botón de vista preliminar en cualquier hoja del libro.
Si quisiéramos evitar que alguien utilizara la vista preliminar, haríamos:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = True
End Sub
La macro anterior anularía la utilidad del botón de vista preliminar, pues el mismo quedaría inutilizado de
inmediato.
Imprimir Hojas
Para imprimir la hoja actual hacemos la instrucción PrintOut, tal que:
Sub ImprimeHoja ()
ActiveSheet.PrintOut
End Sub
Si además deseamos fijar previamente un rango de impresión hacemos:
Sub ImprimeRango ()
ActiveSheet.PageSetup.PrintArea = Range("$A$1:$C$10").Address
ActiveSheet.PrintOut
End Sub
En la macro anterior, cuando queremos imprimir un rango, es necesario agregar la instrucción Address, caso
contrario no funcionará.
Si deseamos poner un encabezado a la izquierda de cada hoja, con la frase "Reporte Trimestral" (o cualquier
otro mensaje):
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim Sht As Worksheet
For Each Sht In ThisWorkbook.Sheets
With Sht.PageSetup
.LeftHeader = "Reporte Trimestral" ' O cualquier otro mensaje...
End With
Next Sht
End Sub
Color de Etiquetas
Es posible cambiar el color de las etiquetas (las que figuran en la parte inferior y muestran el nombre de la hoja).
La etiqueta es el objeto Tag y con su propiedad ColorIndex podemos cambiar su color. Esto solo se puede hacer
en Excel 2.002 o superior (en versiones anteriores de Excel NO es posible cambiar el color de etiquetas de
hojas).
También podrías cambiar el color de etiqueta de hoja con clic derecho sobre la misma y eligiendo la opción
"Color de Etiquetas".
Para cambiar el color de etiqueta con una macro (Excel 2.002 o superior) podemos hacer:
Sub ColorEtiqueta()
ActiveWorkbook.Sheets("Hoja1").Tab.ColorIndex = 5
End Sub
El número que se le asigna a ColorIndex indica el color. Si quieres averiguar el número correspondiente para un
determinado color, puedes hacer lo siguiente:
1. Clic derecho sobre una etiqueta de hoja
2. Elige la opción "Color de Etiquetas"
3. Elige un color de la paleta
4. Aceptar
5. En la ventana Inmediato del editor VBA escribe: ?Activesheet.Tab.ColorIndex
6. Enter
Verás que aparece un número que representa el color de la etiqueta. Podrás utilizar dicho número en la macro.
Ordenar hojas
Para ordenar las hojas se suele utilizar la instrucción Move. Una forma rápida de ordenar las hojas de un libro
alfabéticamente en el orden ascendente y/o descendente es:
Sub OrdenarAscendentemente()
Dim X As Integer, Y As Integer
For X = 1 To Sheets.Count
For Y = X To Sheets.Count
If UCase(Worksheets(Y).Name) < UCase(Worksheets(X).Name) Then
Worksheets(Y).Move Before:=Worksheets(X)
End If
Next Y
Next X
End Sub
Sub OrdenarDescendentemente()
Dim X As Integer, Y As Integer
For X = 1 To Sheets.Count
For Y = X To Sheets.Count
If UCase(Worksheets(Y).Name) > UCase(Worksheets(X).Name) Then
Worksheets(Y).Move Before:=Worksheets(X)
End If
Next Y
Next X
End Sub
También se podrían ordenar las hojas de un libro utilizando un array con los nombres de las hojas, ordenando
este array y luego moviendo en función del orden. El caso es que el anterior ejemplo funciona perfectamente, ya
que saca provecho de la función uppercase "mayúsculas" pues A>AA>AB>ABC es decir, que nos dice el orden
necesario.
Otras maneras de ordenar podrían ser:
Sub OrdenarAscendentemente()
Dim X As Long, Y As Long
For X = 1 To Worksheets.Count
Y=X
Do While Y > 1
If Worksheets(Y).Name < Worksheets(Y - 1).Name Then
Worksheets(Y).Move Before:=Worksheets(Y - 1)
End If
Y=Y-1
Loop
Next
End Sub
Sub OrdenarDescendentemente()
Dim X As Long, Y As Long
For X = 1 To Worksheets.Count
Y=X
Do While Y > 1
If Worksheets(Y).Name > Worksheets(Y - 1).Name Then
Worksheets(Y).Move Before:=Worksheets(Y - 1)
End If
Y=Y-1
Loop
Next
End Sub
Rangos
Mediante macros VBA podemos manipular de distintas formas los rangos y celdas de las hojas Excel. En este
capítulo veremos como hacerlo.
Selección de celdas
Existen diversas formas de seleccionar celdas, y en todas ellas utilizamos el método Select.
Veamos 3 métodos (equivalentes) para seleccionar una celda, por ejemplo la celda C4:
' La forma clásica de seleccionar
Sub Seleccionar ()
Range("C4").Select
End Sub
' Esta es otra terminología válida para seleccionar
Sub Seleccionar ()
[C4].Select
End Sub
' Finalmente podemos seleccionar de esta otra forma
' El primer Nº equivale a fila y el segundo a columna.
Sub Seleccionar ()
Cells(4, 3).Select
End Sub
En los 3 casos anteriores se selecciona la celda C4. En el primer caso utilizamos el objeto Range y en el tercer
caso el objeto Cells.
También podemos seleccionar determinadas celdas (con datos, con fórmulas, etc). En la siguiente macro iremos
seleccionando distintos tipos de celdas:
Sub Seleccionando ()
On Error Resume Next
' Colocamos On Error Resume Next
' para evitar el error re compilación derivado de no poder selecionar un rango que no existe
' por ej., si la hoja activa no tuviera comentarios, no podríamos selecionarla con el código
' Para seleccionar todas la celdas que contienen comentarios.
Cells.SpecialCells(xlCellTypeComments).Select
'Para seleccionar todas la celdas cuyo valor es una constante.
Cells.SpecialCells(xlCellTypeConstants, 23).Select
' Para seleccionar todas la celdas que contienen fórmulas.
Cells.SpecialCells(xlCellTypeFormulas, 23).Select
' Para seleccionar todas la celdas vacías, dentro de la región usada.
Cells.SpecialCells(xlCellTypeBlanks).Select
' Para seleccionar todas la celdas visibles en nuestra hoja.
Cells.SpecialCells(xlCellTypeVisible).Select
End Sub
Conviene deducir que si quisiéramos seleccionar las celdas que contienen comentarios en un rango concreto y
no en toda la hoja deberíamos utilizar:
Sub Seleccion ()
On Error Resume Next
' Método 1
Range("A1:G10").SpecialCells(xlCellTypeComments).Select
' Método 2
[A1:G10].SpecialCells(xlCellTypeComments).Select
' Método 3
Range(cells(1,1),cells(10,7)).SpecialCells(xlCellTypeComments).Select
End Sub
Para seleccionar hasta la última celda no vacía:
Sub Seleccion ()
On Error Resume Next ' Es un buen hábito utilizar comodines como este
' aunque si lo mantenemos activo resultaría difícil saber donde podría estar el problema
' Selecciona desde la celda actual hasta la última celda no vacía hacia la derecha.
Selection.End(xlToRight).Select
' Selecciona desde la celda indicada hasta la última celda no vacía hacia abajo.
Range("AF10").End(xlDown).Select
' Selecciona desde la celda actual hasta la última celda no vacía hacia la izquierda.
Selection.End(xlToLeft).Select
' Selecciona desde la celda actual hasta la última celda no vacía hacia arriba.
Selection.End(xlUp).Select
End Sub
Otra forma interesante de seleccionar es con el método Offset, que permite seleccionar un rango de acuerdo a
unas coordenadas indicadas. Esta instrucción requiere que le indiquemos un origen y una cantidad de filas y
columnas desde el origen (es muy útil para seleccionar rangos variables).
La sintaxis es: Origen.Offset.(filas, columnas).select.
Las filas y números se indican como números. Si estos son positivos el desplazamiento es hacia abajo - derecha
respectivamente. Si son negativos el desplazamiento es hacia arriba - izquierda respectivamente.
Veamos los siguiente ejemplos para entender mejor la selección con Offset:
Sub Selecciona ()
On Error Resume Next
' Selecciona desde la celda actual hasta una celda (fila) hacia abajo.
Selection.Offset(1, 0).Select
' La instrucción Selection hace que el origen sea la celda actual
' El 1 indica las filas a desplazarce hacia abajo
' El 0 indica las columnas a desplazarce a la derecha
' Hace lo mismo que la anterior. Poner 0 u omitirlo es lo mismo.
Selection.Offset(1).Select
' Selecciona desde la celda actual, + una celda hacia abajo + una celda hacia la derecha.
Selection.Offset(1, 1).Select
'Selecciona una columna y/o celda hacia la derecha desde la celda [A1]
[A1].Offset(0, 1).Select
' Selecciona desde la celda actual hasta la misma celda selecionada, sin cambio alguno.
Selection.Offset().Select
' Desde B1 selecciona una celda hacia arriba y otra a la izquierda
[B2].Offset(-1, -1).Select
' Recuerda que al poner un signo negativo el movimiento cambia de dirección
' Si el negativo el movimiento es hacia abajo/derecha. Con el negativo es hacia arriba/izquierda
' Si desde A1 intentamos seleccionar una celda hacia arriba y otra a la izquierda...
[A1].Offset(-1, -1).Select
' Se produciría un error, porque como A1 es la primera celda, no podemos seleccionar
' una celda ni a la izquierda ni arriba de A1. De todas formas el error se ignora ya que
' hemos escrito On Error Resume Next al comienzo de la macro.
' Selecciona desde la celda actual hasta una celda hacia la izquierda (si fuera posible)
Selection.Offset(-1).Select
'Selecciona desde la celda actual hasta una celda hacia la arriba (si fuera posible)
Selection.Offset(, -1).Select
' Desde la celda actual, seleciona todo el cuadrante de celdas contiguas.
Selection.CurrentRegion.Select
' Selecciona el cuadrante de celdas selecionadas en bloque una celda más hacia la derecha y abajo.
Selection.CurrentRegion.Offset(1, 1).Select
End Sub
Todas las acciones anteriores se pueden concatenar de tal manera que podríamos realizar lo siguiente:
Sub Seleccion ()
On Error Resume Next
[F7].End(xlDown).Offset(4).End(xlToRight).End(xlDown).Select
' Si F7 estuviera vacío y la columna F también,
' tras ejecutar [F7].End(xlDown). nos encontraríamos en la última fila (F65536)
' Pero no podríamos ir a [F7].End(xlDown).Offset(4) pues excel tiene 65536 filas y no 65536+X+4
End Sub
Con la macro anterior iriamos desde la celda F7 hasta la última celda no vacía hacia abajo. Luego nos
desplazaríamos 4 celdas desde esta nueva posición hacia abajo.
Luego iríamos hasta la última celda no vacía hacia la derecha desde esta nueva posición. Finalmente de nuevo
hacia abajo desde esta nueva posición.
También es posible la selección de rangos utilizando variables en filas y columnas, utilizando el objeto Cells.
Esta forma es muy útil cuando queremos utilizar variables en la fila la columna.
La sintaxis debe ser: cells(fila,columna)
Sub Seleccion()
' Selección desde A1 hasta fila N y columna J (asumimos que N y J son variables)
range(cells(1,1),cells(N,J)).select
End Sub
Estos 3 líneas de código selecionan el mismo rango de celdas:
Sub Seleccionar ()
Range("A1:E5").Select
[A1:E5].Select
Range(Cells(1, 1), Cells(5, 5)).Select
End Sub
Selección de rangos
Veamos ahora distintas formas equivalentes de seleccionar un rango:
' Método clásico para seleccionar el rango de celdas B6:B10
Sub Seleccionar ()
Range("B6:B10").Select
End Sub
Sub Seleccionar ()
'Otro método para seleccionar el rango de celdas B6:B10
[B6:B10].Select
End Sub
Supongamos que queremos seleccionar un rango, pero no conocemos su dimensión, por ejemplo porque la
misma va cambiando. Un ejemplo puede ser una tabla donde se van agregando nuevos registros. Con la
instrucción CurrentRegion Excel seleccionará todo el rango utilizado automáticamente, aunque no conozcamos
su tamaño de antemano:
' Selecciona la región actual
Sub Seleccionar ()
Selection.CurrentRegion.Select
End Sub
Con la macro anterior se seleciona el cuadrante, rectángulo y/o cuadrado de celdas adyacentes a nuestra celda
activa. El rectángulo queda definido por las celdas con información.
También podríamos modificar la macro anterior para que seleccione la región actual desde una celda
determinada, por ejemplo:
' Selecciona el rectángulo adyacente a C2.
Sub Seleccionar ()
[C2].CurrentRegion.Select
End Sub
o también podemos hacer:
' Selecciona el rectángulo adyacente a C2.
Sub Seleccionar ()
Range("C2").CurrentRegion.Select
End Sub
Selección de filas
Para seleccionar filas podemos utilizar la instrucción Rows, tal como vemos en las siguientes macros:
' Seleccionar la Fila 1.
Sub SeleccionaFila ()
Rows("1:1").Select
End Sub
' Selecciona la fila 4.
Sub SeleccionaFila ()
Rows("4:4").Select
End Sub
' Selecciona desde la fila 4 hasta la 11, ambas inclusive
Sub SeleccionaFilas ()
Rows("4:11").Select
End Sub
' Selecciona las siguientes filas a la vez: 4,8,15 y 22.
Sub SeleccionaFilas ()
Range("4:4,8:8,15:15,22:22").Select
End Sub
Selección de columnas
Para seleccionar columnas podemos utilizar la instrucción Columns, tal como vemos en las siguientes macros:
Sub SeleccionaColumna ()
' Selecciona la Columna B
Columns("B:B").Select
' Selecciona la Columna H
Columns("H:H").Select
' Selecciona des de la Columna C hasta la F
Columns("C:F").Select
' Selecciona las siguientes Columnas: A,C,E,G, I y K.
Range("A:A,C:C,E:E,G:G,I:K").Select
End Sub
Otras selecciones
Para seleccionar todas las celdas que contengan cierto color:
Sub SeleccionarPorColor()
On Error Resume Next
Dim Columna As Single, Fila As Long
Dim Rg As Range, miRango As Range, RgColores As Range
' Vamos a selecionar todas las celdas del UsedRange que contengan el mismo color que la celda activa
' Utilizamos el rango de las celdas usadas (el rango que excel debe analizar), pues de lo contrario
' la macro tardaría mucho al tener que analizar 65536 filas y 256 columnas es decir, 16 millones de celdas !
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
End With
Set RgColores = ActiveCell
For Each Rg In miRango
If Rg.Interior.ColorIndex = ActiveCell.Interior.ColorIndex Then
Set RgColores = Union(RgColores, Rg)
End If
Next Rg
RgColores.Select
End Sub
Para seleccionar todas las celdas que contengan cierto Valor:
Sub SeleccionarPorValor()
On Error Resume Next
Dim Columna As Single, Fila As Long, X as Long
Dim Rg As Range, miRango As Range, RgValores As Range
'vamos a selecionar todas las celdas del UsedRange que contengan el valor que introduzcamos:
Dim MiValor As String
MiValor = InputBox("Introduce el valor que deseas selecionar!", "Por Favor:")
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
End With
For Each Rg In miRango
If LCase(Rg.Value) = LCase(MiValor) Then
If X = 0 Then
X = 1: Set RgValores = Rg
Else
Set RgValores = Union(RgValores, Rg)
End If
End If
Next Rg
RgValores.Select
End Sub
Para seleccionar todas las celdas que contengan Valores no duplicados en el rango utilizado:
Sub SeleccionarValoresUnicos()
On Error Resume Next
Dim Columna As Single, Fila As Long, X As Long
Dim Rg As Range, miRango As Range, RgValores As Range
'vamos a selecionar todas las celdas del UsedRange que contengan el valor que introduzcamos:
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
End With
For Each Rg In miRango
If Application.CountIf(miRango, Rg.Value) = 1 Then
If X = 0 Then
X = 1: Set RgValores = Rg
Else
Set RgValores = Union(RgValores, Rg)
End If
End If
Next Rg
RgValores.Select
End Sub
Para seleccionar todas las celdas que contengan Valores no duplicados en UsedRange:
Sub SeleccionarValoresdUPLICADOS()
On Error Resume Next
Dim Columna As Single, Fila As Long, X As Long
Dim Rg As Range, miRango As Range, RgValores As Range
'vamos a seleccionar todas las celdas del UsedRange que contengan el valor que introduzcamos:
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
End With
For Each Rg In miRango
If Application.CountIf(miRango, Rg.Value) > 1 Then
If X = 0 Then
X = 1: Set RgValores = Rg
Else
Set RgValores = Union(RgValores, Rg)
End If
End If
Next Rg
RgValores.Select
End Sub
Excel considera que pese a que tengamos 65.536 filas y 256 columnas, prácticamente siempre utilizamos una
ínfima cantidad de estas filas y columnas.
Para saber el rango de celdas que utilizamos basta con utilizar el siguiente código:
Sub Rango()
ActiveSheet.UsedRange.Select
End Sub
Para selecionar desde la celda A1 hasta la última celda del rango utilizado:
Sub Rango()
Range([a1], ActiveSheet.UsedRange).Select
End Sub
Para selecionar la última celda con datos del rango utilizado (suponemos que tenemos seleccionado B4:D4):
Sub Seleccion ()
' Esto daría como resultado 5
R = Range([a1], ActiveSheet.UsedRange).Rows.Count
' Esto daría como resultado 4
C = Range([a1], ActiveSheet.UsedRange).Columns.Count
' Selecionaría la celda D5
Cells(R, C).Select
End Sub
En la macro anterior, el objeto UsedRange seleciona el rango "cuadrado o rectángulo" utilizado.
Si quisiéramos seleccionar la última celda con información del rango seleccionado, he aquí 4 métodos posibles:
' Método 1
Sub Seleccionar ()
' Definimos las variables
Dim R As Long, C As Single
' Utilizamos R que indicaría la última fila que contiene datos
R = Range([A1], ActiveSheet.UsedRange).Rows.Count
' Utilizamos C que indicaría la última columna que contiene datos
C = Range([A1], ActiveSheet.UsedRange).Columns.Count
'Selecionamos la última celda del rango UsedRange
Cells(R, C).Select
End Sub
' Método 2
Sub Seleccionar ()
' Definimos las variables
Dim R As Long, C As Single
With [A1].SpecialCells(xlCellTypeLastCell)
R = .Row
C = .Column
End With
Cells(R, C).Select
End Sub
' Método 3
Sub Seleccionar ()
' El código on error evita el error debido a que no haya celdas con valor
On Error Resume Next
' Definimos las variables
Dim R As Long, C As Single
R = Cells.Find("*", Range("A1"), xlFormulas, , xlByRows, xlPrevious).Row
C = Cells.Find("*", Range("A1"), xlFormulas, , xlByColumns, xlPrevious).Column
Cells(R, C).Select
End Sub
' Método 4
Sub Seleccionar ()
With Selection.CurrentRegion
.Cells(.Cells.Count).Select
End With
End Sub
Insertar rangos
Como es lógico de suponer, existen numerosas maneras de insertar rangos, para lo cual utilizamos la instrucción
Insert:
Sub Insertar ()
' Inserta una nueva fila sobre la fila 1.
Rows(1).Insert
' Inserta una nueva columna a la izquierda de la columna A
Columns("A:A").Insert
' También inserta una nueva columna a la izquierda de la columna A
[A1].EntireColumn.Insert
' Inserta una nueva fila sobre la fila 1
[A1].EntireRow.Insert
End Sub
También podemos insertar tantas nuevas filas o columnas como tenga el rango:
Sub Inserta ()
' Inserta 3 nuevas columnas a la izquierda de la columna B
Range("B1:D10").EntireColumn.Insert
' Inserta 5 nuevas filas sobre la fila 10.
Rows("10:15").Insert
End Sub
Borrar rangos
Podemos borrar comentarios, contenidos, formatos, etc. En general utilizamos la instrucción Clear seguida de lo
que queremos borrar. A continuación vemos como hacerlo:
' Borra los comentarios sobre la celda A1
Sub Borrar ()
Range("A1").ClearComments
End Sub
' Limpia la celda A1 de cualquier formato que tenga, por ej. color
Sub Borrar ()
[A1].ClearFormats
End Sub
' Borra el contenido de la celda A1, no el formato
Sub Borrar ()
Cells(1,1)..ClearContents
End Sub
Si queremos realizar el borrado de diferentes propiedades de un mismo rango podríamos hacer:
Sub Borrar ()
With Range("A1")
.ClearComments
.ClearContents
.ClearFormats
.ClearNotes
.Clear
End With
End Sub
La instrucción Clear sola, como se vé en la macro anterior, borra toda información de la celda (formato,
contenido, comentarios, etc).
A veces queremos borrar el contenido de ciertas celdas, por ej. las celdas que contienen fórmulas:
Sub BorrarFormulas()
Cells.SpecialCells(xlCellTypeFormulas, 23).ClearContents
End Sub
También podemos realizar borrados sobre filas y columnas enteras:
Sub Borrar ()
On Error Resume Next
' Borra toda informacion de la Fila 1.
Rows(1).Clear
' Borra el formato de la Columna A.
Columns("A:A").ClearFormats
' Borra toda información, formato, etc, de la columna A
[A1].EntireColumn.Clear
' Borra los comentarios de la Fila 1.
[A1].EntireRow.ClearComments
' Borra toda información de las 5 primeras Filas.
Rows("1:5").Clear
' Borra toda información de las Filas 10 a 15 inclusives
Rows("10:15").Clear
' Borra toda la información del rango actual utilizado, comenzando desde A1
Rango("A1").CurrentRegion.Clear
End Sub
Copiar y pegar rangos
Para copiar rangos utilizamos el método Copy. Algunos ejemplos sobre cómo copiar son:
Sub Copiar()
' Copia la celda C4
Range("C4").Copy
' Copia la celda C4, esta es otra terminología también válida.
[C4].Copy
' Copia la celda C2 (la primera posición equivale a fila y la segunda a columna).
Cells(2, 4).Copy
' Copia el rango de celdas B6:B10
Range("B6:B10").Copy
' Copia el rango de celdas B12:B22, esta es otra terminología también válida.
[B12:B22].Copy
' Copia el cuadrante, rectángulo y/o cuadrado de celdas adyacentes a nuestra celda. El rectángulo queda
definido por las celdas con información.
Selection.CurrentRegion.Copy
' Copia el cuadrante, rectángulo y/o cuadrado de celdas comenzando en C2 y en dirección derecha-inferior. El
rectángulo queda definido por las celdas con información.
[C2].CurrentRegion.Copy
' Copia el cuadrante, rectángulo y/o cuadrado de celdas comenzando en C4 y en dirección derecha-inferior. El
rectángulo queda definido por las celdas con información.
Range("C4").CurrentRegion.Copy
' Copia la Fila 1.
Rows("1:1").Copy
' Copia la fila 4.
Rows("4:4").Copy
' Copia desde la fila 4 hasta la 11 ambas inclusive.
Rows("4:11").Copy
' Copia las siguientes filas a la vez: 4,5,15 y 22.
Range("4:4,8:8,15:15,22:22").Copy
' Copia la Columna B
Columns("B:B").Copy
' Copia desde la Columna C hasta la F, ambas inclusive
Columns("C:F").Copy
' Copia las siguientes Columnas: A,C,E,G y I-K.
Range("A:A,C:C,E:E,G:G,I:K").Copy
Para realizar el pegado de los rangos copiados utilizamos las siguientes macros:
' Copia todo contenido de la celda A1 y lo pega en la celda B1
Range("A1").Copy Range("B1")
' Aquí realizamos lo mismo solo que de otra manera, especificando donde queremos que la información sea
pegada mediante la utilizacion de propiedades
Range("B1").Copy Destination:=Range("C1")
A la hora de pegar podemos elegir que es lo que queremos pegar: valores, formatos, todo, etc. La opción más
utilizada es xlPasteValues
, que solo pega los valores. La lista de las cosas que podemos pegar es:
Valores con formatos: xlPasteValuesAndNumberFormats
Valores: xlPasteValues
Validación xlPasteValidation
Fórmulas y números: xlPasteFormulasAndNumberFormats
Fórmulas: xlPasteFormulas
Formatos: xlPasteFormats
Comentarios: xlPasteComments
Ancho de columna: xlPasteColumnWidths
Todo excepto bordes: xlPasteAllExceptBorders
Todo: xlPasteAll
Veamos ejemplos sobre como pegar distintas cosas:
Sub Copiar()
' Copia la celda A1 y la pega en B1
Range("A1").Copy
Range("B1")
' Copia la celda A1 y la pega en B1 (podemos escribirlo en la misma línea)
Range("A1").Copy Range("B1")
' Misma operación, copia la celda A1 y la pega en B1
Range("A1").Copy
Cells(1, 2).PasteSpecial(xlPasteAll)
' Copia la celda A1 pero solo pega el valor en B1, no el formato
Range("A1").Copy
[B1].PasteSpecial(xlPasteValues)
' Copia la celda A1 y pega solo la fórmula en B1, ni el valor ni el formato
Range("A1").Copy
Range("A1").Offset(, 1).PasteSpecial(xlPasteFormulas)
' Cuando copiamos algo se ve que Excel deja un rastro sobre lo copiado. Para quitarlo utilizamos:
Application.CutCopyMode=false
End Sub
Nombrar rangos
Existen varias maneras de nombrar un rango. Cuando hacemos esto desde Excel, sin macros, primero
seleccionamos el rango que queremos nombrar y una vez selecionado debemos ir al menú Insertar > Nombre >
Definir. Luego escribimos el nombre que querramos y aceptamos (de tal manera que podremos refererirnos a
ese rango con el nombre que le hayamos dado).
Otra forma de nombrar un rango es seleccionándolo y luego encima de la columna A, existe un espacio que nos
da información sobre la celda activa. Se puede escribir un nombre allí y ya quedaría nombrado dicho rango.
Para nombrar un rango desde una macro utilizamos la instrucción Name, por ej.:
Sub Nombrar()
' En el caso de que quisiéramos crear un nombre para un valor constante
Names.Add Name:="Euro", RefersTo:=166.67
' En el caso de que quisieramos crear un nombre para refererirnos al rango A1:B4 con el nombre Ventas.
Range("A1:B4").Name = "Ventas"
End Sub
Los nombre creados pueden utilizar fórmulas, esto es muy frecuente si queremos aplicar un nombre a un rango
de una Tabla Dinámica. En lugar de tener que cambiar el rango utilizado en la TD, cada vez que añadimos un
nuevo registro a nuetra base de datos,
podemos utilizar nombres que hagan referencia a rangos dinámicos mediante fórmulas tal que:
Sub RangoNombrado()
ActiveWorkbook.Names.Add _
Name:="RangoTD", _
RefersToR1C1:= "=OFFSET(Hoja1!R1C1,0,0,(COUNTA(Hoja1!C1)-0),COUNTA(Hoja1!R1)+0)"
End Sub
Combinar rangos
Para combinar celdas utilizamos la instrucción MergeCells. Solo podemos combinar celdas que estén contiguas y
siempre que formen o un cuadrado o un rectángulo, pues de lo contrario Excel no lo permitiría.
Para combinar un rango de celda hacemos:
' Combinar las celdas del rango B4:D4
Sub Combinar ()
Application.DisplayAlerts = False
Range("B4:D4").MergeCells = True
End Sub
Conviene recordar que si combinamos desde una macro, y las celdas que queremos combinar no estan vacías,
Excel nos pedirá confirmación, pues podríamos perder información. Para evitar la confirmación deberíamos
modificar la macro anterior agregando una nueva línea al comienzo:
' Combinar las celdas del rango B4:D4 y evitar confirmación
Sub Combinar ()
Application.DisplayAlerts = False
Range("B4:D4").MergeCells = True
End Sub
Ocultar / Mostrar rangos
Para ocultar o mostrar filas debemos utilizas la instrucción Hidden y luego le asignamos True o False para ocultar
o mostrar respectivamente. Por ej.:
Sub Ocultar ()
' Ocultar la fila 3
Rows("3:3").EntireRow.Hidden = True
' Ocultar varias filas contiguas, aún cuando no es necesario selecionar un rango para operar con él
Rows("7:14").Select
Selection.EntireRow.Hidden = True
' Ocultar varias filas no contiguas
Range("19:19,26:26,32:32,36:39").EntireRow.Hidden = True
End Sub
Si luego queremos volver a mostrar la fila oculta, simplemente cambiamos el True por False:
Sub Mostrar ()
' Mostrar la fila 3
Rows("3:3").EntireRow.Hidden = False
End Sub
Para ocultar columnas es exactamente igual:
Sub Ocultar ()
' Ocultar la columna B, sin selecionarla primero
Columns("B:B").EntireColumn.Hidden = True
' Ocultar las columnas contiguas D,E,F y G selecionándolas primero
Columns("D:G").Select
Selection.EntireColumn.Hidden = True
' Ocultar varias columnas discontínuas, sin necesidad de selecionarlas
Range("I:K,M:O,Q:Q,S:S").EntireColumn.Hidden = True
End Sub
Si luego queremos volver a mostrar la columna oculta, simplemente cambiamos el True por False.
Proteger / Desproteger rangos
Para proteger utilizamos la instrucción Locked, y luego le asiganmos True o False para proteger o desproteger
respectivamente. La protección de rangos es útil cuando queremos proteger el libro o la hoja ya que de lo
contrario carece de sentido, de hecho por defecto todas las celdas de un libro y/o una hoja estan protegidas
inicialmente.
Ahora bien, la protección de celdas o rangos no toma efecto mientras la hoja y/o el libro no estén protegidas.
Suponiendo que sea nuestra intención proteger la hoja y/o el libro posteriormente, podríamos usar estas macros
para proteger rangos:
Sub Proteger ()
' Protege el rango seleccionado
Selection.Locked = True
' Protege el rango indicado
Range("T7:T16").Locked = True
' Protege la celda indicada
Range("T11").Locked = True
' Desprotege el rango indicado
Range("T7:T16").Locked = False
End Sub
Transponer rangos
La operación de transponer se realiza cuando queremos que los valores de una fila se copien como una columna
o viceversa. Para ello utilizamos la instrucción Transpose.
Dicho de otra forma es una manera particular de pegar los datos copiados previamente con lo cual:
Sub Seleccion ()
' Convertir fila en columna
Range("A1:A15").Copy
Range("D4").PasteSpecial Paste:=xlPasteAll, Transpose:=True
' Convertir columna en fila
Range("A1:B10").Copy
Range("D4").PasteSpecial Paste:=xlPasteAll, Transpose:=True
End Sub
Ordenar rangos
La ventaja de ordenar rangos desde macros es que podemos ordenar siguiendo más de 3 criterios, que es el
máximo que permite Excel si lo hacemos desde el menú Datos > Ordenar.
Cuando ordenamos podemos aplicar muchas propiedades, como ser: OrderCustom, MatchCase, Orientation,
DataOption,Order, etc. Sin embargo podemos reducir las mismas y no es necesario utilizarlas todas. Para
ordenar utilizamos la instrucción Sort.
Para ordenar el rango utilizado, por los campos de columnas G, F, A, B y C hacemos:
Sub Ordenar ()
With [A1].CurrentRegion
' [A1].CurrentRegion podría ser = Range("A1:Z45")
.Sort Key1:=Range("G9"), Order1:=xlAscending, Header:=xlGuess
.Sort Key1:=Range("F3"), Order1:=xlDescending, Header:=xlGuess
.Sort _
Key1:=Range("A2"), Order1:=xlAscending, _
Key2:=Range("B2"), Order2:=xlAscending, _
Key3:=Range("C2"), Order3:=xlAscending, _
Header:=xlGuess
End With
End Sub
Otra forma de hacer lo anterior es:
Sub Ordenar ()
With [A1].CurrentRegion
.Sort Key1:=.Cells(7), Order1:=xlAscending, Header:=xlGuess
.Sort Key1:=.Cells(6), Order1:=xlDescending, Header:=xlGuess
.Sort _
Key1:=.Cells(1), Order1:=xlAscending, _
Key2:=.Cells(2), Order2:=xlAscending, _
Key3:=.Cells(3), Order3:=xlAscending, _
Header:=xlGuess
End With
End Sub
Borrar rangos
Para borrar utilizamos la instrucción Clear. Existen distintas cosas que podemos borrar: borrar todo, solo
formatos, solo contenidos, etc.
El borrado es sencillo:
Sub Borrar ()
With Range("A1").CurrentRegion
' Borra comentarios
.ClearComments
' Borra contenidos
.ClearContents
' Borra formatos
.ClearFormats
' Borra notas
.ClearNotes
' Borra todo
.Clear
End With
End Sub
En la macro anterior hemos ido realizando un borrado escalonado, para al final resumir todo en un único borrado
que realizaría todo lo anterior de una vez (instrucción Clear), es decir, que si queremos borrar todo junto
directamente utilizamos Clear.
Imprimir rangos
Para definir el rango a imprimir utilizamos la instrucción PrintArea. Es conveniente que definamos y guardemos el
rango a imprimir:
Sub DefinirRango()
ActiveSheet.PageSetup.PrintArea = "$A$1:$G$22"
End Sub
En el caso anterior si presionáramos sobre el botón Imprimir se imprimiría el rango A1:G22.
También podríamos imprimir automáticamente desde una macro tal que:
Sub ImprimeHoja ()
ActiveSheet.PrintOut
End Sub
Eliminar filas vacías
Existen muchas formas de eliminar las filas vacías. Supongamos que tenemos una base de datos o tabla
definida en el rango A1:Z500 y queremos borrar las filas cuyo valor en la columna B este vacío:
Primer método para borrar filas vacías
Sub BorrarFilasVacias1()
Application.ScreenUpdating = False
Dim FilaBorrable As Range
' Para aumentar la velocidad de ejecución
Set FilaBorrable = Range("B:B").Find(what:="")
Do Until FilaBorrable Is Nothing
FilaBorrable.Select
FilaBorrable.EntireRow.Delete
Set FilaBorrable = Range("B:B").FindNext
Loop
End Sub
El método anterior tiene el inconveniente que si el rango es muy grande y hay muchas filas vacías, el looping se
eterniza aún con el Application.ScreenUpdating = False
Segundo método para borrar filas vacías
Sub BorrarFilasVacias1()
Dim X As Long
Dim R As Long
' Para aumentar la velocidad de ejecución
With ActiveSheet
R = Range([a1], .UsedRange).Rows.Count
Application.ScreenUpdating = False
For X = R To 1 Step -1
Rows(X).Select
If Application.CountA(Rows(X)) = 0 Then
Rows(X).Delete
End If
Next X
End With
End Sub
' Si la Fila tiene algun valor >< 0
El método anterior es bastante más rápido que el primero, pero todavía no es el óptimo.
Tercer método para borrar filas vacías
Sub BorrarFilasVacias3()
Dim FilaBorrable As Range
Dim R As Single
' Para aumentar la velocidad de ejecución
Application.ScreenUpdating = False
' insertamos una nueva fila para después aplicar un criterio de búsqueda y borrar los valores obtenidos de esta
búsqueda
With ActiveSheet
.Rows(1).Insert
.Cells(1, 2) = "Valores a borrar"
R = Range(.Range("B2"), .UsedRange).Rows.Count
Set FilaBorrable = Range("B1", Cells(R, 2))
FilaBorrable.AutoFilter Field:=1, Criteria1:=""
'Borra solo las celdas visibles
FilaBorrable.SpecialCells(xlCellTypeVisible).EntireRow.Delete
.UsedRange
End With
End Sub
El anterior es el método más rápido.
Recuerda que para desocultar todas las filas y columnas ocultas debes hacer:
Sub Desocultar()
With Cells
.EntireColumn.Hidden = False
.EntireRow.Hidden = False
End With
End Sub
Restringir movimiento
Con la instrucción ScrollArea podremos hacer que un usuario solo pueda moverse dentro de un rango
determinado de la hoja Excel. Veamos un ejemplo sencillo:
' Limitamos el movimiento al rango A1:G15 de la Hoja1
Sub LimitarMov()
ActiveWorkbook.Worksheets("Hoja1").ScrollArea = "A1:G15"
End Sub
' Eliminamos la limitación anterior
Sub QuitarLimitacion()
ActiveWorkbook.Worksheets("Sheet1").ScrollArea = ""
End Sub
Scroll Bars
Cada hoja Excel tiene una barra vertical y horizontal que al moverla nos permite desplazarnos por la hoja hacia
abajo o hacia la derecha respectivamente. Estas barras también se conocen como ScrollBars.
Es posible hacer que cada vez que se activa una hoja las ScrollBars estén al comienzo, indepnedientemente de
dónde quedaron la última vez que se ingresó a la hoja. Esto permite que cuando el usuario activa la hoja,
siempre verá el comienzo de la misma:
Private Sub Worksheet_Activate()
' Movemos el ScrollBar vertical a la fila 1
ActiveWindow.ScrollRow = 1
' Movemos el ScrollBar horizontal a la columna 1
ActiveWindow.ScrollColumn = 1
Range("A1").Select
End Sub
Arrays
Los Arrays son conjuntos de elementos y son muy útiles a la hora de manipular varios objetos de forma
simultánea. En este capítulo veremos más en detalle como crearlos y los diferentes tipos que existen.
Recuerda que la mayoría de macros de este capítulo están están en el libro Arrays.xls, dentro de los 400 Extras
que se envían junto con el Manual.
Definición
Un Array es un grupo de elementos secuencialmente puestos con un índice, que tienen el mismo nombre y tipo
de datos intrínseco.
Cada elemento de un array tiene un número de índice que lo identifica como único.
Los cambios realizados a un elemento de un array no afectan los otros elementos.
Antes de que poner valores en un Array, primero debemos crearlo. El Array es declarado utilizando la instrucción
Dim.
En resumen, un array es un grupo de elementos del mismo tipo, cada elemento en un grupo array es único y
puede ser cambiado sin que afecte al resto de los elementos del siguiente array.
Por ejemplo:
Dim MiArray(0 to 3)
El array anterior contiene 4 elementos: el elemento 0,1,2 y 3
Dicho array puede ser simplificado como:
Dim Miarray(3)
Esta última definición significa que los elementos de un array empiezan por el 0, que siempre resulta ser el
primer elemento.
Fijos
Una array con los días de la semana (número fijo de elementos)
Sub EjArrays()
Dim DiaSemana(0 To 6) As String
' Tambien podríamos poner:
' Dim DiaSemana(6) As String, es decir un array de 7 elementos
DiaSemana(0) = "Lunes"
DiaSemana(1) = "Martes"
DiaSemana(2) = "Miércoles"
DiaSemana(3) = "Jueves"
DiaSemana(4) = "Viernes"
DiaSemana(5) = "Sábado"
DiaSemana(6) = "Domingo"
Debug.Print DiaSemana(0) ' Esto nos permite visualizar "Lunes" en la Ventana Inmediato
End Sub
Recuerda que el primer elemento del array es el equivalente a DiaSemana(0). Esta terminología es un préstamo
de otros lenguajes de programación, ahora bien si quieres refererirte al primer elemento de un array como
miarray(1) la solución es introducir la instrucción Option Base 1 al comienzo de la macro, tal que:
Option Base 1
Sub EjArrays()
Dim DiaSemana(1 To 7) As String
' Tambien podríamos poner:
' Dim DiaSemana(7) As String es decir un array de 7 elementos pues es Option Base 1
DiaSemana(1) = "Lunes"
DiaSemana(2) = "Martes"
DiaSemana(3) = "Miercoles"
DiaSemana(4) = "Jueves"
DiaSemana(5) = "Viernes"
DiaSemana(6) = "Sábado"
DiaSemana(7) = "Domingo"
Debug.Print DiaSemana(1) ' Esto nos permite visualizar "Lunes" en la Ventana Inmediato
End Sub
La mayoría de las veces los elementos de los arrays quedan definidos desde un rango o bien desde una única
línea tal que:
Option Base 1
Sub EjArrays()
Dim DiaSemana() As Variant
DiaSemana = Array("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
Debug.Print DiaSemana(1) ' Esto nos permite visualizar "Lunes" en la Ventana Inmediato
End Sub
Variables
Un array no tiene por qué tener un número fijo de elementos, es decir un array puede contener un número
variable de elementos en cualquier momento.
Los arrays se utilizan para aumentar la velocidad de las macros pues permiten la manipulación de gran cantidad
de información sin necesidad de operar con ella, salvo en memoria.
La utilización de Arrays dinámicos (aquellos que no tienen un número fijo de elementos), en muchas ocasiones
es obligatoria.
Por ej. supongamos que queremos obtener el número de directorios existentes en en el dicos C. Deberíamos
utilizar un array como el siguiente:
Sub ArrayDirectorios()
Dim X As Single
Dim NXls() As String
Dim MiRuta As String, MiNombre As String
Cells.ClearContents
' Muestra los nombres en C:\ que representan directorios.
MiRuta = "C:\" ' Establece la ruta.
' Recupera la primera entrada, del directorio C:\
MiNombre = Dir(MiRuta, vbDirectory)
Do While MiNombre <> "" ' Inicia el bucle.
' Ignora el directorio actual y el que lo abarca.
If MiNombre <> "." And MiNombre <> ".." Then
' Realiza una comparación a nivel de bit para asegurarse de que MiNombre es un directorio.
If (GetAttr(MiRuta & MiNombre) And vbDirectory) = vbDirectory Then
X=X+1
ReDim Preserve NXls(1 To X)
NXls(X) = MiNombre
Debug.Print MiNombre ' Muestra la entrada
End If ' solamente si representa un directorio.
End If
MiNombre = Dir ' Obtiene siguiente entrada.
Loop
If X = 0 Then MsgBox "No hay directorios en C:\": Exit Sub
For X = LBound(NXls) To UBound(NXls)
Cells(X, 1) = NXls(X)
Next X
Columns.AutoFit
End Sub
Del mismo modo hubiéramos podido crear un Array con los Libros xls, contenidos en un directorio cualquiera.
Las arrays expuestos hasta aquí son unidireccionales, y aunque los array pueden tener hasta 60 direcciones,
casi nunca utilizaremos Arrays com más de tres dimensiones.
Bidimensionales
Los array unidimensionales son muy frecuentes, aunque también se pueden usar arrays bidemensinales, por ej:
Dim MiArray(1 to 10, 1 to 10) as Integer
Esto sería como pensar en una matriz de 100 elementos, 10 filas x 10 columnas, con lo cual para referirte a la
segunda fila y tercera fila utilizaríamos:
Debug.Print MiArray(2,3)
Lo mas común es que siempre declaremos en principio un array como Variant.
Ejemplo
A continuación observaremos diferentes ejemplos que utilizan arrays. Supongamos que tenemos diferentes
controles en una hoja y queremos colocarlos en determinados lugares:
Sub EjArrays()
Dim X As Byte
Dim Rg As Range
Dim MyShapesArray() As Variant
Dim MyShapesRgArray
Dim MyShape As Shape
' Es lo mismo poner () as VARIANT QUE NO PONER NADA
' MyShapesArray es un array que contiene los nombre the diferentes controles en nuestra ActiveSheet
MyShapesArray = Array("IShape", "SB_H", "SB_V", "BPlay", "SB_Bombs")
' MyShapesRgArray en un array que contiene el lugar donde pondremos los controles
MyShapesRgArray = Array(Range(ActiveCell.Offset(-5, -5), ActiveCell.Offset(-2, -2)), _
Range(ActiveCell.Offset(-3, 0), ActiveCell.Offset(-2, 4)), _
Range(ActiveCell.Offset(0, -3), ActiveCell.Offset(1, -2)), _
Range(ActiveCell.Offset(5, -5), ActiveCell.Offset(-1, -2)), _
Range(ActiveCell.Offset(-3, 5), ActiveCell.Offset(-2, -1)))
For X = LBound(MyShapesArray) To UBound(MyShapesArray)
With ActiveSheet
Set MyShape = .Shapes(MyShapesArray(X))
Set Rg = MyShapesRgArray(X)
'Rg.Select
With MyShape
'.Select
'.Visible = True 'True
.Height = Rg.Height
.Width = Rg.Width
.Left = Rg.Left: .Top = Rg.Top
End With
End With
Next X
End Sub
Este código lo utilizamos para colocar los controles en el lugar deseado. Es posible ver esta macro en
funcionamiento en los juegos:
Buscaminas.xls y MinesWeeper.xls
la macro se llama GameSetup, dentro del modulo GameSetup.
Redim
Cuando utilizamos el comando Redim redimensionamos el Array y al hacerlo perdemos todos los valores que
habíamos creado inicialmente, por ej:
Sub EjArrays()
Dim DiaSemana() As Variant
DiaSemana = Array("Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sábado", "Domingo")
Debug.Print DiaSemana(1)
ReDim DiaSemana(2)
' Al redimensionar el array para con 3 elementos perdemos los valores previamente asignados en:
' DiaSemana = Array("Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sábado", "Domingo")
' con lo que:
Debug.Print DiaSemana(1)
' no devuelve valor alguno!
End Sub
La macro anterior no devuelve ningún valor porque hemos perdido los mismos al no utilizar la instrucción REDIM
PRESERVE, que la veremos en la sección siguiente.
Preserve
La instrucción Preserve se utiliza para conservar los valores de cada elemento, aún cuando redimensionamos el
array:
Sub EjArrays()
Dim NAleatorios() As Variant
NAleatorios = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
Dim X As Byte
Do
MsgBox "El array tiene: " & UBound(NAleatorios) & " Elementos"
ReDim Preserve NAleatorios(UBound(NAleatorios) + 1)
NAleatorios(UBound(NAleatorios)) = Rnd * 100
Cells(X + 1, 1).Value = Round(Rnd * UBound(NAleatorios))
X=X+1
Loop While UBound(NAleatorios) <> 15
' Seleccionaría la celda:
Cells(UBound(NAleatorios), 1).Select
End Sub
También podemos asignar los valores de un rango a un array, tal que:
aaa=range("A1:A15").values
lo cual significa que es un array Bidemensional ya que aunque solo tiene una columna (en este caso la columna
A), para referirnos a cualquier elemento de este array deberemos especificar no solo la fila sino también la
columna.
Hemos asignado los valores de un rango a un array con lo que para referirnos a lo elementos del array
deberemos hacerlo como si de un array bidemensional se tratara, aún cuando todas las celdas del rango estén
en la misma columna como en el caso siguiente:
Private Sub RgArray_Click()
Dim X As Single
Dim Rango() As Variant
Dim miarray As Variant
Rango = Range("Col1")
For X = LBound(Rango,1) To UBound(Rango,1)
' Aunque podemos simplificar como:
Range("col1").Cells(X).Select
Debug.Print Rango(X, 1)
Next X
End Sub
For X = LBound(Rango) To UBound(Rango)
Estructuras
Las estructuras son conjuntos de instrucciones VBA que deben respetar una sintáxis determinada y que nos
permiten realizar diversas operaciones. En este capítulo las veremos en detalle.
Recuerda que la mayoría de macros de este capítulo están están en el libro Estructuras.xls, dentro de los 400
Extras que se envían junto con el Manual.
Do Loop
La instrucción Do Loop es utilizada para repetir las mismas instrucciones una y otra vez hasta que una condición
tenga lugar. Es probablemente la estructura más simple de cuantas hay en cuanto a repeticiones, pues no
establece condiciones de entrada ni de salida como ocurre en Do While o Do Until. Veamos algunos ejemplos:
Si la celda contiene datos coloreamos toda la fila:
Sub Colorea()
[A1].EntireRow.Select ' Comenzamos desde la fila 1
Do ' Comenzamos a evaluar
If ActiveCell.Value = "" Then Exit Do ' Si la celda activa no tiene valor salimos de la macro
Selection.EntireRow.Interior.ColorIndex = 15 ' Si la celda tiene valor pinta la fila de gris
Selection.Offset(2).Select ' Nos movemos a la fila siguiente
Loop ' Comenzamos nuevamente "el rulo" desde el Do
End Sub
Podemos retocar lo anterior y poner la condición no de inicio dentro del Looping tal que:
Sub Colorea()
[A1].EntireRow.Select
Do While ActiveCell.Value <> ""
Selection.EntireRow.Interior.ColorIndex = 15
Selection.Offset(2).Select
Loop
End Sub
Donde obviamente hemos tenido que cambiar la condición de = "" a <>"", es decir distinta de vacía. De haber
querido poner una condición no de inicio sino de salida, es decir que el looping se ejecute por lo menos una vez:
Sub Colorea()
[A1].EntireRow.Select
Do
Selection.EntireRow.Interior.ColorIndex = 15
Selection.Offset(2).Select
Loop While ActiveCell.Value <> ""
End Sub
En el caso anterior, aún cuando la celda A1 estuviera vacía el looping se ejecutaría por lo menos una vez.
También hubiéramos podido jugar tal que:
Sub Colorea()
[A1].EntireRow.Select
Do
Selection.EntireRow.Interior.ColorIndex = 15
Selection.Offset(2).Select
Loop Until ActiveCell.Value = ""
End Sub
O bien:
Sub Colorea()
[A1].EntireRow.Select
Do Until ActiveCell.Value = ""
Selection.EntireRow.Interior.ColorIndex = 15
Selection.Offset(2).Select
Loop
End Sub
Este último caso podría dar lugar a que el looping terminara antes de empezar.
El caso es que todos estos ejemplos son prácticamente idénticos y depende de nosotros utilizar uno u otro, salvo
en contadas ocasiones donde algunos obviamente no sirven. El útlimo ejemplo no valdría si quisiéramos que el
looping ejecutara las instrucciones internas al menos una vez.
For Next
La instrucción For Next repite un grupo de instrucciones un número especificado de veces. La sintaxis es:
For contador = principio To fin [Step incremento]
[instrucciones]
[Exit For]
[instrucciones]
Next [contador]
La sintaxis de la instrucción For...Next consta de las siguientes partes:
-Contador (requerido): variable numérica que se utiliza como contador de bucle. La variable no puede ser
Booleana ni un elemento de matriz.
-Principio (requerido): valor inicial del contador.
-Fin (requerido): valor final del contador.
-Incremento (opcional): cantidad en la que cambia el contador cada vez que se ejecuta el bucle. Si no se
especifica, el valor predeterminado de incremento es uno.
-Instrucciones (opcional): una o más instrucciones entre For y Next que se ejecutan un número especificado de
veces.
El argumento incremento puede ser positivo o negativo. El valor del argumento incremento determina la manera
en que se procesa el bucle, como se muestra a continuación:
For X = 1 to 50
es decir el valor del incremento es positivo donde 1 es el Principio y 50 el Fin, es decir 1<= 50, o bien Principio
<= Fin
o bien:
For X = 50 to 1
es decir el valor del incremento es negativo donde 50 es el Principio y 1 el Fin, es decir 50 >= 1, o bien Principio
>= Fin
Cuando el incremento es negativo es necesario especificar el incremento que va a tener lugar en el bucle
mediante la palabra Step tal que:
Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones, con incremento negativo de 2
For X = 10 To 1 Step -2
Cells(X, 1) = X
Next X
End Sub
En el caso anterior X tomaría los valores 10,8,6,4,2 sucesivamente.
Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones, con incremento negativo de 1
For X = 10 To 1 Step -1
Cells(X, 1) = X
Next X
End Sub
En el caso anterior X tomaría los valores 10,9,8,7,6,5,4,3,2,1 sucesivamente.
Se pueden colocar en el bucle cualquier número de instrucciones Exit For como una manera alternativa de salir
del mismo. La instrucción Exit For, que se utiliza a menudo en la evaluación de alguna condición (por ejemplo,
If...Then), transfiere el control a la instrucción que sigue inmediatamente a la instrucción Next. ej:
Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones.
For X = 1 To 10
If Cells(X, 1) = "" Then Exit Sub
Cells(X, 1) = X
Next X
End Sub
En el ejemplo anterior realizaríamos un bucle de 10 repeticiones pero si en el trascurso del mismo las celdas
(X,1) estuvieran vacías el bucle se rompería y saldríamos de él.
Del mismo modo se puede modificar el valor del contador volviendo a un valor dado tal que:
Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones.
For X = 1 To 10
If Cells(X, 1) = "" Then
X=1
Cells(X, 1) = X + Cells(X, 1)
End if
Cells(X, 1) = X + Cells(X, 1)
Next X
End Sub
En el ejemplo anterior, si el valor de (X,1) estuviera vacío volveríamos a X=1, y para evitar un bucle infinito le
daríamos a la celda (X,1) el valor igual a = X + Cells(X, 1)
Este otro ejemplo muestra que cambiar el valor del contador mientras está dentro de un bucle puede acarrear un
bucle infinito, haciendo difícil su lectura y depuración. Ejemplo:
Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones.
For X = 1 To 10
If Cells(X, 1) = "" Then
X=1
Else
Cells(X, 1) = X
End If
Next X
End Sub
En el ejemplo anterior, si el valor de la celda (1,1) estuviera vacío tendríamos un bucle repetitivo infinito ya que x
siempre sería = a 1.
Se pueden anidar bucles For...Next, colocando un bucle For...Next dentro de otro. Para ello, proporcionamos a
cada bucle un nombre de variable único como su contador. La siguiente construcción sería la correcta:
For I = 1 To 10
For J = 1 To 10
For K = 1 To 10
...
Next K
Next J
Next I
For Each Next
La instrucción For Each Next repite un grupo de instrucciones para cada elemento de una matriz o colección. Su
sintaxis es:
For Each elemento In grupo
[instrucciones]
[Exit For]
[instrucciones]
Next [elemento]
Por lo general la instrucción For Each Next suele utilizarse para evaluar rangos y o hojas, como se ve en los
siguientes ejemplos:
' Queremos colocar en el encabezado de cada una de las hojas del libro la palabra "Exceluciones"
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim Hoja As Worksheet
For Each Hoja In ThisWorkbook.Sheets
Hoja.PageSetup.LeftFooter = "Exceluciones"
Next Hoja
End Sub
' Queremos borrar todo el contenido de cada hoja antes de cerrar un libro
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Hoja As Worksheet
For Each Hoja In ThisWorkbook.Sheets
Hoja.Cells.Clear
Next Hoja
End Sub
La entrada al bloque For Each se produce si hay al menos un elemento en grupo. Una vez que se ha entrado en
el bucle, todas las instrucciones en el bucle se ejecutan para el primer elemento en grupo. Después, mientras
haya más elementos en grupo, las instrucciones en el bucle continúan ejecutándose para cada elemento.
Cuando no hay más elementos en el grupo, se sale del bucle y la ejecución continúa con la instrucción que sigue
a la instrucción Next.
Se pueden colocar en el bucle cualquier número de instrucciones Exit For. La instrucción Exit For se utiliza a
menudo en la evaluación de alguna condición (por ejemplo, If...Then) y transfiere el control a la instrucción que
sigue inmediatamente a la instrucción Next.
Podemos anidar bucles For Each...Next, colocando un bucle For Each...Next dentro de otro. Sin embargo, cada
elemento del bucle debe ser único.
Nota: si omitimos un elemento en una instrucción Next, la ejecución continúa como si se hubiera incluído, es
decir tanto:
For Each Cell In Range("Rg")
' Instrucciones...
Next Cell
como:
For Each Cell In Range("Rg")
' Instrucciones...
Next
funcionarían mientras hubiera mas elementos en el grupo, en el caso anterior dentro del rango llamado "Rg".
Si se encuentra una instrucción Next antes de su instrucción For correspondiente, se producirá un error.
No se puede utilizar la instrucción For Each...Next con una matriz de tipos definidos por el usuario porque un tipo
Variant no puede contener un tipo definido por el usuario.
While Wend
La instrucción While Wend ejecuta una serie de instrucciones mientras una condición dada sea True, es decir
verdadera, o tenga lugar. Su sintaxis es:
While condición
[intrucciones]
Wend
Condición (requerido): expresión numérica o expresión de cadena cuyo valor es True o False. Si condición es
Null, condición se considera False.
Instrucciones (opcional): una o más instrucciones que se ejecutan mientras la condición es True.
Si condición es True, todas las instrucciones se ejecutan hasta que se encuentra la instrucción Wend. Después,
el control vuelve a la instrucción While y se comprueba de nuevo condición. Si condición es aún True, se repite el
proceso. Si no es True, la ejecución se reanuda con la instrucción que sigue a la instrucción Wend.
Los bucles While...Wend se pueden anidar a cualquier nivel. Cada Wend coincide con el While más reciente.
En principio no es frecuente utilizar este tipo de intrucciones, se aconseja la utilización de Looping, que sirve para
lo mismo.
Go To
La instrucción GoTo es un método bastante rudo de variar el sentido que debería tomar una macro, ya que
cuando una macro llega a una línea que contiene dicha instrucción "salta" al lugar especificado en GoTo (es
decir, saltamos incondicionalmente a una línea especificada en el procedimiento). La Sintaxis de GoTo es:
GoTo línea
El argumento línea puede ser cualquier etiqueta de línea o número de línea.
GoTo solamente puede saltar a líneas del procedimiento en el que aparece.
Nota: demasiadas instrucciones GoTo pueden ser difíciles de leer y de depurar. Siempre que sea posible,
conviene utilizar instrucciones de control estructuradas (Do...Loop, For...Next, If...Then...Else, Select Case). Es
decir conviene no habituarse a utilizar este código, salvo cuando no quede otro remedio.
Veamos un ejemplo:
Sub Macro()
GoTo Adios
Range("A1").Font.Bold = True
Range("A1").Font.Size = 50
Range("A1").Font.ColorIndex = 3
Range("A1").Interior.ColorIndex = 5
Range("A1").Select
Adios:
End Sub
La macro anterior no realiza ninguna operación, ya que nada más empezar saltamos a la línea "Adios:" y
después no hay más código.
Nota: en principio nunca deberíamos utilizar GoTo, pues siempre, o prácticamente siempre deberíamos ser
capaces de encontrar una alternativa a través de instrucciones de control estructuradas tales como: Do...Loop,
For...Next, If...Then...Else, Select Case.
With End With
La instrucción With End With ejecuta una serie de instrucciones sobre un único objeto o sobre un tipo definido
por el usuario. Permite realizar múltiples operaciones sobre el mismo objeto. La sintaxis que emplea es:
With objeto
[instrucciones]
End With
Objeto (requerido): nombre de un objeto o de un tipo definido por el usuario.
Instrucciones (opcional): una o más instrucciones que se van a ejecutar sobre objeto.
Veamos un ejemplo sencillo con el cual asignamos un formato a la celda A1:
' La siguiente macro NO utiliza With
Sub Macro()
Range("A1").Font.Bold = True
Range("A1").Font.Size = 50
Range("A1").Font.ColorIndex = 3
End Sub
' Repetimos lo anterior pero con With
Sub Macro()
With Range("A1")
.Font.Bold = True
.Font.Size = 50
.Font.ColorIndex = 3
End With
End Sub
En el ejemplo anterior se ve que al utilizar el With, no es necesario volver a repetir el objeto Range("A1"). Todo lo
que está entre With y End With se aplica al objeto Range("A1").
Veamos otro ejemplo algo más complejo con el cual asignamos un formato a la celda A1 y además aplicamos el
With en dos niveles:
' La siguiente macro NO utiliza With
Sub Macro()
Range("A1").Font.Bold = True
Range("A1").Font.Size = 50
Range("A1").Font.ColorIndex = 3
Range("A1").Interior.ColorIndex = 5
Range("A1").Select
End Sub
' La siguiente macro realiza las mismas operaciones utilizando With
Sub Macro_With()
With Range("A1")
With .Font
.Bold = True
.Size = 50
.ColorIndex = 3
End With
.interior.ColorIndex = 5
.Select
End With
End Sub
Nota: una vez que se ha entrado en un bloque With no es posible cambiar el objeto. Por tanto, no podemos
utilizar una única instrucción With para varios objetos diferentes, pero si podemos utilizar otro bloque que utilice
el anterior bloque, como lo hace el ejemplo anterior.
Aunque en principio parece que la segunda macro es más difícil de entender, es un buen hábito utilizar
estructuras With pues aumentan la velocidad de ejecución de las macros, siendo más fáciles de manipular a
medida que nos acostumbramos a ellas.
If Then
La instrucción If Then permite escoger entre 2 o más posibilidades, para decidir sobre que es lo que queremos,
entre una serie de alternativas.
La instrucción ejecuta condicionalmente un grupo de instrucciones, dependiendo del valor de una expresión. Su
sintaxis es:
If condición Then [instrucciones]-[Else instrucciones_else]
Tambien podemos utilizar la siguiente sintaxis en formato de bloque:
If condición Then
[instrucciones]
[ElseIf condición-n Then
[instrucciones_elseif] ...
[Else
[instrucciones_else]]
End If
Condición (requerido): uno o más de los siguientes dos tipos de expresiones: Una expresión numérica o
expresión de cadena que puede ser evaluada como True o False. Si condición es Null, condición se considera
False.
Una o más instrucciones separadas por dos puntos ejecutados si la condición es True. condición-n (Opcional).
igual que -condición.
instrucciones_elseif (Opcional): una o más instrucciones ejecutadas si la condición-n asociada es True.
instrucciones_else (opcional): una o más instrucciones ejecutadas si ninguna de las expresiones anteriores
condición o condición-n es True.
Veamos algunos ejemplos de If, escritos en una sola línea:
En esta macro si el valor de la celda A1 es > a 15, entonces la condición es verdadera (es decir TRUE) con lo
cual se ejecuta la instrucción definida para tal caso, en este ejemplo lanzamos un mensaje, que dice: "La celda
A1> 15"
Sub IF_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
End Sub
En esta otra macro si el valor de la celda es >15 se cumple con la condición demandada con lo cual se ejecuta
la primera opción, en caso de que no sea TRUE (es decir en caso de que sea FALSE) ejecutamos la segunda
instrucción, en nuestro ejemplo, el mensaje: "La celda A1< 15"
Sub IF_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15" Else MsgBox "La celda A1< 15"
End Sub
También hubiéramos podido escribir el anterior ejemplo a través de dos construcciones If tal que:
Sub IF_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
If [A1] < 15 Then MsgBox "La celda A1< 15"
End Sub
Si el valor de la celda A1 fuera 200, la siguiente macro lanzaría dos mensajes pues las dos instrucciones IF...
serían TRUE:
Sub IF_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
If [A1] > 15 Then MsgBox "La celda A1< 15"
End Sub
En el caso de que querramos realizar más de una operación si una condición devuelve True, o bien si devuelve
False, conviene utilizar una construcción en bloque.
Veamos algunos ejemplos de If, escritos en bloque:
En caso de que el valor de la celda A1>15 entonces la condicion es True, y siendo True, lanzaríamos un
mensaje y después pondríamos la celda A1 en negrita y con fondo Rojo.
Sub IF_Then()
If [A1] > 15 Then
Msgbox "La celda A1> 15"
With [A1]
.Interior.ColorIndex = 3
.Font.Bold = True
End With
End If
End Sub
o bien:
Sub IF_Then()
If [A1] > 15 Then
MsgBox "La celda A1> 15"
[A1].Interior.ColorIndex = 3
[A1].Font.Bold = True
Else
[A1].Interior.ColorIndex = 10
[A1].Font.Size = 50
End If
End Sub
' si la condicion es TRUE
' lanzaríamos un mensaje
' el fondo de la celda [A1] seria rojo
' y la celda [A1] estaría en negrita
' Si la condicion fuera False
'el fondo de la celda [A1] sería Verde
' y la fuente tendría tamaño 50
Un boloque If puede tener así mismo varias secciones ElseIf, que vendrían a decir "de lo contrario", "o". La
instrucción ElseIf impide que el código continúe verificándose cuando una de las condiciones se a presentado
como True. Veamos un ejemplo:
Si el valor de la celda A1 fuera 500 al confirmarse como verdadera la primera condición (>15) ejecutaríamos las
tres instrucciones tal que, (MsgBox "La celda A1> 15"), ([A1].Interior.ColorIndex = 10), y ([A1].Font.Bold = True) y
a continuación acabaríamos con la ejecución de la condición:
Sub IF_Then()
If [A1] > 15 Then
MsgBox "La celda A1> 15"
[A1].Interior.ColorIndex = 10
[A1].Font.Bold = True
ElseIf [A1] > 10 Then
[A1].Interior.ColorIndex = 10
[A1].Font.Size = 50
ElseIf [A1] > 2 Then
MsgBox "2"
End If
End Sub
En el caso anterior, si el valor de A1 fuera 3, aún cuando las tres condiciones devolverían True por separado,
solo se ejecutaría la primera.
Veamos otro ejemplo donde en función de la hora del día obtendremos un mensaje diferente:
Sub IF_Then()
If Time < TimeValue("08:30:00") Then MsgBox "Buenos Dias!"
If Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then MsgBox "Buenas Tardes!"
If Time >= TimeValue("20:30:00") Then MsgBox "Buenas noches!"
End Sub
on bien escrito de diferente manera:
Sub IF_Then()
If Time < TimeValue("08:30:00") Then
MsgBox "Buenos Dias!"
ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then MsgBox "Buenas Tardes!"
Else: MsgBox "Buenas noches!" 'cuando ninguna de las anteriores posibilidades se cumple:
End If
End Sub
o bien:
Sub IF_Then()
If Time < TimeValue("08:30:00") Then
MsgBox "Buenos Dias!"
ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then
MsgBox "Buenas Tardes!"
Else
MsgBox "Buenas noches!"
End If
End Sub
o bien:
Sub IF_Then()
If Time < TimeValue("08:30:00") Then MsgBox "Buenos Dias!"
ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then MsgBox "Buenas Tardes!"
Else: MsgBox "Buenas noches!"
End If
End Sub
o bien:
Sub IF_Then()
If Time < TimeValue("08:30:00") Then
MsgBox "Buenos Dias!"
Else
If Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then
MsgBox "Buenas Tardes!"
Else
MsgBox "Buenas noches!"
End If
End If
End Sub
Como se ve hay muchísimas maneras de escribir la misma Macro. Ahora depende de cada uno decidir cual se
prefiere.
Select Case
La instrucción Select Case se utiliza cuando las alternativas en una estructura de If Then son muchas. En tal
caso conviene evitar el If Then y hacer uso de Select Case, que permite ejecutar uno de varios grupos de
instrucciones, dependiendo del valor de una expresión.
La sintaxis de Select Case es:
Select Case expresión_prueba
[Case lista_expresion-n
[instrucciones-n]] ...
[Case Else
[instrucciones_else]]
End Select
Veamos un ejemplo:
Sub Select_Case()
Dim Número As Variant ' la declaramos como Variant para evitar el error de compilación que
' obtendríamos en el caso de que [A1] fuera texto
Número = [A1]
' Inicializa variable.
Select Case Número
' Evalúa Número.
Case 1 To 5:
MsgBox "Entre 1 y 5"
' Para Nºs entre 1 y 5, inclusive
Case 6, 7, 8:
MsgBox "Entre 6 y 8"
' Para Nºs entre 1 y 5, inclusive
Case 9 To 10: MsgBox "Mayor que 8"
Case Else
' Para Nºs entre 9 y 10, inclusive
' Para otros valores.
MsgBox "No está entre 1 y 10"
End Select
End Sub
Si expresión_prueba coincide con cualquier lista_expresión asociada con una cláusula Case, las instrucciones
que siguen a esa cláusula Case se ejecutan hasta la siguiente cláusula Case o, para la última cláusula, hasta la
instrucción End Select. El control pasa después a la instrucción que sigue a End Select. Si expresión_prueba
coincide con una expresión de lista_expresión en más de una cláusula Case, sólo se ejecutan las instrucciones
que siguen a la primera coincidencia.
En el ejemplo anterior, si [A1] fuera "pedro" se ejecutaría la condicion
Case Else ' Otros valores
Si [A1] fuera 5 se ejecutaría la instrucción
Case 1 To 5: MsgBox "Entre 1 y 5"
En la siguiente macro, si A1 fuera 15, solo se ejecutaría la primera opción del Case Select, al devolver TRUE:
Sub Select_Case()
Dim Número As Variant ' La declaramos como Variant para evitar el error de compilación que obtendríamos en
el caso de que [A1] fuera texto
Número = [A1]
' Inicializa variable.
Select Case Número
' Evalúa Número.
' Número entre 1 y 25, inclusive.
Case 1 To 25:
Debug.Print "Entre 1 y 25"
' Número entre 6 y 8.
Case 10, 14, 15: Debug.Print "Bien 10, 14 o 15"
Case 15 To 18
' Número entre 15 y 18.
Debug.Print "'Número entre 15 y 18, inclusive."
Case Else
' Otros valores.
Debug.Print "Valor no comprendido en los diferentes Casos"
End Select
End Sub
La cláusula Case Else se utiliza para indicar las instrucciones que se van a ejecutar si no se encuentran
coincidencias entre expresión_prueba y una lista_expresión en cualquiera de las otras selecciones de Case.
Aunque no es necesario, es buena idea tener una instrucción Case Else en el bloque Select Case para controlar
valores imprevistos de expresión_prueba. Cuando no hay una instrucción Case Else y ninguna expresión de la
lista en las cláusulas Case coincide con la expresión de prueba, la ejecución continúa en la instrucción que sigue
a End Select, es decir la instrucción no ejecuta ninguna opción pues no hay valor que devuelva TRUE.
Lógicamente Select Case ayuda bastante como se ve en el siguiente ejemplo conocido, pues ya lo hemos
utilizado al explicar IF Then:
Sub Select_Case()
Select Case Time
Case Is < TimeValue("08:30:00"): MsgBox "Buenos Dias!"
Case Is >= TimeValue("20:30:00"): MsgBox "Buenas Noches!"
Case Else: MsgBox "Buenas Tardes!"
End Select
End Sub
Constuir la macro anterior con Select Case en lugar de If Then hace que sea más sencilla de entender y de
escribir.
En la siguiente macro nos daria igual no utilizar la opción o comodín Case Else ya que sabemos que los días de
la semana son 7:
Sub Select_Case()
Select Case Weekday(Now, vbMonday) ' o bien: Weekday(Now, 2)
Case 1: MsgBox "Hoy es Lunes"
Case 2: MsgBox "Hoy es Martes "
Case 3: MsgBox "Hoy es Miércoles"
Case 4: MsgBox "Hoy es Jueves"
Case 5: MsgBox "Hoy es Viernes"
Case 6: MsgBox "Hoy es Sábado"
Case 7: MsgBox "Hoy es Domingo"
End Select
End Sub
En la macro anterior utilizamos la opción Weekday(Now, vbMonday) o Weekday(Now, 2), porque la fórmula
Weekday puede dar como resultado 1-7 en función del día por el que querramos comenzar la semana. La
semana que empieza por el día se pone tal que:
Weekday(Now, vbMonday)
o bien:
Weekday(Now, 2)
VBA permite realizar la misma operación de cientos de maneras distintas, como ya se ha demostrado antes. De
hecho la macro anterior podría simplificarse tal que:
Sub Macro()
Dim ArrayDiaSemana
ArrayDiaSemana = Array("", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday))
End Sub
En la macro anterior hemos utilizado un array que contiene los días de la semana, pero cuyo primer elemento
esta vacío "", pues Weekday(Now,2) jamás dara 0, con lo cual o bien utilizaríamos la macro anterior o bien:
Sub Macro()
Dim ArrayDiaSemana
ArrayDiaSemana = Array("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday) - 1)
End Sub
o bien ponemos la Option Base 1, que se utiliza cuando queremos que un array no contemple el valor 0 de inicio
tal que:
Option Base 1
Sub Macro()
Dim ArrayDiaSemana
ArrayDiaSemana = Array("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday))
End Sub
DoEvents
La instrucción DoEvents cede el control de la ejecución al sistema operativo, para que éste pueda procesar otros
eventos.
Su Sintaxis es:
DoEvents( )
La función DoEvents pasa el control al sistema operativo. El control no se devuelve hasta que el sistema
operativo haya terminado de procesar los eventos en cola y se hayan enviado todas las teclas de la cola
SendKeys.
Advertencia: siempre que demos preferencia al procesador temporalmente dentro de un procedimiento de
evento, debemos asegurarnos que el procedimiento no se ejecute de nuevo desde una parte diferente del código
antes de que devuelva la primera llamada. Esto podría causar resultados impredecibles. Además, no debemos
utilizar la función DoEvents si existe la posibilidad de que otras aplicaciones interactúen con el procedimiento, de
manera imprevista, durante el tiempo en que éste ha cedido el control.
DoEvents suele utilizarse muchas veces para que a medida que una instrucción Looping o For Next se está
ejecutando si presionamos otro control tal que:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
End Sub
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As
Boolean)
End Sub
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
End Sub
Las macros dentro de las opciones anteriores se ejecutan antes de volver al looping o For Next que contiene el
código DoEvents().
Si quisiéramos que una macro realizara cierta cantidad de operaciones siguiendo un looping, y supiéramos que
no debemos seleccionar ninguna celda mientras tanto, podríamos utilizar la siguiente macro "DoEventsMacro"
en conjunción con la macro de evento.
On Error GoTo
La instrucción On Error GoTo se utiliza para controlar un error de macro en caso de haberlo. Lo ideal es que el
usuario final de la aplicación con macros pueda ver un mensaje más comprensible. Entonces podemos indicarle
a la macro que si se produce un error haga un salto a otra línea donde se le indica cómo proceder.
En la siguiente macro
Sub GOTOMacro()
Dim X, Y
On Error GoTo CasoError
Y = [A1] / [B1]
' Si A1/B1 diera como resultado un error, la macro saltaría a la línea "CasoError"
' de lo contrario continuaríamos con
For X = 1 To 50
Cells(X, 1) = X
Next X
Exit Sub
CasoError:
MsgBox "Ha surgido un error, intente con otros valores en A1 y B1"
End Sub
En el caso anterior, al dividir A1 entre B1 podría existir un error, por ejemplo, si en B1 hubiese un valor 0 o una
letra. Como la macro no puede realizar dicha operación habría un error de VBA. Pero con el On Error GoTo
podemos controlar dicho error y mostrar un mensaje personalizado, tal como lo hemos armado en la línea
CasoError.
On Error Resume Next
Otra alternativa en caso de error es ingnorarlo y continuar con la ejecución del código, (aunque sería peligroso,
porque ignorar un error no significa que el mismo desaparezca!). Para ignorar un error lo hacemos con la
intrucción On Error Resume Next, ubicándo esta línea al comienzo del código:
Sub Macro ()
' Si hay un error lo ignora y continúa ejecutando el resto del código
On Error Resume Next
' Aquí iría el resto del código
End Sub
Built in Dialogs
Los Built In Dialogs son Cuadros de Diálogo predeterminados que permiten realizar diversas operaciones
fácilmente, sin tener que recurrir a una macro. En este capítulo los veremos más en detalle.
Ejemplos
Como se suele decir en programación, cuando queremos realizar algo, antes que inventarlo conviene descubrir
si ya esta inventado!
Para que crear algo que ya ha sido creado con anterioridad, desde VBA tenemos acceso a la mayoría de lo Built
In Dialogs.
Por ejemplo, si quisiéramos que el usuario guarde su libro con con el cuadro de diálogo "Guardar como"
podríamos llamarlo desde el Built In Dialog xlDialogSaveAs. La instrucción completa sería:
Application.Dialogs(xlDialogSaveAs).Show
La instrucción anterior abriría nuestro viejo y conocido cuado de diálogo "Guardar como", tal como se ve en la
siguiente figura:
Los built-in dialogs son funcionalidades que permiten interactuar con la voluntad del usuario en la ejecución de la
macro. Para tener acceso a todos los built-in dialogs, lo podemos hacer desde el editor de VBA:
1. Presionamos la tecla F2 para abrir el Examinador de objetos.
2. En la lista Clases elegimos XLBuiltInDialog
3. En la lista Miembros de la derecha veremos todos los disponibles.
En el siguiente ejemplo abrimos un archivo mediante el Built In Dialog GetOpenFilename pero solo listamos los
archivos XL* (el asterisco significa "cualquier caracter"). En este caso solo listaríamos archivos XLS y XLA:
Sub Ejemplo1()
Dim Nombre_del_Fichero As Variant 'o bien: As String
Nombre_del_Fichero = Application.GetOpenFilename( _
FileFilter:="Hojas de cálculo (*.xl*),*.xl*", _
Filterindex:=1, _
' Podemos definir el título del Built In Dialog
Title:="¿Sobre que Libro deseas operar?", MultiSelect:=False)
Workbooks.Open Nombre_del_Fichero
End Sub
Si quisiéramos abrir más de un libro de excel:
Sub Ejemplo2()
Dim Nombre_del_Fichero As Variant 'o bien: As String
Nombre_del_Fichero = Application.GetOpenFilename( _
FileFilter:="Hojas de cálculo (*.xl*),*.xl*", _
Filterindex:=1, _
Title:="¿Sobre que Libro deseas operar?", MultiSelect:=True)
On Error Resume Next
If Nombre_del_Fichero <> False Then
NumFiles = UBound(Nombre_del_Fichero) - LBound(Nombre_del_Fichero) + 1
If Nombre_del_Fichero(LBound(Nombre_del_Fichero)) = False Then Exit Sub
' Para evitar que las macros de evento Private Sub Workbook_Open()
' se ejecuten
Application.EnableEvents = False
For X = LBound(Nombre_del_Fichero) To UBound(Nombre_del_Fichero)
Workbooks.Open Nombre_del_Fichero(X)
Next X
Application.EnableEvents = True
Else
Exit Sub
End If
End Sub
FileFilter se aplica para definir el tipo de ficheros sobre los que deseamos trabajar.
En este sentido si quiséramos que el usuario pudiera escoger entre abrir Ficheros de Text "TXT", ficheros de
Excel "Xls", o bien Cualquier Otro deberiamos utilizar:
FileFilter:="Archivos de texto (*.txt),*.TXT," & _
" Todos los archivos de Microsoft Excel (*.Xls),*.Xls," & _
" Todos los archivos (*.*),*.*"
dándole la oportunidad de elegir entre TXT, XLS. También hubiéramos podido llamarles tal que:
FileFilter:="Archivos de texto (*.txt),*.TXT," & _
"hojas de cálculo Excel (*.Xls),*.Xls," & _
"cualquier otro (*.*),*.*"
Lo único que hay que respetar es la extensión aplicable a cada fichero sobre el que deseemos trabajar
si colocaramos:
Filterindex:=1
El cuadro de diálogo abierto mostraría Archivos de texto como el tipo de archivo.
Filterindex:=2
El cuadro de diálogo abierto mostraría Hojas de Cálculo Excel como el tipo de archivo.
Filterindex:=3
El cuadro de diálogo abierto mostraría cualquier otro archivo como el tipo de archivo
Title es el título que mostrará el cuadro de diálogo:
Title:="¿Sobre que Libro deseas operar?"
Title:="¿Que Libros deseas Abrir?"
Title:="¿Que Libros deseas Guardar?"
MultiSelect:=True,
Si queremos tener la posibilidad de operar sobre más de un libro deberemos poner True, de lo contrario False.
He aqui un Ejemplo que podemos utilizar:
Sub Ejemplo3()
Dim FileList As Variant
Dim NumFiles As Integer, X As Integer
On Error Resume Next
FileList = Application.GetOpenFilename( _
"Archivos de texto (*.txt),*.TXT," & _
"Todos los archivos de Microsoft Excel (*.Xls),*.Xls," & _
"Todos los archivos (*.*),*.*", _
3, _
"¡Seleccione los Ficheros sobre los que desees Trabajar!", _
,_
True)
' Permitimos seleccionar mas de un Fichero
' la opción deseada para mostrar es: Todos los archivos
' el título es="¡Seleccione los Ficheros sobre los que desees Trabajar!"
' esto tan solo otra forma de escribir lo mismo
If FileList <> False Then
NumFiles = UBound(FileList) - LBound(FileList) + 1
If FileList(LBound(FileList)) = False Then Exit Sub
Cells.Clear
For X = LBound(FileList) To UBound(FileList)
Cells(X, 1) = FileList(X)
' Debug.Print FileList(x)
' Hubiéramos podido trabajar con ellos tal que
' Creando otra macro que trabajara con ellos
' Call ReporteVentas
Next X
Else
Application.EnableEvents = True
Exit Sub
End If
End Sub
Barras de Herramientas
Podemos personalizar o adaptar nuestros propios menús y barras de herramientas dentro de Excel. En este
capítulo veremos como hacerlo.
Crear Toolbar
Excel no deja de ser otra aplicación de las muchas que conocemos como MS Word, MS PowerPoint, MS Access,
Contawin, WordPad etc. Y al igual que todas las demás aplicaciones contiene una serie de funcionalidades y/o
disposiciones comunes como:
La barra de título: es la que encontramos en la parte superior de cualquier aplicación.
Se caracteriza y es fácil de reconocer porque simpre, independientemente de la aplicación a la que sirva
contiene a la izquierda el logotipo de la aplicación, después el nombre de la aplicación y el nombre del
documento contenido en la aplicación, después el botón minimizar, seguido del de maximizar y/o restaurar y
finalmente el de cerrar. Sabemos que una aplicacion esta activa porque el color de su barra de título está de
color Azul, mientras que cuando no esta activa suele tener un color gris.
La barra de menú: también es común en todas las aplicaciones existentes, ahora bien las palabras que contiene
esta barra varían en función de la funcionalidad que tenga la aplicacion en si. En este sentido la barra de menu
de MS Word difiere de la barra de menú de MS Excel. Independientemente de cual sea la aplicación en si
tendremos los siguientes menus dentro de la barra de menus: (Archivo, Edición y Ayuda, aunque este último
término en Excel venga expresado con el caracter "?"). Puesto que Excel es una hoja de cálculos, Word un
procesador de textos y access una base de datos, estas aplicaciones diferirán en cuanto a las palabras que
contengan su barra de menú, así como en cuanto a los controles que contengan cada una de los menús de la
barra de menú.
Los controles que contiene el menú formato de Word difieren de los que tiene el menú formato de Excel, lo cual
es lógico. Si sobre cualquier punto de la horizontal que representa la barra de menú hacemos clic con el botón
derecho del ratón cualquier aplicación nos permitiría ver el número de barras de herramientas disponibles para la
aplicación en si, así como cuales de ellas están visibles y cuales no o cuales podemos personalizar.
Si abriéramos un documento de texto desde el escritorio, obervaríamos que un documento de texto posee una
barra de títulos idéntica a la de Excel pero una barra de menú que solo tendría 4 menus (Archivo, Edición,
Formato y Ayuda). Si hiciéramos clic derecho en la misma, observaríamos que un documento de texto "bloc de
notas" no contiene barra de herramientas.
Si abrimos Internet Explorer, observaremos que la barra de títulos estará siempre, con la misma disposición que
la descrita al principio de este capítulo (Logotipo, Nombre del documento contenido en la aplicación, nombre de
la aplicación, minimizar, maximizar o restaurar y cerrar). Despues la barra de menús ( Ver, Favoritos y
Herramientas). Si hiciéramos clic drecho sobre la barra de menús, observaríamos que contiene entre otras la
siguientes barras de herramientas (Barra de direcciones, botones estándar, vínculos, personalizar, etc.), es decir
la barra de herramientas de MS Internet Explorer pueden ser personalizadas, pero hasta cierto punto y/o límite
ya que solo podemos variar los vínculos, la disoposición de la diferentes barras de herramientas y la disposición
y presencia de los botones dentro de la barra de heraamientas llamada "botones estandar".
También conviene recordar que Excel, Word, y el resto de aplicaciones Office siempre mantienen la última
configuración utilizada. En este sentido si ocultáramos todas la barras de herramientas y cerráramos la aplicación
la siguiente vez que abriéramos la misma aplicación todas las barras de herramientas estarían ocultas.
Tras esta introducción, podemos decir que en Excel todo es posible en cuando a barras de herramintas y barra
de menús, entendiendo como todo es posible:
1. Crear una nueva barra de herramientas personalizada
2. Modificar cualquiera de la existentes añadiendo nuevos comandos y/ menús
3. Deshabilitar controles y/o funciones
4. Cambiar el nombre de las barras personalizadas
Nosotros somos partidarios de no crear barras de herramientas en Excel debido a que simpre quedarán en el
listado de barras de herramientas salvo que las eliminemos al cerrar el libro que las creó. Est sería innecesario
ya que en lugar de crear barras de herramientas nos podemos limitar a añadir controles en la misma hoja o bien
añadir barras de herramientas POPUP.
La dinámica y el el proceso de creación de una barra de herraminta y un menú, submenú o control dentro de un
submenú es el mismo.
Cualquier menú, submenú y/o control tiene un identificador "ID" al cual podremos hacer referencia al crearlo y/o
borrarlo.
La siguiente instruccion evita que podamos personalizar y/o modificar las barras de herramientas de Excel, en
caso que ninguna estuviera visible. Con el siguiente código, no podremos visualizar ninguna barra.
CommandBars("Toolbar List").Enabled = False
Si quisiéramos volver a permitir la modificación de las barra de herramientas, tan solo necesitariamos cambiar el
False por True. En ambos casos, la función es evitar que el usuario final añada y/o modifique las Barras de
Herramientas (BH).
A la hora de crear una BH, conviene borrarla previamente, para evitar el problema derivado de crear una BH con
un nombre preexistente, por ej:
Sub BorrarToolbar()
On Error Resume Next
' Borra la barra de Herramientas llamada Exceluciones
' On error resume next evita el problema derivado en caso de que no
' hubiera ninguna barra de herramientas llamada ExceLuciones
CommandBars("ExceLuciones").Delete
End Sub
Es decir si quisiéramos crear una BH llamada "Exceluciones", sería conveniente llamar a la macro anterior
primero tal que:
Sub CrearToolbar()
Dim X As Byte
On Error Resume Next
Call BorrarToolbar ' Llamamos a la macro BorrarToolbar, para evitar problemas en código
' Creamos la barra deHerramientas
With CommandBars.Add(Name:="ExceLuciones")
.Visible = True
' esta BH tendrá 3 controles, o mejor dicho 2 controles de botón y un Dropdown control
With .Controls.Add(Type:=msoControlButton)
.Caption = "VBA"
.Visible = True
.OnAction = "SheetVBA"
.FaceId = 1954
.TooltipText = "Muestra el Editor de VBA"
.Style = msoButtonIconAndCaption
' el 1º control enseñará la imagen y el texto
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "Saludos:"
.OnAction = "Msg"
.FaceId = 1954
.BeginGroup = True
.TooltipText = "Simple Saluda!"
.Style = msoButtonCaption
' Aún cuando hemos puesto un FacedID=1954,
' al definir que solo queremos enseñar el texto y no la imagen del botón, el código
' .FaceId = 1954 no es necesario
End With
With .Controls.Add(Type:=msoControlDropdown)
' Cuando el control es ejecutado la macro MacroDiaSemana se ejecutará.
.OnAction = "MacroDiaSemana"
' el 3º control es de tipo ContolDropDown, por ello necesitamos saber los valores que tendrá
For X = 2 To 8
.AddItem Application.WorksheetFunction.Proper(Format(X, "DDDD"))
Next X
' los valores añadidos son: Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, Domingo
.ListIndex = 1
.BeginGroup = True
.TooltipText = "Que día es Hoy?!"
End With
End With
End Sub
Conviene recordar que al ejecutar esta macro crearemos una BH llamada "ExceLuciones", y al cerrar el libro,
esta BH seguirá como una de las BH de Excel, ya que no la hemos borrado antes de cerrar el libro. Es por ello
que preferimos no utilizar BH creadas con VBA, ya que todo lo que realizamos a través de ellas puede ser
realizado mediante simples comandos adjuntos en las hojas. Cómo solución podríamos utilizar una nacro de
evento que al cerrar el libro activo llamara a la macro
"BorrarToolbar", y con ello borraríamos esta BH recién creada, por ejemplo:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call BorrarToolbar
End Sub
Sub BorrarToolbar()
On Error Resume Next ' Para evitar la imposibilidad de Borrar algo que no existe.
Application.CommandBars("Exceluciones").Delete ' Borraríamos la BH "Exceluciones"
End Sub
Finalmente, si lo que queremos es utilizar una BH y no queremos utilizar eventos, también podremos utilizar
PopUps, que son BH que solo aparecen cuando una característica dada tiene lugar. Esto lo veremos en la
próxima sección.
PopUp
Si lo que queremos es utilizar una BH solo cuando, por ejemplo, hacemos clic con el botón derecho del ratón en
una hoja determinada, podemos utilizar una macro de evento que cree una BH temporal o PopUp, tal que:
Sub CrearPOPUP()
Dim CBarPOPUP As CommandBar
Dim POPUPControl As CommandBarControl
Dim SubPOPUPControl As CommandBarButton
' Borrar la Previa
Call BorrarPOPUP
Set CBarPOPUP = CommandBars.Add( _
Name:="ExceLucionesPOPUP", _
Position:=msoBarPopup, _
MenuBar:=False, _
Temporary:=False)
With CBarPOPUP
' Vamos añadiéndole diferentes botones tal que...
' 1)
Set POPUPControl = .Controls.Add(Type:=msoControlButton)
With POPUPControl
.Caption = "&Informe Ventas..."
.FaceId = 1922
.OnAction = "MacroEg"
End With
' 2)
Set POPUPControl = .Controls.Add(Type:=msoControlButton)
With POPUPControl
.Caption = "&Plan Contable..."
.FaceId = 1016
.OnAction = "MacroEg"
End With
' 3)
Set POPUPControl = .Controls.Add(Type:=msoControlPopup)
With POPUPControl
.Caption = "Paises"
.BeginGroup = True
End With
' 3.A)
Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton)
With SubPOPUPControl
.Caption = "Francia"
.FaceId = 71
.OnAction = "MacroEg"
End With
' 3.B)
Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton)
With SubPOPUPControl
.Caption = "España"
.FaceId = 72
.OnAction = "MacroEg"
End With
' 3.C)
Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton)
With SubPOPUPControl
.Caption = "Portugal"
.FaceId = 73
.OnAction = "MacroEg"
End With
End With
End Sub
Private Sub MacroEg()
MsgBox "en lugar de este mensaje hubieramos podido ejecutar nuestra macro", vbInformation,
"LOGICAMENTE..."
End Sub
Sub BorrarPOPUP()
On Error Resume Next
CommandBars("ExceLucionesPOPUP").Delete
End Sub
Al ser una BH PopUp, no necesitamos crearla cada vez que hacemos clic con el botón derecho del ratón, tal que:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Range("RangoCeldas"), Target) Is Nothing Then
Call CrearPOPUP
Application.CommandBars("ExceLucionesPOPUP").ShowPopup
' CommandBars("ExceLucionesPOPUP").ShowPopup '.showpopup
' Pues queremos observar como los comandos del boton derecho
' de nuestro raton varían
Cancel = True
End If
End Sub
Pero para ello si necesitaremos crearla al abrir el libro tal que:
Private Sub Workbook_Open()
Call CrearPOPUP
End Sub
y una vez creada, podremos visualizarla cuando lo querramos tal que:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Range("RangoCeldas"), Target) Is Nothing Then
Application.CommandBars("ExceLucionesPOPUP").ShowPopup
' Pues queremos observar como los comandos del botón derecho
' de nuestro raton varían
Cancel = True
End If
End Sub
Recordemos que esta macro de evento BeforeRightClick solo tiene lugar cuando hacemos clic con el botón
derecho del ratón estando dentro del rango definido como: Range("RangoCeldas") ya que no queremos perder la
funcionalidad del botón derecho del ratón en otros rangos.
Mostrar / Ocultar Toolbar
Del mismo modo que podemos crear y borrar un BH, también podemos ocultar y desocultar tantas BH como
querramos. Para ello utilizamos:
Sub OcultarDesocultarBH()
Dim X As Integer
Application.ScreenUpdating = False
' Para permitir la ejecución de la macro.
CommandBars("Toolbar List").Enabled = True
On Error Resume Next
For X = 1 To Application.CommandBars.Count
With CommandBars(X)
.Visible = Not .Visible
End With
Next X
On Error GoTo 0
End Sub
La macro anterior ocultaría todas las BH visibles y desocultaría todas las BH no visibles.
Deshabilitar Controles
No son pocas las veces que queremos deshabilitar ciertos controles dentro de un libro Excel dado. A veces no
queremos que nadie imprima la hoja activa, o bien queremos que nadie copie una celdas determinadas. Para
realizar esto con acierto deberemos saber:
1. Qué es una Barra de Menú
2. Personalizar una Barra de Herramientas (BH)
Volvemos a estos temas por el siguiente motivo. Si no queremos tener los controles de copiar, cortar y pegar en
ninguna de nuestras BHs...¿para que tenerlos desde el botón derecho del ratón?. Con esto queremos decir que
si queremos deshabilitar los controles de copiar, cortar y pegar, deberíamos también deshailitarlos del botón
derecho del ratón y no solo los de la barra estándar. No obstante también podríamos ir al menú Edición > Copiar
con lo que aún deshabilitando los controles de las BH, los controles del menú bar seguirían activos, como así
también CONTROL+C que es la combinación de teclas para copiar y CONTROL+V que es la combinación de
teclas para pegar.
En definitiva, para deshabilitar todos los controles de copiar deberíamos:
1) Saber si existe alguna combinación de teclas que ejecuten la acción que queremos evitar y deshabilitarla.
Luego al cerrar el libro esto se hace tal que:
Application.OnKey "^C", ""
Application.OnKey "^C"
' Con esto deshabilitaríamos las teclas Control + C
' Con esto re-habilitaríamos las teclas Control + C
2) Deshabilitar los contoles de copiar en cada una de las BH disponibles en Excel. Esto se hace dela siguiente
forma:
Sub DeshabilitaCiertosControles()
Dim CBControl As CommandBarControl
Dim CBar As Integer
Dim MyArray
Dim X As Byte
Application.ScreenUpdating = False
MyArray = Array(19, 21, 22)
On Error Resume Next
' Para Deshabilitar los controles definidos en el array MyArray
For CBar = 1 To Application.CommandBars.Count
For Each CBControl In CommandBars(CBar).Controls
For X = LBound(MyArray) To UBound(MyArray)
Application.CommandBars(CBar).FindControl(ID:=MyArray(X), Recursive:=True).Enabled = False
Next X
Next CBControl
Next CBar
Application.CommandBars("PLY").Enabled = False
CommandBars("Toolbar List").Enabled = False
On Error GoTo 0
End Sub
Hemos utilizado un array de los identificadores de los comandos que queremos deshabilitar que son 19,21,22 es
decir, Copiar, Cortar y Pegar respectivamente. Una vez que hemos deshabilitado todos los controles con estos
ID, necesitamos a su vez realizar el siguiente paso...
3) Evitar la personalización:
CommandBars("Toolbar List").Enabled = False
Ya que de lo contrario podríamos volver a personalizar nuestras BH e incluir los controles 19, 21 y 22 en
cualquier BH bien sea personalizada o de las que trae Excel, por ej Estándar.
4) Deshabilitar copiado de hoja:
Application.CommandBars("PLY").Enabled = False
Deberemos deshabilitar al mismo tiempo la copia de la hoja desde el botón derecho del ratón en los tabuladores
(etiquetas) de hoja, pues de lo contrario lo realizado hasta ahora sería inservible.
5) Deshabilitar opciones del botón derecho del reatón:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
End Sub
Como hemos mencionado en repetidas ocasiones el botón derecho del ratón siempre tiene las opciones de
copiar, cortar y pegar con lo que es más sencillo directamente deshabilitar por completo la opción de botón
derecho del ratón.
Sin embargo, todo lo realizado sigue sin ser óptimo, ya que desde el menú Edición tenemos la posibilidad de
mover o copiar la hoja. Es decir que necesitaríamos saber todos los controles que sirven para realizar lo mismo,
o que pueden servir para de alguna manera llegar a evitar el fin pretendido. E incluso, si conociéramos todos los
ID's, luego quedaría la posibilidad de acceder al editor de VBA y desde aquí habilitar los comandos
deshabilitados. Puede que lleguemos a la conclusión que finalmente es imposible, pero no lo es, tan solo lleva
tiempo, y ademas el 99,9% de lo usuarios no emplearán el tiempo requerido para volver a habilitar algo, que el
creador haya querido deshabilitar. De hecho muchos programadores nunca protegen su código teniendo en
cuenta que existen herramientas con las que se podría crackear fácilmente las claves e protección.
Como alternativa recurrente podriamos crear un menú bar carente de funcionalidad y evitar el acceso a VBA,
deshabilitar el botón derecho del ratón también en los tabuladores de hoja tal que:
Public Sub MakeMenuBar()
Dim X As Byte
Dim ABC As String
ABC = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"
Dim CBar As CommandBar
Call DeleteMenuBar
For Each CBar In CommandBars
' Borramos las barras visibles
If CBar.Type = msoBarTypeNormal Then CBar.Visible = False
Next CBar
Set CBar = CommandBars.Add(MenuBar:=True)
With CBar
.Name = "MenuPARIA"
.Visible = True
End With
Application.VBE.MainWindow.Visible = False
Application.CommandBars("PLY").Enabled = False
' Para deshabilitar los comandos tales como "CONTROL+P" es decir PRINT
' Nos faltarían todavía algunos pero...
For X = 1 To Len(ABC)
Application.OnKey "^" & Mid(ABC, X, 1), ""
Application.OnKey "^" & LCase(Mid(ABC, X, 1)), ""
Application.OnKey "%" & Mid(ABC, X, 1), ""
Application.OnKey "%" & LCase(Mid(ABC, X, 1)), ""
Next X
' Tampoco hemos deshabilitado los ALT+F1, F2,...
' Application.SendKeys ("%q")
CommandBars("Toolbar List").Enabled = False
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
' Utilizamos este código porque si el commandbar PLY esta activo no merece la pena deshabilitar el botón
derecho.
If Application.CommandBars("PLY").Enabled = True Then Exit Sub
Cancel = True
End Sub
Recordemos nuevamente que cualquier ExcelManíaco podría sin gran dificultad habilitar cualquier comando y/o
control previamente deshabilitado.
Menús
Podemos personalizar o adaptar nuestros propios menús y barras de herramientas dentro de Excel. En este
capítulo veremos como hacerlo.
Crear menú
La creación de un menú no varía con respecto a la creación de una barra de herramientas (BH). Ahora bien,
siempre debe haber una barra de menú visible, mientras que las BH pueden estar todas ocultas. Se puede crear
una barra de menú totalmente nueva, o bien utilizando la existente, la que excel agrega y muestra por defecto,
añadir nuevos menús y o submenus, o bien podemos añadir nuevos controles a un menu existente.
Como norma general, aunque no escrita, si quisiéramos agregar un nuevo menú a nuestra barra de menús (por
ej. el menú "Exceluciones"), los menus agregados se colocan antes del menu ayuda de excel llamado "?" (el
menú que viene después del menú "Ventana").
El siguiente ejemplo muestra como podemos crear un menú "Exceluciones" en Excel.
Al igual que cuando creamos las BH, para crear un menú deberemos borrarlo previamente, para evitar el error de
compilación derivado de crear un menú que ya existe.
Sub BorrarMenu()
On Error Resume Next
Application.CommandBars("Worksheet Menu Bar").Controls("ExceLuciones").Delete
End Sub
Sub CrearMenu()
Dim HelpMenu As CommandBarControl
Dim MenuNuevo As CommandBarPopup
Dim MenuItem As CommandBarControl
Dim SubmenuItem As CommandBarButton
' Borra el Menu "Exceluciones" llamando a otra macro
Call BorrarMenu
' Busca por el menú Ayuda, esto es simplemente un convenio no firmado entre programadores
' para los cuales cualquier menu creado y añadido debe ir antes que el menu llamado Ayuda y/o Help, el cual
tiene como ID =30010
Set HelpMenu = Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30010)
If HelpMenu Is Nothing Then
' Añade el menu "Exceluciones" al final
Set
MenuNuevo
=
Application.CommandBars("Worksheet
Bar").Controls.Add(Type:=msoControlPopup, Temporary:=True)
Menu
Else
' Si Ayuda existe, entonces antes que el menu "?" es decir ID=30010
Set
MenuNuevo
=
Application.CommandBars("Worksheet
Bar").Controls.Add(Type:=msoControlPopup, Before:=HelpMenu.Index, Temporary:=True)
End If
' Llamamos al nuevo Menu creado... "E&xceluciones"
Menu
' hemos colocado un & antes que la "x" para que la "x" esté subrayada y podamos acceder al menú no
solamente con el ratón sino desde el teclado con la combinacion de teclas "ALT + X"
MenuNuevo.Caption = "E&xceluciones"
' Y vamos añadiéndole diferentes botones y/o controles tal que...
'1)
Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlButton)
With MenuItem
.Caption = "&Informe Ventas..."
.FaceId = 176
.OnAction = "MacroEjemplo"
' esta será la macro que ejecutaremos al hacer clic sobre el botón
"&Informe Ventas...", o cuando utilicemos la combinación de teclas "ALT +X...ALT+I"
End With
'2)
Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlButton)
With MenuItem
.Caption = "&Plan Contable..."
.FaceId = 36
.OnAction = "MacroEjemplo"
End With
'3)
Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlPopup)
With MenuItem
.Caption = "Países"
.BeginGroup = True
End With
'3.A) Del mismo modo que añadimos controles, podemos añadir subcontroles
' y dentro de estos podríamos añadir a su vez más subcontroles, aunque no es aconsejable
Set SubmenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
With SubmenuItem
.Caption = "Francia"
.FaceId = 71
.OnAction = "MacroEjemplo" 'Estamos utilizando la misma macro, pero lógicamente, se suelen colocar
tantos botones como macros querramos utilizar,
End With
'3.B)
Set SubmenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
With SubmenuItem
.Caption = "España"
.FaceId = 72
.OnAction = "MacroEjemplo"
End With
'3.C)
Set SubmenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
With SubmenuItem
.Caption = "Portugal"
.FaceId = 73
.OnAction = "MacroEjemplo"
End With
Sheets("Crear MenuExceLuciones").Shapes("ImgMenu").Visible = True
End Sub
Esta es la macro que hemos creado para que sea ejecutada al hacer clic sobre cualquier control del menú
creado:
Private Sub MacroEjemplo()
MsgBox "en lugar de un mensaje hubieramos podido...", vbInformation, "LOGICAMENTE..."
End Sub
Haber decidido colocar el menu "Exceluciones" antes que el menú y/o control Ayuda "?" no significa que
debamos hacerlo siempre asi. Pero debemos de saber el ID del menú para poder maniobrar sobre el y/o con el.
30002 =&Archivo
30003 =&Edición
30004 =&Ver
30005 =&Insertar
30006 =&Formato
30007 =&Herramientas
30011 =Da&tos
30083 =A&cción
30009 =Ve&ntana
30010 =&?
Agregar Controles al menú
Ahora agregaremos controles a un menú Excel predeterminado, ya que agregar controles a un menu personal,
es decir un menu nuevo, ya lo hemos realizado en el la sección anterior.
Debemos de saber el ID del menú sobre el que vamos a trabajar y/o en su defecto su nombre y/o caption:
30002 =&Archivo
30003 =&Edición
30004 =&Ver
30005 =&Insertar
30006 =&Formato
30007 =&Herramientas
30011 =Da&tos
30083 =A&cción
30009 =Ve&ntana
30010 =&?
En el siguiente ejemplo insertamos un nuevo control en el Menu Insertar, y le adjuntamos una macro sencillita
para cuando el control creado sea ejecutado y/o clicado a través del ratón o a través de teclado con el metodo
abreviado de teclas "Conbinación de teclas":
Sub AñadirControl_al_MenuXX()
Dim MenuXX As CommandBarPopup
Dim nuevoControl As CommandBarButton
' Elimina el Control si existiera:
Call DeleteMenuControl
' Encontrar el Menu Insertar:
Set MenuXX = Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30005)
' Buscamos por el Menu Insertar y en caso de que no existiera, EXIT
' Lógicamente el menu "Insertar" debería estar siempre, pero nos aseguramos...
If MenuXX Is Nothing Then
MsgBox "Parece que su Barra de Menu, no Contiene el Control Insertar", vbInformation, "ATENCION"
Exit Sub
End If
Set nuevoControl = MenuXX.Controls.Add( _
Type:=msoControlButton)
' before:= en caso de que quisiéramos colocarlo no en el final, sino
' antes que el control llamado "Com&entario"
' Set nuevoControl = MenuXX.Controls.Add( _
Type:=msoControlButton, _
Before:=Application.CommandBars("Insert").Controls("Com&entario").Index)
With nuevoControl
.Caption = "Insertar Mensaje E&xceLuciones"
.BeginGroup = True
.FaceId = 1589
.OnAction = "MsgBox_Hola"
End With
End Sub
Sub DeleteMenuControl()
On Error Resume Next
Application.CommandBars("Worksheet
E&xceLuciones").Delete
End Sub
Menu
Bar").FindControl(ID:=30005).Controls("Insertar
Mensaje
Sub MsgBox_Hola()
MsgBox Chr(10) & "Un Feliz AÑO Nuevo!!!", _
vbInformation, _
"Exceluciones le desea:"
End Sub
Conviene recordar que si ejecutáramos esta macro y no borráramos el control creado al cerrar el libro, luego si
fuéramos al menú Insertar e hiciéramos clic sobre el control "Insertar Mensaje E&xceLuciones", Excel
automáticamente abriría el libro que contiene la macro que hemos ordenado que se ejecute. Es por ello que los
menús nuevos y/o personalizados se aportan como complementos o bien se borran cuando el libro que los creó
se cierra.
También debemos recordar que podemos hacer eferencia a un menú por su nombre y/o por su identificativo (es
decir su ID). Los ID no variarán de país a país (versiones de Excel en distintos idiomas) mientras que los
nombres puede que si !.
Comandos
En este capítulo se explicarán algunos comandos útiles que suelen utilizarse con frecuencia en las macros.
Mensajes de alerta
Los mensajes de alerta son avisos que dispara Excel antes de realizar determinadas acciones. Por ejemplo, al
intentar borrar una Hoja, nos aparece una aviso de confirmación. A nivel de macros, es importante tenerlos
presentes, tal como vemos a continuación:
Sub BorrarHoja()
' Borramos una hoja
ActiveSheet.Delete
' Pero esto requiere la confirmacion por parte del usuario...
' Para evitar el mensaje de alerta, ya que Excel siempre nos pedirá confirmación,
' bastará con utilizar la siguiente instrucción:
Application.DisplayAlerts = False
' Con lo cual ahora sí podremos borrar la hoja dada sin necesidad de confirmación
ActiveSheet.Delete
' Finalmente dejamos a Excel en su estado original de mostrar los mensajes
Application.DisplayAlerts = True
End Sub
Es importante recordar que el Application.DisplayAlerts=False siempre debe ir antes de la acción que requiere
confirmación. Al final de la macro conviene volver a asignarle la propiedad True.
Barra de estado
La barra de estado de Excel es la que figura en la parte inferior y suele mostrar distintos mensajes. Esta barra se
puede mostrar u ocultar desde el menú Ver > Barra de estado.
Usualmente la Barra de estado muestra la palabra Listo, tal como se ve a continuación:
En otros casos, la misma cambia el mensaje mostrado, según la operación que estemos por realizar. Por
ejemplo, si seleccionamos un rango y lo copiamos, la barra de estado daría una instrucción como la que se ve a
continuación:
Es posible cambiar el mensaje de la Barra de estado mediante código VBA. A continuación se exponen algunas
instrucciones para saber como manipularla y modificarla:
Sub BarraEstado()
' Si queremos ver la barra de estado original
Application.DisplayStatusBar = True
' Si NO queremos verla bastará con:
Application.DisplayStatusBar = False
' Por defecto la Barra de estado siempre estará Visible, es decir:
Application.DisplayStatusBar = True
' Si queremos que la barra de estado muestre un mensage diferente bastará con:
Application.DisplayStatusBar = "Hola que tal estas??"
' Si queremos que la Barra de Estado este limpia, es decir sin mensaje alguno:
Application.DisplayStatusBar = ""
End Sub
Msgbox
Un Msgbox es simplemente una ventana que muestra un mensaje. Por ej., con la siguiente instrucción
mostraríamos un saludo:
Sub Saludo()
' Escribimos el mensaje entre comillas
Msgbox "Hola, Excel te saluda!"
End Sub
El mesaje anterior se vería así en la hoja Excel:
En este otro ejemplo, el mensaje lo tomamos de una celda Excel:
Sub Saludo()
' El mensaje mostrará el contenido de la celda A1
Dim M as Variant
M = range("A1").value
Msgbox M
End Sub
También es posible dar formato y aplicar otras propiedades al Msgbox, tal como se ve explica continuación:
Sub MacroMensajes()
' Los mensajes que excel puede lanzar se rigen por:
' Prompt:="Me llamo Pedro." Enseñaria el mensaje...
' Buttons:= VbInformation, O bien
' Buttons:= 64
' con lo cual Buttons ----> Muestra el icono de mensaje de información.
' Title:="Exceluciones:", el título que adjuntaríamos al mensaje
MsgBox Prompt:="Me llamo Pedro.", Buttons:=vbInformation, Title:="Exceluciones:"
End Sub
La macro anterior mostraría un mensaje como el siguiente:
Por defecto, un Msgbox siempre incluye el botón "Aceptar", el cual haría desaparecer el mensaje y continuaría
ejecutando el código restante si lo hubiera. También podemos configurar para que en lugar del botón "Aceptar"
aparezca un botón de "Ok" y "Cancelar" y de acuerdo al que elija el usuario, la macro continuaría con un código u
otro código. Esto lo realizamos agregando la instrucción vbOKCancel, tal como vemos a continuación:
Sub Mensaje()
Dim Respuesta As Integer
Respuesta = MsgBox("Seleccione Aceptar o Cancelar", vbOKCancel)
' verificamos si se presionó "Cancelar"
If Respuesta = vbCancel Then
MsgBox "Macro caso Cancelar" ' Aquí continuaría la macro en caso de Cancelar
End If
' si se presionó "Aceptar"
If Respuesta = vbOK Then
MsgBox "Macro caso Aceptar"
' Aquí continuaría la macro en caso de Aceptar
End If
End Sub
El Msgbox anterior se vería así:
y al presionar "Aceptar" o "Cancelar" veríamos otro Msgbox.
Si quisiéramos separar en varias líneas el mensaje, deberíamos hacerlo con la instrucción &Chr(13):
Sub Mensaje()
MsgBox "Este es un mensaje " & Chr(13) _
& "escrito en 2 líneas"
End Sub
El mensaje anterior se vería así:
Inputbox
Un InputBox se utiliza cuando requerimos un input del Usuario (es decir, cuando esperamos que el usuario
introduzca un dato). Básicamente lo que hacemos es asignarle un valor a una variable, pero le damos el control
al usuario para que asigne dicho valor o dato a gusto.
Dentro del InputBox utilizamos las siguientes instrucciones:
Prompt: mensaje del InputBox
Title: título del InputBox
Default: valor por defecto al abrir el InputBox (si omitimos no aparecerá nada)
Type: indica el tipo de dato a introducir (1
Número, 2 Texto, 4 True o False, 5 Rangos)
Vamos ahora como queda el InputBox:
Sub Nombre()
' el dato que proporcionará el usuario quedará registrado por la Variable Respuesta. Como no sabemos que tipo
de dato es lo definimos como una variable de tipo Variant.
Dim Nombre As Variant
Nombre = Application.InputBox(prompt:="Escriba su nombre", Title:="Colegio de Abogados", Default:="Pedro",
Type:=2)
Msgbox Nombre ' En lugar de este Msgbox continuaría el resto de la macro...
End Sub
El InputBox anterior se verá así:
Fin
Aquí finaliza la 2º Parte del Manual.

Documentos relacionados