Documentos de Académico
Documentos de Profesional
Documentos de Cultura
com
Copyright
Todos los nombres propios de programas, sistemas operativos, equipos de hardware, etc. que aparecen en este curso son marcas registradas de
sus respectivas compañías.
Reservados todos los derechos. El contenido de esta obra está protegido por ley, que establece penas de prisión y/o multas, además de las
correspondientes indemnizaciones por daños y perjuicios, para quienes reprodujeren, plagiaren, distribuyeren o comunicasen pú blicamente, en
todo o en parte, una obra literaria, artística o científica, o su transformación, interpretación o ejecución artística fijada en cualquier tipo de soporte o
comunicada a través de cualquier medio, sin la preceptiva autorización.
Todos los contenidos del Curso de Macros VBA Excel Copyright ©2.008 por TodoEXCEL.
1
www.todoexcel.com
Contenido
1. INICIO ..................................................................................................................................................................... 9
2. TEORIA .................................................................................................................................................................. 11
2.1. INTRODUCCION.................................................................................................................................................. 12
2
www.todoexcel.com
3. MACROS ............................................................................................................................................................... 97
5. EXTRAS................................................................................................................................................................ 223
8
www.todoexcel.com
1. INICIO
1.1. Presentación
Solo requieres de un PC
No pierdes tiempo en traslados
Lo haces a tu propio ritmo
Lo puedes consultar desde cualquier lugar
No contiene farragosos y pesados apuntes en papel
Lo tienes siempre disponible a tan solo un clic
Posee un potente buscador de contenidos
Contiene variados elementos multimedia
Permite navegar los contenidos más fácilmente
TEORIA: si eres principiante debes comenzar por aquí. En esta sección te explicaremos lo básico y
elemental para poder comenzar a entender el mundo de las macros. La sección está debidamente
ilustrada con fotos a todo color y explicaciones sencillas y fáciles de seguir.
MACROS: si ya dominas la teoría o eres nivel intermedio deberías continuar en esta sección. En la
misma se explican las principales macros o rutinas que debes conocer. Hemos hecho un "barrido"
por todos los temas o necesidades que podrías tener a la hora de programar.
LIBRERIA: en esta sección ponemos a tu disposición una "librería de macros". Una librería no es más
que una forma de ir guardando todas aquellas macros de interés que vas creando en tus desarrollos.
Muchas de ellas las necesitarás nuevamente así que para no tener que empezar de cero, lo ideal es
ir guardándolas en una librería de fácil acceso. Nuestra librería pretende ir creciendo día a día, tanto
con nuestros propios aportes como con los tuyos !
EXTRAS: esta sección es una recopilación muy interesante de diferentes recursos y macros vba que
se obtienen en la web. No te preocupes porque nos hemos tomado el trabajo de recopilarlas y
ponerlas a tu disposición de forma ordenada.
9
www.todoexcel.com
Sobre el autor
"TodoExcel" está formado por un grupo de expertos en hojas de cálculo Excel. Somos unos
"enamorados" de Excel y las posibilidades que ofrece. Hemos trabajado muchísimos años con este
programa y todavía no dejamos de sorprendernos con las maravillas que permite hacer.
Nuestra experiencia proviene de haber trabajado de forma intensiva con Excel, construyendo todo
tipo de modelos, plantillas y soluciones a medida. Nuestra misión es ser "los más entendidos en
hojas de cálculo Excel" para lo cual nos esforzamos día a día en conocer y divulgar mejor esta
herramienta y sus posibilidades.
Confiamos en tener el mejor equipo de expertos en Excel, con especialistas en funciones y fórmulas,
macros vba, tablas y datos y todas las herramientas y opciones en general que ofrece Excel.
Si deseas conocer mejor a nuestro equipo, puedes visitar nuestra web para mayor información.
10
www.todoexcel.com
2. TEORIA
En la primera parte de este curso veremos la teoría respecto a la programación de macros. Dominar
la teoría es sumamente importante para luego poder entrar a la parte práctica y comprender las
macros más rápido y mejor.
11
www.todoexcel.com
2.1. INTRODUCCION
Bienvenido al Curso de Macros de TodoEXCEL. 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.
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 curso 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 curso 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 buena forma de introducirnos al mundo de las macros es con una definció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 curso (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!
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 curso, pero a grandes rasgos podemos comentar que las 4 grandes "áreas"
donde se aplican las macros son:
12
www.todoexcel.com
1. 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...
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,…).
13
www.todoexcel.com
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 curso. En la medida que adquieras mayores
conocimientos sobre como programar macros iras 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.
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.
14
www.todoexcel.com
En la medida que avances con la lectura de este curso te irás familizarizando 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 curso 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!
15
www.todoexcel.com
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.
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. Veras como aparece una nueva barra
de herramientas de macros. Puedes ubicar esta barra de herramientas donde te sea más cómodo.
16
www.todoexcel.com
Excel 2.007
En la nueva versión de Excel, las opciones del menú de macros se encuentran en la ficha
programador,.
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:
Excel 2.007
1. Desde la ficha Programador > botón Visual Basic
2. Desde el teclado (Teclas de Método Abreviado): ALT+F11
(el acceso a la ficha programador lo explicamos en la sección anterior)
Nuestra forma preferida de acceder al editor de macros es con las teclas ALT + F11
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). Puedes mostrar u ocultar estas ventanas desde el menú Ver.
17
www.todoexcel.com
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.
18
www.todoexcel.com
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 e Inmediato las dejaremos
para más adelante.
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).
19
www.todoexcel.com
Si estas 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).
20
www.todoexcel.com
1. Escribirla manualmente
2. Utilizar la grabadora de macros
3. 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)
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.
¿qué significa esto? Que comenzaremos con una hoja Excel vacía y luego de ejecutar la macro veras
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.
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.4 Doble clic en Hoja1 (Hoja1) para empezar a escribir el código de la macro.
2. Escribimos la macro
2.1 En la ventana de macros escribe textualmente el siguiente código:
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. Así es como debe quedar todo:
*Nota: si la ventana de tu editor tiene una instrucción "Option Explicit" escrita en la parte superior,
no le presetes atención, puedes dejarla. Más adelante te explicaremos que significa.
22
www.todoexcel.com
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
exáctamente lo que queríamos hacer con nuestra macro, así que tarea cumplida. Hemos escrito un
valor en una celda excel desde una macro !
23
www.todoexcel.com
Excel 2.007
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:
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 veras 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 !
24
www.todoexcel.com
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:
Esta macro tiene 4 líneas de código, por eso es tan sencilla (cuando termines este curso 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.
- 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.
25
www.todoexcel.com
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.
- 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 curso 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 A10 de Excel asignarle el valor 1500.
Recuerda: siempre debes hacer referencia a un objeto para luego asignarle propiedades o
métodos.
26
www.todoexcel.com
2.3.5. 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í:
5. Finalmente abrimos el menú de macros con ALT+F8, seleccionamos MiPrimeraMacro desde la lista
de nombres y presionamos Ejecutar.
27
www.todoexcel.com
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.
28
www.todoexcel.com
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.
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 curso 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
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
29
www.todoexcel.com
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.
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 curso irás aprendiendo nuevos objetos,
propiedades y métodos.
30
www.todoexcel.com
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 !
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.
¿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.
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:
31
www.todoexcel.com
1.4 Donde dice Nombre de la macro 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.
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.
32
www.todoexcel.com
* Podrás obsevar 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.
33
www.todoexcel.com
Excel 2.007
1. Vamos a grabar la macro
1.1 Vé a la ficha Programador > Grabar macro
1.4 Donde dice Nombre de la macro 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. Detener la grabación
Para terminar de grabar, debemos presionar el botón de detener grabación
34
www.todoexcel.com
* 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.
2.4.3. 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:
35
www.todoexcel.com
Llegados a este punto, interesa ver las diferencias entre la macro escrita manualmente y la grabada
automáticamente.
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:
36
www.todoexcel.com
Excel 2.003
Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub
37
www.todoexcel.com
Excel 2.007
' Esta macro escribe el valor 1500 en la 2.2 El código que se grabó automáticamente fue el
celda A1 siguiente:
Sub MiPrimeraMacro()
Range("A1").Value=1500 Sub MiPrimeraMacro()
End Sub '
' MiPrimeraMacro Macro
' Esta macro escribe el valor 1500 en A1
Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub
38
www.todoexcel.com
2.4.5. 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:
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
39
www.todoexcel.com
seeción siguiente veremos que el método a utilizar dependerá de cada situación particular. Además,
hay muchas cosas que la grabadora de macros no puede hacer.
2.4.6. Conclusión
En las 2 secciones anteriores vimos dos tablas comparativas de los 2 métodos que tenemos para
crear una macro:
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 disminuya 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
Macro grabada
Sub MiPrimeraMacro()
Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub
40
www.todoexcel.com
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 curso para hacerte la vida lo más fácil posible. La buena noticia es que este curso
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 curso (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 curso, 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 curso.
41
www.todoexcel.com
¿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:
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.
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
querramos 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
42
www.todoexcel.com
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 curso 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.
2.5.1. Macro 1
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 curso están las macros más
importantes que podrás necesitar, escritas, comentadas y listas para que las puedas copiar, pegar
y adaptar en tus propios desarrollos.
43
www.todoexcel.com
2.5.2. Macro 2
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).
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 curso 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.
2.5.3. Macro 3
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:
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 curso 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.
45
www.todoexcel.com
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.
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:
No importa si no ves todas las ventanas (se pueden mostrar u ocultar desde el menú "Ver"). En las
secciones siguientes te explicaremos la utilidad de cada una de estas ventanas.
Veamos una foto para ver como se ve la ventana de Proyecto. Si no la puedes visualizar esta
ventana 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:
Proyectos
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.
Carpetas
En un segundo nivel tenemos 3 carpetas:
- Microsoft Excel Objetos
- Formularios
47
www.todoexcel.com
- Módulos.
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.
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.
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.
48
www.todoexcel.com
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 lso 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 curso.
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:
49
www.todoexcel.com
Esta ventana no tiene mayores complicaciones. Lo que interesa es más bién 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
contínua cada macro.
En la medida que empecemos a escribir muchas macros, existe una forma rápida de movernos entre
ellas. Desde la lista desplegable de la parte superior derecha podremos ver la lista de macros
escritas. Haciendo clic en cualquiera de ellas el editor nos posicionará rápidamente en la misma.
50
www.todoexcel.com
La ventana inmediato sirve para escribir, ejecutar y probar un código macro rápidamente, sin tener
que armar toda la macro con la estrucuta 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:
51
www.todoexcel.com
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).
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:
52
www.todoexcel.com
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.
53
www.todoexcel.com
En varias secciones de este curso 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".
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.
Otra forma de ejecutar una macro es desde el menú de macros, que lo puedes visualizar
presionando ALT+F8
Verás que se abre un cuadro como el siguiente:
54
www.todoexcel.com
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 habras tus libros Excel. Es
una opción muy útil por si tienes macros que quieres utilizar en todos tus libros Excel (solo estárán
disponibles en tu PC).
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
siguiente:
55
www.todoexcel.com
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 pegar, 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.
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.
56
www.todoexcel.com
Excel 2.003: desde el menú Ver > Barra de Herramientas > Dibujo. Esto muestra un menú como el
siguiente:
Excel 2.007: desde la ficha Insertar > Formas. Esto muestra un menú como el siguiente:
Si ya has insertado una figura en tu hoja Excel, podrás asociarle una macro siguiendo estos pasos:
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.
57
www.todoexcel.com
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.
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:
58
www.todoexcel.com
59
www.todoexcel.com
2.7.6. 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 siguiente capítulo Macros de Eventos.
60
www.todoexcel.com
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.
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.
1. Las macros de eventos se deben escribir en la carpeta ThisWorkbook del editor de macros.
61
www.todoexcel.com
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:
End Sub
Al seleccionar una macro de vento el editor escribe automáticamente la primera y útlima 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:
62
www.todoexcel.com
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 del menú de 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:
63
www.todoexcel.com
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.
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.
3. Finalmente, en la lista desplegable de la derecha veremos todos los eventos de hoja que podemos
utilizar para disparar nuestra macro automáticamente.
64
www.todoexcel.com
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:
End Sub
Al seleccionar una macro de evento el editor escribe automáticamente la primera y útlima 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:
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 del menú de 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.
65
www.todoexcel.com
Existen unas 9 macros de evento a nivel hoja. Puedes insertarlas siguiendo las instrucciones dadas al
comienzo. Las más importantes son:
66
www.todoexcel.com
2.9. FORMULARIOS
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).
67
www.todoexcel.com
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.
68
www.todoexcel.com
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.
69
www.todoexcel.com
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.
70
www.todoexcel.com
ComboBox (cuadro combinado): 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 (cuadro de lista): sirve para que un usuario rellene o elija varias opciones de una lista.
Ejemplo: creamos una lista con Regiones o Ciudades y el usario deberá elegir una o varias de ellas.
CheckBox (casilla de verificación): 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 (botón de opción): 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 (botón de alternar): 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 (marco): 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 gurpo de opciones del tipo Mayor de Edad / Menor de Edad los agrupamos
dentro de otro Frame.
71
www.todoexcel.com
CommandButton (botón de comando): 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.
ScrollBar (barra de desplazamiento): 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.
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.
72
www.todoexcel.com
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.
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.
73
www.todoexcel.com
74
www.todoexcel.com
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.
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 y luego hacemos clic en el Userform, en la parte donde
querramos ubicarlo.
75
www.todoexcel.com
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.2 En el Userform hacemos clic a la izquierda del TextBox, para agregar la Etiqueta de texto.
76
www.todoexcel.com
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.
Agregamos los cuadros de texto y las etiquetas restantes (ya lo hicimos para el nombre así que
repetimos para Edad y Fecha de Nacimiento).
* Un TextBox cuyo (Name) sea UFEdad, con una Etiqueta llamada "Edad"
* Un TextBox cuyo (Name) sea UFFecha, con una Etiqueta llamada "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.
77
www.todoexcel.com
Para permitir que el usuario ejecute una acción, se pueden agregar un Botón de comando. Nuestro
Userform tendrá un botón para Agregar los datos a la tabla Excel y otro botón para Cerrar el
Userform.
Es muy importante que no olvides asignar bien los nombres (Name) a los Botones de comando, 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.
78
www.todoexcel.com
'limpa 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.
79
www.todoexcel.com
9.4 En el menú superior elegimos Ver > Objeto para regresar al Userform.
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 camabiarlo:
Podemos agregar un botón para que un usuario pueda ejecutar el Userform desde la hoja Excel.
81
www.todoexcel.com
2.10. VARIOS
En este capítulo se comentan temas diversos pero que no dejan de ser importantes sobre macros.
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 simplemento 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
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
82
www.todoexcel.com
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
End Sub
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 vé 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
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:
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 estrucutras 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
curso, capítulo "Estrucuturas".
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 caracter). 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
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 esctructura estaba incompleta, nos faltó el
84
www.todoexcel.com
End If (existe una estructura If - End If que se explica mejor en la 2º parte del curso, 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.
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.
85
www.todoexcel.com
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).
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. De este modo, cada vez que abras el Excel, el
complemento estará activo.
Excel 2.007
Para visualizar los complementos instalados, puedes hacerlo desde la ficha Complementos, y verás
un cuadro similar al que se muestra a continuación (los complementos visibles dependen de los que
tengas activados, en nuestro caso solo tenemos activado un complemento llamado "ASAP Utilities").
86
www.todoexcel.com
Si quieres instalar nuevos complementos, deberás hacerlo desde el menú Office > Opciones de Excel
> Complementos. Con el botón Ir podrás abrir el cuadro de complementos.
87
www.todoexcel.com
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).
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. De este modo, cada vez que abras el Excel, el
complemento estará activo.
Las opciones de seguridad de macros han cambiado considerablemente en la nueva versión Excel
2.007.
Excel 2.003
Excel posee 3 niveles de seguridad de macros. Los mismos se pueden definir desde el menú
Herramientas > Opciones > pestaña Seguridad > botón Seguridad de macros. El cuadro de diálogo
que se abre se ve así:
88
www.todoexcel.com
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.
Excel 2.007
Esta versión de Excel posee gran cantidad de novedades respecto a temas de seguridad. En primer
lugar, las opciones de niveles de seguridad de macros las encontramos en el menú Office > Opciones
de Excel > Centro de confianza > Configuración del Centro de confianza tal cual se ve a
continuación:
89
www.todoexcel.com
Al presionar el botón de Configuración del Centro de confianza aparece una nueva ventana en la cual
debemos elegir de Configuración de macros (parte izquierda) y luego seleccionar la opción
Deshabilitar todas las macros con notificación. Esto hará que cada vez que se abra un libro con
macros, aparezca un mensaje notificando de las mismas y dando la opción de habilitarlas o
deshabilitarlas.
90
www.todoexcel.com
Otra opción muy interesante que ofrece Excel 2.007 es la de generar "Carpetas de confianza", de tal
modo que para cualquier archivo que esté guardado en esas carpetas, se habilitarán
automáticamente las macros (nos evitaremos el molesto mensaje de "Habilitar macros"). Para
configurar esto vamos al Centro de Confianza, seleccionamos Ubicaciones de confianza y luego
indicamos una carpeta desde el botón de Agregar nueva ubicación...
Excel 2.003
Cuando se abre un libro Excel que contiene macros, aparece un mensaje de aviso indicando si se
desean habilitar o deshabilitar las mismas.
91
www.todoexcel.com
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.
92
www.todoexcel.com
Recuerda que puedes visualizar las macros de tu libro presionando ALT+F8. 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 deseas ocultar 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:
93
www.todoexcel.com
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:
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:
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í
Application.ScreenUpdating=True
End Sub
Al final, volvemos a dejarla en True, que es como debe quedar por defecto.
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í
94
www.todoexcel.com
Application.Calculation = xlCalculationAutomatic
End Sub
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
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
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 intrucciones 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
95
www.todoexcel.com
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
96
www.todoexcel.com
3. MACROS
En esta parte del curso veremos casos prácticos de macros, listas para utilizar o adaptar.
97
www.todoexcel.com
3.1. Importante
Antes de comenzar con esta 2º parte del curso, 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 curso, que contiene la teoría para principiantes.
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.
98
www.todoexcel.com
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
99
www.todoexcel.com
3.2. 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.
Sub MiNombre ()
' Indicamos que 'Nombre' es una variable 'String' (texto)
Dim Nombre As String
' Le asignamos 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.
3.2.1. 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 ovbiamante 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.
100
www.todoexcel.com
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.
3.2.2. 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:
101
www.todoexcel.com
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.
Sub MacroMensaje()
MsgBox saludo
MsgBox despedida
End Sub
102
www.todoexcel.com
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()
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).
3.2.3. Tipos
La tabla siguiente muestra los tipos de datos compatibles, incluyendo el tamaño de almacenamiento
y el intervalo.
103
www.todoexcel.com
Variant (con caracteres) bytes + longitud de la cadena mismo intervalo que para un tipo String de
longitud variable
Definido por el usuario número requerido por los elementos intervalo de cada elemento es el mismo que el
(utilizando Type) intervalo de su tipo de datos.
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
104
www.todoexcel.com
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
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
Option Explicit
Sub Macro()
105
www.todoexcel.com
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.
3.2.4. 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 = "TodoEXCEL"
ActiveCell = Autor
End Sub
106
www.todoexcel.com
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.
3.2.5. 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:
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:
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.
107
www.todoexcel.com
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.
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
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.
108
www.todoexcel.com
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
3.2.6. 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:
El hecho de que ambas macros utilicen una variable llamada x no significa que hagan referencia a la
misma variable, tan solo se llaman igual, de hecho a medida que la macro1 vaya ejecutándose x en
el primera macro ira desde 1 hasta 25 mientras 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()
109
www.todoexcel.com
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.
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
110
www.todoexcel.com
elemento de una variable de un tipo definido por el usuario se inicializa como si fuera una variable
distinta.
3.2.7. 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 = "TodoEXCEL"
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
TodoEXCEL.
3.2.8. Conversión
Es posible convertir variables de un tipo a otro. Existen distintas funciones que que permiten hacer
estas conversiones, por ej:
111
www.todoexcel.com
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.
112
www.todoexcel.com
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.
3.2.9. Ejemplos
Recordar siempre que antes de utilizar una variable, debemos saber como funciona:
Las variables String siempre deben definirse entre comillas:
Sub ejString()
Dim QAZ As String
QAZ = "TodoEXCEL"
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
113
www.todoexcel.com
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 = "TodoEXCEL"
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()
114
www.todoexcel.com
115
www.todoexcel.com
3.3. LIBROS
Mediante macros VBA podemos manipular de distintas formas tanto libros Excel como archivos con
otras extensiones. En este capítulo veremos como hacerlo.
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
Sub Informacion ()
ActiveWorkbook.Name 'Obtendríamos su nombre, por ej. Libro4.xls
ActiveWorkbook.Path ' Obtendríamos la ruta del libro activo, por ej. C:\Windows
ActiveWorkbook.FullName ' Obtendríamos ruta+nombre, por ej. C:\Windows\Libro4.xls
End Sub
116
www.todoexcel.com
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
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
117
www.todoexcel.com
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...?
Sub CierraExcel()
Application.Quit
End Sub
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
118
www.todoexcel.com
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:\"
End Sub
Sub BorraLibro ()
Workbooks("C:\TuLibro.xls").Delete
End Sub
Sub Killer ()
End Sub
Para eliminar el libro activo, en caso de que estuviera abierto, primero deberiamos cerrarlo, tal que:
119
www.todoexcel.com
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
Sub NuevoLibro()
Workbooks.Add
End Sub
Sub NuevoLibro()
Workbooks.Add
Workbooks.Add
End Sub
120
www.todoexcel.com
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
Sub Imprimir ()
' Imprime el libro activo
ActiveWorkbook.Printout
End Sub
Sub Imprimir ()
' Imprime el libro y hoja indicados
Workbooks("MiLibro.Xls").Sheets("Hoja1").Printout
End Sub
121
www.todoexcel.com
Sub ImprimirRango ()
' Imprime el rango indicado
Sheets("Hoja1").PageSetup.PrintArea = "$A$4:$H$100"
Workbooks("MiLibro.Xls").Sheets("Hoja1").Printout
End Sub
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):
122
www.todoexcel.com
Sub CalculoAutomaticoSinTablas ()
Application.Calculation = xlSemiautomatic
End Sub
Sub CalculoAutomatico ()
Application.Calculation = xlManual
End Sub
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 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á).
Sub DesprotegeLibro ()
ActiveWorkbook.Unprotect ("Excel")
End Sub
123
www.todoexcel.com
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
124
www.todoexcel.com
3.4. HOJAS
Mediante macros VBA podemos manipular de distintas formas las hojas de los libros Excel. En este
capítulo veremos como hacerlo.
3.4.1. 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
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 (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.
125
www.todoexcel.com
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
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
126
www.todoexcel.com
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(before:=Sheets("Ventas"), Count:=10)
End Sub
3.4.2. Selecionar
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
127
www.todoexcel.com
Sub Seleccionar()
With ActiveWorkbook.Sheets("Hoja2")
.Visible = True
.Select
End With
End Sub
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
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
128
www.todoexcel.com
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.
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 sleccionamos 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
Sub SeleccionarTodas
activeworkbook.Sheets.select
End Sub
129
www.todoexcel.com
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.
Si no se especifica Before o After, Microsoft Excel creará un nuevo libro que contenga la hoja
desplazada.
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
Sub moverHoja()
Dim Hoja As Worksheet
130
www.todoexcel.com
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
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
131
www.todoexcel.com
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.
Sub Copiar()
' Copiamos la Hoja1 después de la Hoja3
Worksheets("Hoja1").Copy after:=Worksheets("Hoja3")
End Sub
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
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
132
www.todoexcel.com
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
3.4.8. 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".
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:
133
www.todoexcel.com
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
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.
Para proteger y desproteger una hoja sin contraseña, utilizamos las intrucciones Protect y Unprotect,
tal como se ve a continuación:
Para realizar lo anterior, pero utilizando como contraseña la palabra "hola", debemos agregar la
propiedad Password, tal que:
134
www.todoexcel.com
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
135
www.todoexcel.com
.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.
La Vista previa no es una opción muy utilizada, salvo en las macros de evento, las cuales son
ejecutadas cuando un ocurre un evento, por ej:
End Sub
La anterior es una macro que ocurre cuando presionamos el botón de vista preliminar en cualquier
hoja del libro.
136
www.todoexcel.com
La macro anterior anularía la utilidad del botón de vista preliminar, pues el mismo quedaría
inutilizado de inmediato.
Sub ImprimeHoja ()
ActiveSheet.PrintOut
End Sub
Sub ImprimeRango ()
ActiveSheet.PageSetup.PrintArea = Range("$A$1:$C$10").Address
ActiveSheet.PrintOut
End Sub
Si deseamos poner un encabezado a la izquierda de cada hoja, con la frase "Reporte Trimestral" (o
cualquier otro mensaje):
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 Tab 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()
137
www.todoexcel.com
ActiveWorkbook.Sheets("Hoja1").Tab.ColorIndex = 5
End Sub
Verás que aparece un número que representa el color de la etiqueta. Podrás utilizar dicho número en
la macro.
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.
138
www.todoexcel.com
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
139
www.todoexcel.com
3.5. RANGOS
Mediante macros VBA podemos manipular de distintas formas los rangos y celdas de las hojas Excel.
En este capítulo veremos como hacerlo.
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:
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
140
www.todoexcel.com
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
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).
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.
141
www.todoexcel.com
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
' 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
' 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
' 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
142
www.todoexcel.com
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.
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
Sub Seleccionar ()
Range("A1:E5").Select
[A1:E5].Select
Range(Cells(1, 1), Cells(5, 5)).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:
143
www.todoexcel.com
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:
Para seleccionar filas podemos utilizar la instrucción Rows.Select, tal como vemos en las siguientes
macros:
Para seleccionar columnas podemos utilizar la instrucción Columns.Select, tal como vemos en las
siguientes macros:
144
www.todoexcel.com
Sub SeleccionaColumna ()
' Selecciona la Columna B
Columns("B:B").Select
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
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))
145
www.todoexcel.com
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
146
www.todoexcel.com
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 ()
End Sub
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
147
www.todoexcel.com
' 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
Como es lógico de suponer, existen numerosas maneras de insertar rangos, para lo cual utilizamos
la instrucción Insert:
Sub Insertar ()
148
www.todoexcel.com
[A1].EntireColumn.Insert
End Sub
También podemos insertar tantas nuevas filas o columnas como tenga el rango:
Sub Inserta ()
End Sub
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:
' Limpia la celda A1 de cualquier formato que tenga, por ej. color
Sub Borrar ()
[A1].ClearFormats
End Sub
Sub Borrar ()
With Range("A1")
.ClearComments 'Borra comentarios
.ClearContents 'Borra contenidos
.ClearFormats 'Borra formatos
.ClearNotes 'Borra notas
.Clear 'Borra todo lo anterior
149
www.todoexcel.com
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
Sub Borrar ()
On Error Resume Next
' Borra toda la información del rango actual utilizado, comenzando desde A1
Rango("A1").CurrentRegion.Clear
End Sub
Para copiar rangos utilizamos el método Copy. Algunos ejemplos sobre cómo copiar son:
Sub Copiar()
[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 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
Para realizar el pegado de los rangos copiados utilizamos las siguientes macros:
' 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")
151
www.todoexcel.com
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:
Sub Copiar()
' Cuando copiamos algo se ve que Excel deja un rastro sobre lo copiado. Para quitarlo utilizamos:
Application.CutCopyMode=False
End Sub
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).
152
www.todoexcel.com
Para nombrar un rango desde una macro utilizamos la instrucción Name, por ej.:
Sub Nombrar()
' 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
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.
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:
Range("B4:D4").MergeCells = True
End Sub
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 varias filas contiguas, aún cuando no es necesario selecionar un rango para operar con él
Rows("7:14").Select
Selection.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
Sub Ocultar ()
End Sub
Si luego queremos volver a mostrar la columna oculta, simplemente cambiamos el True por False.
154
www.todoexcel.com
Para proteger utilizamos la instrucción Locked, y luego le asignamos 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 ()
End Sub
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 ()
End Sub
155
www.todoexcel.com
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.
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
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
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
156
www.todoexcel.com
.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.
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
Sub ImprimeHoja ()
ActiveSheet.PrintOut
End Sub
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:
Sub BorrarFilasVacias1()
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
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 ' Si la Fila tiene algun valor >< 0
Rows(X).Delete
End If
Next X
End With
End Sub
El método anterior es bastante más rápido que el primero, pero todavía no es el óptimo.
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
158
www.todoexcel.com
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
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:
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:
159
www.todoexcel.com
3.6. 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.
3.6.1. 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)
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.
3.6.2. Fijos
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"
160
www.todoexcel.com
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
3.6.3. 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.
161
www.todoexcel.com
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.
3.6.4. Bidimensionales
Los array unidimensionales son muy frecuentes, aunque también se pueden usar arrays
bidemensinales, por ej:
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)
162
www.todoexcel.com
3.6.5. 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
3.6.6. 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
163
www.todoexcel.com
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.
3.6.7. 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
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:
164
www.todoexcel.com
165
www.todoexcel.com
3.7. 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.
3.7.1. 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:
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
166
www.todoexcel.com
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.
-Contador (requerido): variable numérica que se utiliza como contador de bucle. La variable no
puede ser Booleana ni un elemento de matriz.
167
www.todoexcel.com
-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
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
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
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:
168
www.todoexcel.com
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
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
169
www.todoexcel.com
For K = 1 To 10
...
Next K
Next J
Next I
La instrucción For Each Next repite un grupo de instrucciones para cada elemento de una matriz o
colección. Su sintaxis es:
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 'TodoEXCEL'
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim Hoja As Worksheet
For Each Hoja In ThisWorkbook.Sheets
Hoja.PageSetup.LeftFooter = "TodoEXCEL"
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.
170
www.todoexcel.com
Nota: si omitimos un elemento en una instrucción Next, la ejecución continúa como si se hubiera
incluído, es decir tanto:
funcionarían mientras hubiera mas elementos en el grupo, en el caso anterior dentro del rango
llamado "Rg".
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.
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.
171
www.todoexcel.com
3.7.5. GoTo
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
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.
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
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:
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.
173
www.todoexcel.com
3.7.7. 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.
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.
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
174
www.todoexcel.com
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.
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 ' si la condicion es TRUE
MsgBox "La celda A1> 15" ' lanzaríamos un mensaje
[A1].Interior.ColorIndex = 3 ' el fondo de la celda [A1] seria rojo
[A1].Font.Bold = True ' y la celda [A1] estaría en negrita
Else ' Si la condicion fuera False
[A1].Interior.ColorIndex = 10 'el fondo de la celda [A1] sería Verde
[A1].Font.Size = 50 ' y la fuente tendría tamaño 50
End If
End Sub
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:
175
www.todoexcel.com
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
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
176
www.todoexcel.com
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.
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.
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.
177
www.todoexcel.com
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 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.
178
www.todoexcel.com
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
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
179
www.todoexcel.com
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
3.7.9. 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.
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:
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.
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.
181
www.todoexcel.com
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
182
www.todoexcel.com
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.
3.8.1. 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:
183
www.todoexcel.com
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
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
184
www.todoexcel.com
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:
dándole la oportunidad de elegir entre TXT, XLS. También hubiéramos podido llamarles tal que:
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
MultiSelect:=True,
Si queremos tener la posibilidad de operar sobre más de un libro deberemos poner True, de lo
contrario False.
Sub Ejemplo3()
Dim FileList As Variant
Dim NumFiles As Integer, X As Integer
185
www.todoexcel.com
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
End Sub
186
www.todoexcel.com
Podemos personalizar o adaptar nuestros propios menús y barras de herramientas dentro de Excel.
En este capítulo veremos como hacerlo. Las barras de herramientas también se conocen como
Toolbars.
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 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.
187
www.todoexcel.com
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
188
www.todoexcel.com
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:
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.
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.
A la hora de crear una Barras de herramientas, conviene borrarla previamente, para evitar el
problema derivado de crear una Barras de herramientas con un nombre preexistente, por ej:
Sub BorrarToolbar()
On Error Resume Next
' Borra la barra de Herramientas llamada TodoEXCEL
' On error resume next evita el problema derivado en caso de que no
' hubiera ninguna barra de herramientas llamada TodoEXCEL
CommandBars("TodoEXCEL").Delete
End Sub
Es decir si quisiéramos crear una Barras de herramientas llamada "TodoEXCEL", sería conveniente
llamar a la macro anterior primero tal que:
Sub CrearToolbar()
Dim X As Byte
On Error Resume Next
189
www.todoexcel.com
Call BorrarToolbar ' Llamamos a la macro BorrarToolbar, para evitar problemas en código
' Creamos la barra deHerramientas
With CommandBars.Add(Name:="TodoEXCEL")
.Visible = True
' esta Barras de herramientas 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 Barras de herramientas llamada
"TodoEXCEL", y al cerrar el libro, esta Barras de herramientas seguirá como una de las Barras de
herramientas de Excel, ya que no la hemos borrado antes de cerrar el libro. Es por ello que
preferimos no utilizar Barras de herramientas 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 Barras de herramientas recién creada, por ejemplo:
Sub BorrarToolbar()
On Error Resume Next ' Para evitar la imposibilidad de Borrar algo que no existe.
190
www.todoexcel.com
3.9.2. 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:="TodoEXCELPOPUP", _
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"
191
www.todoexcel.com
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
Sub BorrarPOPUP()
On Error Resume Next
CommandBars("TodoEXCELPOPUP").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:
192
www.todoexcel.com
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.
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.
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:
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
193
www.todoexcel.com
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.
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", "" ' Con esto deshabilitaríamos las teclas Control + C
Application.OnKey "^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:
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.
194
www.todoexcel.com
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.
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:
Recordemos nuevamente que cualquier ExcelManíaco podría sin gran dificultad habilitar cualquier
comando y/o control previamente deshabilitado.
196
www.todoexcel.com
3.10. MENUS
Podemos personalizar o adaptar nuestros propios menús y barras de herramientas dentro de Excel.
En este capítulo veremos como hacerlo.
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ú "TodoEXCEL"), los menus agregados se colocan antes del menu ayuda de
excel llamado "?" (el menú que viene después del menú "Ventana").
Sub BorrarMenu()
On Error Resume Next
Application.CommandBars("Worksheet Menu Bar").Controls("TodoEXCEL").Delete
End Sub
Sub CrearMenu()
Dim HelpMenu As CommandBarControl
Dim MenuNuevo As CommandBarPopup
Dim MenuItem As CommandBarControl
Dim SubmenuItem As CommandBarButton
' 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 'TodoEXCEL' al final
Set MenuNuevo = Application.CommandBars("Worksheet Menu
Bar").Controls.Add(Type:=msoControlPopup, Temporary:=True)
Else
' Si Ayuda existe, entonces antes que el menu '?' es decir ID=30010
Set MenuNuevo = Application.CommandBars("Worksheet Menu
Bar").Controls.Add(Type:=msoControlPopup, Before:=HelpMenu.Index, Temporary:=True)
End If
197
www.todoexcel.com
' 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"
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 MenuTodoEXCEL").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:
198
www.todoexcel.com
Haber decidido colocar el menu "TodoEXCEL" 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 =&?
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 =&?
Sub AñadirControl_al_MenuXX()
Dim MenuXX As CommandBarPopup
199
www.todoexcel.com
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 Menu Bar").FindControl(ID:=30005).Controls("Insertar
Mensaje E&xceLuciones").Delete
End Sub
Sub MsgBox_Hola()
MsgBox Chr(10) & "Un Feliz AÑO Nuevo!!!", _
vbInformation, _
"TodoEXCEL 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 !.
200
www.todoexcel.com
3.11. COMANDOS
En este capítulo se explicarán algunos comandos útiles que suelen utilizarse con frecuencia en las
macros.
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()
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.
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:
201
www.todoexcel.com
Es posible cambiar el mensaje de la Barra de estado mediante código VBA. Esto permite mostrar
mensajes personalizados ya sea mientras se ejecutan las macros o al finalizar las mismas.
Sub BarraEstado()
' Si queremos que la barra de estado muestre un mensage diferente bastará con:
Application.DisplayStatusBar = "Procesando mi reporte..."
' Si queremos que la Barra de Estado este limpia, es decir sin mensaje alguno:
Application.DisplayStatusBar = ""
End Sub
3.11.3. 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
202
www.todoexcel.com
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:='TodoEXCEL:', el título que adjuntaríamos al mensaje
MsgBox Prompt:="Me llamo Pedro.", Buttons:=vbInformation, Title:="TodoEXCEL:"
End Sub
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:
203
www.todoexcel.com
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
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
3.11.4. 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.
204
www.todoexcel.com
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
205
www.todoexcel.com
4. LIBRERIA
Una "librería" es una colección de macros. En la medida que vamos haciendo nuestras macros,
conviene ir guardándolas en una librería. De este modo las tendremos disponibles para cuando
necesitemos usarlas nuevamente y evitaremos tener que reprogramar las macros en cada momento.
En esta sección veremos nuestra librería de macros (aquellas que utilizamos frecuentemente).
Para borrar filas debemos posicionarnos en una celda y utilizar la instrucción EntireRow.Delete
Veamos un ejemplo:
'En esta macro recorremos la columna 2 (la B) desde la fila 2000 hasta la 1
'Si la celda tiene el valor "q" entonces borramos la fila
Sub BorrarFilas()
Dim r As Long
For r = 2000 To 1 Step -1 'Debemos ir desde abajo hacia arriba
If Cells(r, 2).Value = "q" Then Cells(r, 2).EntireRow.Delete
Next r
End Sub
4.2. Búsquedas
Para hacer búsquedas (el equivalente a la función "buscarv" de Excel) utilizamos la instrucción
lookupvalue.
Veamos un ejemplo:
Sub BuscarCodigo()
'Definimos variables
Dim lookupvalue As Variant, value As Variant, lookupRange As Range
207
www.todoexcel.com
4.3. Cálculos
Muchas veces, cuando ejecutamos macros, nos interesará poner el modo de cálculo manual. Para
esto utilizamos la instrucción Calculation.
Veamos un ejemplo:
'Poner modo de cálculo manual
Application.Calculation = xlManual
4.4. ComboBox
Cuando trabajamos con un combobox, podemos crear un evento que se dispare luego de presionar
intro.
Veamos un ejemplo:
4.5. CommandBars
Aquí jugamos un poco con las barras de comando. Cambiando los "True" por "False" y viceversa
veremos como afecta.
4.6. CopiarPegar
Sub CopiarPegar()
Range("A104").Copy
Range("A105").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
4.7. Demos
Esta es una macro sumamente interesante. Esta macro sirve para crear versiones "demo" de
nuestros libros.
1) Primero se ejecuta una macro "Auto_Open" (se ejecuta automáticamente al abrir el libro)
2) Dicha macro pedirá al usuario una clave de desactivación
3) Si la clave de desactivación es correcta, el usuario podrá usar el libro normalmente
4) Si la clave es incorrecta, se ejecutará la macro "Demo"
5) La macro "Demo" hace que se pueda ejecutar el libro una cantidad de veces o hasta una fecha
dada
6) Si se ha superado la cantidad de usos o la fecha, el libro se cerrará automáticamente
Sub Auto_Open()
Dim V As String
'Defino una palabra clave de activación (ponerla en una celda oculta o con texto y fondo blanco)
If Hoja6.Range("B1").value = "españa" Then
Exit Sub
Else
If V = "españa" Then
Hoja6.Range("B1").value = "españa"
MsgBox "Activación exitosa, presione 'Ok' para guardar los cambios."
ThisWorkbook.Save
Exit Sub
End If
End If
End Sub
209
www.todoexcel.com
Sub Demo()
'Incremento el contador
Usos.value = Usos.value + 1
MsgBox "Esta es una versión DEMO que expirará el " & FechaFin & " o luego de 20 usos."
MsgBox "Usted ha consumido " & Usos & " de 20 usos disponibles."
If Date > FechaFin Or Usos > 20 Then 'Aquí se puede cambiar el Nº de usos
MsgBox "Demo expirada, contacte con el autor"
ThisWorkbook.Close SaveChanges:=True
End If
End Sub
4.8. Eventos
En este ejemplo vemos un ejemplo sobre cómo llamar macros cuando cambia algún valor de una
columna determinada.
'Esta declaracion de variables va al inicio de la hoja o modulo porq luego las uso en cada caso
Dim LCR As Long, LCC As Long
'MAcro q se dipara cuando se selecciona una celda determinada (en este caso la de fila 1, columna 1)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row = 1 And Target.Column = 1 Then MsgBox "QQQ"
End Sub
211
www.todoexcel.com
4.9. ExcelVersions
Para saber con que versión de Excel nos encontramos utilizamos la instrucción Application.Version
Sub ExcelVersionControl()
''CONTROLA LA VERSION DE EXCEL
Dim xlVer As Variant
xlVer = Val(Application.Version)
MSgbox XlVer
If xlVer < 10 Then MsgBox "Version no soportada" 'Para avisar que no funciona para Excel inferior a
2.002
End Sub
La macro devuelve:
08 Para Excel 97
09 Para Excel 2.000
10 para Excel 2.002
11 para Excel 2.003
12 Para Excel 2.007
4.10. LayOut
Con estas macros jugaremos a ocultar y mostrar barras de herramientas o desactivar menús.
Recordar que podemos cambiar las propiedades "True" por "False" y viceversa para lograr el efecto
contrario.
Option Explicit
Sub OcultaMenus()
'Ocultar menus
Application.CommandBars("Worksheet Menu Bar").Enabled = False
'Ocultar barras de herramientas
Application.DisplayFullScreen = True
End Sub
Sub CmdBarsOff()
Dim ctl As CommandBarControl
Sub CmdBarsOn()
Application.CommandBars("Worksheet Menu Bar").Reset
'Activa menu boton derecho en menus
CommandBars("Toolbar List").Enabled = True
'Para volver a ver el menu de clic derecho en celda
Application.CommandBars("Cell").Enabled = True
End Sub
213
www.todoexcel.com
4.11. Filtros
Option Explicit
'Poner autofiltro
Range("B6:M6").AutoFilter
'QUITAR FILTROS
If Range("InHuurData").AutoFilter = xlOn Then
Range("InHuurData").AutoFilter
End If
If ActiveSheet.AutoFilterMode Then
Set af = ActiveSheet.AutoFilter
iFilterCount = 1
For Each fFilter In af.Filters
If fFilter.On Then
af.Range.Cells(1, iFilterCount) _
.Interior.ColorIndex = 6
Else
af.Range.Cells(1, iFilterCount) _
.Interior.ColorIndex = 40
End If
iFilterCount = iFilterCount + 1
Next fFilter
Else
Rows(1).EntireRow.Interior.ColorIndex = xlNone
End If
End Sub
'FILTROS AVANZADOS
214
www.todoexcel.com
Range("E7:CL23").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Sheets("Filtros").Range("D3:G10"), _
CopyToRange:=Range("G26:O26"), Unique:=False
4.12. FTP
Algunos códigos de interés relacionados con FTP desde Excel.
'GUARDAR LIBRO ACTIVO EN FTP (requiere ftp configurado en SaveAs, si no pedirá user y pass)
ActiveWorkbook.SaveAs Filename:= _
"ftp://ftp.MiWeb.com/public_html/prueba/Libro123.xls", FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
'ABRIR LIBRO DESDE FTP (requiere ftp configurado en SaveAs, si no pedirá user y pass)
Workbooks.Open Filename:= _
"ftp://ftp.MiWeb.com/public_html/prueba/Libro88.xls"
Range("D11").Select
'ABRIR LIBRO DESDE FTP (***No requiere ftp configurado en SaveAs, lo configuramos desde vba)
Sub Abrir()
Workbooks.Open Filename:= _
"ftp://miusarioaqui:miclaveaqui@ftp.miweb.com/public_html/prueba/Libro88.xls"
End Sub
215
www.todoexcel.com
4.13. Funciones
'Ejemplo de SUMA
If Application.Sum(Range("D7:D65536")) = 0 Then MsgBox "nada"
'Ejemplo de SUMARSI
myVal = Application.SumIf(Range("A1:A10"), "a", Range("b1:b10"))
'Ejemplo de CONTARSI
n = Application.CountIf(Range("K:K"), "Check Record")
'Ejemplo de LARGO
Dim L As Long
L = Len(Sheets("Menu").Range("B1"))
4.14. Guardar
4.15. Hojas
216
www.todoexcel.com
4.16. Imágenes
End Sub
'OCULTAR IMAGEN
'Boton para q si esta oculta la muestre y si esta visible la oculte
Private Sub ToggleButton1_Click()
Worksheets("Sheet1").Shapes("Rectangle 3").Visible = Not (Shapes("Rectangle3").Visible)
End Sub
4.17. Imprimir
Algunas macros relacionadas con impresión:
LngLastRow = ActiveSheet.Range("G65536").End(xlUp).Row
ActiveSheet.Range("A1:G" & LngLastRow).Select
With ActiveSheet.PageSetup
.PrintArea = ("A1:G" & LngLastRow)
.FitToPagesWide = 1
.FitToPagesTall = False
End With
End Sub
217
www.todoexcel.com
4.18. Msgbox
'INPUT BOX es un tipo especial de Msgbox que solicita al usuario una entrada de un valor o texto
Sub Entrada()
Dim V As String
V = Application.InputBox("Introduzca la clave del administrador")
End Sub
4.19. Ordenar
'En A38:G38 esta el encabezado. El Key1 es F39 (una fila mas abajo, osea el primer registro)
4.20. Proteger
4.21. Rangos
'NOMBRAR RANGOS
Dim LR As Long
LR = 100
ActiveWorkbook.Names.Add Name:="LasRow", RefersToR1C1:=LR
'INOVILIZAR PANELES
ActiveWindow.FreezePanes = False
Range("B105").Select
ActiveWindow.FreezePanes = True
'REDIMENSIONAR UN RANGO
Selecciona una tabla menos la 1º fila de encabezado
Range("PerPrimero").CurrentRegion.Offset(1, 0).Select
'PINTAR RANGOS
Si es Ingreso pinto verde
If Cells(LCR, 2).value = "Ingreso" Then
Range(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 10
End If
Si es Gasto pinto Rojo
If Cells(LCR, 2).value = "Gasto" Then
Range(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 3
219
www.todoexcel.com
End If
Si es vacío (cuando borra) pinto negro
If Cells(LCR, 2).value = "" Then
Range(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 1
End If
Sub Reso()
Range("G3") = CStr(GetSystemMetrics(SM_CXSCREEN))
Range("G4") = CStr(GetSystemMetrics(SM_CYSCREEN))
End Sub
4.23. Selección
Macros de selección
4.24. Tablas
220
www.todoexcel.com
4.26. Varios
'SCROLLING
ActiveWindow.ScrollRow = 1
ActiveWindow.ScrollColumn = 1
'SCROLL AREA
ActiveSheet.ScrollArea = "A1:S50"
Application.CommandBars("Standard").Visible = False
Application.DisplayFormulaBar = False
222
www.todoexcel.com
5. EXTRAS
Hemos preparado una buena cosecha de recursos más que interesantes para tus macros.
224
www.todoexcel.com
6. TodoEXCEL
CURSOS EXCEL
Capacítese con los mejores cursos Excel, preparados por nuestros expertos.
PRODUCTOS EXCEL
Complementos, plantillas y programas Excel de utilidad para usuarios.
DESARROLLOS EXCEL
Soluciones a medida para empresas y profesionales con macros vba Excel.
COMUNIDAD EXCEL
El lugar de encuentro de usuarios y expertos en hojas Excel.
www.todoexcel.com
225