Manual de Excel VBA
Manual de Excel VBA
Manual de Excel VBA
Inicio
Presentacin
Bienvenido a nuestro Curso de Macros VBA Exce
Estamos seguros que este curso ser tu agrado. Hemos trabajado muy duro para hacer un curso de altsima
calidad.
TodoEXCEL
Copyright
Todos los nombres propios de programas, sistemas operativos, equipos de hardware, etc. que aparecen en este curso son marcas regis
respectivas compaas.
Reservados todos los derechos. El contenido de esta obra est protegido por ley, que establece penas de prisin y/o multas, adems de
correspondientes indemnizaciones por daos y perjuicios, para quienes reprodujeren, plagiaren, distribuyeren o comunicasen pblicame
parte, una obra literaria, artstica o cientfica, o su transformacin, interpretacin o ejecucin artstica fijada en cualquier tipo de soporte o
travs de cualquier medio, sin la preceptiva autorizacin.
Microsoft y Microsoft Excel son marcas registradas por Microsoft Corporation.
Todos los contenidos del Curso de Macros VBA Excel Copyright 2.008 por TodoEXCEL.
MACROS: si ya dominas la teora o eres nivel intermedio deberas continuar en esta seccin. En la misma se
explican las principales macros o rutinas que debes conocer. Hemos hecho un "barrido" por todos los temas o
necesidades que podras tener a la hora de programar.
LIBRERIA: en esta seccin ponemos a tu disposicin una "librera de macros". Una librera no es ms que una
forma de ir guardando todas aquellas macros de inters que vas creando en tus desarrollos. Muchas de ellas
las necesitars nuevamente as que para no tener que empezar de cero, lo ideal es ir guardndolas en una
librera de fcil acceso. Nuestra librera pretende ir creciendo da a da, tanto con nuestros propios aportes
como con los tuyos !
EXTRAS: esta seccin es una recopilacin 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
disposicin de forma ordenada.
Otras secciones del curso, no menos importantes, son:
Sobre el autor
"TodoExcel" est formado por un grupo de expertos en hojas de clculo Excel. Somos unos "enamorados" de
Excel y las posibilidades que ofrece. Hemos trabajado muchsimos aos con este programa y todava no
1
Teoria
En la primera parte de este curso veremos la teora respecto a la programacin de macros. Dominar la teora es
sumamente importante para luego poder entrar a la parte prctica y comprender las macros ms rpido y mejor.
Introduccin: qu son las macros y para que se utilizan.
Cmo comenzar: las principales herramientas del editor de macros.
Si deseas conocer mejor a nuestro equipo, puedes visitar nuestra web para mayor informacin.
Introduccin
Excel y macros
Bienvenido al Curso de Macros de TodoEXCEL. Ests por comenzar una de las experiencias ms fascinantes y
atractivas de la Hoja de Clculos Excel.
La Hoja de Clculos Excel es una de las herramientas ms poderosas para el tratamiento de datos y su
anlisis. 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.
Con las macros podrs sorprender y sorprenderte porque incrementars las prestaciones y el potencial de
Excel de forma ilimitada. El nico lmite que tendrs ser tu imaginacin.
Sin embargo, si realmente quieres "exprimir todo el jugo" a Excel, debers conocer y utilizar una de sus
mayores y ms potentes herramientas: las macros.
Si eres usuario principiante de la hoja Excel con este curso dars un salto cuntico y te convertirs rpidamente
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 tambin te sorprenders con nuevos cdigos y
secciones especiales que hemos preparado para ti.
Una buena forma de introducirnos al mundo de las macros es con una defincin sencilla y directa:
Anteriormente definimos a las macros como algo que nos permite expandir e incrementar las prestaciones de la
hoja Excel. Cules seran 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:
Macro: es un conjunto de instrucciones de cdigo (programado) que permiten realizar una tarea
determinada como as tambin expandir e incrementar las prestaciones de Excel. Las macros se escriben en
lenguaje de programacin 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 "programacin". Bueno, si ese es tu caso no debes
preocuparte. Hace unos aos nosotros mismos no tenamos la ms mnima idea de programacin Excel. Pero
la buena noticia es que con un buen curso (confiamos en que este lo es!) podrs aprender y "tomar vuelo"
rpidamente en el mundo de las macros.
Vers que es fcil, divertido y que puedes expandir al infinito los lmites de Excel!
1. Automatizacin de procesos
Supongamos que todos los das 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 seleccin. Estas 6 acciones las hacemos manualmente y no parecen muchas, pero que tal si hay
que hacer esto en repetidas ocasiones y todos los das? Una macro nos permite ejecutar los 6 pasos
automticamente, tan solo presionando un botn 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 dinmicas, etc...
Lenguaje VBA
Cuando hablamos de macros hablamos de Objetos, Propiedades y Mtodos (OPM). Estos son los 3 conceptos
generales ms importantes que debes conocer a la hora de programar las macros. De momentos solo te
daremos una sencilla definicin y luego iremos profundizando ms en ellos.
Recuerda que la programacin de macros se hace a travs del lenguaje VBA (Visual Basic for Applications)
desde el editor VBA que trae incorporado Excel. Este tipo de programacin tambin se conoce como
"Programacin Orientada a Objetos" (OOP, Objects Oriented Programming). La Programacin orientada a
Objetos nos permite trabajar sobre los objetos propios de Excel como as tambin crear nuestros propios
objetos. Esto se relaciona con lo que te comentbamos en la seccin anterior sobre Objetos, Propiedades y
Mtodos.
Hay un ejemplo muy prctico para comprender lo que son los Objetos, Propiedades y Mtodos (OPM).
Supongamos que tenemos una canasta con frutas. Cuales seran los OPM de la misma?
Objetos: los objetos de la canasta de frutas seran las mismas frutas (manzanas, naranjas, peras).
Propiedades: las propiedades seran las caractersticas de las frutas (color, olor, sabor, textura).
Mtodos: finalmente los mtodos son las acciones que podramos ejercer sobre las frutas (comprarlas,
venderlas, comerlas, almacenarlas, limpiarlas, quitarles la piel,).
Mtodos: un mtodo es una accin 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. Recurdalas 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 ms objetos, con sus propiedades y sus mtodos. 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 tambin conocer el nombre de algn mtodo que desees aplicarle.
Delete (borrar)
En la medida que avances con la lectura de este curso te irs familizarizando con la denominacin de los
distintos objetos, propiedades y mtodos. El lenguaje VBA tiene miles de OPM, y existe una forma muy prctica
de conocerlos todos que es con la grabadora de macros, tema que trataremos ms adelante.
Aprender macros es mucho ms fcil de lo que tu te imaginas. Es cierto que hay macros muy complicadas que
requieren un conocimiento muy avanzado. Pero es un lenguaje fcil y muy intuitivo. Adems Excel posee una
grabadora de macros que las escribe de forma automtica. Luego nosotros podemos retocarlas a gusto. Te
10
aseguramos que en cuanto termines este curso estars escribiendo tus propias macros y te sorprenders lo
fcil que es seguir aprendiendo y profundizando tus conocimientos. Nosotros te daremos las herramientas para
que lo consigas!
Cmo comenzar
Antes de comenzar a programar macros es necesario que conozcas la barra de herramientas VBA y las
distintas formas de acceder al editor de macros, que es la herramienta donde escribirs el cdigo de las
mismas. En las secciones siguientes te ensearemos ambos conceptos.
11
12
Barra de herramientas
2. En la parte inferior del men que se despliega, presiona el botn Opciones de Excel
La barra de herramientas de macros es considerablemente diferente entre Excel 2.003 e inferior y Excel 2.007.
3. En la lista de opciones Mas Frecuentes, selecciona la casilla de Mostrar ficha programador en la cinta de opcione
Excel posee una Barra de Herramientas de Macros o VBA. Puedes acceder a la misma desde el men Her
Macros. Dicho men se ve como en la fotografa a continuacin (fjate que tambin se indican las combinacione
para acceder a dichas opciones).
Tambin tienes la opcin de dejar siempre visible dicha barra de herramientas. Puedes hacer esto desde el men V
de Herramientas > Visual Basic. Veras como aparece una nueva barra de herramientas de macros. Puedes ubica
de herramientas donde te sea ms cmodo.
Excel 2.007
En la nueva versin de Excel, las opciones del men de macros se encuentran en la ficha programador,.
13
14
Editor VBA
El Editor de Visual Basic es la aplicacin que trae Excel desde donde se escriben y guardan las macros. Tienes 3
acceder al editor:
Excel 2.007
1. Desde la ficha Programador > botn Visual Basic
2. Desde el teclado (Teclas de Mtodo Abreviado): ALT+F11
(el acceso a la ficha programador lo explicamos en la seccin 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 vers algo similar a la figura siguiente (no importa si
estrictamente similar, eso depender de las ventanas que tengas visibles y ocultas). Puedes mostrar u ocultar esta
desde el men Ver.
15
16
Si estas en el editor y quieres regresar a la hoja Excel tambin puedes utilizar el cono de Excel que se encuentra
superior del editor (primer cono de la izquierda, con la X de Excel).
Ventana de Cdigo: esta es el lugar donde escribiremos el cdigo propiamente dicho de las macros. Como no he
ninguna macro todava veremos la hoja en blanco. Recuerda bien estas dos ventanas, ya que las usaremos a c
para escribir nuestra primera macro.
Como vers el Editor de VB tiene muchas ventanas. Pero de momento solo nos interesan las dos ventanas que te
anteriormente: la Ventana Proyecto VBA Project y la Ventana de Cdigo donde se escribe el cdigo de las
Ventana de Propiedades e Inmediato las dejaremos para ms adelante.
Recuerda: presionando las teclas ALT+F11 puedes ir desde Excel al Editor o desde el Editor al Excel de forma alte
mantener presionada la tecla ALT y presionar F11 repetidas veces, vers como pasas de Excel al editor y viceversa
17
18
Mi primera macro
Vamos a escribir manualmente nuestra primera macro ahora!. Es una macro muy sencilla, pero te servir para
orientarte en el Editor de Visual Basic y reconocer los pasos requeridos para hacer una macro.
1. Escribirla manualmente
2. Utilizar la grabadora de macros
qu significa esto? Que comenzaremos con una hoja Excel vaca y luego de ejecutar la macro veras que
aparece el valor 1.500 en la celda A1. El valor lo pondr automticamente la macro cuando nosotros se lo
indiquemos.
Suena demasiado simple, cierto? Sin embargo es suficiente como para comenzar y que aprendas
generalidades que luego aplicars 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.
En este captulo vamos a ver como se escribe una macro manualmente (mtodo 1)
19
20
Escribir la macro
Bueno, es importante que recuerdes el objetivo: esta macro escribir automticamente el valor 1.500 en la
celda A1 de tu hoja Excel. Los pasos que debes seguir son los siguientes:
*Nota: si la ventana de tu editor tiene una instruccin "Option Explicit" escrita en la parte superior, no le presetes
atencin, puedes dejarla. Ms adelante te explicaremos que significa.
De momento no te preocupes por el cdigo escrito. Ms adelante te ensearemos a interpretarlo. Ahora que ya
tienes la macro escrita pasemos a la siguiente seccin para ver como ejecutarla.
2. Escribimos la macro
2.1 En la ventana de macros escribe textualmente el siguiente cdigo:
' Esta macro escribe el valor 1500 en la celda A1
Sub MiPrimeraMacro()
Range("A1").Value=1500
End Sub
2.2 Si la macro est bien copiada vers que la primera lnea queda en color verde y la segunda y cuarta en
azul. Estos colores los asigna automticamente el editor y te lo explicaremos ms adelante. As es como debe
quedar todo:
21
22
Ejecutar la macro
Si utilizas Excel 2.003 o inferior contina aqu...
Si utilizas Excel 2.007 contina aqu...
Si has seguido cualquiera de los 2 pasos anteriores ya podrs ver el resultado de la macro. Qu hizo la Macro? S
el Libro 1, Hoja 1, Celda A1 vers que se escribi el valor 1.500. Eso es exctamente lo que queramos hacer
macro, as que tarea cumplida. Hemos escrito un valor en una celda excel desde una macro !
Excel 2.007
Si ya tienes escrita la macro en el editor, ahora podrs que ejecutarla, o sea hacer que funcione. Tienes 2 forma
esto:
A. Ejecutar la macro desde el mismo Editor
Si te posicionas en cualquiera de las lneas de cdigo de la macro y luego presionas la tecla F5 la macro se ejec
ver el resultado puedes volver a la hoja excel con ALT+F11).
Se abrir un cuadro que contiene una lista con los nombres de las macros creadas.
Selecciona MiPrimeraMacro y haz clic en Ejecutar.
Se abrir un cuadro que contiene una lista con los nombres de las macros creadas.
Selecciona MiPrimeraMacro y haz clic en Ejecutar.
23
24
Comprender la macro
Recuerda que el propsito 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 lneas de su
cdigo. Recordemos como se vea nuestra macro escrita en el editor:
Esta macro tiene 4 lneas de cdigo, por eso es tan sencilla (cuando termines este curso seguro podrs escribir
macros de cientos o quizs miles de lneas de cdigo!). Veamos que significa cada lnea. Las explicaciones que
vienen a continuacin suelen aplicarse a todas las macros, as que es importante que las comprendas.
- La primera lnea 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 lnea 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 automticamente.
- 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 lnea, el editor detecta automticamente que es un
comentario y lo pinta de verde luego de darle a Enter.
25
26
End Sub
- Aqu es donde comienza realmente la macro.
- Toda macro siempre comienza con la palabra Sub, luego un espacio, luego un nombre (sin espacios
intermedios) y finalmente los parntesis (). Ms adelante veremos algunas excepciones a esto.
27
28
Resumen
Nuestro objetivo fue crear una macro que escribiera el valor 1500 en la celda A1 de la Hoja1 de Excel. Como era
sencilla decidimos escribir el cdigo manualmente. Vamos a resumir todos los pasos que hicimos hasta aqu:
1. Creamos un nuevo libro Excel y lo guardamos con el nombre Libro1.
2. Accedimos el Editor de Visual Basic con las teclas ALT+F11
3. En la Ventana Proyecto, en VBAProject (Libro1), hicimos doble clic en Hoja1 (Hoja1).
4. En la Ventana de Cdigo escribimos textualmente el siguiente cdigo:
' Esta macro escribe el 1500 en la celda A1
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub
Todo qued como se aprecia en la foto...
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
haga.
Recuerda: en estos 5 pasos hemos visto rpidamente como escribir una macro sencilla y ejecutarla. En las
siguientes iremos profundizando ms estos temas, sobre todo el referente el cdigo de la macro.
5. Finalmente abrimos el men de macros con ALT+F8, seleccionamos MiPrimeraMacro desde la lista de
presionamos Ejecutar.
29
30
OPM de la macro
Recordemos nuevamente el cdigo de nuestra primera macro:
Mtodo
Es una accin sobre el objeto > por ej. copiar la celda, borrar la hoja, agrandar el grfico.
Ahora ya estamos en condiciones de identificar mejor los objetos, propiedades y mtodos de la misma.
La mayora de las macros llevan una estructura similar, aunque hay algunas excepciones.
Range("A1") es el objeto, recuerda que siempre que hacemos macros primero debemos indicar el objeto excel
sobre el que vamos a operar. En este caso usamos el objeto Range (Rango). El objeto Range es el que se
utiliza para hacer referencia a una celda o rango Excel. Luego se escribe la referencia de la celda Excel (letra
de columna y nmero de fila) entre comillas y parntesis. Ya le hemos indicado a la macro que deber ocuparse
de la celda A1 (objeto). Ahora debemos indicarle que hacer con ella (propiedad o mtodo).
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.
Value = 1500 es la propiedad, que le asignaremos al objeto. Siempre empezamos por el objeto para luego
asignarle una propiedad o mtodo. 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.
El nombre lo pondremos a gusto, anteponiendo la palabra Sub los parntesis de apertura y cierre al final.
Conviene dar un nombre que nos indique que hace la macro.
La instruccin principal la veremos un par de prrafos ms abajo. Este cdigo siempre vara segn lo que se
quiera hacer con la macro en cuestin.
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 irs aprendiendo nuevos objetos, propiedades y mtodos.
Al comienzo del curso te mencionbamos que las macros consisten en operar sobre un Objeto, ya sea
alterando una de sus Propiedades o ejecutando un Mtodo sobre el mismo.
Recuerda: para aprender a programar macros debes aprender cuales son los objetos, propiedades y mtodos
de Excel. No olvides la definicin de los mismos:
Objeto
- Es una parte de Excel
- Por ej. una celda de Excel, una hoja, un grfico.
Propiedad
31
32
Mi primera macro
Vamos a grabar nuestra primera macro ahora!. Es la misma macro que hicimos en el captulo anterior, pero
esta vez la haremos con la grabadora de macros.
A. Escribirla manualmente
B. Utilizar la grabadora de macros
que significa esto? Que comenzaremos con una hoja Excel vaca y luego de ejecutar la macro vers que
aparece el valor 1.500 en la celda A1. El valor lo pondr automticamente la macro cuando nosotros se lo
indiquemos.
Suena demasiado simple, cierto? Sin embargo es suficiente como para comprender la metodologa de
funcionamiento de la grabadora de macros.
En el captulo anterior vimos como se escriba una macro de forma manual. Ahora veremos como utilizar la
grabadora de macros. Como te mencionbamos antes, la ventaja de la grabadora es que prcticamente no
requiere conocimientos de programacin y cdigo VBA. Simplemente encendemos la grabadora, ejecutamos
las acciones y listo. La grabadora genera el cdigo automticamente !
33
34
Grabando la macro
Excel trae incorporada una grabadora de macros. La misma funciona de forma muy fcil. Encendemos la
ejecutamos las acciones que nos interesan sobre la hoja excel, paramos la grabadora ylisto!. Excel escrib
automtica el cdigo VBA de la macro.
Ahora podemos hacer un experimento muy interesante. Repetir nuestra primera macro, pero esta vez hacin
grabadora de macros. Sigue los pasos a continuacin:
Cuando comienza a grabar la macro activa una nueva barra de macros como la que se muestra en la foto. El bot
de la izquierda te permitir parar la grabacin y finalizar la macro.
Otra forma de detener la grabacin de la macro es desde el men Herramientas > Macros > Detener grabacin. H
para detener la grabacin.
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 Posicinate en la celda A1 y escribe el valor 1500.
35
36
* Podrs obsevar que el cdigo que se grab es distinto que el cdigo que habamos escrito cuando hicimo
manualmente. Ms adelante en este mismo captulo analizaremos y explicaremos las diferencias.
4. Vamos a probar la macro
4.1 Vuelve a Excel con ALT+F11.
4.2 Vers que la celda A1 tiene el valor 1500 porque lo escribimos mientras grabbamos la macro.
4.3 Para ver como opera la macro borra dicho valor.
4.4 Abre el men de macros desde el men Herramientas > Macro > Macros
4.5 Selecciona MiPrimeraMacro (no te confundas con Hoja1.MiPrimeraMacro que es la que hicimos primero).
4.6 Presiona Aceptar y vers como se escribe nuevamente el valor 1500 en la celda A1.
Excel 2.007
1. Vamos a grabar la macro
1.1 V a la ficha Programador > Grabar macro
* Podrs observar que el cdigo que se grab es distinto que el cdigo que habamos escrito cuando hicimo
manualmente. Ms adelante en este mismo captulo analizaremos y explicaremos las diferencias.
4. Vamos a probar la macro
4.1 Vuelve a Excel con ALT+F11.
1.4 Donde dice Nombre de la macro escribe MiPrimeraMacro. Ese ser el nombre que le daremos a nuestra macro
4.2 Vers que la celda A1 tiene el valor 1500 porque lo escribimos mientras grabbamos la macro.
2. Detener la grabacin
Para terminar de grabar, debemos presionar el botn de detener grabacin
37
38
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:
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
Recuerda: al utilizar la grabadora no accedemos en ningn momento al editor de macros ni tenemos que
escribir cdigo. Todo lo hace automticamente la grabadora.
39
40
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub
3. Ejecucin de la macro
3. Ejecucin de la macro
Excel 2.007
Excel 2.003
MACRO ESCRITA
MACRO GRABADA
1. Como la hicimos
1. Como la hicimos
2. El cdigo de la macro
El cdigo que escribimos fue:
' Esta macro escribe el valor 1500 en la
celda A1
Sub MiPrimeraMacro()
Range("A1").Value=1500
End Sub
2. El cdigo de la macro
2.1 Con ALT+F11 accedemos al editor de macros.
2.2 El cdigo que se grab automticamente fue el
siguiente:
Sub MiPrimeraMacro()
'
' MiPrimeraMacro Macro
' Esta macro escribe el valor 1500 en A1
MACRO ESCRITA
MACRO GRABADA
1. Como la hicimos
1. Como la hicimos
2. El cdigo de la macro
El cdigo que escribimos fue:
' Esta macro escribe el valor 1500 en la
celda A1
Sub MiPrimeraMacro()
Range("A1").Value=1500
End Sub
2. El cdigo de la macro
2.1 Con ALT+F11 accedemos al editor de macros.
2.2 El cdigo que se grab automticamente fue el
siguiente:
Sub MiPrimeraMacro()
'
' MiPrimeraMacro Macro
' Esta macro escribe el valor 1500 en A1
Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub
Range("A1").Select
41
42
3. Ejecucin de la macro
Diferencias
En nuestro ejemplo, tanto la Macro Escrita como la Macro Grabada logran la misma funcin 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 seccin
anterior vers que hay algunas diferencias. El anlisis de las mismas nos permitir ver las ventajas y
desventajas de escribir una macro de forma manual o de grabarla con la grabadora de macros.
Volvamos a poner las tablas comparativas, pero esta vez comentando las diferencias:
MACRO ESCRITA
MACRO GRABADA
1. Como la hicimos
1. Como la hicimos
2. El cdigo de la macro
2. El cdigo de la macro
Sub MiPrimeraMacro()
' Esta macro escribe 1500 en A1
Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub
La macro grab nuestras acciones pero utiliz 3 lneas
de cdigo (solo contamos las que estn entre Sub y
End Sub). Vemos que el cdigo es ms largo y que
aparecen nuevos objetos, propiedades y mtodos. La
macro se interpreta as:
Primero seleccionar el rango A1. Luego en la celda
activa introducir una frmula con el valor 1500.
Finalmente, como presionamos Enter, se posiciona en
la celda siguiente, la A2.
El objetivo fue logrado, pero la macro gener ms
cdigo del necesario.
El mtodo de la macro grabada parece el preferible, porque lo hace todo de forma automtica y nos evita tener
que escribir un cdigo que en esta etapa nos resulta desconocido. Sin embargo, en la seecin siguiente
veremos que el mtodo a utilizar depender de cada situacin particular. Adems, hay muchas cosas que la
43
44
Conclusin
En las 2 secciones anteriores vimos dos tablas comparativas de los 2 mtodos que tenemos para crear una
macro:
1. El mtodo de escribir manualmente la macro
2. El mtodo de grabar la macro automticamente.
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
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 conclusin podemos decir que la diferencia fundamental est en el cdigo generado. Aunque las
macros grabadas son ms sencillas porque no requieren conocer el cdigo necesario (objetos, propiedades y
mtodos) sin embargo la cantidad de cdigo que generan suele ser ms largo (ms lneas).
A pesar que el resultado final es el mismo, un cdigo con ms lneas siempre es menos deseable que un
cdigo con menos lneas. Esto es as porque un cdigo largo es ms difcil de controlar y de comprender y a la
larga puede ser ms propenso a que genere errores o disminuya la velocidad de ejecucin de la macro.
Recordemos los dos cdigos generados (omitimos los comentarios del comienzo del cdigo). Recuerda que lo
que nos interesa son las lneas entre Sub y End Sub. Ambas macros logran su cometido de escribir el valor
1500 en la celda A1. Sin embargo fjate que en la macro escrita solo utilizamos una lnea de cdigo mientras
que la macro grabada gener 3 lneas de cdigo (solo consideramos las lneas entre Sub y End Sub).
Macro escrita
Sub MiPrimeraMacro()
Range("A1").Value=1500
End Sub
Como conocamos el objeto y la propiedad fuimos directamente al grano. Al objeto Rango A1 le aplicamos la
propiedad Valor 1500. Solo una lnea de cdigo. Rpido y certero.
Macro grabada
Sub MiPrimeraMacro()
Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub
La macro grabada grab todas nuestras acciones en 3 lneas de cdigo. Cuando seleccionamos el rango A1 se
gener la 1 lnea de cdigo, cuando escribimos el valor 1500 se gener la 2 lnea de cdigo y cuando dimos al
"enter" luego de escribir el valor 1500 se gener la 3 lnea de cdigo.
En la macro grabada vers un nuevo objeto, ActiveCell (celda activa) y una nueva propiedad del mismo,
45
46
Nuestra recomendacin respecto a las macros escritas y grabadas ya te la dimos al comienzo del captulo.
Ejemplos de macros
Lo mejor es escribir las macros manualmente y utilizar la grabadora en aquellos casos donde no tenemos ni
idea sobre cul es el cdigo que necesitamos o como es el nombre del objeto, propiedad o mtodo.
Recuerdas el cdigo que habamos escrito para nuestra primera macro? El objetivo que perseguamos era
escribir el valor 1500 en la celda A1 de la hoja1. Repasemos rpidamente todo lo que habamos hecho para
escribir la macro:
Lo usual es que si ests comenzando solo utilizars la grabadora, y en la medida que vas conociendo el
lenguaje VBA, con sus distintos objetos, propiedades y mtodos ya te irs 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 todava no tienes idea de ningn cdigo. Sin embargo hemos preparado
este curso para hacerte la vida lo ms fcil posible. La buena noticia es que este curso tiene una 2 parte con
una gran cantidad de macros ya escritas.
As que nuestra recomendacin final es que primero leas la 1 parte de este curso (la teora), por lo menos un
par de veces, hasta que te encuentres cmodo con los conceptos. Luego ya podrs 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 cdigos, aparte de los que nosotros te facilitamos en la 2 parte del curso.
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 lnea 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 lnea 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 parntesis de apertura y cierre (). En nuestra macro:
Sub MiPrimeraMacro()
3. La 3 lnea era la instruccin principal que es donde nos referimos a los objetos, propiedades y mtodos.
Todo esto va escrito entre Sub y End Sub y podramos tener muchas lneas de cdigo si la macro fuera ms
compleja. Siempre se hace referencia al objeto y luego se le asignan propiedades o mtodos.
En nuestro caso el objeto es el rango A1 > Range("A1") y la propiedad que le asignamos fue el valor 1500 >
Value=1500
La lnea de la macro qued as:
47
48
Range("A1").Value = 1500
Macro 1
4. La 4 lnea representaba el final de la macro. Todas las macros se finalizan con la instruccin End Sub.
Tambin vimos que la macro se puede grabar automticamente, con la grabadora de macros, pero que
preferimos escribirla para utilizar menos lneas de cdigo y de paso aprender mejor los fundamentos del cdigo.
En la 2 parte de este curso estn las macros ms importantes que podrs 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.
6. Esta macro utiliza la instruccin Msgbox que sirve para abrir una ventana con la informacin que le
indiquemos. Ms adelante vers como puedes mostrar en esa ventana informacin 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 estn las macros ms importantes que
podrs necesitar, escritas, comentadas y listas para que las puedas copiar, pegar y adaptar en tus propios
desarrollos.
49
50
Macro 2
Macro 3
5. Puedes ejecutar esta macro rpidamente posicionndote en cualquiera de sus lneas de cdigo y luego
presionando la tecla F5 para ver lo que sucede.
5. Para probar esta macro vuelve a Excel con ALT+F11 y escribe algunos nmeros o palabras a gusto en el
rango A1:A5. Por ejemplo:
Tambin 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. Vers que la macro elimina las lneas de divisin de las celdas de la hoja activa (algo que tambin puedes
hacer desde Excel, men Herramientas > Opciones > pestaa Ver > casilla Lneas de divisin).
Esta macro utiliza el objeto ActiveWindow (ventana activa).
Luego le asigna la propiedad DisplayGridlines=False (mostrar lneas de divisin=falso)
Si quisieras volver a ver las lneas de divisin puedes cambiar la propiedad False por True, tal que:
5.1 Posicinate en la celda C1
ActiveWindow.DisplayGridlines = True
5.2 Desde el men Herramientas > Macros > Macro, elige de la lista la macro CopiaRango y luego Aceptar.
Recuerda que esto es tan solo un adelanto. En la 2 parte de este curso estn las macros ms importantes que
podrs necesitar, escritas, comentadas y listas para que puedas copiar, pegar y adaptar en tus propios
desarrollos.
5.3 El resultado ser que el rango A1:A5 se copiar a partir de la celda C1 que era la celda activa al ejecutar la
macro.
Range("A1:A5")
El objeto Range ya lo conocamos...
Copy
Este es un mtodo (una accin)
51
52
Destination:=ActiveCell
Este es otro objeto. Destination se suele utilizar luego de un Copy y ActiveCell hace referencia a la celda activa.
El editor de macros
Recuerda que esto es tan solo un adelanto. En la 2 parte de este curso estn las macros ms importantes que
podrs necesitar, escritas, comentadas y listas para que puedas copiar, pegar y adaptar en tus propios
desarrollos.
Es importante reconocer bien las principales opciones y secciones que tiene el editor de macros (tambin
conocido como editor de Visual Basic), dado que ser la herramienta que utilizaremos para escribir las macros.
En esta seccin veremos las distintas partes del editor y estudiaremos sus principales caractersticas.
53
54
Cmo acceder
El Editor de Visual Basic es la aplicacin que trae Excel desde donde se escriben y guardan las macros. Tienes 3
acceder al editor:
La forma ms rpida de acceder al editor es presionando ALT+F11
Tambin tienes otras formas de acceder:
Excel 2.003 o inferior: desde el men Herramientas > Macros > Editor de Visual Basic
56
Ventana Proyecto
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 editro de visual basic.
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 cuestin.
En la ventana de Proyecto hay carpetas donde se guardarn y escribirn las macros. Hemos presionado el
botn Alternar Carpetas para que se ordenen mejor los elmentos, como se ve a continuacin:
2. Formularios
Los formularios son ms conocidos como UserForms. Si no lo visualizas puedes agregarlos desde el men
Insertar > Userform.
2.1 Dentro de la carpeta de Formularios vemos un elemento llamado Userform1.
Todo el tema de formularios lo veremos con ms en detalle en el captulo "Formularios".
3. Mdulos
Los mdulos sirven para escribir macros a nivel genrico, sin estar relacionadas a la hoja o libro en particular. Si
no visualizas ninguno puedes agregarlos desde el men Insertar > Mdulo.
3.1 Dentro de la carpeta de Mdulos vemos que hay un elemento llamado Mdulo1. Podemos insertar tantos
mdulos como necesitemos. En los mdulos podemos escribir macros que operan de forma genrica, sin
distinguir entre hojas o libros.
Haciendo doble clic izquierdo en cualquiera de estos objetos vers que se habilita la Ventana de Cdigo de la
izquierda (una hoja en blanco grande). En la misma es donde se escriben las macros.
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), vers que aparece el proyecto VBAProject(Libro1). Dentro del parntesis aparece el nombre de tu
libro excel y lo de VBAProject podrs cambiarlo luego.
1. Si es una macro que solo debe afectar una hoja en particular escrbela en los objetos de Hoja, en el nombre
de Hoja correspondiente.
2. Si la macro debe afectar a todo un libro en particular escrbela en el objeto ThisWorkbook. Estas suelen ser
macros que se ejecutan al abrir, cerrar o guardar el libro.
3. Si la macro es de tipo genrica escrbela en un Mdulo.
Carpetas
En un segundo nivel tenemos 3 carpetas:
- Microsoft Excel Objetos
- Formularios
- Mdulos.
Veamos cada una de ellas:
1. Microsoft Excel Objetos
En esta carpeta vemos que cuelgan dos elementos:
57
58
Ventana Propiedades
Ventana Cdigo
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.
Veamos una foto para ver como se ve la Ventana de Cdigo. Cada vez que hagas doble clic izquierdo en algn
Objeto de la Ventana Proyecto se activar a la derecha la Ventana de Cdigo. Si no la puedes visualizar
puedes activarla posicionndote en el Objeto en cuestin y luego desde el men Ver > Cdigo.
Cada objeto tiene sus propiedades. Por ejemplo, si hacemos doble clic en el objeto Mdulo1 que vimos en la
seccin anterior, podremos ver sus propiedades:
Si todava no has escrito ninguna macro vers la ventana de cdigo en blanco. En nuestro ejemplo hemos
escrito 3 macros:
Algunos objetos tienen muchas propiedades (por ej. los Userforms) as que tenemos la opcin de ordenar lso
mismos de forma alfabtica o por categora. El objeto Mdulo1 solo tiene la propiedad (Name)Mdulo1. Si
quisiramos podramos reemplazar el nombre de Mdulo1 y asignar otro nombre a gusto.
Consejo: en la medida que vamos insertando muchas macros en nuestro proyecto, conviene ir creando nuevos
mdulos con nombres apropiados para mantener ordenadas nuestras macros.
El resto de las propiedades de los otros objetos escapa al alcance de esta seccin, pero podrs ver algunas en
la 2 parte de este curso.
Esta ventana no tiene mayores complicaciones. Lo que interesa es ms bin el cdigo que escribamos aqu.
Puedes escribir todas las macros que quieras en esta ventana. Recuerda que el mismo editor asignar
automticamente los colores al cdigo y adems separar con una lnea contnua cada macro.
En la medida que empecemos a escribir muchas macros, existe una forma rpida 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 rpidamente en la misma.
59
60
Ventana Inmediato
Veamos como se ve la Ventana de Inmediato. Si no la puedes visualizar puedes activarla desde el men Ver >
Ventana Inmediato.
La ventana inmediato sirve para escribir, ejecutar y probar un cdigo macro rpidamente, sin tener que armar
toda la macro con la estrucuta que comentamos en secciones anteriores.
Por ejemplo, si quisiramos averiguar la cantidad de hojas que tiene un Libro podramos escribir la siguiente
macro en un mdulo y ejecutarla:
Sub ContarHojas()
Dim N As Long
N= thisworkbook.Sheets.Count
Msgbox N
End Sub
De momento no importa los objetos, propiedades o mtodos que hemos utilizado. Solo te queremos mostrar
que es una macro de 5 lneas. Ahora supongamos que solo nos interesa saber el nmero 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 nmero de hojas que posee
el libro. El signo ? al comienzo significa que estamos buscando conocer el resultado de algo. El resultado final
se vera as, suponiendo que el libro tiene 1 hoja:
Veamos otro ejemplo. Si el libro fue guardado, podramos querer averiguar el directorio donde se encuentra.
Podramos 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:
61
62
Proteger el cdigo
As como se pueden proteger los libros, las hojas y las celdas de Excel, tambin es posible proteger con una
contrasea el cdigo 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 pestaa de Proteccin. Vers una
ventana como la de la siguiente:
63
64
Ejecucin de macros
Desde el cdigo
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.
La forma ms rpida de ejecutar una macro es desde el mismo cdigo. Cuando terminas de escribir una macro
puedes posicionarte en cualquiera de sus lneas de cdigo y presionar la tecla F5. Recuerda que puedes
acceder al cdigo de las macros desde el editor de macros, con las teclas ALT+F11.
Dependiendo del caso te interesar ejecutar la macro desde un men, desde un botn o incluso ejecutarla
automticamente 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 automticamente al ocurrir alguno de los eventos
mencionados se explica en el captulo "Macros de Eventos".
65
66
Desde el men
Otra forma de ejecutar una macro es desde el men de macros, que lo puedes visualizar presionando ALT+F8
Vers que se abre un cuadro como el siguiente:
67
68
Desde el teclado
Otra forma muy prctica de ejecutar una macro es desde el teclado. Esto tambin se conoce como teclas de
mtodo abreviado. Para configurar las teclas con las cuales ejecutar debes hacer los siguiente:
hay muchas combinaciones de Ctrl+Letra que ya estn 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
Maysc antes de la letra de tal forma que la macro se ejecutar con Ctrl+Mays+Letra y de esta forma no
alterar las teclas de mtodo abreviado por defecto de Excel.
3. Donde dice Tecla de mtodo abreviado presiona la tecla MAYUSC y luego una letra. En nuestro ejemplo la
macro se ejecutar con Ctrl+Maysc+Q
Recuerda: la macro siempre se ejecuta con la tecla Ctrl+ la letra que tu escribas en la casilla. Sin embargo,
69
70
Desde objetos
Muchas veces, y sobre todo cuando desarrolles aplicaciones en Excel, te interesar asignar macros a objetos
grficos insertados en la hoja. Excel posee una gran cantidad de figuras y dibujos que puedes insertar en la
hoja.
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:
3. Al elegir la opcin de Asignar macro abrirs el el men de macros. Selecciona de la lista la macro de tu
inters luego Aceptar.
Si ya has insertado una figura en tu hoja Excel, podrs asociarle una macro siguiendo estos pasos:
1. Haz clic izquierdo en la figura para desplegar su men de opciones.
2. Elige la opcin Asignar macro
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.
71
72
Desde botones
(solo para Excel 2.000 a 2.003)
Tambin es posible crear nuevos botones para la barra de herramientas de Excel y asignarle macros a los
mismos. Para hacerlo sigue estos pasos:
1. Ir al men Ver> Barra de herramientas > Personalizar.
1.1 Desde la pestaa Comandos, en la lista de Categoras, elegimos la opcin Macros.
1.2 A la derecha aparecer una opcin de Personalizar botn sobre la cual debemos hacer clic izquierdo y luego
arrastar y soltar ese botn a la barra de botones de Excel.
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
2. Es importante que mantengas abierto el cuadro de Personalizar, porque si no no podrs editar el botn. Si
hacemos clic izquierdo sobre el botn se desplegar el men de opciones. Las opciones ms importantes son las
de Cambiar imagen del botn y la de Asignar macro. Esta ltima opcin nos permitir abrir el cuadro de diogo
con la lista de macros creadas para asignarle una macro determinada (visto en la seccin anterior).
73
74
Automticamente
Las macros tambin se pueden ejecutar automticamente. 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 ms detalle en el siguiente captulo Macros de Eventos.
75
76
Macros de eventos
Eventos de libros
Como decamos en la seccin anterior, las macros tambin se pueden ejecutar automticamente. En este caso
se las denomina macros de evento, porque ante un determinado evento o accin realizada por el usuario, la
macro se ejecuta automticamente.
Los eventos de libros permiten disparar automticamente una macro cuando suceden determinadas acciones a
nivel del libro excel en cuestin, por ejemplo al abrirlo, guardarlo, cerrarlo, imprimirlo, etc.
Instrucciones para insertar una macro de evento a nivel libro:
En las secciones siguientes repasaremos los principales eventos que pueden disparar una macro
automticamente. Existen una gran cantidad de macros de evento as que solo estudiaremos las ms
utilizadas.
1. Las macros de eventos se deben escribir en la carpeta ThisWorkbook del editor de macros.
3. Finalmente, en la lista desplegable de la derecha veremos todos los eventos de libro que podemos utilizar
para disparar nuestra macro.
77
78
En el caso de las macros de evento, siempre aparece la palabra Private. Eso significa que esa macro no la
podrs ver en la lista del men de macros. Esto es as porque la macro no se puede ejecutar manualmente, si
no que se ejecuta automticamente cuando ocurre el evento, en este caso cuando se activa el libro excel en
cuestin.
Existen ms de 20 macros de evento a nivel libro. Puedes insertarlas siguiendo las instrucciones dadas al
comienzo. Las ms importantes son:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' El cdigo que escribas aqu se ejecutar automticamente al cerrar el libro
End Sub
4. Por ejemplo, si haces clic en la opcin Activate, vers que en la ventana de macros se escribe
automticamente el siguiente cdigo:
End Sub
Al seleccionar una macro de vento el editor escribe automticamente la primera y tlima lnea de su cdigo (no
debes modificar esto). Luego podrs escribir tu cdigo macro entre esas lneas. En este caso, la macro que
escribas se ejecutar cada vez que actives el libro excel en cuestin. Por ejemplo, puedes hacer una macro que
muestre un mensaje de saludo cada vez que abres el libro:
Entonces, cada vez que abras el libro, la macro se ejecutar automticamente y vers el saludo:
79
80
Eventos de hojas
Los eventos de hojas permiten disparar automticamente una macro cuando suceden determinadas acciones a nive
Instrucciones para insertar una macro de evento a nivel hoja:
1. Las macros de eventos se deben escribir en la carpeta Hoja1(Nombre) del editor de macros. Fjate que Hoja1 i
Por ejemplo, si en tu Excel la primera hoja se llama "Gastos", en el editor veras Hoja1(Gastos).
En nuestro caso tenemos Hoja1(Hoja1). Al hacer doble clic en dicha carpeta, la macro que escribamos solo afectar
4. Por ejemplo, si haces clic en la opcin Activate, vers que en la ventana de macros se escribe el siguiente cdigo
Private Sub Worksheet_Activate()
End Sub
Al seleccionar una macro de evento el editor escribe automticamente la primera y tlima lnea de su cdigo (no de
escribas se ejecutar cada vez que actives la hoja excel en cuestin. Por ejemplo, puedes hacer una macro que mu
Entonces, cada vez que actives la hoja, la macro se ejecutar automticamente y vers el saludo:
3. Finalmente, en la lista desplegable de la derecha veremos todos los eventos de hoja que podemos utilizar para d
En el caso de las macros de evento, siempre aparece la palabra Private. Eso significa que esa macro no la podrs
que se ejecuta automticamente cuando ocurre el evento, en este caso cuando se activa la hoja excel en cuestin.
Existen unas 9 macros de evento a nivel hoja. Puedes insertarlas siguiendo las instrucciones dadas al comienzo. La
81
82
Formularios
Un Formulario (o su denominacin en ingls Userform) se utiliza para crear un Cuadro de Dilogo donde el
usuario puede introducir informacin, o realizar otras operaciones. Al ejecutar muchas de las opciones del men
de Excel se abren formularios. Por ejemplo, desde el men Herramientas > Opciones se abre un formulario
como el siguiente, desde donde se pueden activar o desactivar distintas opciones de Excel.
Este formulario es muy completo y posee pestaas en la parte superior, casillas de seleccin (cuadraditos con
tildes), casillas de opciones (crculos con un punto dentro) y listas desplegables (lista con una flechita que
despliega distintas opciones).
Tambin podemos crear nuestros propios formularios como se ve a contoinuacin.
83
84
Crear un formulario
Para crear un Userform debemos hacer lo siguiente:
1. Abrir el editor de macros (por ejemplo, con CTRL+F11).
2. Insertar un objeto Userform. Esto podemos hacerlo fcilmente:
2.1 Seleccionamos el Libro Excel donde trabajaremos, en nuestro caso VBAProject (Libro2).
2.2 Hacemos clic derecho en el mismo y elegimos la opcin Insertar > Userform
2.3 Como se ve en la fotografa, veremos que aparece un objeto Userform1 que cuelga de la carpeta
Formularios
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 ms intuitiva.
En este captulo aprenderemos como construir nuestros propios Userforms !
3. En la ventana de Cdigo de la derecha, veremos que aparece un Userform en blanco, sin controles. Para
abrir su Cuadro de Herramientas puedes hacerlo desde el men Ver > Cuadro de Herramientas. Ah figuran los
controles que podremos agregar dentro del Userform. Para adir uno, simplemente hacemos clic izquierdo en el
control deseado y luego clic izquierdo dentro del Userform, en el sitio donde querramos agregar el control.
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
85
86
La idea es que mediante estos controles podremos tanto capturar como enviar informacin o datos desde o
hacia las celdas de Excel respectivamente. Tambin 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, vers 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.
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.
ComboBox (cuadro combinado): sirve para que un usuario elija una opcin 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.
87
88
CheckBox (casilla de verificacin): sirve para que un usuario active una determinada funcin.
ScrollBar (barra de desplazamiento): si tenemos una lista con muchos elementos el scrollbar nos permite
navegarlos.
Ejemplo: podemos hacer que al cerrar el Userform se imprima un reporte solo si la casilla de seleccin est
tildada.
Ejemplo: tenemos una lista con 150 pases. Con el ScrollBar podemos subir y bajar por la lista de los mismos
utilizando las flechas de desplazamiento.
OptionButton (botn de opcin): sirve para que un usuario seleccione una opcin 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.
Ejemplo: tenemos una lista con tipos de inters y queremos que sean incrementados o disminudos en
cantidades predeterminadas desde el SpinButton.
Ejemplo: queremos introducir una fotografa como fondo del Userform para darle un aspecto ms profesional.
Ejemplo: queremos que el usuario defina su idioma, en modo encendido espaol y en modo apagado ingls.
Ejemplo: queremos que el usuario seleccione un dato que fue introducido previamente en una celda Excel.
Haciendo doble clic en cada control se abrir una venta donde podremos escribir y asociarle una macro. En la
seccin siguiente veremos un ejemplo simple sobre como crear un Userform paso a paso.
Para ver como se veran 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.
CommandButton (botn de comando): es un simple botn que nos permite ejecutar acciones.
Ejemplo: un botn de Ayuda que ejecuta otro Userform con ayuda para el usuario.
89
90
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 botn, los mismos se volcarn en una tabla
de Excel.
Los controles que utilizaremos son:
Textbox: para que el usuario ingrese los datos
Label: para darle el nombre e los Textbox
CommandButton: para proceder con el ingreso de datos o cancelar
91
92
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 ttulo. 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 ttulo del
Userform es ms apropiada para nuestro propsito y para darle mejor informacin al usuario.
93
94
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).
5.5 Hacemos clic en alguna parte vaca del Userform para seleccionarlo y mostrar el cuadro de herramientas.
4.3 Hacemos clic en una parte vaca del Userform, para volver a seleccionar todo el Userform.
Agregamos los cuadros de texto y las etiquetas restantes (ya lo hicimos para el nombre as que repetimos para
Edad y Fecha de Nacimiento).
Repetimos los pasos 4 y 5 y agregamos:
* Un TextBox cuyo (Name) sea UFEdad, con una Etiqueta llamada "Edad"
* Un TextBox cuyo (Name) sea UFFecha, con una Etiqueta llamada "Fecha Nac."
5.2 En el Userform hacemos clic a la izquierda del TextBox, para agregar la Etiqueta de texto.
Es muy importante que no olvides asignar bien los nombres (Name) a los Textbox, si no la macro dar error.
Puedes revisar los pasos 4 y 5 para recordar como hacerlo.
Si los textbox no quedan alineados se pueden alinear de la siguiente forma:
1. Clic en el primer TextBox
2. Mantieniendo pulsada la tecla MAYUS, selecciona los otros TextBox
3. Vamos al men Formato > Alinear > Izquierda
4. Hacemos clic en alguna parte vaca del Userform para seleccionarlo y mostrar el cuadro de herramientas.
5.3 Si fuera necesario podemos cambiar el tamao de la etiqueta de texto o del Cuadro de Texto para que no
se superpongan. Se puede hacer clic en sus bordes (pequeos cuadraditos) y arrastrar para cambiar su
tamao.
5.4. Seleccionamos la nueva etiqueta, hacemos doble clic en la propiedad Caption de la ventana de
propiedades, tipeamos Nombre y luego Enter.
95
96
7.2 En el Userform hacemos clic en la parte inferior izquierda para agregar el botn.
7.3 Con el nuevo botn seleccionado hacemos doble clic en la propiedad (Nombre) de la Ventana de
Propiedades, tipeamos UFAgregar y luego enter.
7.4 Con el nuevo botn seleccionado hacemos doble clic en su propiedad Caption en la Ventana de
Propiedades, tipeamos Agregar y luego enter.
7.5 Hacemos clic en alguna parte vaca del Userform para seleccionarlo y mostrar el Cuadro de Herramientas.
7.6 Repetimos los pasos anteriores para agregar otro Botn de comando llamado UFCerrar y nombre "Cerrar".
7.8 Si fuese necesario podemos reubicar los botones dentro del Userform.
Es muy importante que no olvides asignar bien los nombres (Name) a los Botones de comando, si no la macro
dar error. Esto se explica en el paso 7.3 y luego debers repetirlo para el otro botn, tal cual se indica en el
paso 7.6.
8.4 En el men superior elegimos Ver > Objeto para regresar al Userform.
No te preocupes si no comprendes el cdigo. Hay muchos objetos, propiedades y mtodos nuevos. Todos ellos
se explican mejor en la 2 parte de este curso.
9.4 En el men superior elegimos Ver > Objeto para regresar al Userform.
97
98
Probar el Userform
Varios
En este captulo se comentan temas diversos pero que no dejan de ser importantes sobre macros.
1. Hacemos clic en alguna parte vaca 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 botn de Agregar y los datos se
completarn en la Tabla de Excel.
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
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:
1. Clic derecho en una parte vaca del USerform
2. Elegimos Orden de Tabulacin.
3. Seleccionamos el control de la lista y con los botones de Mover Arriba o Mover Abajo ajustamos el orden.
4. Hacemos clic en OK
99
100
Sub SuperMacro()
Call FormatoN
Call Bordes
Call Relleno
End Sub
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 cdigo 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
cdigo de la macro principal. Por ejemplo, si ejecutamos la Macro1 y queremos que desde la misma se ejecute
la Macro2 lo haramos as:
La palabra Call se puede omitir pero recomendamos utilizarla para identificar mejor que estamos llamando otras
macros. Como se v en el cdigo, la SuperMacro ejecuta 3 macros. Estas 3 macros deben estar ubicadas en el
mismo mdulo y las escribimos a continuacin:
Sub Macro1()
'El cdigo de mi Macro1
Macro2
End Sub
Sub FormatoN()
'Asigna Formato Numrico
Selection.NumberFormat = "#,##0;[Red]#,##0"
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 instruccin Call, la misma queda en azul
automticamente, y nos permite identificar mejor que estamos llamando otra macro.
Sub Bordes()
'Asigna Bordes
With Selection.Borders
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Sub
Sub Macro1()
'El cdigo de mi Macro1
Call Macro2
End Sub
Sub Relleno()
'Asigna Color de Relleno
With Selection.Interior
.ColorIndex = 36
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
End Sub
101
102
Depuracin y errores
Es comn que cuando ejecutamos una macro la misma tenga algn 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 funcin es seleccionar la celda A2. Si
escribimos correctamente la macro, el editor asigna automticamente los colores azules, lo que significa que ha
reconocido la estructura Sub() - End Sub.
Ejemplo:
'Esta macro selecciona la celda A2
Sub Macro()
Range("A2").Select
End Sub
Si las instrucciones estn bien escritas el editor convierte automticamente las maysculas 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, captulo "Estrucuturas".
Si cometiramos un error al referirnos al objeto "Range" y por ejemplo olvidramos poner la comilla luego del 2,
al dar enter a dicha lnea aparecera un mensaje de error y la lnea se pintara automticamente de rojo, como
se ve a continuacin.
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
Sub Macro()
Range("A2).Select
End Sub
Cuando sucede esto aparece un aviso que nos indica el error cometido. Si vemos que la lnea est roja es
seal que debemos corregir algo (usualmente falta o sobra algn caracter). En nuestro caso, hemos olvidado
poner la comilla (el objeto Range siempre requiere que la celda est entre comillas y luego entre parntesis).
Veamos otro error de tipeo. En ese caso escribimos errneamente "Sab", en lugar de "Sub". A pesar que no
aparecer ningn 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 lnea 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
103
104
automticamente (Excel carga automticamente todos los complementos que estn seleccionados al abrirse).
Una vez que tenemos nuestras macros, es posible "empaquetarlas" bajo la forma de un Complemento, tambin co
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 ms que nuevas funcionalidades y opciones para Excel, realizadas con ma
3. Se abrir el Cuadro de dilogo de guardar y en la parte inferior hay una lista desplegable llamada Guardar como
lista debes elegir la opcin Complemento de Microsoft Excel, que suele ser la ltima de las opciones.
4. Debers elegir un nombre para tu complemento y guardarlo normalmente. Dicho archivo se guardar automtic
extensin XLA.
5. Para instalar el complemento debes hacerlo desde el men Herramientas > Complementos y luego la opcin
como te sealbamos al comienzo. Debers buscar el directorio donde guardaste el archivo XLA y seleccionarlo. D
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 vers un cuadro sim
muestra a continuacin (los complementos visibles dependen de los que tengas activados, en nuestro caso
activado un complemento llamado "ASAP Utilities").
Si quieres instalar nuevos complementos, debers hacerlo desde el men Office > Opciones de Excel > Complem
botn Ir podrs abrir el cuadro de complementos.
A la izquierda se ve la lista de complementos disponibles siendo posible activarlos o desactivarlos (sel
deseleccionando la casilla a la izquierda de su nombre).
Cuando queremos instalar nuevos complementos debemos hacerlo con el botn Examinar. Dicho botn nos perm
directorio donde se encuentra el complemento que deseamos instalar. La extensin de los archivos de complement
La utilidad de un complemento es que podemos crear nuestras macros y luego guardarlas como complemento. D
dichas macros estarn disponibles en todas las hojas Excel que abramos, dado que el complemento
105
106
4. Debers elegir un nombre para tu complemento y guardarlo normalmente. Dicho archivo se guardar automtic
extensin XLA.
Y se abrir el cuadro de complementos
5. Para instalar el complemento debes hacerlo desde el men Herramientas > Complementos y luego la opcin
como te sealbamos al comienzo. Debers buscar el directorio donde guardaste el archivo XLA y seleccionarlo. D
cada vez que abras el Excel, el complemento estar activo.
107
108
Seguridad de macros
Las opciones de seguridad de macros han cambiado considerablemente en la nueva versin Excel 2.007.
Si utilizas Excel 2.003 o inferior, continuar aqu...
Si utilizas Excel 2.007 o inferior, continuar aqu...
Excel 2.003
Excel posee 3 niveles de seguridad de macros. Los mismos se pueden definir desde el men Herramientas
pestaa Seguridad > botn Seguridad de macros. El cuadro de dilogo que se abre se ve as:
Al presionar el botn de Configuracin del Centro de confianza aparece una nueva ventana en la cual debem
Configuracin de macros (parte izquierda) y luego seleccionar la opcin Deshabilitar todas las macros con notificac
que cada vez que se abra un libro con macros, aparezca un mensaje notificando de las mismas y dando la opcin
o deshabilitarlas.
Lo recomendable es tener el nivel de seguridad en Medio. De esta forma cada vez que abramos un archivo tendre
de habilitar o deshabilitar las macros, mediante un mensaje automtico de aviso que aparece. Si el archivo pro
fuente segura las podremos habilitar sin problemas.
Excel 2.007
Esta versin de Excel posee gran cantidad de novedades respecto a temas de seguridad. En primer lugar, la
niveles de seguridad de macros las encontramos en el men Office > Opciones de Excel > Centro de confianza >
del Centro de confianza tal cual se ve a continuacin:
109
110
111
112
Firma digital
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.
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 ms aparecer el
mensaje de macros al abrir dicho archivo. Todos los xls que lleven esa firma se abrirn con sus macros
habilitadas.
Si quieres ejecutar las macros y que no vuelva a aparecer dicho mensaje, debers 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 opcin de buscar archivos.
Al ejecutar Selfcert.exe se abre una pequea 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 botn Elegir, escogemos la firma creada, aceptamos y todo listo, macros
firmadas.
113
114
Macros privadas
Recuerda que puedes visualizar las macros de tu libro presionando ALT+F8. Vers 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 botn de Ejecutar.
Si deseas ocultar las macros del libro en dicho cuadro puedes hacerlo utilizando la instruccin Private cuando
escribas tu macro. Debes utilizar dicha instruccin delante de la palabra Sub. De este modo solo ocultars la
macro en cuestin. Ejemplo:
Private Sub MiMacro()
'Esta macro no aparecer en la lista de macros
'Cdigo de tu macro aqu
End Sub
Si tienes muchas macros en el mdulo y quieres ocultarlas todas, en lugar de escribir la palabra Private en cada
una de ellas, puedes colocar la siguiente instruccin al comienzo de tu mdulo:
Option Private Module
De esta forma todas las macros de dicho mdulo quedarn ocultas.
115
116
.Interior.ColorIndex = 5
End With
End Sub
Acelerar el cdigo
En la medida que la cantidad de cdigo contenido en las macros se incrementa, es posible que la velocidad de
ejecucin de las mismas disminuya. Sin embargo, existen algunas recomendaciones para mantener las macros
rpidas:
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
ms lento. Si solo queremos ver el resultado final y ganar velocidad, debemos utilizar la instruccin
Application.ScreenUpdating=False. En general se recomienda incluir siempre esta lnea al comienzo de cada
macro, por ejemplo:
Si queremos insertar frmulas en celdas mediante macros, existe una forma ms rpido de hacerlo que con
Copiar y pegar. Por ejemplo:
Sub SuperMacro()
Application.ScreenUpdating=False
'El cdigo de la macro aqu
Application.ScreenUpdating=True
End Sub
Sub CopiarFormula()
Range("A1:A10").FormulaR1C1 = "=SUM(RC[1]:RC[5])"
End Sub
Para saber como obtener la frmula podemos hacer lo siguiente:
4.1 Insertamos la frmula en la celda
4.2 Vamos al men Herramientas > Macros > Grabar nueva macro
4.3 Desde la celda con la frmula presionamos la tecla F2 y luego Enter.
4.4 Revisamos la macro grabada para obtener el cdigo
Al final, volvemos a dejarla en True, que es como debe quedar por defecto.
Cuando se utiliza la grabadora de macros, es comn que se genere ms cdigo del necesario y esto hace que
funcione un poco ms 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 cdigo ser el
siguiente:
Sub CopiaRango()
Range("C10:C12").Select
Selection.Copy
Range("E10").Select
ActiveSheet.Paste
End Sub
Sub CopiaRango()
Range("C10:C12").Copy Range("E10")
End Sub
Sub CambiarFormatoRango()
With Range("A1")
.Value = 10
.Font.Bold = True
117
118
Macros
En esta parte del curso veremos casos prcticos de macros, listas para utilizar o adaptar.
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
119
120
Importante
En muchos ejemplos las macros no tienen su lnea de comienzo (Sub) ni su lnea de final (End Sub), como por
ejemplo: ActiveSheet.PageSetup.PrintArea = "$A$1:$G$22"
Antes de comenzar con esta 2 parte del curso, es importante que tengas en cuenta lo siguiente:
Esta lnea la podras utilizar dentro de la ventana Inmediato del editor VBA.
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 teora para principiantes.
Pero en la mayora 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
Todas las dudas y consultas sobre Excel las respondemos desde nuestra web.
Es comn que hagamos uso de los Msgbox para indicar que puedes continuar con tu cdigo. Esto quiere decir
que como el cdigo siguiente depender de lo que t necesites, el Msgbox es una forma de finalizar la macro.
Si quisieras continuar tu macro simplemente deberas eliminar el Msgox y reemplazarlo por el resto de tu
cdigo.
Luego, utilizando la tecla F8 podrs ver como las diferentes macros se ejecutan pausadamante lnea a lnea
(esto fue explicado en la 1 parte del Manual, captulo "Varios", seccin "Depuracin y errores").
Utilizando el Application.Wait
Muchas de las macros adjuntas en los libros, muestran la siguiente lnea de cdigo:
Application.Wait Now + TimeValue("00:00:01")
Esto produce que la macro se ejecute de forma ms lenta, para poder observar mejor el cometido que est
realizando, pues de lo contrario, y sobre todo en las macros con poco cdigo, la macro finalizara en apenas
unas dcimas de segundo.
Por ejemplo,con Application.Wait Now + TimeValue("00:00:02")
obligamos a Excel a esperar 2 segundos ms que el tiempo actual para continuar con la lnea del cdigo que
estuviese a continuacin.
121
122
Variables
Definicin
Como prcticamente todas las macros utilizan variables, es importante comenzar a entenderlas. Una variable
es sencillamente un dato o valor que VBA guarda en memoria.
Una variable es un lugar de almacenamiento con nombre que puede contener cierto tipo de datos que puede se
modificado durante la ejecucin del programa. Cada variable tiene un nombre nico que la identifica dentro de s
nivel de mbito. Puede especificar un tipo de datos o no. Los nombres de variable deben comenzar con un carcte
alfabtico, deben ser nicos dentro del mismo mbito, no deben contener ms de 255 caracteres y no puede
contener un punto o carcter de declaracin de tipo.
Es decir las variables pueden contener caracteres alfanumricos, pero siempre deben empezar por una letra y n
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 variable
propias, algunas de estas palabras son: Sub, End, with, do, loop etc, ya que son nombres que tienen un significad
propio dentro de VBA.
La idea es que Excel recordar que la variable "Nombre" tiene asignado el valor "Pedro". Podremos utilizar
dicha variable ms adelante en nuestro cdigo.
Podemos declarar todo tipo evariables, por ello conviene tambin adquirir la costumbre de hacer que el propi
nombre de nuestras variable resulte descriptivo de la funcin que cumplir, por ejemplo:
Sub Macro()
' Definimos una variable numrica TipoCambio, que es el factor de conversin entre el euro y la lib
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 cdigo de nuestra macro crece mucho, al haber dado un nombre apropiado a la variable nos permitir
reconocerla fcilmente, 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, llegara un punto donde no recordaramos que haba en valor, porqu
es un nombre que no nos dice mucho.
La declaracin de variables agiliza el consumo de memoria y hace que el cdigo se ejecute mas rpido. Si n
123
124
Declaracin
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 obligacin de declarar todas las variables que podamos ir utilizando en
nuestros mdulos (es decir obligarnos a definir nuestras variables de entrada).
Esto lo podemos realizar desde el editor de VBA, a traves del men Herramientas > Opciones > pestaa Editor
> y seleccionar la casilla Requerir declaracin de variables
Con esta accin cada vez que insertamos un nuevo mdulo en el editor de Visual Basic, el mdulo aadido
incluir automticamente la instruccin Option Explicit al comienzo de todo, como se ve a continuacin:
126
Sub MacroMensaje()
' Declaramos la variable saludo como variable tipo texto
Dim saludo As String
' Damos un valor a la variable declarada
saludo = "Hola que tal"
' Damos un valor a esta otra variable, que NO ha sido declarada
despedida = "Adios"
MsgBox saludo
MsgBox despedida
End Sub
Cuando ejecutamos esta macro obtenemos un error de compilacin , 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, tendramos:
Sub MacroMensaje()
' Declaramos la variable saludo como variable tipo texto
Dim saludo As String
' Aqu declaramos la variable que habamos olvidado antes
Dim despedida As String
' Damos un valor a la variable declarada
saludo = "Hola que tal"
' Damos un valor a la variable declarada
despedida = "Adios"
MsgBox saludo
MsgBox despedida
End Sub
La declaracin de variables es primordial, totalmente necesaria, pues ayuda a saber el cdigo que estamos
manipulando y utilizar menos memoria, es por ello una buena accin forzar la declaracin de variables siempre
(por eso recomendamos seguir los pasos indicados al comienzo de esta seccin).
127
128
Lgicamente si sabemos que una variable va a utilizar valores numricos sin decimales y entre 1 y 25, conviene
Byte, como se ve en este ejemplo:
Tipos
La tabla siguiente muestra los tipos de datos compatibles, incluyendo el tamao de almacenamiento y el intervalo.
En la 1 columna (Tipo de datos) se define el tipo variables que podemos usar
En la 2 columna (Tamao) se define cuanto espacio ocupa en memoria
En la 3 columna (Intervalo) se definen los valores que puede adquirir la variable
Tipo de datos
Tamao
La macro anterior utiliza bastantes menos recursos que esta prxima que no fuerza la declaracin de la vari
considerada como Variant):
Intervalo
Byte
byte
0 a 255
Boolean
bytes
True o False
Integer
bytes
-32,768 a 32,767
bytes
-2,147,483,648 a 2,147,483,647
bytes
Single (coma
simple)
flotante/
precisin
Option Explicit
Sub Macro()
Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
Sub Macro()
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
Que incluyamos la declaracion Option Explicit no implica que vayamos a hacer un buen uso de las variables pue
hemos considerado que X es Long, cuando podra utilizar menos recursos siendo Byte:
bytes
-1.79769313486231E308 a -4,940656458
negativos; 4,94065645841247E-324 a 1,7
valores positivos
bytes
-922.337.203.685.477,5808 a 922.337.20
Decimal
bytes
+/-79.228.162.514.264.337.593.543.950.3
7,9228162514264337593543950335 con
del signo decimal; el nmero ms peque
0,0000000000000000000000000001
Date
bytes
Object
bytes
0 a 2.000 millones
longitud de la cadena
1 a 65.400 aproximadamente
bytes
Option Explicit
Sub Macro()
Dim X As Long
' Aunque sera recomendable Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
Una solucin momentnea para saber que tipo de variable deberamos utilizar podra ser de la siguiente for
eliminado la instruccin 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:
129
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
130
Locales
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
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 hacan 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
Tambin se pueden declarar varias variables en la misma lnea de cdigo tal que:
Daria como resultado Integer, en lugar de Byte, no obstante el ahorro de recursos resulta en cualquier caso evident
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 podrn utilizar el mismo nombre de la variable tal que:
Option Explicit
Sub Macro1()
Dim Autor As String
Autor = "TodoEXCEL"
ActiveCell = Autor
End Sub
Sub Macro2()
Dim Autor As String
Autor = "Pedro"
ActiveCell = Autor
End Sub
Sub Macro3()
Dim Autor As String
Autor = "Jose"
ActiveCell = Autor
End Sub
131
132
Sub Macro4()
Dim Autor As String
Autor = "Salvador"
ActiveCell = Autor
End Sub
Pblicas
Las variables declaradas mediante la instruccin Public estn disponibles para todos los procedimientos en
todos los mdulos de todas las aplicaciones, a menos que Option Private Module est en efecto; en este caso,
las variables slo son pblicas dentro del proyecto en el que residen.
Se recomienda la utilizacin de variables locales antes que la de variables pblicas (las veremos en la seccin
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 pblicas an cuando la macro termina, el valor al que hacen referencia las
variables sigue vigente y ocupando espacio en memoria.
Este tipo de variables son tiles cuando empezamos a trabajar con macros pues facilitan la comprensin, y nos
ahorran el hecho de tener que declarar lo mismo una y otra vez.
Usamos la instruccin Public para declarar el tipo de datos de una variable. Por ejemplo, la instruccin siguiente
declara una variable como de tipo Integer:
Public NmeroDeEmpleados As Integer
Usamos tambin la instruccin Public para declarar el tipo de objeto de una variable. La instruccin siguiente
declara una variable para una nueva instancia de una hoja de clculo:
Option Explicit
133
134
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
' An cuando este ejemplo puede resultar absurdo pues:
Sub Macro()
Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
Con el ejemplo anterior tan solo pretendemos hacer referencia a que a veces conviene utilizar variables
pblicas pues son variables que van a ser utilizadas ampliamente y es absurdo ir definindolas en cada macro.
Que una variable sea pblica 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 tena.
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
135
136
Estticas
Las variables declaradas con la instruccin Static conservan su valor mientras el cdigo se est ejecutando.
Una vez que el cdigo del mdulo se est ejecutando, las variables declaradas con la instruccin Static
conservan su valor hasta que se reinicie o restablezca el mdulo. En los mdulos de clase, las variables
declaradas con la instruccin Static conservan su valor en cada instancia de clase hasta que se destruye la
instancia. En mdulos de formulario, las variables estticas conservan su valor hasta que se cierra el formulario.
Use la instruccin Static en procedimientos no estticos para declarar explcitamente variables que son visibles
slo dentro de un procedimiento, pero cuya vida es la misma que la del mdulo en la que se defini el
procedimiento.
Usamos una instruccin 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 tenan la ltima vez que fueron utilizados, se declaran tal que:
Static X as byte, o Static Y as Long
En este ejemplo trabajaremos con dos macros: macro1 y macro2.
Ambas utilizarn una variable comn tal que: Public Rg As Range
Utilizaremos Option Explicit para forzar la declaracin de variables.
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 ejecutndose 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 travs de la macro1 desde 10 hasta 250.
Option Explicit
Public Rg As Range
Nota: la instruccin 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 estticos, 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 instruccin Static se usa
para declarar variables especficas dentro de procedimientos no estticos para conservar su valor mientras el
programa se est ejecutando.
En este ejemplo se utiliza la instruccin Static para conservar el valor de una variable mientras el cdigo del
mdulo se est ejecutando.
' Definicin de funcin.
Function ConservarTotal(Nmero)
' Slo la variable Acumulado conserva su valor entre distintas llamadas.
Static Acumulado
Acumulado = Acumulado + Nmero
ConservarTotal = Acumulado
End Function
' Definicin de una funcin como Static.
Static Function MiFuncin(Arg1, Arg2, Arg3)
' Todas las variables locales conservan su valor entre llamadas a la funcin.
Acumulado = Arg1 + Arg2 + Arg3
Mitad = Acumulado / 2
MiFuncin = Mitad
End Function
Ya sean pblicas, locales o estticas, cuando se inicializan las variables, una variable numrica se inicializa a 0,
una cadena de longitud variable se inicializa a una cadena de longitud cero ("") y una cadena de longitud fija se
rellena con ceros. Las variables Variant se inicializan a Empty. Cada elemento de una variable de un tipo
definido por el usuario se inicializa como si fuera una variable distinta.
Sub Macro1()
Dim x As Byte
For x = 1 To 25
Set Rg = Cells(x, 1)
Call Macro2
Next x
End Sub
Sub Macro2()
Static x As Byte
x=x+5
Rg.Select
Rg = x
End Sub
Si una vez ejecutada la macro1, ejecutramos la macro2 repetidas veces, la celda A25 seguira seleccionada,
pero su valor aumentara hasta 255. Y porque no ms?
Porque aunque sea static hemos definido x en esta macro como Byte luego cuando x>255 obtendramos un
error de recompilacin, ya que habra un desbordamiento.
137
138
Constantes
Conversin
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
Es posible convertir variables de un tipo a otro. Existen distintas funciones que que permiten hacer estas
conversiones, por ej:
CBool(expresin), CByte(expresin), CCur(expresin), CDate(expresin), CDbl(expresin), CDec(expresin),
CInt(expresin), CLng(expresin), CSng(expresin), CStr(expresin), CVar(expresin)
El argumento obligatorio expresin es cualquier expresin de cadena o expresin numrica.
Tipos devueltos: el nombre de la funcin determina el tipo devuelto, como se muestra a continuacin:
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. Lgicamente carece de sentido declarar variables como
constante si stas no son pblicas.
Funcin
Tipo devuelto
CBool
Boolean
Para declarar una variable como constante utilizamos la instruccin Const, por ej:
Option Explicit
Const nPaises As Byte = 53
Const UKrate = 1.43, USrate = 0.78
CByte
Byte
CCur
Currency
CDate
Date
CDbl
Double
expresin de fecha
.79769313486231E308 a 4,94065645841247E-324 para valores
negativos; 4,94065645841247E-324 a
1,79769313486232E308 para valores
positivos.
Cdec
+/79.228.162.514.264.337.593.543.950.335
para nmeros basados en cero, es decir,
nmeros sin decimales. Para nmeros
con 28 decimales, el intervalo es +/7,9228162514264337593543950335. La
menor posicin para un nmero que no
sea
cero
es
0,0000000000000000000000000001.
Cint
Clong
CSng
Cstr
CVar
La 3 linea de cdigo declara autorLibro como una constante de tipo string y le da el valor TodoEXCEL.
0 a 255
.337.203.685.477,5808 a
922.337.203.685.477,5807.
Si la expresin del argumento expresin que se pasa a la funcin est fuera del intervalo del tipo de dato al que
se va a convertir, se produce un error. En general, el cdigo se puede documentar utilizando las funciones de
139
140
conversin de tipos de datos para indicar que el resultado de alguna de las operaciones se debera expresar
como un tipo de datos en particular, no como el tipo de datos predeterminado.
Ejemplos
Cuando la parte fraccionaria es exactamente 0,5, CInt y CLng siempre redondean al nmero par ms 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 nmero. Adems, Fix e Int siempre devuelven un
valor del mismo tipo del que se le pasa.
Utilizamos la funcin IsDate para determinar si se puede convertir date a una fecha o una hora. Si tubiramos
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
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 comodn que solemos utilizar para ver lo que sucede a traves de la ventana inm
MsgBox QAZ
End Sub
Salvo cuando hacen referencia a algn valor que venga de la misma hoja de Excel tal que:
Sub ejString()
Dim QAZ As String
QAZ = ActiveCell.Value
Debug.Print QAZ
MsgBox QAZ
End Sub
CDate reconoce literales de fecha y literales de hora adems de nmeros comprendidos dentro del intervalo de
fechas aceptables. Al convertir un nmero a una fecha, la parte numrica entera se convierte a una fecha.
Cualquier parte fraccionaria del nmero se convierte a la hora del da, comenzando a medianoche.
CDate reconoce formatos de fecha que se ajusten a la configuracin regional de tu sistema. Es posible que no
se determine el orden correcto del da, mes y ao si se proporciona en un formato diferente del que reconoce la
configuracin de fecha. Adems, no se puede reconocer un formato de fecha largo si contiene la cadena del da
de la semana.
Pero en este caso si ActiveCell.Value=255, QAZ hara referencia a 255 como si de un nombre se tratara y no co
cifra.
Para utilizar este valor 255 guardado como QAZ deberamos previamente convertirlo a alguna variable qu
manipulacin 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 ce
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
141
142
Libros
Mediante macros VBA podemos manipular de distintas formas tanto libros Excel como archivos con otras
extensiones. En este captulo veremos como hacerlo.
La fechas se pueden guardar como string pero no pueden ser utilizads en operaciones como fechas salvo que las
a Date:
Sub EjByte()
Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
Sub EjInteger()
Dim X As Integer, Y As Integer
For X = 1 To 1000
Y = Y + 20
Cells(X, 1) = X + Y
Next X
End Sub
Sub EjLong()
Dim X As Integer, Y As Long
' de haber definido Y as Integer
' obtendramos un desbordamiento
For X = 1 To 2000
Y = Y + 20
Cells(X, 1) = X + Y
Next X
End Sub
143
144
Abrir Libros
Para abrir un libro excel utilizamos la instruccin Open. Si queremos abrir un libro determinado podemos utilizar la
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
With Application.FileSearch
.NewSearch
.LookIn = Directory
.Filename = "*.Xls" ' si solo quisiramos abrir libros Excel, extensin = XLS
.SearchSubFolders = False ' Si no quisiramos 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
Para abrir un libro cuando tiene clave debemos especificar la contrasea y al mismo tiempo escribirla tal que:
Sub Abrir()
Dim Libro As Workbook
Set Libro = Workbooks.Open(Filename:="C:\Directorio\Libro.xls", Password:="qaz", WriteResPasswo
End Sub
Para abrir un libro cuando tiene vnculos deberamos especificar si queremos actualizar los vnculos o no, tal co
a continuacin:
Sub Abrir()
Application.EnableEvents = True
Workbooks.Open Filename:="c:\Directorio\MiLibro.xls", UpdateLinks:= False
End Sub
146
Cerrar Libros
Para cerrar un libro utilizamos la instruccin Close:
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
Sub Cerrar()
ActiveWorkbook.Close
End Sub
Si queremos cerrarlo sin que nos pregunte si queremos guardar los posibles cambios realizados, debemos
indicar que no queremos que se muestren los mensajes de alerta:
Sub Cerrar()
Application.DisplayAlerts = False
ActiveWorkbook.Close
End Sub
Para cerrar todos los libros abiertos sin que nos pregunte si queremos guardar los posibles cambios registrados
en cada libro si los hubiese:
Sub Cerrar()
Application.DisplayAlerts = False
Application.Workbooks.Close
End Sub
Y dejando que nos pregunte:
Sub Cerrar()
Application.Workbooks.Close
End Sub
Con lo cual si tubiramos 5 libros abiertos y en cuatro de estos libros hubiramos cambiado algo obtendramos
4 mensajes con la pregunta:
microsoft Excel:
Desea guardar los cambios efectuados en...?
147
148
Guardar Libros
Para guardar un libro utilizamos la instruccin SaveAs. Si queremos guardarlo con un nombre que figura en una
"QAZ"):
Sub Macro()
On Error Resume Next
' Ponemos On Error Resume Next, para evitar el error derivado de una celda vaca y/o con un caracte
ActiveWorkbook.SaveAs [A1].Value
' Tambin podramos poner
' ActiveWorkbook.SaveAs Filename:=Range('A1').Value
End Sub
La macro anterior guardara el libro activo con el nombre QAZ. Debemos recordar que no todos los caracteres d
ejemplo los caracteres @ ? . | NO son caracteres vlidos.
Para guardar un libro en otra carpeta deberamos 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 podramos especificar este otro nombre
End Sub
Del mismo modo que podemos guardar y abrir un documento desde y donde querramos, tambin podemos guar
guardamos un libro y no especificamos su extensin Excel lo hace como un .XLS, es decir un libro de Excel. Pero
de otra propiedad se tratara:
Sub Macro()
Dim Carpeta As String
On Error Resume Next
Carpeta = "F:\"
ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlTemplate
' Lo guardara como una plantilla es decir con una extensin: XLA
ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlNormal
' Lo guardara como una hoja normal es decir con una extensin: XLS
ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlHtml
' Lo guardara como una Hoja Web es decir con una extensin: Htm
ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlUnicodeText
' Lo guardara como una Hoja de texto es decir con una extensin: TxT
End Sub
149
150
.Filename = "*.Xls" 'si solo quisiramos borrar los libros Excel, extension = XLS
.SearchSubFolders = False ' Si no quisiramos 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
Borrar Libros
Para borrar un libro utilizamos la instruccin Delete:
Sub BorraLibro ()
Workbooks("C:\TuLibro.xls").Delete
End Sub
Conviene recordar que excel nos pedira confirmacin antes de borrarlo.
Ejemplo de la instruccin Kill
En este ejemplo se utiliza la instruccin Kill para borrar un archivo de un disco.
Se supone que PRUEBA es un archivo que contiene informacin.
Sub Killer ()
Para eliminar el libro activo, en caso de que estuviera abierto, primero deberiamos cerrarlo, tal que:
Sub Eliminar()
Dim strFile As String
strFile = ActiveWorkbook.FullName
ActiveWorkbook.Close SaveChanges:=False
Kill strFile
End Sub
o bien:
Kill "C:\Hola.xls"
o bien:
Sub BorrarLibros()
Dim X As Long
Dim Libro As Workbook
Dim Directory As String
Directory = ActiveWorkbook.Path
On Error Resume Next
Application.EnableEvents = False ' Para avitar macros de evento en los libros abiertos
With Application.FileSearch
.NewSearch
.LookIn = Directory
151
152
Crear Libros
Para crear 1 nuevo libro utilizamos la instruccin Add, por ejemplo:
Sub NuevoLibro()
Workbooks.Add
End Sub
Abrir un libro en blanco o crear un libro es lo mismo, pero tambin podemos crear libros basados en plantillas o
en otras hojas de clculo, 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
' Abriramos 10 libros que saldran con los siguientes nombres, en la ventana inmediata de VBA
'QAZ2
'QAZ3
'QAZ4
'QAZ5
'QAZ6
'QAZ7
'QAZ8
'QAZ9
'QAZ10
'QAZ11
End Sub
153
154
Imprimir Libros
Calcular Libros
Los clculos se realizan con la instruccin Calculate. Las distintas formas de realizar clculos con macros son:
Sub Imprimir ()
' Imprime el libro activo
ActiveWorkbook.Printout
End Sub
Para realizar todos los clculos que tengan que realizarse en el libro:
Sub CalculaTodo()
Calculate
End Sub
Sub Imprimir ()
' Imprime el libro y hoja indicados
Workbooks("MiLibro.Xls").Sheets("Hoja1").Printout
End Sub
Sub CalculaHoja()
ActiveSheet.Calculate
End Sub
Tambin podemos especificar las opciones de clculo para indicarle a Excel como realizar los clculos. La
configuracin de clculo predeterminada de Excel es Automtico, pero tambin podramos definir otras formas:
Automtico: calcula todas las frmulas dependientes cada vez que se cambia un valor, una frmula o un
nombre.
Sub CalculoAutomatico ()
Application.Calculation = xlAutomatic
End Sub
Automtico excepto tablas: calcula todas las frmulas dependientes, salvo las tablas de datos (para calcular las
tablas de datos podemos hacer clic en "Calcular ahora" en la ficha Clculo del men Herramientas, Opciones):
Sub CalculoAutomaticoSinTablas ()
Application.Calculation = xlSemiautomatic
End Sub
155
156
Proteger/Desproteger Libros
La proteccin de libros se hace con las instrucciones Protect y Unprotect, por ejemplo:
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
Sub ProtegeLibro()
With ActiveWorkbook
' Primero protegemos esctuctura (mover, copiar, insertar hojas) y ventana (cambiar tamao o mover
.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 po
comillas y parntesis y es sensible a las maysculas (si protejo con "Excel" la clave "excel" no funcionar).
157
158
Listar Libros
Hojas
Para listar libros con extensin *.* de un directorio (o con otra extensin) de un directorio y los subdirectorios,
podemos utilizar la siguiente macro:
Mediante macros VBA podemos manipular de distintas formas las hojas de los libros Excel. En este captulo
veremos como hacerlo.
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 quisiramos abrir libros Excel, extension = XLS
.SearchSubFolders = False ' Si no quisiramos 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
159
160
Agregar
Tambin hubiramos podido utilizar el siguiente cdigo en base a lo dicho al principio de esta seccin:
Para agregar una nueva hoja al libro utilizamos la instruccin Add. Si queremos agregar una nueva hora al libro
activo utilizamos el siguiente cdigo:
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets("hoja3"))
End Sub
Sub AgregarHoja()
ActiveWorkbook.Worksheets.Add
End Sub
En el caso anterior, podra darse el caso de que el nombre de esta hoja estuviera mal escrito tal que:
Sub AgregarHoja()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add
End Sub
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets("oja3")) ' Escribimos 'oja' en lugar de 'Hoja'
End Sub
Utilizando los cdigos anteriores la nueva hoja creada se colocar justo delante de la hoja activa de nuestro
libro activo.
Entonces obtendramos un error de compilacin, el cual podemos evitar agregando una instruccin On Error al
comienzo de la macro:
Si quisiramos crear una nueva hoja en nuestro libro, y que fuera colocada a la derecha de todas las demas
hojas, podramos utilizar la siguiente sintaxis:
Sub Agregar()
On Error Resume Next
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets("oja3"))
End Sub
En el caso anterior evitaramos el error de compilacin. Como "oja3" no existe, la macro, al no saber que hacer,
continuara a la siguiente lnea de cdigo saltndose las instrucciones dadas y que han provocado el error.
Before Variant (opcional): un objeto que especifica la hoja antes de la cual se agregar la hoja nueva.
Si quisiramos crear 5 nuevas hojas antes que la 3 hoja en un libro que contiene 7 hojas:
After Variant (opcional): un objeto que especifica la hoja despus de la cual se agregar la hoja nueva.
Count Variant (opcional): el nmero de hojas de clculo que se agregarn. 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.
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(before:=Sheets(3), Count:=10)
End Sub
y si esta 3 hoja se llamara "Ventas":
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(before:=Sheets("Ventas"), Count:=10)
End Sub
161
162
Selecionar
Dentro de los libros de excel, podemos encontrar hojas y grficos. Para referirnos a una hoja dentro de un libro
tenemos distintas posibilidades. Podemos utilizar las instrucciones Select o Activate (en la seccin siguiente
veremos la diferencia).
Seleccionar una hoja utilizando su nmero de hoja contenida dentro del libro, como se ve a continuacin:
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 continuacin:
Sub Seleccionar()
' para seleccionar la segunda hoja del libro activo
ActiveWorkbook.Sheets("Hoja2").Select
End Sub
o lo que es lo mismo en caso de que una hoja este oculta:
Sub Seleccionar()
With ActiveWorkbook.Sheets("Hoja2")
.Visible = True
163
164
.Select
End With
End Sub
Sub Seleccionar ()
ActiveWorkbook.Sheets(Array(1, 2, "ventas")).Select
End Sub
En el ejemplo anterior la hoja activa sera la primera de nuestro libro y las hojas selecionadas seran las 2
primeras y la llamada "ventas".
Recordar que la hoja activa siempre es la que figura como primer miembro del array.
La instruccin 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.
Tambin se pueden seleccionar hojas mediante la instruccin Array, por ej. creando un array que contenga en
ndice de las hojas que querramos selecionar (ver captulo "Arrays" para ms detalle).
Esta instruccin seleccionara las hojas 3 y 1 en este orden con lo cual la hoja 3 ser la hoja activa.
Sub Seleccionar ()
ActiveWorkbook.Sheets(Array(3, 1)).Select
End Sub
Esta instruccin seleccionara las hojas 1,2,3 y la hoja activa seria la 1
Sub Seleccionar ()
ActiveWorkbook.Sheets(Array(1,2,3)).Select
End Sub
Tambin se puede crear un Array que contenga los nombres de las hojas que queramos selecionar.
Esta instruccin activara la hoja llamada "hoja3" y selecionara las hojas llamadas "hoja3" y "pedro":
Sub Seleccionar ()
ActiveWorkbook.Sheets(Array("hoja3", "pedro")).Select
End Sub
Con esta otra instruccin selecionaramos las hojas cuyos nombres son: "ventas","compras", "resultado" y
activara la hoja "ventas".
Sub Seleccionar ()
ActiveWorkbook.Sheets(Array("ventas","compras", "resultado")).Select
End Sub
Tambin podemos al mismo tiempo mezclar ambos mtodos comentados antes (seleccionar por nombre o por
nmero de hoja):
165
166
Mover Hojas
Conviene recordar la diferencia entre selecionar y activar una hoja (la diferencia es la misma entre seleccionar y
activar una celda). La instruccin para seleccionar es Select y la instruccin para activar es Activate.
Para mover hojas de un lugar del libro a otro debemos utilizar la instruccin Move, la cual desplaza la hoja de
clculo a otro lugar del libro.
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 observaramos 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.
Lgicamente, 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:
expresin.Move(Before, After)
expresin (requerida): expresin que devuelve un objeto de la lista Aplicar a.
Before Variant (opcional): la hoja de clculo antes de la cual se situar la desplazada. No se puede especificar
Before si se especifica After.
After Variant (opcional): la hoja de clculo despus de la cual se situar la desplazada. No se puede especificar
After si se especifica Before.
Si no se especifica Before o After, Microsoft Excel crear un nuevo libro que contenga la hoja desplazada.
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
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 posicin 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 podra tener solo 2 hojas (Hoja1 y Hoja3 respectivamente). De tal modo la macro
anterior les cambiara el orden, poniendo Hoja3 y luego Hoja1.
Si abrimos un libro con 3 hojas (teniendo la hoja 2 como activa) la siguiente macro primero movera la hoja 2
delante de la hoja 1, y despus 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
167
168
La siguiente macro contiene 2 lneas absurdas ya que al ser en principio, Hoja1 la primera hoja cuando abrimos
un nuevo libro, moverla de la posicin 1 sera como volver a selecionar una celda que ya estaba selecionada:
Borrar Hojas
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 confirmacin, del mismo modo que cuando
eliminamos cualquier otro fichero.
Cuando se elimina una hoja o un libro, este mtodo muestra un cuadro de dilogo en el que se nos pide
confirmar la eliminacin. Este cuadro de dilogo se muestra de manera predeterminada. Al llamar a este
mtodo en el objeto Workbook o Worksheet, el mtodo 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
dilogo 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 opcin que observaremos
cuando se ejecute el cdigo:
Sub BorrarHoja()
Sheets("Hoja1").Delete
End Sub
En este otro ejemplo se elimina la hoja1 del libro activo sin mostrar el cuadro de dilogo de confirmacin:
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 dilogo
de confirmacin:
Sub borrarHoja()
Application.DisplayAlerts = False
Sheets(1).Delete
Application.DisplayAlerts = True
End Sub
169
170
Copiar Hojas
Copiar Hojas
expresin.Copy(Before, After)
expresin.Copy(Before, After)
expresin (Requerida): expresin que devuelve uno de los objetos arriba mencionados.
expresin (Requerida): expresin que devuelve uno de los objetos arriba mencionados.
Before Variant (opcional): la hoja de clculo antes de la cual se copiar sta. No se puede especificar Before si
se especifica After.
Before Variant (opcional): la hoja de clculo antes de la cual se copiar sta. No se puede especificar Before si
se especifica After.
After Variant (opcional): la hoja de clculo despus de la cual se copiar sta. No se puede especificar After si
se especifica Before.
After Variant (opcional): la hoja de clculo despus de la cual se copiar sta. No se puede especificar After si
se especifica Before.
Sub Copiar()
' Copiamos la Hoja1 despus de la Hoja3
Worksheets("Hoja1").Copy after:=Worksheets("Hoja3")
End Sub
Sub Copiar()
' Copiamos la Hoja1 despus 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
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
171
172
Ocultar/Mostrar Hojas
La propiedad para mostrar u ocultar es Visible y debemos asignarle True o False en caso de querer mostrar u
ocultar, respectivamente. Todo libro debe tener al menos una hoja visible. Esto implica que si el libro tiene 10
hojas solo podremos ocultar 9, y si el libro solo tiene 1 hoja no la podremos ocultar.
Si tenemos 1 libro con ms 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
Esta manera de ocultar las hojas no evitara poder saber que existen hojas ocultas. Podramos saber si hay
hojas ocultas desde el men Formato > Hojas > Mostrar de Excel y podramos observar el nombre de las hojas
ocultas, an cuando estas estuvieran ocultas con una contrasea que nos impidiera mostrarlas. Que no
podamos mostrarlas no implica que no sepamos que algo esta oculto si lo quisiramos.
Si queremos ocultar hojas y adems ocultarlas desde el men Formato > Hojas > Mostrar de Excel (an cuando
estas hojas no contengan contrasea para ser desprotegidas) deberamos hacer:
Sub SuperOcultas()
ActiveWorkbook.Sheets("ventas").Visible = xlSheetVeryHidden
End Sub
173
174
Nombrar
Para renombrar una hoja utilizamos la instruccin Name, tal como se ve a continuacin:
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
Sub Renombrar()
Sheets("Ventas").Name = "Compras"
End Sub
En el caso anterior renombraramos la hoja llamada "Ventas" con el nuevo nombre "Compras".
Si queremos renombrar la primer hoja del libro con el nombre "total":
Sub Renombrar()
Sheets(1).Name = "total"
End Sub
Conviene recordar que da lo mismo que los nombres de las hojas estn escritos en maysculas o en
minsculas, ya que:
Sheets("Ventas").select
Sheets("VenTAs").select
Sheets("ventas").select
sera lo mismo, Excel no diferenciara maysculas o minsculas y en todos los casos seleccinara la hoja
"Ventas".
Con la siguiente macro crearamos una hoja, la situaramos al final (despus de la ltima hoja del libro) y
finalmente la llamaramos con el nombre "ventas":
Sub Macro()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets(Worksheets.Count))
Hoja.Name = "Ventas"
End Sub
En la macro anterior, Worksheets.Count devuelve un nmero que representa la cantidad de hojas que tiene el
libro.
Ante el caso de que otra de nuestras hojas se llamara "ventas" nos encontraramos ante un error de
compilacin, ya que no es posible llamar dos hojas con el mismo nombre. Entonces, primero deberamos
renombrar previamente.
175
176
.Protect DrawingObjects:=True
' Protegemos objetos
.Protect Contents:=True
' Protegemos contenidos
.Protect Scenarios:=True
' Protegemos escenarios
.Protect AllowFormattingCells:=True
' Protegemos formato de celdas
Para realizar lo anterior, pero utilizando como contrasea la palabra "hola", debemos agregar la propiedad
Password, tal que:
' Para proteger la primera hoja con la palabra 'hola'
Sub Proteger ()
Sheets(1).Protect Password:="hola"
End Sub
.Protect AllowFormattingColumns:=True
' Protegemos formato de columnas
.Protect AllowFormattingRows:=True
' Protegemos formato de filas
.Protect AllowInsertingColumns:=True
' Protegemos la posibilidad que se inserten columnas
.Protect AllowInsertingRows:=True
' Protegemos la posibilidad que se inserten filas
.Protect AllowInsertingHyperlinks:=True
' Protegemos la posibilidad que se inserten hipervcnulos
.Protect AllowDeletingColumns:=True
' Protegemos la posibilidad que se borren columnas
Desde Excel no podemos proteger varias hojas en simultneo, nos obliga proteger una a una. Sin embargo
desde una macro s podemos proteger las hojas que querramos de forma simultnea. La siguiente macro
protegera todas las hojas del libro activo, excepto las hojas que son grficos. Adems las protegera con la
contrasea "hola".
.Protect AllowDeletingRows:=True
' Protegemos la posibilidad que se borren filas
.Protect AllowSorting:=True
' Protegemos la posibilidad que se utilice la opcin de Ordenar
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
.Protect AllowFiltering:=True
' Protegemos la posibilidad que se utilice la opcin de Filtrar
.Protect AllowUsingPivotTables:=True
' Protegemos la posibilidad que se utilicen Tablas Dinmicas
.Protect Password:="WW"
' Asignamos la clave de proteccin 'WW'
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 proteccin a algn elemento en particular):
177
End With
End Sub
En la macro anterior protegemos todo dentro de la hoja, y lo hacemos con la contrasea "WW" la cual SI que
distingue entre maysculas y minsculas. Recuerda que si no quisiramos proteger alguna de esas
propiedades bastara con poner:=False.
178
179
180
Imprimir Hojas
Color de Hojas
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).
Sub ImprimeHoja ()
ActiveSheet.PrintOut
End Sub
Tambin podras cambiar el color de etiqueta de hoja con clic derecho sobre la misma y eligiendo la opcin
"Color de Etiquetas".
Para cambiar el color de etiqueta con una macro (Excel 2.002 o superior) podemos hacer:
Sub ColorEtiqueta()
ActiveWorkbook.Sheets("Hoja1").Tab.ColorIndex = 5
End Sub
En la macro anterior, cuando queremos imprimir un rango, es necesario agregar la instruccin Address, caso
contrario no funcionar.
Si deseamos poner un encabezado a la izquierda de cada hoja, con la frase "Reporte Trimestral" (o cualquier
otro mensaje):
El nmero que se le asigna a ColorIndex indica el color. Si quieres averiguar el nmero correspondiente para un
determinado color, puedes hacer lo siguiente:
1. Clic derecho sobre una etiqueta de hoja
2. Elige la opcin "Color de Etiquetas"
3. Elige un color de la paleta
4. Aceptar
5. En la ventana Inmediato del editor VBA escribe: ?Activesheet.Tab.ColorIndex
6. Enter
Vers que aparece un nmero que representa el color de la etiqueta. Podrs utilizar dicho nmero en la macro.
181
182
Ordenar Hojas
Para ordenar las hojas se suele utilizar la instruccin Move. Una forma rpida de ordenar las hojas de un libro
alfabticamente 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
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
Tambin se podran ordenar las hojas de un libro utilizando un array con los nombres de las hojas, ordenando
este array y luego moviendo en funcin del orden. El caso es que el anterior ejemplo funciona perfectamente,
ya que saca provecho de la funcin uppercase "maysculas" pues A>AA>AB>ABC es decir, que nos dice el
orden necesario.
183
184
Rangos
Seleccin de celdas
Mediante macros VBA podemos manipular de distintas formas los rangos y celdas de las hojas Excel. En este
captulo veremos como hacerlo.
Existen diversas formas de seleccionar celdas, y en todas ellas utilizamos el mtodo Select.
Veamos 3 mtodos (equivalentes) para seleccionar una celda, por ejemplo la celda C4:
' La forma clsica de seleccionar
Sub Seleccionar ()
Range("C4").Select
End Sub
' Esta es otra terminologa vlida para seleccionar
Sub Seleccionar ()
[C4].Select
End Sub
Conviene deducir que si quisiramos seleccionar las celdas que contienen comentarios en un rango concreto y
185
186
' Selecciona desde la celda actual hasta una celda (fila) hacia abajo.
Selection.Offset(1, 0).Select
' La instruccin 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
' Mtodo 2
[A1:G10].SpecialCells(xlCellTypeComments).Select
' Selecciona desde la celda actual, + una celda hacia abajo + una celda hacia la derecha.
Selection.Offset(1, 1).Select
' Mtodo 3
Range(cells(1,1),cells(10,7)).SpecialCells(xlCellTypeComments).Select
'Selecciona una columna y/o celda hacia la derecha desde la celda [A1]
[A1].Offset(0, 1).Select
End Sub
' Selecciona desde la celda actual hasta la misma celda selecionada, sin cambio alguno.
Selection.Offset().Select
' Desde B1 selecciona una celda hacia arriba y otra a la izquierda
[B2].Offset(-1, -1).Select
' Recuerda que al poner un signo negativo el movimiento cambia de direccin
' Si el negativo el movimiento es hacia abajo/derecha. Con el negativo es hacia arriba/izquierda
' Si desde A1 intentamos seleccionar una celda hacia arriba y otra a la izquierda...
[A1].Offset(-1, -1).Select
' Se producira 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 la ltima celda no vaca hacia la derecha.
Selection.End(xlToRight).Select
' Selecciona desde la celda indicada hasta la ltima celda no vaca hacia abajo.
Range("AF10").End(xlDown).Select
' Selecciona desde la celda actual hasta una celda hacia la izquierda (si fuera posible)
Selection.Offset(-1).Select
' Selecciona desde la celda actual hasta la ltima celda no vaca hacia la izquierda.
Selection.End(xlToLeft).Select
'Selecciona desde la celda actual hasta una celda hacia la arriba (si fuera posible)
Selection.Offset(, -1).Select
' Selecciona desde la celda actual hasta la ltima celda no vaca hacia arriba.
Selection.End(xlUp).Select
End Sub
' Selecciona el cuadrante de celdas selecionadas en bloque una celda ms hacia la derecha y abajo.
Selection.CurrentRegion.Offset(1, 1).Select
Otra forma interesante de seleccionar es con el mtodo Offset, que permite seleccionar un rango de acuerdo a
unas coordenadas indicadas. Esta instruccin requiere que le indiquemos un origen y una cantidad de filas y
columnas desde el origen (es muy til para seleccionar rangos variables).
End Sub
Todas las acciones anteriores se pueden concatenar de tal manera que podramos realizar lo siguiente:
Sub Seleccion ()
On Error Resume Next
[F7].End(xlDown).Offset(4).End(xlToRight).End(xlDown).Select
' Si F7 estuviera vaco y la columna F tambin,
' tras ejecutar [F7].End(xlDown). nos encontraramos en la ltima fila (F65536)
' Pero no podramos ir a [F7].End(xlDown).Offset(4) pues excel tiene 65536 filas y no 65536+X+4
End Sub
Con la macro anterior iriamos desde la celda F7 hasta la ltima celda no vaca hacia abajo. Luego nos
desplazaramos 4 celdas desde esta nueva posicin hacia abajo.
187
188
Luego iramos hasta la ltima celda no vaca hacia la derecha desde esta nueva posicin. Finalmente de nuevo
hacia abajo desde esta nueva posicin.
Seleccin de rangos
Veamos ahora distintas formas equivalentes de seleccionar un rango:
Tambin es posible la seleccin de rangos utilizando variables en filas y columnas, utilizando el objeto Cells.
Esta forma es muy til cuando queremos utilizar variables en la fila la columna.
La sintaxis debe ser: cells(fila,columna)
Sub Seleccion()
' Seleccin 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
Supongamos que queremos seleccionar un rango, pero no conocemos su dimensin, por ejemplo porque la
misma va cambiando. Un ejemplo puede ser una tabla donde se van agregando nuevos registros. Con la
instruccin CurrentRegion Excel seleccionar todo el rango utilizado automticamente, aunque no conozcamos
su tamao de antemano:
Sub Seleccionar ()
Range("A1:E5").Select
[A1:E5].Select
Range(Cells(1, 1), Cells(5, 5)).Select
End Sub
189
190
Seleccin de filas
Para seleccionar filas podemos utilizar la instruccin Rows.Select, tal como vemos en las siguientes macros:
' Seleccionar la Fila 1.
Sub SeleccionaFila ()
Rows("1:1").Select
End Sub
' Selecciona la fila 4.
Sub SeleccionaFila ()
Rows("4:4").Select
End Sub
' Selecciona desde la fila 4 hasta la 11, ambas inclusive
Sub SeleccionaFilas ()
Rows("4:11").Select
End Sub
' Selecciona las siguientes filas a la vez: 4,8,15 y 22.
Sub SeleccionaFilas ()
Range("4:4,8:8,15:15,22:22").Select
End Sub
191
192
Seleccin de columnas
Otras selecciones
Para seleccionar columnas podemos utilizar la instruccin Columns.Select, tal como vemos en las siguientes
macros:
Sub SeleccionaColumna ()
' Selecciona la Columna B
Columns("B:B").Select
' Selecciona la Columna H
Columns("H:H").Select
' Selecciona des de la Columna C hasta la F
Columns("C:F").Select
' Selecciona las siguientes Columnas: A,C,E,G, I y K.
Range("A:A,C:C,E:E,G:G,I:K").Select
End Sub
193
194
Para seleccionar todas las celdas que contengan Valores no duplicados en el rango utilizado:
Para saber el rango de celdas que utilizamos basta con utilizar el siguiente cdigo:
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
Sub Rango()
ActiveSheet.UsedRange.Select
End Sub
Para selecionar desde la celda A1 hasta la ltima celda del rango utilizado:
Sub Rango()
Range([a1], ActiveSheet.UsedRange).Select
End Sub
Para selecionar la ltima celda con datos del rango utilizado (suponemos que tenemos seleccionado B4:D4):
Sub Seleccion ()
' Esto dara como resultado 5
R = Range([a1], ActiveSheet.UsedRange).Rows.Count
' Esto dara como resultado 4
C = Range([a1], ActiveSheet.UsedRange).Columns.Count
Para seleccionar todas las celdas que contengan Valores no duplicados en UsedRange:
Sub SeleccionarValoresdUPLICADOS()
On Error Resume Next
Dim Columna As Single, Fila As Long, X As Long
Dim Rg As Range, miRango As Range, RgValores As Range
'vamos a seleccionar todas las celdas del UsedRange que contengan el valor que introduzcamos:
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
End With
For Each Rg In miRango
If Application.CountIf(miRango, Rg.Value) > 1 Then
If X = 0 Then
X = 1: Set RgValores = Rg
Else
Set RgValores = Union(RgValores, Rg)
End If
End If
Next Rg
RgValores.Select
End Sub
Excel considera que pese a que tengamos 65.536 filas y 256 columnas, prcticamente siempre utilizamos una
cantidad de estas filas y columnas.
End Sub
En la macro anterior, el objeto UsedRange seleciona el rango "cuadrado o rectngulo" utilizado.
Si quisiramos seleccionar la ltima celda con informacin del rango seleccionado, he aqu 4 mtodos posibles:
' Mtodo 1
Sub Seleccionar ()
' Definimos las variables
Dim R As Long, C As Single
' Utilizamos R que indicara la ltima fila que contiene datos
R = Range([A1], ActiveSheet.UsedRange).Rows.Count
' Utilizamos C que indicara la ltima columna que contiene datos
C = Range([A1], ActiveSheet.UsedRange).Columns.Count
'Selecionamos la ltima celda del rango UsedRange
Cells(R, C).Select
End Sub
' Mtodo 2
Sub Seleccionar ()
195
196
' Mtodo 3
Sub Seleccionar ()
' El cdigo 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
Insertar rangos
Como es lgico de suponer, existen numerosas maneras de insertar rangos, para lo cual utilizamos la
instruccin Insert:
Sub Insertar ()
' Mtodo 4
Sub Seleccionar ()
With Selection.CurrentRegion
.Cells(.Cells.Count).Select
End With
End Sub
End Sub
Tambin podemos insertar tantas nuevas filas o columnas como tenga el rango:
Sub Inserta ()
' Inserta 3 nuevas columnas a la izquierda de la columna B
Range("B1:D10").EntireColumn.Insert
' Inserta 5 nuevas filas sobre la fila 10.
Rows("10:15").Insert
End Sub
197
198
Rows(1).Clear
Borrar rangos
Podemos borrar comentarios, contenidos, formatos, etc. En general utilizamos la instruccin Clear seguida de lo
que queremos borrar. A continuacin vemos como hacerlo:
' Borra los comentarios sobre la celda A1
Sub Borrar ()
Range("A1").ClearComments
End Sub
' Limpia la celda A1 de cualquier formato que tenga, por ej. color
Sub Borrar ()
[A1].ClearFormats
End Sub
End Sub
La instruccin Clear sola, como se v en la macro anterior, borra toda informacin de la celda (formato,
contenido, comentarios, etc).
A veces queremos borrar el contenido de ciertas celdas, por ej. las celdas que contienen frmulas:
Sub BorrarFormulas()
Cells.SpecialCells(xlCellTypeFormulas, 23).ClearContents
End Sub
200
Para realizar el pegado de los rangos copiados utilizamos las siguientes macros:
Para copiar rangos utilizamos el mtodo Copy. Algunos ejemplos sobre cmo copiar son:
Sub Copiar()
' Aqu realizamos lo mismo solo que de otra manera, especificando donde queremos que la informacin sea pegada
Range("B1").Copy Destination:=Range("C1")
A la hora de pegar podemos elegir que es lo que queremos pegar: valores, formatos, todo, etc. La opcin ms
valores. La lista de las cosas que podemos pegar es:
' Copia la celda C2 (la primera posicin equivale a fila y la segunda a columna).
Cells(2, 4).Copy
Validacin xlPasteValidation
Valores: xlPasteValues
Frmulas y nmeros: xlPasteFormulasAndNumberFormats
Frmulas: xlPasteFormulas
' Copia el rango de celdas B12:B22, esta es otra terminologa tambin vlida.
[B12:B22].Copy
Formatos: xlPasteFormats
Comentarios: xlPasteComments
' Copia el cuadrante, rectngulo y/o cuadrado de celdas adyacentes a nuestra celda. El rectngulo qu
Selection.CurrentRegion.Copy
' Copia el cuadrante, rectngulo y/o cuadrado de celdas comenzando en C2 y en direccin derechainferior. El rectngulo queda definido por las celdas con informacin.
[C2].CurrentRegion.Copy
' Copia el cuadrante, rectngulo y/o cuadrado de celdas comenzando en C4 y en direccin derechainferior. El rectngulo queda definido por las celdas con informacin.
Range("C4").CurrentRegion.Copy
' Copia la Fila 1.
Rows("1:1").Copy
' Cuando copiamos algo se ve que Excel deja un rastro sobre lo copiado. Para quitarlo utilizamos:
Application.CutCopyMode=False
End Sub
201
202
Nombrar rangos
Existen varias maneras de nombrar un rango. Cuando hacemos esto desde Excel, sin macros, prime
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 es
rango con el nombre que le hayamos dado).
Otra forma de nombrar un rango es seleccionndolo y luego encima de la columna A, existe un espacio que nos d
informacin sobre la celda activa. Se puede escribir un nombre all y ya quedara nombrado dicho rango.
Para nombrar un rango desde una macro utilizamos la instruccin Name, por ej.:
Sub Nombrar()
' En el caso de que quisiramos crear un nombre para un valor constante
Names.Add Name:="Euro", RefersTo:=166.67
' En el caso de que quisieramos crear un nombre para refererirnos al rango A1:B4 con el nombre Ven
Range("A1:B4").Name = "Ventas"
End Sub
Los nombre creados pueden utilizar frmulas, esto es muy frecuente si queremos aplicar un nombre a un rango d
una Tabla Dinmica. En lugar de tener que cambiar el rango utilizado en la TD, cada vez que aadimos un nuev
registro a nuetra base de datos,
podemos utilizar nombres que hagan referencia a rangos dinmicos mediante frmulas 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
203
204
Combinar rangos
Para combinar celdas utilizamos la instruccin MergeCells. Solo podemos combinar celdas que estn contiguas
y siempre que formen o un cuadrado o un rectngulo, pues de lo contrario Excel no lo permitira.
Para ocultar o mostrar filas debemos utilizas la instruccin Hidden y luego le asignamos True o False para
ocultar o mostrar respectivamente. Por ej.:
Sub Ocultar ()
' Ocultar la fila 3
Rows("3:3").EntireRow.Hidden = True
' Ocultar varias filas contiguas, an cuando no es necesario selecionar un rango para operar con l
Rows("7:14").Select
Selection.EntireRow.Hidden = True
Conviene recordar que si combinamos desde una macro, y las celdas que queremos combinar no estan vacas,
Excel nos pedir confirmacin, pues podramos perder informacin. Para evitar la confirmacin deberamos
modificar la macro anterior agregando una nueva lnea al comienzo:
' Combinar las celdas del rango B4:D4 y evitar confirmacin
Sub Combinar ()
Application.DisplayAlerts = False
Range("B4:D4").MergeCells = True
End Sub
Si luego queremos volver a mostrar la fila oculta, simplemente cambiamos el True por False:
Sub Mostrar ()
' Mostrar la fila 3
Rows("3:3").EntireRow.Hidden = False
End Sub
Para ocultar columnas es exactamente igual:
Sub Ocultar ()
Si luego queremos volver a mostrar la columna oculta, simplemente cambiamos el True por False.
205
206
Ahora bien, la proteccin de celdas o rangos no toma efecto mientras la hoja y/o el libro no estn protegidas.
Suponiendo que sea nuestra intencin proteger la hoja y/o el libro posteriormente, podramos usar estas macros
para proteger rangos:
Sub Proteger ()
' Protege el rango seleccionado
Selection.Locked = True
' Protege el rango indicado
Range("T7:T16").Locked = True
' Protege la celda indicada
Range("T11").Locked = True
' Desprotege el rango indicado
Range("T7:T16").Locked = False
End Sub
207
208
Transponer rangos
Ordenar rangos
La operacin de transponer se realiza cuando queremos que los valores de una fila se copien como una
columna o viceversa. Para ello utilizamos la instruccin Transpose.
La ventaja de ordenar rangos desde macros es que podemos ordenar siguiendo ms de 3 criterios, que es el
mximo que permite Excel si lo hacemos desde el men Datos > Ordenar.
Dicho de otra forma es una manera particular de pegar los datos copiados previamente con lo cual:
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 instruccin Sort.
Sub Seleccion ()
Para ordenar el rango utilizado, por los campos de columnas G, F, A, B y C hacemos:
' Convertir fila en columna
Range("A1:A15").Copy
Range("D4").PasteSpecial Paste:=xlPasteAll, Transpose:=True
Sub Ordenar ()
With [A1].CurrentRegion
' [A1].CurrentRegion podra ser = Range('A1:Z45')
.Sort Key1:=Range("G9"), Order1:=xlAscending, Header:=xlGuess
.Sort Key1:=Range("F3"), Order1:=xlDescending, Header:=xlGuess
.Sort _
Key1:=Range("A2"), Order1:=xlAscending, _
Key2:=Range("B2"), Order2:=xlAscending, _
Key3:=Range("C2"), Order3:=xlAscending, _
Header:=xlGuess
End With
End Sub
Otra forma de hacer lo anterior es:
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
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
209
210
Borrar rangos
Imprimir rangos
Para borrar utilizamos la instruccin Clear. Existen distintas cosas que podemos borrar: borrar todo, solo
formatos, solo contenidos, etc.
Para definir el rango a imprimir utilizamos la instruccin PrintArea. Es conveniente que definamos y guardemos
el rango a imprimir:
El borrado es sencillo:
Sub DefinirRango()
ActiveSheet.PageSetup.PrintArea = "$A$1:$G$22"
End Sub
Sub Borrar ()
With Range("A1").CurrentRegion
' Borra comentarios
.ClearComments
' Borra contenidos
.ClearContents
' Borra formatos
.ClearFormats
' Borra notas
.ClearNotes
' Borra todo
.Clear
End With
End Sub
En la macro anterior hemos ido realizando un borrado escalonado, para al final resumir todo en un nico
borrado que realizara todo lo anterior de una vez (instruccin Clear), es decir, que si queremos borrar todo
junto directamente utilizamos Clear.
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
211
212
' insertamos una nueva fila para despus aplicar un criterio de bsqueda y borrar los valores obtenido
With ActiveSheet
.Rows(1).Insert
.Cells(1, 2) = "Valores a borrar"
R = Range(.Range("B2"), .UsedRange).Rows.Count
Set FilaBorrable = Range("B1", Cells(R, 2))
FilaBorrable.AutoFilter Field:=1, Criteria1:=""
'Borra solo las celdas visibles
FilaBorrable.SpecialCells(xlCellTypeVisible).EntireRow.Delete
.UsedRange
End With
End Sub
El anterior es el mtodo ms rpido.
Recuerda que para desocultar todas las filas y columnas ocultas debes hacer:
El mtodo anterior tiene el inconveniente que si el rango es muy grande y hay muchas filas vacas, el looping se
Application.ScreenUpdating = False
Sub Desocultar()
With Cells
.EntireColumn.Hidden = False
.EntireRow.Hidden = False
End With
End Sub
214
Restringir movimiento
Scroll Bars
Con la instruccin 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 tambin se conocen como ScrollBars.
Es posible hacer que cada vez que se activa una hoja las ScrollBars estn al comienzo, indepnedientemente de
dnde 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:
215
216
Arrays
Definicin
Los Arrays son conjuntos de elementos y son muy tiles a la hora de manipular varios objetos de forma
simultnea. En este captulo veremos ms en detalle como crearlos y los diferentes tipos que existen.
Un Array es un grupo de elementos secuencialmente puestos con un ndice, que tienen el mismo nombre y tipo
de datos intrnseco.
Recuerda que la mayora de macros de este captulo estn estn en el libro Arrays.xls, dentro de los 400 Extras
que se envan junto con el Manual.
Cada elemento de un array tiene un nmero 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
instruccin Dim.
En resumen, un array es un grupo de elementos del mismo tipo, cada elemento en un grupo array es nico y
puede ser cambiado sin que afecte al resto de los elementos del siguiente array.
Por ejemplo:
Dim MiArray(0 To 3)
El array anterior contiene 4 elementos: el elemento 0,1,2 y 3
Dicho array puede ser simplificado como:
Dim Miarray(3)
Esta ltima definicin significa que los elementos de un array empiezan por el 0, que siempre resulta ser el
primer elemento.
217
218
Fijos
Una array con los das de la semana (nmero fijo de elementos)
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
Sub EjArrays()
Dim DiaSemana(0 To 6) As String
' Tambien podramos poner:
' Dim DiaSemana(6) As String, es decir un array de 7 elementos
DiaSemana(0) = "Lunes"
DiaSemana(1) = "Martes"
DiaSemana(2) = "Mircoles"
DiaSemana(3) = "Jueves"
DiaSemana(4) = "Viernes"
DiaSemana(5) = "Sbado"
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 terminologa es un
prstamo de otros lenguajes de programacin, ahora bien si quieres refererirte al primer elemento de un array
como miarray(1) la solucin es introducir la instruccin Option Base 1 al comienzo de la macro, tal que:
Option Base 1
Sub EjArrays()
Dim DiaSemana(1 To 7) As String
' Tambien podramos 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) = "Sbado"
DiaSemana(7) = "Domingo"
Debug.Print DiaSemana(1) ' Esto nos permite visualizar 'Lunes' en la Ventana Inmediato
End Sub
La mayora de las veces los elementos de los arrays quedan definidos desde un rango o bien desde una nica
lnea tal que:
Option Base 1
Sub EjArrays()
Dim DiaSemana() As Variant
DiaSemana = Array("Lunes", "Martes", "Mircoles", "Jueves", "Viernes", "Sbado", "Domingo")
Debug.Print DiaSemana(1) ' Esto nos permite visualizar 'Lunes' en la Ventana Inmediato
End Sub
219
220
Variables
Un array no tiene por qu tener un nmero fijo de elementos, es decir un array puede contener un nmero
variable de elementos en cualquier momento.
Los arrays se utilizan para aumentar la velocidad de las macros pues permiten la manipulacin de gran cantidad
de informacin sin necesidad de operar con ella, salvo en memoria.
La utilizacin de Arrays dinmicos (aquellos que no tienen un nmero fijo de elementos), en muchas ocasiones
es obligatoria.
Por ej. supongamos que queremos obtener el nmero de directorios existentes en en el dicos C. Deberamos
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 comparacin 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 hubiramos 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 ms de tres dimensiones.
221
222
Bidimensionales
Ejemplo
Los array unidimensionales son muy frecuentes, aunque tambin se pueden usar arrays bidemensinales, por ej:
A continuacin 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 ActiveShee
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 cdigo lo utilizamos para colocar los controles en el lugar deseado. Es posible ver esta macro en
funcionamiento en los juegos:
Buscaminas.xls y MinesWeeper.xls
la macro se llama GameSetup, dentro del modulo GameSetup.
223
224
REdim
Cuando utilizamos el comando Redim redimensionamos el Array y al hacerlo perdemos todos los valores que
habamos creado inicialmente, por ej:
Sub EjArrays()
Dim DiaSemana() As Variant
DiaSemana = Array("Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sbado", "Domingo")
Debug.Print DiaSemana(1)
ReDim DiaSemana(2)
' Al redimensionar el array para con 3 elementos perdemos los valores previamente asignados en:
' DiaSemana = Array('Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sbado', 'Domingo')
' con lo que:
Debug.Print DiaSemana(1)
' no devuelve valor alguno!
End Sub
La macro anterior no devuelve ningn valor porque hemos perdido los mismos al no utilizar la instruccin
REDIM PRESERVE, que la veremos en la seccin siguiente.
225
226
Preserve
La instruccin Preserve se utiliza para conservar los valores de cada elemento, an 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
' Seleccionara la celda:
Cells(UBound(NAleatorios), 1).Select
End Sub
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, an cuando todas las celdas del rango estn
en la misma columna como en el caso siguiente:
Private Sub RgArray_Click()
Dim X As Single
Dim Rango() As Variant
Dim miarray As Variant
Rango = Range("Col1")
For X = LBound(Rango,1) To UBound(Rango,1)
' Aunque podemos simplificar como:
For X = LBound(Rango) To UBound(Rango)
Range("col1").Cells(X).Select
Debug.Print Rango(X, 1)
Next X
End Sub
227
228
Estructuras
Do Loop
Las estructuras son conjuntos de instrucciones VBA que deben respetar una sintxis determinada y que nos
permiten realizar diversas operaciones. En este captulo las veremos en detalle.
La instruccin Do Loop es utilizada para repetir las mismas instrucciones una y otra vez hasta que una
condicin tenga lugar. Es probablemente la estructura ms 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:
Recuerda que la mayora de macros de este captulo estn estn en el libro Estructuras.xls, dentro de los 400
Extras que se envan junto con el Manual.
Podemos retocar lo anterior y poner la condicin 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 condicin de = "" a <>"", es decir distinta de vaca. De haber
querido poner una condicin no de inicio sino de salida, es decir que el looping se ejecute por lo menos una
vez:
Sub Colorea()
[A1].EntireRow.Select
Do
Selection.EntireRow.Interior.ColorIndex = 15
Selection.Offset(2).Select
Loop While ActiveCell.Value <> ""
End Sub
En el caso anterior, an cuando la celda A1 estuviera vaca el looping se ejecutara por lo menos una vez.
Tambin hubiramos 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
229
230
For Next
Sub Colorea()
[A1].EntireRow.Select
Do Until ActiveCell.Value = ""
Selection.EntireRow.Interior.ColorIndex = 15
Selection.Offset(2).Select
Loop
End Sub
La instruccin For Next repite un grupo de instrucciones un nmero especificado de veces. La sintaxis es:
For contador = principio To fin [Step incremento]
[instrucciones]
[Exit For]
[instrucciones]
Next [contador]
Este ltimo caso podra dar lugar a que el looping terminara antes de empezar.
-Contador (requerido): variable numrica que se utiliza como contador de bucle. La variable no puede ser
Booleana ni un elemento de matriz.
-Principio (requerido): valor inicial del contador.
-Fin (requerido): valor final del contador.
-Incremento (opcional): cantidad en la que cambia el contador cada vez que se ejecuta el bucle. Si no se
especifica, el valor predeterminado de incremento es uno.
-Instrucciones (opcional): una o ms instrucciones entre For y Next que se ejecutan un nmero 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 continuacin:
For X = 1 to 50
es decir el valor del incremento es positivo donde 1 es el Principio y 50 el Fin, es decir 1<= 50, o bien Principio
<= Fin
o bien:
For X = 50 to 1
es decir el valor del incremento es negativo donde 50 es el Principio y 1 el Fin, es decir 50 >= 1, o bien Principio
>= Fin
Cuando el incremento es negativo es necesario especificar el incremento que va a tener lugar en el bucle
mediante la palabra Step tal que:
Sub For_Next()
Dim X As Integer
231
232
Este otro ejemplo muestra que cambiar el valor del contador mientras est dentro de un bucle puede acarrear
un bucle infinito, haciendo difcil su lectura y depuracin. 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 vaco tendramos un bucle repetitivo infinito ya que x
siempre sera = a 1.
Se pueden colocar en el bucle cualquier nmero de instrucciones Exit For como una manera alternativa de salir
del mismo. La instruccin Exit For, que se utiliza a menudo en la evaluacin de alguna condicin (por ejemplo,
If...Then), transfiere el control a la instruccin que sigue inmediatamente a la instruccin Next. ej:
Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones.
For X = 1 To 10
If Cells(X, 1) = "" Then Exit Sub
Cells(X, 1) = X
Next X
End Sub
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 construccin sera la correcta:
For I = 1 To 10
For J = 1 To 10
For K = 1 To 10
...
Next K
Next J
Next I
En el ejemplo anterior realizaramos un bucle de 10 repeticiones pero si en el trascurso del mismo las celdas
(X,1) estuvieran vacas el bucle se rompera y saldramos de l.
Del mismo modo se puede modificar el valor del contador volviendo a un valor dado tal que:
Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones.
For X = 1 To 10
If Cells(X, 1) = "" Then
X=1
Cells(X, 1) = X + Cells(X, 1)
End If
Cells(X, 1) = X + Cells(X, 1)
Next X
End Sub
En el ejemplo anterior, si el valor de (X,1) estuviera vaco volveramos a X=1, y para evitar un bucle infinito le
daramos a la celda (X,1) el valor igual a = X + Cells(X, 1)
233
234
' Instrucciones...
Next Cell
como:
[instrucciones]
[Exit For]
Si se encuentra una instruccin Next antes de su instruccin For correspondiente, se producir un error.
[instrucciones]
Next [elemento]
No se puede utilizar la instruccin 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.
Por lo general la instruccin 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. Despus,
mientras haya ms elementos en grupo, las instrucciones en el bucle continan ejecutndose para cada
elemento. Cuando no hay ms elementos en el grupo, se sale del bucle y la ejecucin contina con la
instruccin que sigue a la instruccin Next.
Se pueden colocar en el bucle cualquier nmero de instrucciones Exit For. La instruccin Exit For se utiliza a
menudo en la evaluacin de alguna condicin (por ejemplo, If...Then) y transfiere el control a la instruccin que
sigue inmediatamente a la instruccin Next.
Podemos anidar bucles For Each...Next, colocando un bucle For Each...Next dentro de otro. Sin embargo, cada
elemento del bucle debe ser nico.
Nota: si omitimos un elemento en una instruccin Next, la ejecucin contina como si se hubiera includo, es
decir tanto:
For Each Cell In Range("Rg")
235
236
While Wend
GoTo
La instruccin While Wend ejecuta una serie de instrucciones mientras una condicin dada sea True, es decir
verdadera, o tenga lugar. Su sintaxis es:
La instruccin GoTo es un mtodo bastante rudo de variar el sentido que debera tomar una macro, ya que
cuando una macro llega a una lnea que contiene dicha instruccin "salta" al lugar especificado en GoTo (es
decir, saltamos incondicionalmente a una lnea especificada en el procedimiento). La Sintaxis de GoTo es:
While condicin
GoTo lnea
[intrucciones]
Wend
Nota: demasiadas instrucciones GoTo pueden ser difciles 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 cdigo, salvo cuando no quede otro remedio.
Si condicin es True, todas las instrucciones se ejecutan hasta que se encuentra la instruccin Wend. Despus,
el control vuelve a la instruccin While y se comprueba de nuevo condicin. Si condicin es an True, se repite
el proceso. Si no es True, la ejecucin se reanuda con la instruccin que sigue a la instruccin Wend.
Veamos un ejemplo:
Los bucles While...Wend se pueden anidar a cualquier nivel. Cada Wend coincide con el While ms reciente.
En principio no es frecuente utilizar este tipo de intrucciones, se aconseja la utilizacin de Looping, que sirve
para lo mismo.
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 operacin, ya que nada ms empezar saltamos a la lnea "Adios:" y
despus no hay ms cdigo.
Nota: en principio nunca deberamos utilizar GoTo, pues siempre, o prcticamente siempre deberamos ser
capaces de encontrar una alternativa a travs de instrucciones de control estructuradas tales como: Do...Loop,
For...Next, If...Then...Else, Select Case.
237
238
With Range("A1")
With .Font
.Bold = True
.Size = 50
.ColorIndex = 3
End With
.interior.ColorIndex = 5
.Select
End With
End Sub
End With
Nota: una vez que se ha entrado en un bloque With no es posible cambiar el objeto. Por tanto, no podemos
utilizar una nica instruccin 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 ms difcil de entender, es un buen hbito utilizar
estructuras With pues aumentan la velocidad de ejecucin de las macros, siendo ms fciles de manipular a
medida que nos acostumbramos a ellas.
En el ejemplo anterior se ve que al utilizar el With, no es necesario volver a repetir el objeto Range("A1"). Todo
lo que est entre With y End With se aplica al objeto Range("A1").
Veamos otro ejemplo algo ms complejo con el cual asignamos un formato a la celda A1 y adems aplicamos
el With en dos niveles:
' La siguiente macro NO utiliza With
Sub Macro()
Range("A1").Font.Bold = True
Range("A1").Font.Size = 50
Range("A1").Font.ColorIndex = 3
Range("A1").Interior.ColorIndex = 5
Range("A1").Select
End Sub
' La siguiente macro realiza las mismas operaciones utilizando With
Sub Macro_With()
239
240
If Then
La instruccin If Then permite escoger entre 2 o ms posibilidades, para decidir sobre que es lo que queremos,
una serie de alternativas.
Sub If_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
If [A1] < 15 Then MsgBox "La celda A1< 15"
End Sub
La instruccin ejecuta condicionalmente un grupo de instrucciones, dependiendo del valor de una expresin. Su si
es:
Si el valor de la celda A1 fuera 200, la siguiente macro lanzara dos mensajes pues las dos instrucciones IF... s
TRUE:
Sub If_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
If [A1] > 15 Then MsgBox "La celda A1< 15"
End Sub
If condicin Then
[instrucciones]
[ElseIf condicin-n Then
[instrucciones_elseif] ...
En el caso de que querramos realizar ms de una operacin si una condicin devuelve True, o bien si devuelve F
conviene utilizar una construccin en bloque.
[Else
[instrucciones_else]]
End If
Condicin (requerido): uno o ms de los siguientes dos tipos de expresiones: Una expresin numrica o expresi
cadena que puede ser evaluada como True o False. Si condicin es Null, condicin se considera False.
Una o ms instrucciones separadas por dos puntos ejecutados si la condicin es True. condicin-n (Opcional). igua
-condicin.
instrucciones_elseif (Opcional): una o ms instrucciones ejecutadas si la condicin-n asociada es True.
instrucciones_else (opcional): una o ms instrucciones ejecutadas si ninguna de las expresiones anteriores condic
condicin-n es True.
Veamos algunos ejemplos de If, escritos en una sola lnea:
En esta macro si el valor de la celda A1 es > a 15, entonces la condicin es verdadera (es decir TRUE) con lo c
ejecuta la instruccin definida para tal caso, en este ejemplo lanzamos un mensaje, que dice: "La celda A1> 15"
En caso de que el valor de la celda A1>15 entonces la condicion es True, y siendo True, lanzaramos un mens
despus pondramos la celda A1 en negrita y con fondo Rojo.
Sub If_Then()
If [A1] > 15 Then
Msgbox "La celda A1> 15"
With [A1]
.Interior.ColorIndex = 3
.Font.Bold = True
End With
End If
End Sub
o bien:
Sub If_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
End Sub
En esta otra macro si el valor de la celda es >15 se cumple con la condicin demandada con lo cual se ejec
primera opcin, en caso de que no sea TRUE (es decir en caso de que sea FALSE) ejecutamos la segunda instru
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
Sub If_Then()
If [A1] > 15 Then
' si la condicion es TRUE
MsgBox "La celda A1> 15"
' lanzaramos un mensaje
[A1].Interior.ColorIndex = 3
' el fondo de la celda [A1] seria rojo
[A1].Font.Bold = True
' y la celda [A1] estara en negrita
Else
' Si la condicion fuera False
[A1].Interior.ColorIndex = 10
'el fondo de la celda [A1] sera Verde
[A1].Font.Size = 50
' y la fuente tendra tamao 50
End If
End Sub
Un boloque If puede tener as mismo varias secciones ElseIf, que vendran a decir "de lo contrario", "o". La instru
241
242
ElseIf impide que el cdigo contine verificndose cuando una de las condiciones se a presentado como True. Ve
un ejemplo:
End Sub
Si el valor de la celda A1 fuera 500 al confirmarse como verdadera la primera condicin (>15) ejecutaramos la
instrucciones tal que, (MsgBox "La celda A1> 15"), ([A1].Interior.ColorIndex = 10), y ([A1].Font.Bold = True
continuacin acabaramos con la ejecucin de la condicin:
o bien:
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
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 T
Else: MsgBox "Buenas noches!"
End If
End Sub
o bien:
En el caso anterior, si el valor de A1 fuera 3, an cuando las tres condiciones devolveran True por separado, so
ejecutara la primera.
Veamos otro ejemplo donde en funcin de la hora del da 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 Tarde
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!"
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 muchsimas maneras de escribir la misma Macro. Ahora depende de cada uno decidir cual se pref
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
243
244
Select Case
La instruccin Select Case se utiliza cuando las alternativas en una estructura de If Then son muchas. En tal ca
Select Case, que permite ejecutar uno de varios grupos de instrucciones, dependiendo del valor de una expresin.
La sintaxis de Select Case es:
Select Case expresin_prueba
[Case lista_expresion-n
[instrucciones-n]] ...
[Case Else
La clusula Case Else se utiliza para indicar las instrucciones que se van a ejecutar si no se encuentran
lista_expresin en cualquiera de las otras selecciones de Case. Aunque no es necesario, es buena idea tener u
Case para controlar valores imprevistos de expresin_prueba. Cuando no hay una instruccin Case Else y ningun
coincide con la expresin de prueba, la ejecucin contina en la instruccin que sigue a End Select, es decir la in
hay valor que devuelva TRUE.
[instrucciones_else]]
End Select
Veamos un ejemplo:
Lgicamente Select Case ayuda bastante como se ve en el siguiente ejemplo conocido, pues ya lo hemos utilizado
Sub Select_Case()
Dim Nmero As Variant ' la declaramos como Variant para evitar el error de compilacin que
' obtendramos en el caso de que [A1] fuera texto
Nmero = [A1] ' Inicializa variable.
Select Case Nmero ' Evala Nmero.
Case 1 To 5: MsgBox "Entre 1 y 5"
' Para Ns entre 1 y 5, inclusive
Case 6, 7, 8: MsgBox "Entre 6 y 8"
' Para Ns entre 1 y 5, inclusive
Case 9 To 10: MsgBox "Mayor que 8" ' Para Ns entre 9 y 10, inclusive
Case Else ' Para otros valores.
MsgBox "No est entre 1 y 10"
End Select
End Sub
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 ms sencilla de entender y de escribir
Si expresin_prueba coincide con cualquier lista_expresin asociada con una clusula Case, las instrucciones
hasta la siguiente clusula Case o, para la ltima clusula, hasta la instruccin End Select. El control pasa despu
expresin_prueba coincide con una expresin de lista_expresin en ms de una clusula Case, slo se ejecut
coincidencia.
En el ejemplo anterior, si [A1] fuera "pedro" se ejecutara la condicion
Case Else ' Otros valores
Si [A1] fuera 5 se ejecutara la instruccin
Case 1 To 5: MsgBox "Entre 1 y 5"
En la siguiente macro, si A1 fuera 15, solo se ejecutara la primera opcin del Case Select, al devolver TRUE:
Sub Select_Case()
Dim Nmero As Variant
En la siguiente macro nos daria igual no utilizar la opcin o comodn Case Else ya que sabemos que los das de la s
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 Mircoles"
Case 4: MsgBox "Hoy es Jueves"
Case 5: MsgBox "Hoy es Viernes"
Case 6: MsgBox "Hoy es Sbado"
Case 7: MsgBox "Hoy es Domingo"
End Select
End Sub
En la macro anterior utilizamos la opcin Weekday(Now, vbMonday) o Weekday(Now, 2), porque la frmula Week
del da por el que querramos comenzar la semana. La semana que empieza por el da se pone tal que:
Weekday(Now, vbMonday)
' La declaramos como Variant para evitar el error de compilacin que obtend
245
246
o bien:
Weekday(Now, 2)
DoEvents
La instruccin DoEvents cede el control de la ejecucin al sistema operativo, para que ste pueda procesar otros ev
VBA permite realizar la misma operacin de cientos de maneras distintas, como ya se ha demostrado antes. De h
que:
Sub Macro()
Dim ArrayDiaSemana
ArrayDiaSemana = Array("", "Lunes", "Martes", "Mircoles", "Jueves", "Viernes", "Sbado", "Domin
MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday))
End Sub
En la macro anterior hemos utilizado un array que contiene los das de la semana, pero cuyo primer elemento esta v
con lo cual o bien utilizaramos la macro anterior o bien:
Sub Macro()
Dim ArrayDiaSemana
ArrayDiaSemana = Array("Lunes", "Martes", "Mircoles", "Jueves", "Viernes", "Sbado", "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
Option Base 1
Sub Macro()
Dim ArrayDiaSemana
ArrayDiaSemana = Array("Lunes", "Martes", "Mircoles", "Jueves", "Viernes", "Sbado", "Domingo
MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday))
End Sub
Su Sintaxis es:
DoEvents( )
La funcin DoEvents pasa el control al sistema operativo. El control no se devuelve hasta que el sistema opera
terminado de procesar los eventos en cola y se hayan enviado todas las teclas de la cola SendKeys.
Advertencia: siempre que demos preferencia al procesador temporalmente dentro de un procedimiento de evento,
asegurarnos que el procedimiento no se ejecute de nuevo desde una parte diferente del cdigo antes de que de
primera llamada. Esto podra causar resultados impredecibles. Adems, no debemos utilizar la funcin DoEvents s
posibilidad de que otras aplicaciones interacten con el procedimiento, de manera imprevista, durante el tiempo en
ha cedido el control.
DoEvents suele utilizarse muchas veces para que a medida que una instruccin Looping o For Next se est ejec
presionamos otro control tal que:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
End Sub
247
248
On Error GoTo
La instruccin On Error GoTo se utiliza para controlar un error de macro en caso de haberlo. Lo ideal es que el
usuario final de la aplicacin con macros pueda ver un mensaje ms comprensible. Entonces podemos indicarle
a la macro que si se produce un error haga un salto a otra lnea donde se le indica cmo proceder.
Otra alternativa en caso de error es ingnorarlo y continuar con la ejecucin del cdigo, (aunque sera peligroso,
porque ignorar un error no significa que el mismo desaparezca!). Para ignorar un error lo hacemos con la
intruccin On Error Resume Next, ubicndo esta lnea al comienzo del cdigo:
En la siguiente macro
Sub Macro ()
' Si hay un error lo ignora y contina ejecutando el resto del cdigo
On Error Resume Next
' Aqu ira el resto del cdigo
End Sub
Sub GOTOMacro()
Dim X, Y
On Error GoTo CasoError
Y = [A1] / [B1]
' Si A1/B1 diera como resultado un error, la macro saltara a la lnea 'CasoError'
' de lo contrario continuaramos 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 podra existir un error, por ejemplo, si en B1 hubiese un valor 0 o una
letra. Como la macro no puede realizar dicha operacin habra 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 lnea
CasoError.
249
250
Cuadros de dilogo
Ejemplos
Los Built In Dialogs son Cuadros de Dilogo predeterminados que permiten realizar diversas operaciones
fcilmente, sin tener que recurrir a una macro. En este captulo los veremos ms en detalle.
Como se suele decir en programacin, 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 mayora de lo
Built In Dialogs.
Por ejemplo, si quisiramos que el usuario guarde su libro con con el cuadro de dilogo "Guardar como"
podramos llamarlo desde el Built In Dialog xlDialogSaveAs. La instruccin completa sera:
Application.Dialogs(xlDialogSaveAs).Show
La instruccin anterior abrira nuestro viejo y conocido cuado de dilogo "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 ejecucin de
la macro. Para tener acceso a todos los built-in dialogs, lo podemos hacer desde el editor de VBA:
1. Presionamos la tecla F2 para abrir el Examinador de objetos.
2. En la lista Clases elegimos XLBuiltInDialog
3. En la lista Miembros de la derecha veremos todos los disponibles.
251
252
FileFilter se aplica para definir el tipo de ficheros sobre los que deseamos trabajar.
En este sentido si quisramos que el usuario pudiera escoger entre abrir Ficheros de Text "TXT", ficheros de
Excel "Xls", o bien Cualquier Otro deberiamos utilizar:
FileFilter:="Archivos de texto (*.txt),*.TXT," & _
" Todos los archivos de Microsoft Excel (*.Xls),*.Xls," & _
" Todos los archivos (*.*),*.*"
dndole la oportunidad de elegir entre TXT, XLS. Tambin hubiramos podido llamarles tal que:
FileFilter:="Archivos de texto (*.txt),*.TXT," & _
"hojas de clculo Excel (*.Xls),*.Xls," & _
"cualquier otro (*.*),*.*"
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 listaramos archivos XLS y XLA:
Sub Ejemplo1()
Dim Nombre_del_Fichero As Variant 'o bien: As String
Nombre_del_Fichero = Application.GetOpenFilename( _
FileFilter:="Hojas de clculo (*.xl*),*.xl*", _
Filterindex:=1, _
' Podemos definir el ttulo del Built In Dialog
Title:="Sobre que Libro deseas operar?", MultiSelect:=False)
Workbooks.Open Nombre_del_Fichero
End Sub
Lo nico que hay que respetar es la extensin aplicable a cada fichero sobre el que deseemos trabajar
si colocaramos:
Filterindex:=1
El cuadro de dilogo abierto mostrara Archivos de texto como el tipo de archivo.
Filterindex:=2
El cuadro de dilogo abierto mostrara Hojas de Clculo Excel como el tipo de archivo.
Filterindex:=3
El cuadro de dilogo abierto mostrara cualquier otro archivo como el tipo de archivo
253
254
3, _
"Seleccione los Ficheros sobre los que desees Trabajar!", _
,_
True)
' Permitimos seleccionar mas de un Fichero
' la opcin deseada para mostrar es: Todos los archivos
' el ttulo es='Seleccione los Ficheros sobre los que desees Trabajar!'
' esto tan solo otra forma de escribir lo mismo
Barras de herramientas
Podemos personalizar o adaptar nuestros propios mens y barras de herramientas dentro de Excel. En este
captulo veremos como hacerlo. Las barras de herramientas tambin se conocen como Toolbars.
End Sub
255
256
Crear Toolbar
Excel no deja de ser otra aplicacin de las muchas que conocemos como MS Word, MS PowerPoint, MS Access,
WordPad etc. Y al igual que todas las dems aplicaciones contiene una serie de funcionalidades y/o disposiciones
como:
La barra de ttulo: es la que encontramos en la parte superior de cualquier aplicacin.
Se caracteriza y es fcil de reconocer porque simpre, independientemente de la aplicacin a la que sirva con
izquierda el logotipo de la aplicacin, despus el nombre de la aplicacin y el nombre del documento conten
aplicacin, despus el botn minimizar, seguido del de maximizar y/o restaurar y finalmente el de cerrar. Sabemo
aplicacion esta activa porque el color de su barra de ttulo est de color Azul, mientras que cuando no esta activa s
un color gris.
La barra de men: tambin es comn en todas las aplicaciones existentes, ahora bien las palabras que contiene
varan en funcin de la funcionalidad que tenga la aplicacion en si. En este sentido la barra de menu de MS Word
la barra de men de MS Excel. Independientemente de cual sea la aplicacin en si tendremos los siguientes men
de la barra de menus: (Archivo, Edicin y Ayuda, aunque este ltimo trmino en Excel venga expresado con el car
Puesto que Excel es una hoja de clculos, Word un procesador de textos y access una base de datos, estas ap
diferirn en cuanto a las palabras que contengan su barra de men, as como en cuanto a los controles que conten
una de los mens 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
sobre cualquier punto de la horizontal que representa la barra de men hacemos clic con el botn derecho
cualquier aplicacin nos permitira ver el nmero de barras de herramientas disponibles para la aplicacin en si,
cuales de ellas estn visibles y cuales no o cuales podemos personalizar.
Si abriramos un documento de texto desde el escritorio, obervaramos que un documento de texto posee una
ttulos idntica a la de Excel pero una barra de men que solo tendra 4 menus (Archivo, Edicin, Formato y A
hiciramos clic derecho en la misma, observaramos que un documento de texto "bloc de notas" no contiene
herramientas.
Si abrimos Internet Explorer, observaremos que la barra de ttulos estar siempre, con la misma disposicin que
al principio de este captulo (Logotipo, Nombre del documento contenido en la aplicacin, nombre de la aplicacin, m
maximizar o restaurar y cerrar). Despues la barra de mens ( Ver, Favoritos y Herramientas). Si hiciramos clic dre
la barra de mens, observaramos que contiene entre otras la siguientes barras de herramientas (Barra de di
botones estndar, vnculos, personalizar, etc.), es decir la barra de herramientas de MS Internet Explorer p
personalizadas, pero hasta cierto punto y/o lmite ya que solo podemos variar los vnculos, la disoposicin de la
barras de herramientas y la disposicin y presencia de los botones dentro de la barra de heraamientas llamada
estandar".
Tambin conviene recordar que Excel, Word, y el resto de aplicaciones Office siempre mantienen la ltima con
utilizada. En este sentido si ocultramos todas la barras de herramientas y cerrramos la aplicacin la siguient
257
258
La siguiente instruccion evita que podamos personalizar y/o modificar las barras de herramientas de Excel, en
ninguna estuviera visible. Con el siguiente cdigo, no podremos visualizar ninguna barra.
CommandBars("Toolbar List").Enabled = False
Si quisiramos volver a permitir la modificacin de las barra de herramientas, tan solo necesitariamos cambiar el
True. En ambos casos, la funcin es evitar que el usuario final aada y/o modifique las Barras de Herramientas (
herramientas).
A la hora de crear una Barras de herramientas, conviene borrarla previamente, para evitar el problema derivado de
Barras de herramientas con un nombre preexistente, por ej:
Conviene recordar que al ejecutar esta macro crearemos una Barras de herramientas llamada "TodoEXCEL", y a
libro, esta Barras de herramientas seguir como una de las Barras de herramientas de Excel, ya que no la hemo
antes de cerrar el libro. Es por ello que preferimos no utilizar Barras de herramientas creadas con VBA, ya que to
realizamos a travs de ellas puede ser realizado mediante simples comandos adjuntos en las hojas. Cmo
podramos utilizar una nacro de evento que al cerrar el libro activo llamara a la macro
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
"BorrarToolbar", y con ello borraramos esta Barras de herramientas recin creada, por ejemplo:
Es decir si quisiramos crear una Barras de herramientas llamada "TodoEXCEL", sera conveniente llamar a
anterior primero tal que:
Sub CrearToolbar()
Dim X As Byte
On Error Resume Next
Call BorrarToolbar
259
260
PopUp
Si lo que queremos es utilizar una BH solo cuando, por ejemplo, hacemos clic con el botn derecho del ratn 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 aadindole diferentes botones tal que...
' 1)
Set POPUPControl = .Controls.Add(Type:=msoControlButton)
With POPUPControl
.Caption = "&Informe Ventas..."
.FaceId = 1922
.OnAction = "MacroEg"
End With
' 2)
Set POPUPControl = .Controls.Add(Type:=msoControlButton)
With POPUPControl
.Caption = "&Plan Contable..."
.FaceId = 1016
.OnAction = "MacroEg"
End With
' 3)
Set POPUPControl = .Controls.Add(Type:=msoControlPopup)
With POPUPControl
.Caption = "Paises"
.BeginGroup = True
End With
' 3.A)
Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton)
With SubPOPUPControl
.Caption = "Francia"
.FaceId = 71
.OnAction = "MacroEg"
End With
' 3.B)
Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton)
With SubPOPUPControl
.Caption = "Espaa"
.FaceId = 72
.OnAction = "MacroEg"
End With
' 3.C)
Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton)
261
262
With SubPOPUPControl
.Caption = "Portugal"
.FaceId = 73
.OnAction = "MacroEg"
End With
End With
End Sub
Cancel = True
End If
End Sub
Recordemos que esta macro de evento BeforeRightClick solo tiene lugar cuando hacemos clic con el botn
derecho del ratn estando dentro del rango definido como: Range("RangoCeldas") ya que no queremos perder
la funcionalidad del botn derecho del ratn en otros rangos.
Sub BorrarPOPUP()
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
264
Mostrar y ocultar
Deshabilitar controles
Del mismo modo que podemos crear y borrar un BH, tambin podemos ocultar y desocultar tantas BH como
querramos. Para ello utilizamos:
No son pocas las veces que queremos deshabilitar ciertos controles dentro de un libro Excel dado. A veces no
nadie imprima la hoja activa, o bien queremos que nadie copie una celdas determinadas. Para realizar esto con ac
saber:
Sub OcultarDesocultarBH()
Dim X As Integer
Application.ScreenUpdating = False
' Para permitir la ejecucin 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 ocultara todas las BH visibles y desocultara todas las BH no visibles.
1) Saber si existe alguna combinacin de teclas que ejecuten la accin que queremos evitar y deshabilitarla. Lu
libro esto se hace tal que:
Application.OnKey "^C", ""
Application.OnKey "^C"
2) Deshabilitar los contoles de copiar en cada una de las BH disponibles en Excel. Esto se hace dela siguiente form
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
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
Cortar y Pegar respectivamente. Una vez que hemos deshabilitado todos los controles con estos ID, necesitamos a
265
266
el siguiente paso...
3) Evitar la personalizacin:
CommandBars("Toolbar List").Enabled = False
Ya que de lo contrario podramos volver a personalizar nuestras BH e incluir los controles 19, 21 y 22 en cualqu
personalizada o de las que trae Excel, por ej Estndar.
.Name = "MenuPARIA"
.Visible = True
End With
Application.VBE.MainWindow.Visible = False
Application.CommandBars("PLY").Enabled = False
' Para deshabilitar los comandos tales como 'CONTROL+P' es decir PRINT
' Nos faltaran todava algunos pero...
For X = 1 To Len(ABC)
Application.OnKey "^" & Mid(ABC, X, 1), ""
Application.OnKey "^" & LCase(Mid(ABC, X, 1)), ""
Application.OnKey "%" & Mid(ABC, X, 1), ""
Application.OnKey "%" & LCase(Mid(ABC, X, 1)), ""
Next X
' Tampoco hemos deshabilitado los ALT+F1, F2,...
' Application.SendKeys ('%q')
CommandBars("Toolbar List").Enabled = False
End Sub
Recordemos nuevamente que cualquier ExcelManaco podra sin gran dificultad habilitar cualquier coman
previamente deshabilitado.
Como hemos mencionado en repetidas ocasiones el botn derecho del ratn siempre tiene las opciones de copia
con lo que es ms sencillo directamente deshabilitar por completo la opcin de botn derecho del ratn.
Sin embargo, todo lo realizado sigue sin ser ptimo, ya que desde el men Edicin tenemos la posibilidad de m
hoja. Es decir que necesitaramos saber todos los controles que sirven para realizar lo mismo, o que pueden servir
manera llegar a evitar el fin pretendido. E incluso, si conociramos todos los ID's, luego quedara la posibilidad de a
de VBA y desde aqu habilitar los comandos deshabilitados. Puede que lleguemos a la conclusin que finalmen
pero no lo es, tan solo lleva tiempo, y ademas el 99,9% de lo usuarios no emplearn el tiempo requerido para v
algo, que el creador haya querido deshabilitar. De hecho muchos programadores nunca protegen su cdigo teni
que existen herramientas con las que se podra crackear fcilmente las claves e proteccin.
Como alternativa recurrente podriamos crear un men bar carente de funcionalidad y evitar el acceso a VBA, desh
derecho del ratn tambin en los tabuladores de hoja tal que:
Public Sub MakeMenuBar()
Dim X As Byte
Dim ABC As String
ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim CBar As CommandBar
Call DeleteMenuBar
For Each CBar In CommandBars ' Borramos las barras visibles
If CBar.Type = msoBarTypeNormal Then CBar.Visible = False
Next CBar
Set CBar = CommandBars.Add(MenuBar:=True)
With CBar
267
268
Menus
Crear Men
Podemos personalizar o adaptar nuestros propios mens y barras de herramientas dentro de Excel. En este
captulo veremos como hacerlo.
La creacin de un men no vara con respecto a la creacin de una barra de herramientas (BH). Ahora bien, sie
puede crear una barra de men totalmente nueva, o bien utilizando la existente, la que excel agrega y muestra po
existente.
Como norma general, aunque no escrita, si quisiramos agregar un nuevo men a nuestra barra de mens (por ej
"?" (el men que viene despus del men "Ventana").
El siguiente ejemplo muestra como podemos crear un men "TodoEXCEL" en Excel.
Al igual que cuando creamos las BH, para crear un men deberemos borrarlo previamente, para evitar el error de co
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
' Borra el Menu 'TodoEXCEL' llamando a otra macro
Call BorrarMenu
' Busca por el men Ayuda, esto es simplemente un convenio no firmado entre programadores
' para los cuales cualquier menu creado y aadido debe ir antes que el menu llamado Ayuda y/o Help
Set HelpMenu = Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30010)
If HelpMenu Is Nothing Then
' Aade el menu 'TodoEXCEL' al final
Set MenuNuevo = Application.CommandBars("Worksheet Menu Bar").Controls.Add( Type:=msoC
Else
' Si Ayuda existe, entonces antes que el menu '?' es decir ID=30010
Set MenuNuevo = Application.CommandBars("Worksheet Menu Bar").Controls.Add( Type:=msoC
End If
' Llamamos al nuevo Menu creado... 'E&xceluciones'
' hemos colocado un & antes que la 'x' para que la 'x' est subrayada y podamos acceder al men
MenuNuevo.Caption = "E&xceluciones"
' Y vamos aadindole diferentes botones y/o controles tal que...
'1)
Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlButton)
With MenuItem
.Caption = "&Informe Ventas..."
.FaceId = 176
.OnAction = "MacroEjemplo"
' esta ser la macro que ejecutaremos al hacer clic sobre el b
End With
'2)
Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlButton)
With MenuItem
269
270
30083 =A&ccin
30009 =Ve&ntana
30010 =&?
'3)
Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlPopup)
With MenuItem
.Caption = "Pases"
.BeginGroup = True
End With
'3.A) Del mismo modo que aadimos controles, podemos aadir subcontroles
' y dentro de estos podramos aadir a su vez ms 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 lgicamente, se
End With
'3.B)
Set SubmenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
With SubmenuItem
.Caption = "Espaa"
.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:
Private Sub MacroEjemplo()
MsgBox "en lugar de un mensaje hubieramos podido...", vbInformation, "LOGICAMENTE..."
End Sub
Haber decidido colocar el menu "TodoEXCEL" antes que el men y/o control Ayuda "?" no significa que debamos
el.
30002 =&Archivo
30003 =&Edicin
30004 =&Ver
30005 =&Insertar
30006 =&Formato
30007 =&Herramientas
30011 =Da&tos
271
272
End Sub
Agregar controles
Ahora agregaremos controles a un men Excel predeterminado, ya que agregar controles a un menu personal, e
hemos realizado en el la seccin anterior.
Sub DeleteMenuControl()
On Error Resume Next
Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30005).Controls("Insertar Men
End Sub
Debemos de saber el ID del men sobre el que vamos a trabajar y/o en su defecto su nombre y/o caption:
Sub MsgBox_Hola()
MsgBox Chr(10) & "Un Feliz AO Nuevo!!!", _
vbInformation, _
"TodoEXCEL le desea:"
End Sub
30002 =&Archivo
30003 =&Edicin
30004 =&Ver
30005 =&Insertar
30006 =&Formato
30007 =&Herramientas
Conviene recordar que si ejecutramos esta macro y no borrramos el control creado al cerrar el libro, luego s
hiciramos clic sobre el control "Insertar Mensaje E&xceLuciones", Excel automticamente abrira el libro que
ordenado que se ejecute. Es por ello que los mens nuevos y/o personalizados se aportan como complementos o
que los cre se cierra.
30011 =Da&tos
30083 =A&ccin
30009 =Ve&ntana
30010 =&?
Tambin debemos recordar que podemos hacer eferencia a un men por su nombre y/o por su identificativo (es d
de pas a pas (versiones de Excel en distintos idiomas) mientras que los nombres puede que si !.
En el siguiente ejemplo insertamos un nuevo control en el Menu Insertar, y le adjuntamos una macro sencillita para
ejecutado y/o clicado a travs del ratn o a travs de teclado con el metodo abreviado de teclas "Conbinacin de te
Sub AadirControl_al_MenuXX()
Dim MenuXX As CommandBarPopup
Dim nuevoControl As CommandBarButton
' Elimina el Control si existiera:
Call DeleteMenuControl
' Encontrar el Menu Insertar:
Set MenuXX = Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30005)
' Buscamos por el Menu Insertar y en caso de que no existiera, EXIT
' Lgicamente el menu 'Insertar' debera estar siempre, pero nos aseguramos...
If MenuXX Is Nothing Then
MsgBox "Parece que su Barra de Menu, no Contiene el Control Insertar", vbInformation, "ATE
Exit Sub
End If
Set nuevoControl = MenuXX.Controls.Add( _
Type:=msoControlButton)
' before:= en caso de que quisiramos colocarlo no en el final, sino
' antes que el control llamado 'Com&entario'
' Set nuevoControl = MenuXX.Controls.Add( _
Type:=msoControlButton, _
Before:=Application.CommandBars("Insert").Controls("Com&entario").Index)
With nuevoControl
.Caption = "Insertar Mensaje E&xceLuciones"
.BeginGroup = True
.FaceId = 1589
.OnAction = "MsgBox_Hola"
End With
273
274
Comandos
Mensajes de alerta
En este captulo se explicarn 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 confirmacin. A nivel de macros, es importante tenerlos
presentes, tal como vemos a continuacin:
Sub BorrarHoja()
' Borramos una hoja
ActiveSheet.Delete
' Pero esto requiere la confirmacion por parte del usuario...
' Para evitar el mensaje de alerta, ya que Excel siempre nos pedir confirmacin,
' bastar con utilizar la siguiente instruccin:
Application.DisplayAlerts = False
' Con lo cual ahora s podremos borrar la hoja dada sin necesidad de confirmacin
ActiveSheet.Delete
' Finalmente dejamos a Excel en su estado original de mostrar los mensajes
Application.DisplayAlerts = True
End Sub
Es importante recordar que el Application.DisplayAlerts=False siempre debe ir antes de la accin que requiere
confirmacin. Al final de la macro conviene volver a asignarle la propiedad True.
275
276
Barra de estado
La barra de estado de Excel es la que figura en la parte inferior y suele mostrar distintos mensajes. Esta barra
se puede mostrar u ocultar desde el men Ver > Barra de estado.
' 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
En otros casos, la misma cambia el mensaje mostrado, segn la operacin que estemos por realizar. Por
ejemplo, si seleccionamos un rango y lo copiamos, la barra de estado dara una instruccin como la que se ve a
continuacin:
Es posible cambiar el mensaje de la Barra de estado mediante cdigo VBA. Esto permite mostrar mensajes
personalizados ya sea mientras se ejecutan las macros o al finalizar las mismas.
277
278
Msgbox
Un Msgbox es simplemente una ventana que muestra un mensaje. Por ej., con la siguiente instruccin
mostraramos un saludo:
Sub Saludo()
' Escribimos el mensaje entre comillas
Msgbox "Hola, Excel te saluda!"
End Sub
El mesaje anterior se vera as en la hoja Excel:
Por defecto, un Msgbox siempre incluye el botn "Aceptar", el cual hara desaparecer el mensaje y continuara
ejecutando el cdigo restante si lo hubiera. Tambin podemos configurar para que en lugar del botn "Aceptar"
aparezca un botn de "Ok" y "Cancelar" y de acuerdo al que elija el usuario, la macro continuara con un cdigo
u otro cdigo. Esto lo realizamos agregando la instruccin vbOKCancel, tal como vemos a continuacin:
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 continuara la macro en caso de Cancelar
End If
' si se presion 'Aceptar'
If Respuesta = vbOK Then
MsgBox "Macro caso Aceptar" ' Aqu continuara la macro en caso de Aceptar
End If
End Sub
Sub Saludo()
' El mensaje mostrar el contenido de la celda A1
Dim M As Variant
M = range("A1").value
Msgbox M
End Sub
Tambin es posible dar formato y aplicar otras propiedades al Msgbox, tal como se ve explica continuacin:
Sub MacroMensajes()
' Los mensajes que excel puede lanzar se rigen por:
' Prompt:='Me llamo Pedro.' Ensearia el mensaje...
' Buttons:= VbInformation, O bien
' Buttons:= 64
' con lo cual Buttons ----> Muestra el icono de mensaje de informacin.
' Title:='TodoEXCEL:', el ttulo que adjuntaramos al mensaje
MsgBox Prompt:="Me llamo Pedro.", Buttons:=vbInformation, Title:="TodoEXCEL:"
End Sub
Si quisiramos separar en varias lneas el mensaje, deberamos hacerlo con la instruccin &Chr(13):
Sub Mensaje()
MsgBox "Este es un mensaje " & Chr(13) _
& "escrito en 2 lneas"
End Sub
279
280
InputBox
Un InputBox se utiliza cuando requerimos un input del Usuario (es decir, cuando esperamos que el usuario intr
variable, pero le damos el control al usuario para que asigne dicho valor o dato a gusto.
Dentro del InputBox utilizamos las siguientes instrucciones:
Prompt: mensaje del InputBox
Title: ttulo del InputBox
Default: valor por defecto al abrir el InputBox (si omitimos no aparecer nada)
Type: indica el tipo de dato a introducir (1 Nmero, 2 Texto, 4 True o False, 5 Rangos)
Vamos ahora como queda el InputBox:
Todos los contenidos de este curso Copyright 2.008 por TodoEXCEL.
Sub Nombre()
' el dato que proporcionar el usuario quedar registrado por la Variable Respuesta. Como no sabemo
Dim Nombre As Variant
Nombre = Application.InputBox(prompt:="Escriba su nombre", Title:="Colegio de Abogados", Default
Msgbox Nombre ' En lugar de este Msgbox continuara el resto de la macro...
End Sub
El InputBox anterior se ver as:
281
282
Librera
Una "librera" es una coleccin de macros. En la medida que vamos haciendo nuestras macros, conviene ir
guardndolas en una librera. De este modo las tendremos disponibles para cuando necesitemos usarlas
nuevamente y evitaremos tener que reprogramar las macros en cada momento. En esta seccin veremos
nuestra librera de macros (aquellas que utilizamos frecuentemente).
283
284
Borrar Filas
Bsquedas
Para borrar filas debemos posicionarnos en una celda y utilizar la instruccin EntireRow.Delete
Veamos un ejemplo:
Para hacer bsquedas (el equivalente a la funcin "buscarv" de Excel) utilizamos la instruccin lookupvalue.
'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 BuscarCodigo()
'Definimos variables
Dim lookupvalue As Variant, value As Variant, lookupRange As Range
Veamos un ejemplo:
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
285
286
Clculos
ComboBox
Muchas veces, cuando ejecutamos macros, nos interesar poner el modo de clculo manual. Para esto
utilizamos la instruccin Calculation.
Cuando trabajamos con un combobox, podemos crear un evento que se dispare luego de presionar intro.
Veamos un ejemplo:
'Poner modo de clculo manual
Application.Calculation = xlManual
Veamos un ejemplo:
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Intege
If KeyCode = 13 Then 'Cuando apreto enter dentro del combo box entonces
Range("I6").value = ComboBox1.Text 'Pasamos el valor del combo a la celda I6
End If
End Sub
287
288
CommandBars
CopiarPegar
Aqu jugamos un poco con las barras de comando. Cambiando los "True" por "False" y viceversa veremos
como afecta.
289
290
MsgBox "Usted ha consumido " & Usos & " de 20 usos disponibles."
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 automticamente al abrir el libro)
2) Dicha macro pedir al usuario una clave de desactivacin
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
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 automticamente
Veamos como funciona:
Sub Auto_Open()
Dim V As String
'Defino una palabra clave de activacin (ponerla en una celda oculta o con texto y fondo blanco)
If Hoja6.Range("B1").value = "espaa" Then
Exit Sub
Else
V = Application.InputBox("Introduzca la clave de activacin. Si todava no la conoce presione 'Acepta
If V = "espaa" Then
Hoja6.Range("B1").value = "espaa"
MsgBox "Activacin exitosa, presione 'Ok' para guardar los cambios."
ThisWorkbook.Save
Exit Sub
End If
Sub Demo()
Dim V As String, FechaFin As Date, Usos As Range
FechaFin = #7/15/2007# 'm-d-aaaa... CAMBIAR ESTA FECHA !!!
291
292
Eventos
En este ejemplo vemos un ejemplo sobre cmo llamar macros cuando cambia algn 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
'Esta macro se ejecuta cuando cambia algo en la hoja
Private Sub Worksheet_Change(ByVal Target As Range)
LCR = Target.Row 'Definmos variable LCR (por Last Changed Row)
LCC = Target.Column 'Definimos variable LCC (por Last Changed Column)
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
If LCR > 10 Then 'Solo ejecutamos la macro cuando estamos en fila 11 o mayor.
Select Case LCC
Case Is = 2: Call Fecha 'Si cambia columna 2 se ejecuta macro "Fecha"
Case Is = 3: Call Concepto 'Si cambia columna 3 se ejecuta macro "Concepto"
Case Is = 4: Call Grupo
Case Is = 5: Call Tipo
Case Is = 7: Call Importe
Case Is = 8: Call Cuenta
Case Is = 9: Call GrupoCta
End Select
End If
Application.EnableEvents = True
End Sub
293
294
ExcelVersions
LayOut
Para saber con que versin de Excel nos encontramos utilizamos la instruccin Application.Version
Con estas macros jugaremos a ocultar y mostrar barras de herramientas o desactivar mens. Recordar que podemo
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
End Sub
Option Explicit
Sub OcultaMenus()
'Ocultar menus
Application.CommandBars("Worksheet Menu Bar").Enabled = False
'Ocultar barras de herramientas
Application.DisplayFullScreen = True
End Sub
La macro devuelve:
08 Para Excel 97
Sub CmdBarsOff()
Dim ctl As CommandBarControl
For Each ctl In Application.CommandBars("Worksheet Menu Bar").Controls
295
296
'Debug.Print ctl.Caption
If ctl.BuiltIn = True Then
ctl.Enabled = False
End If
Next ctl
Filtros
Algunos cdigos interesantes relacionados con filtros.
Option Explicit
'Poner autofiltro
Range("B6:M6").AutoFilter
'DETERMINAR SI ESTA PUESTO EL AUTOFILTRO
If ActiveSheet.AutoFilterMode = True Then
'FILTRAR CON CONDICION
Range("A1").AutoFilter Field:=8, Criteria1:="<=" & Range("M5").value, Operator:=xlAnd
* En A1 est en encabezado de columna. Luego filtro por <= a valor de M5
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
'QUITAR FILTROS
If Range("InHuurData").AutoFilter = xlOn Then
Range("InHuurData").AutoFilter
End If
'PINTAR CELDA CON FILTRO
'Requiere q en alguna celda este la formula =hoy()
'dado q al filtrar se recalcula y dispara el evento calculate
Private Sub Worksheet_Calculate()
Dim af As AutoFilter
Dim fFilter As Filter
Dim iFilterCount As Integer
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
297
298
FTP
Algunos cdigos de inters 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
Range("E7:CL23").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Sheets("Filtros").Range("D3:G10"), _
CopyToRange:=Range("G26:O26"), Unique:=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
299
300
Funciones
Guardar
'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"))
301
302
Hojas
Imgenes
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
303
304
Imprimir
Msgbox
LngLastRow = ActiveSheet.Range("G65536").End(xlUp).Row
ActiveSheet.Range("A1:G" & LngLastRow).Select
'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
With ActiveSheet.PageSetup
.PrintArea = ("A1:G" & LngLastRow)
.FitToPagesWide = 1
.FitToPagesTall = False
End With
End Sub
305
306
Ordenar
Proteger
'En A38:G38 esta el encabezado. El Key1 es F39 (una fila mas abajo, osea el primer registro)
307
308
Rangos
Resolucin de Pantalla
'NOMBRAR RANGOS
Dim LR As Long
LR = 100
ActiveWorkbook.Names.Add Name:="LasRow", RefersToR1C1:=LR
ActiveWorkbook.Names.Add Name:="Max", RefersToR1C1:="=100"
Sub Reso()
Range("G3") = CStr(GetSystemMetrics(SM_CXSCREEN))
Range("G4") = CStr(GetSystemMetrics(SM_CYSCREEN))
End Sub
'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
End If
Si es vaco (cuando borra) pinto negro
If Cells(LCR, 2).value = "" Then
Range(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 1
End If
309
310
Seleccin
Tablas
Macros de seleccin
311
312
Tablas Dinmicas
Varios
313
314
EXTRAS
Hemos preparado una buena cosecha de recursos ms que interesantes para tus macros.
Haciendo clic aqu podrs descargar todos estos extras !
(si el enlace te solicita clave utiliza la misma con la que accedes al curso)
315
316
Otros
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
317
318