Manual Macros Excel
Manual Macros Excel
[email protected]
(591)715.21583
Libro dirigido a todo aquel que quiera aprovechar una de las herramientas
ms potentes de Microsoft Excel, sin importar el rea profesional de la que
est partiendo
Excel y Macros
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.
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 manual 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 manual te
servir para refrescar algunos conceptos pero tambin te sorprenders con
nuevos cdigos y secciones especiales que hemos preparado para ti.
Lenguaje VBA
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
Como comenzar
Editor VBA
El Editor de Visual Basic es la aplicacin que trae Excel desde donde se escriben
y guardan las macros.
Tienes 3 formas de acceder al editor:
A.
B.
C.
A.
Escribirla manualmente
B.
C.
Mi primera Macro
Vamos a escribir manualmente nuestra primera macro ahora!. Es una macro
muy sencilla, pero te servir para orientarte en el Editor de Visual Basic y
reconocer los pasos requeridos para hacer una macro.
Objetivo de nuestra macro
Escribir el valor 1.500 en la celda A1 de la hoja Excel.
Qu significa esto? Que comenzaremos con una hoja Excel vaca y luego de
ejecutar la macro vers
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:
1.
2.
Escribibos la macro
Ejecutar la macro
Si ya tienes escrita la macro en el editor, ahora podrs que ejecutarla, o sea
hacer que funcione.
Tienes 2 formas de hacer esto:
A.
B.
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:
* los colores del cdigo los asign automticamente el editor)
* la primera lnea que dice Option Explicit la vamos a ignorar de momento
Esta macro tiene 4 lneas de cdigo, por eso es tan sencilla (cuando termines
este manual 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.
1 lnea de cdigo: el comentario
' Esta macro escribe el 1500 en la celda C10
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub
La primera lnea de una macro suele ser un comentario que hacemos sobre la
misma, donde podemos poner lo que querramos.
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.
en la celda C10).
Recuerdas el comienzo del manual donde hablbamos de Objetos (partes de
Excel), Propiedades (caractersticas) y Mtodos (acciones)?. Aqu tenemos un
ejemplo al respecto. Programar macros siempre consiste en lo mismo: primero
hacer referencia al objeto y luego asignarle una propiedad o mtodo. En nuestro
ejemplo:
Range("A1").Value = 1500
Range("A1"). es el objeto
Value es la propiedad
= 1500 es el valor que le damos a la propiedad
Esta lnea de cdigo se interpreta as: a la celda C10 de Excel asignarle el
valor 1500.
Recuerda: siempre debes hacer referencia a un objeto para luego asignarle propiedades o
mtodos.
Resumen
Nuestro objetivo fue crear una macro que escribiera el valor 1500 en la celda A1
de la Hoja1 de Excel.
Como era una macro sencilla decidimos escribir el cdigo manualmente. Vamos
a resumir todos los pasos que hicimos hasta aqu:
1.
2.
3.
4.
5.
6.
OPM de la macro
Recordemos nuevamente el cdigo de nuestra primera macro:
' Esta macro escribe el valor 1500 en la celda A1
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub
Ahora recordemos brevemente el significado de cada lnea de cdigo:
1 lnea: es el comentario de la macro (simpre comienza con el signo ')
2 lnea: es el nombre de la macro (siempre se comienza con Sub)
3 lnea: es la instruccin principal de la macro
4 lnea: es el fin de la macro (siempre termina con End Sub)
La mayora de las macros llevan una estructura similar, aunque hay algunas
excepciones.
El comentario que aparece al comienzo lo ponemos a gusto y sirve para
recordarnos lo que queremos hacer con esa macro. El comentario siempre
comienza con el signo ' y no afecta para nada a la macro.
Es un simple texto.
El nombre lo pondremos a gusto, anteponiendo la palabra Sub los parntesis de
apertura y cierre al final. Conviene dar un nombre que nos indique que hace la
macro.
A.
Escribirla manualmente
B.
C.
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.
Objetivo de nuestra macro
Escribir el valor 1.500 en la celda A1 de tu hoja Excel.
que significa esto? Que comenzaremos con una hoja Excel 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 sufiente como para
comprender la metodologa de funcionamiento de la grabadora de macros.
Grabando la macro
Excel trae incorporada una grabadora de macros. La misma funciona de forma
muy fcil. Encendemos la grabadora, ejecutamos las acciones que nos interesan
sobre la hoja excel, paramos la grabadora ylisto!. Excel escribe de forma
automtica el cdigo VBA de la macro.
Ahora podemos hacer un experimento muy interesante. Repetir nuestra primera
macro, pero esta vez hacindola con la grabadora de macros. Sigue los pasos a
continuacin:
1.
2.
Cuando comienza a grabar la macro activa una nueva barra de macros como
la que se muestra en la foto. El botn cuadrado 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. Hazlo ahora para detener la grabacin.
3.
4.
Resumen
Nuestro objetivo fue grabar una macro que escribiera el valor 1500 en la celda
A1 de la Hoja1 de Excel. Los pasos que seguimos para utilizar la grabadora de
macros fueron:
1.
2.
3.
4.
5.
6.
7.
A.
B.
Macro Escrita
Macro Grabada
1. Como la hicimos
1.
Como la hicimos
1.1 Creamos un Libro Excel llamado Libro1. 1.1 Utilizamos el mismo Libro1.xls
1.2 Abrimos el editor de macros con ALT+F11.1.2 Encendimos la grabadora de macros
1.3 En VBAProject (Libro1) hicimos doble clic desde el men Herramientas > Macro >
en Hoja1 (Hoja1)
Grabar nueva macro
1.4 Escribimos el cdigo de la macro.
1.3 Nos posicionamos en la celda A1 de la
2. El cdigo de la macro
2. El cdigo de la macro
2.1 Con ALT+F11 accedemos al editor de
2.1 Con ALT+F11 accedemos al editor de macros.
macros.
2.2 El cdigo que escribimos manualmente fue 2.2 El cdigo que se grab
automticamente el siguiente:
fue el siguiente:
' Esta macro escribe el valor 1500 en la celda
Sub MiPrimeraMacro()
A1
'
Sub MiPrimeraMacro()
' MiPrimeraMacro Macro
Range("A1").Value=1500
' Esta macro escribe el valor 1500 en la celda
End Sub
A1
Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub
Recuerda que este cdigo qued en
Recuerda que este cdigo qued en
VBAProject (Libro1) > Hoja1 (Hoja1)
VBAProject (Libro1) > Mdulo1
3. Ejecucin de la macro
3. Ejecucin de la macro
Posicionados sobre cualquier lnea del cdigo Para no confundirnos primero borramos el
anterior presionamos F5. Luego con ALT+F11 valor 1500 de la celda A1, Hoja1 (lo
habamos volvimos a la hoja de Excel y comprobamos escrito para grabar la macro). Luego
Diferencias
Macro Escrita
Macro Grabada
1. Como la hicimos
1. Como la hicimos
Desventaja: escribir una macro manualmente Ventaja: no es necesario conocer cdigo de
implica conocer los objetos y propiedades de programacin. La grabadora lo escribe
excel. En este caso tenamos que saber
automticamente.
previamente que exista un objeto Range y una
propiedad Value, y tambin debamos saber
como era la sintaxis de los mismos >
Range("A1").Value=1500. Para un
principiante esto puede ser difcil de saber.
2. El cdigo de la macro
2.
El cdigo de la macro
Ventaja: cuando sabemos escribir macros,
Desventaja: generalmente, cuando utilizamos
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.
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 ralentice 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
Ejemplos de Macros
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:
1.
2.
3.
4.
End Sub
5.
1.
2.
3.
4.
Macro 1
Escribamos manualmente una nueva macro ahora:
1.
2.
3.
4.
5.
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 manual estn
las macros ms importantes que podrs necesitar, escritas, comentadas y listas
para que puedas copiar, pegar y adaptar en tus propios desarrollos.
Macro 2
Escribamos manualmente otra nueva macro ahora:
1.
2.
3.
4.
5.
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:
ActiveWindow.DisplayGridlines = True
Recuerda que esto es tan solo un adelanto. En la 2 parte de este manual estn
las macros ms importantes que podrs necesitar, escritas, comentadas y listas
para que puedas copiar, pegar y adaptar en tus propios desarrollos.
Macro 3
Escribamos manualmente otra nueva macro ahora:
1.
2.
3.
4.
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:
5.1 Posicinate en la celda C1
5.2 Desde el men Herramientas > Macros > Macro, elige de la lista la macro
CopiaRango y luego Aceptar.
5.3 El resultado ser que el rango A1:A5 se copiar a partir de la celda C1 que
era la celda activa al ejecutar la macro.
6.
Range("A1:A5")
El objeto Range ya lo conocamos...
Copy
Este es un mtodo (una accin)
Destination:=ActiveCell
Este es otro objeto. Destination se suele utilizar luego de un Copy y ActiveCell hace
referencia a la celda activa.
Recuerda que esto es tan solo un adelanto. En la 2 parte de este manual estn
las macros ms importantes que podrs necesitar, escritas, comentadas y listas
para que puedas copiar, pegar y adaptar en tus propios desarrollos.
El Editor de macros
Es importante reconocer bien las principales opciones y secciones que tiene el
editor de macros (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.
Como acceder
El Editor de Visual Basic es la aplicacin que trae Excel desde donde se escriben
y guardan las macros.
Tienes 3 formas de acceder al editor:
A.
B.
C.
(*) Recuerda que puedes habilitar esta barra desde el men Ver > Barras de
Herramientas > Visual
Basic.
Nuestra forma preferida de acceder es con ALT+F11. Si ests en Excel y
presionas estas teclas se abrir el editor. Y al revs, si ests en el editor y
presionas las mismas teclas volvers al Excel.
Cuando accedas al editor vers algo como similar a esto:
Las principales ventanas de editor son:
Proyecto (arriba a la izquierda)
Propiedades (abajo a la izquierda)
Inmediato (arriba a la derecha)
Cdigo (abajo a la derecha)
No importa si no ves todas las ventanas, dado que se pueden mostrar u ocultar.
En las secciones siguientes te explicaremos la utilidad de cada una de ellas.
Ventana Proyecto
Veamos una foto para ver como se ve la ventana de Proyecto. Si no la puedes
visualizar puedes activarla desde el men Ver > Explorador de proyectos, dentro
del editor de visual basic.
En la ventana de Proyecto hay carpetas donde se guardarn y escribirn las
macros. Hemos presionado el botn Alternar Carpetas para que se ordenen
mejor los elmentos, como se ve a continuacin:
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.
En resumen VBAProject(Libro1) es la carpeta principal, asociada a un libro Excel
determinado, donde insertaremos todo lo referido a las macros para dicho libro.
En un segundo nivel tenemos las carpetas. Estas carpetas nos distinguen entre
Objetos, Formularios y
Mdulos. Veamos cada una de ellas:
1.
Objetos
En esta carpeta vemos que cuelgan dos elementos:
1.1 ThisWorkbook siempre est presente. Si escribimos una macro aqu la
misma afectar a todo el libro.
1.2 Hoja1(Hoja1) hace referencia las hojas de Excel (habr 1 por cada hoja de
nuestro libro). Si escribimos una macro aqu la misma solo afectar a la hoja en
cuestin.
2.
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.
Recuerda: antes de escribir una macro debes evaluar donde hacerlo.
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.
4. Si quieres hacer un formulario utiliza el objeto Userform.
Ventana Propiedades
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 manual.
Ventana Cdigo
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.
Si todava no has escrito ninguna macro vers la ventana de cdigo en blanco.
En nuestro ejemplo hemos escrito 3 macros:
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.
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:
En los 3 ejemplos anteriores buscbamos un resultado y anteponamos el signo
? al comienzo de la instruccin (buscbamos un nombre o un nmero). En otros
casos podemos ejecutar una accin directamente y por lo tanto escribimos la
macro sin el signo ?. Por ejemplo, si queremos que en la celda A1 aparezca el
valor 100 lo podemos ejecutar desde la Ventana Inmediato como se ve a
continuacin:
En la celda A1 de la Hoja activa de Excel aparecer el valor 100.
Recuerda: desde la Ventana Inmediato puedes ejecutar macros de forma
inmediata, como su nombre
lo indica. Pero dichas macros solo se ejecutan 1 vez al presiona enter y no
quedan disponibles en la lista de macros ni las puedes utilizar en tus desarrollos
(asignndolas a botones o formularios).
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:
Para proteger tus macros sigue estos pasos:
Ejecucin de Macros
En varias secciones de este manual te indicamos como se ejecuta una macro. En
realidad hay muchas formas de hacerlo, as que te las explicaremos a todas.
Dependiendo del caso te interesar ejecutar la macro desde un men, desde un
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".
Desde el cdigo
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.
Desde menu
Otra forma de ejecutar una macro es desde el men Herramientas > Macro >
Macros. Vers que se abre un cuadro como el siguiente:
Para ejecutar la macro:
1.
2.
Clic en Ejecutar
En la parte inferior figura una lista desplegable donde puedes elegir si quieres
listar las macros de
Todos los libros abiertos, solo las de Este libro o las de PERSONAL.XLS
PERSONAL.XLS es un libro excel que se abre automticamente cada vez que
abres Excel. Este libro permanece oculto desde Excel, pero es posible verlo
desde el editor de macros. Todas las macros que escribas en PERSONAL.XLS
siempre estarn disponibles cada vez que habras tus libros Excel. Es una opcin
muy til por si tienes macros que quieres utilizar en todos tus libros Excel (solo
estrn disponibles en tu PC).
Desde 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:
1.
2.
3.
Recuerda: la macro siempre se ejecuta con la tecla Ctrl+ la letra que tu escribas
en la casilla. Sin embargo, hay muchas combinaciones de Ctrl+Letra que ya
estn ocupadas por Excel (Ctrl+C copiar,
Ctrl+V pegar, Ctrl+X guardar, etc) y no se aconsejamos que utilices dichas
combinaciones. Por eso lo que se hace es presionar 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.
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 desde el men Ver >
Barra de Herramientas > Dibujo. Esto te habilita una barra como la siguiente:
Si ya has insertado una figura en tu hoja Excel, podrs asociarle una macro
siguiendo estos pasos:
1.
2.
3.
4.
Finalmente la figura quedar con la macro asignada, de tal forma que cada
vez que hagas un clic encima de la figura, se ejecutar la macro.
Desde botones
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.
2.
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 captulo "Macros de Eventos".
Macros de Eventos
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.
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.
Eventos de libros
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:
1.
2.
3.
4.
Eventos de hojas
Los eventos de hojas permiten disparar automticamente una macro cuando
suceden determinadas acciones a nivel de hojas excel, por ejemplo al activarla,
desactivarla, calcularla, etc.
Instrucciones para insertar una macro de evento a nivel hoja:
1.
2.
3.
4.
Formularios (Userforms)
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).
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 !
Crear un Userform
1.
2.
3.
Controles de un Userform
Como veamos anteriormente, tenemos una serie de controles para agregar al
Userform, que los podamos visualizar desde el men Ver > Cuadro de
Herramientas.
Ahora explicaremos brevemente la utilidad de cada control. Los controles se
explican en el mismo orden que aparecen en el Cuadro de Herramientas y en la
figura anterior (de izquierda a derecha y de arriba hacia abajo).
Seleccionar objetos: sirve para seleccionar controles que hayamos insertado en
el Userform.
Label: sirve para poner un ttulo o un texto.
Ejemplo: podemos poner un texto del tipo "Complete las opciones a
continuacin" y ubicarlo en cualquier sitio del Userform. Tambin podemos
agregar ttulos o descripciones al resto de comandos que agregemos en el
Userform.
Textbox: sirve para que un usuario introduzca datos.
Ejemplo: queremos que el usuario introduzca una fecha o un nombre (que luego
llevaremos a alguna celda de Excel).
ComboBox: sirve para que un usuario elija una opcin de una lista.
Ejemplo: creamos una lista con los meses de Enero a Diciembre para que el
usuario elija uno de ellos.
ListBox: sirve para que un usuario rellene o elija varias opciones de una lista.
Ejemplo: creamos una lista con Regiones o Ciudades y el usario deber elegir
una o varias de ellas.
CheckBox: sirve para que un usuario active una determinada funcin.
Ejemplo: podemos hacer que al cerrar el Userform se imprima un reporte solo si
la casilla de seleccin est tildada.
OptionButton: 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.
ToggleButton: sirve para activar o desactivar alguna funcionalidad. Este botn
adopta el modo
"Encendido" / "Apagado".
Ejemplo: queremos que el usuario defina su idioma, en modo encendido espaol
y en modo apagado ingls.
Frame: sirve para agrupar elementos de un Userform (los elementos se deben
ubicar dentro del
Frame).
Ejemplo: tenemos varias grupos de OptionButton y para distinguirlos los
1.
Primero debemos crear un nuevo libro que contenga una tabla Excel donde se
volcarn los datos del
Userform. Para esto creamos un nuevo libro llamado Datos.xls y creamos la
siguiente tabla:
2. Creamos un Userform (UF)
Los UF se crean desde el editor de visual basic.
2.1 Abrimos el editor con ALT+F11
2.2 Seleccionamos Ver > Explorador de Proyectos para ver la lista de proyectos
disponibles (los mismos se vern en la parte izquierda de la ventana).
2.3 En la venta de Proyectos seleccionamos VBAProject(Datos.xls)
2.4 Desde el men superior elegimos Insertar > Userform
2.5 Aparecer un nuevo Userform vaco junto con el Cuadro de Herramientas (si
el mismo no aparece se puede abrir desde el men Ver > Cuadro de
Herramientas)
3.
Nombramos el Userform
3.1 Abrimos las propiedades desde el men Ver > Ventana Propiedades.
3.2 Hacemos doble clic en donde dice (Name) UserForm1, en la parte superior y
tipeamos DatosUF, luego Enter (este es el nombre con el que nos referiremos al
Userform desde las macros).
3.3 El nombre del Userform cambi en la Ventana de Proyecto, pero el Userform
mismo sigue mostrando "Userform1" en su barra de su ttulo. Para cambiarlo
vamos a la Ventana Propiedades, hacemos doble clic en Caption, escribimos
Datos Personales (encima de Serform1) y luego Enter.
4.
5.
Agregamos un Texto
Para ayudar al usuario a ingresar sus datos, debemos indicarle que es lo que
debe introducir en el Cuadro de Texto del Paso anterior. Podemos agregar una
etiqueta de texto que describa la informacin que se debe introducir.
5.1 En el Cuadro de Herramientas hacemos clic en el botn Label (etiqueta de
texto).
5.2 En el Userform hacemos clic a la izquierda del TextBox, para agregar la
Etiqueta de texto.
5.3 Si fuera necesario podemos cambiar el 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.
6.
Agregamos los cuadros de texto y las etiquetas restantes (ya lo hicimos para el
nombre as que repetimos para Edad y Fecha de Nacimiento).
Repetimos los pasos 4 y 5 y agregamos:
* 1 TextBox cuyo (Name) sea UFEdad, con una etiqueta de texto (Label) Edad
* 1 TextBox cuyo (Name) sea UFFecha, con una etiqueta de texto (Label) Fecha
Nac.
Es muy importante que no olvides asignar bien los nombres (Name) a los
Textbox, si no la macro dar error. Puedes revisar los pasos 4 y 5 para recordr
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.
7.
Para permitir que el usuario ejecute una accin, se pueden agregar botones de
comando o CommandButons. Nuestro Userform tendr un botn para Agregar
los datos a la tabla Excel y otro botn para Cerrar el Userform.
7.1 En el Cuadro de Herramientas hacemos clic en CommandButton.
8.
9.
10.
La tecla TAB sirve para moverse entre los distintos controles de un Userform. Si
al presionar TAB el orden del movimiento no es el correcto, es posible
cambiarlo:
1. Clic derecho en una parte vaca del Userform
2. Elegimos Orden de Tabulacin.
Varios
En este captulo se comentan temas diversos pero que no dejan de ser
importantes sobre macros.
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
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
El error que aparece al ejecutarla es un aviso que indica:
"Error de compilacin: Bloque If sin End If"
Al hacer clic en aceptar la macro queda en "Modo Interrupcin", lo que significa
que todo queda en pausa y no se podrn ejecutar nuevas macros (el modo de
interrupcin se identifica porque el nombre de la macro queda resaltado en
amarillo). Lo que debemos hacer en esta instancia es salir de modo interrupcin
desde el mismo editor, men Ejecutar > Reestablecer. Luego procedemos a
corregir la macro. En este caso el mensaje fue claro: la esctructura estaba
incompleta, nos falt el End If (existe una estructura If - End If que se explica
mejor en la 2 parte del manual, captulo "Estructuras").
Una vez que se ha interrumpido la macro, tenemos la opcin de ejecutarla paso
a paso (o lnea por lnea) y as determinar en qu lnea est el error. Este lo
puedes hacer posicionndote en la primera fila de la macro y luego presionar la
tecla F8. De esta forma se ir resaltando con amarillo y ejecutando cada fila,
hasta que llegues a la que produce el error. Tambin puedes hacerlo desde la
opcin del men Depuracin > Paso a paso por instrucciones.
Complementos (add-ins)
Una vez que tenemos nuestras macros, es posible "empaquetarlas" bajo la
forma de un Complemento, tambin conocidos como Add-in, de tal forma que se
pueden distribuir a otros usuarios para que lo instalen y tengan acceso a las
macros.
En general, estos complementos no son ms que nuevas funcionalidades y
opciones para Excel, realizadas con macros.
Para acceder a los complementos puedes hacerlo desde el men Herramientas >
Complementos de la hoja Excel, y vers un cuadro similar al que se muestra a
continuacin:
A la izquierda se ve la lista de complementos disponibles siendo posible
activarlos o desactivarlos (seleccionando o deseleccionando la casilla a la
izquierda de su nombre).
Cuando queremos instalar nuevos complementos debemos hacerlo con el botn
Examinar. Dicho botn nos permitir buscar el directorio donde se encuentra el
complemento que deseamos instalar. La extensin de los archivos de
complementos es XLA.
La utilidad de un complemento es que podemos crear nuestras macros y luego
guardarlas como complemento. De esta forma, dichas macros estarn
disponibles en todas las hojas Excel que abramos, dado que el complemento se
cargar automticamente (Excel carga automticamente todos los
complementos que estn seleccionados al abrirse).
El proceso de creacin de un complemento es sencillo:
1.
2.
Luego debes guardar dicho archivo excel desde el men Archivo > Guardar
como...
3.
4.
5.
Seguridad de macros
Excel posee 3 niveles de seguridad de macros. Los mismos se pueden definir
desde el men Excel
Herramientas > Opciones > pestaa Seguridad > botn Seguridad de macros. El
cuadro de dilogo que se abre se ve as:
Lo recomendable es tener el nivel de seguridad en Medio. De esta forma cada
vez que abramos un archivo tendremos la opcin de habilitar o deshabilitar las
macros, mediante un mensaje automtico de aviso que aparece. Si el archivo
proviene de una fuente segura las podremos habilitar sin problemas.
Firma digital
Cuando se abre un libro Excel que contiene macros, aparece un mensaje de
aviso indicando si se desean habilitar o deshabilitar las mismas.
Si quieres ejecutar las macros y que no vuelva a aparecer dicho mensaje,
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.
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.
Macros privadas
Recuerda que puedes visualizar las macros de tu libro desde el men Excel
Herramientas > Macro >
Macros. 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 por alguna razn no desearas que figuren 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 cuetin. 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.
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:
1.
2.
hara que se ejecute muy lento, porque se estara recalculando la hoja repetidas
veces. Lo recomendable es deshabilitar el clculo, ejecutar la macro y luego
volver a activar el modo de clculo automtico. Por ejemplo:
Sub SuperMacro()
Application.Calculation = xlCalculationManual
'El cdigo de la macro aqu
Application.Calculation = xlCalculationAutomatic
End Sub
3.
4.
5.
Fin
Page 3 of 106
final (End Sub), como por ejemplo:
ActiveSheet.PageSetup.PrintArea = "$A$1:$G$22"
Esta lnea la podras utilizar dentro de la ventana Inmediato del editor
VBA.
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
Utilizacin de los Msgbox
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.
Utilizacin de los Print.Debug
Muchas veces, cuando queremos mostrar un resultado, lo hacemos
directamente en
la Ventana Inmediato, utilizando la instruccin de Print.Debug.
Variables
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.
Para definir una variable utilizamos una sintaxis del tipo:
Dim NombreVariable as TipoVariable
Dim: indica que estamos creando una variable
NombreVariable: escribimos el nombre de nuestra variable a gusto (sin
espacios)
as: necesario para definir el tipo de variable
TipoVariable: debemos indicar si es una variable texto, fecha, valor, etc.
Veamos un ejemplo sencillo:
Sub MiNombre ()
' Indicamos que "Nombre" es una variable "String" (texto)
Dim Nombre as String
' Le asiganamos un valor a la variable (tambin podramos indicarle una celda
Excel)
Nombre = "Pedro"
Page 4 of 106
Msgbox Nombre
End Sub
La idea es que Excel recordar que la variable "Nombre" tiene asignado el
valor
"Pedro". Podremos utilizar dicha variable ms adelante en nuestro cdigo.
Definicin
Una variable es un lugar de almacenamiento con nombre que puede
contener cierto
tipo de datos que puede ser modificado durante la ejecucin del
programa. Cada
variable tiene un nombre nico que la identifica dentro de su nivel de
mbito. Puede
especificar un tipo de datos o no. Los nombres de variable deben
comenzar con un
carcter alfabtico, deben ser nicos dentro del mismo mbito, no deben
contener
ms de 255 caracteres y no pueden 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 no deben exceder en longitud de 255 caracteres
Se recomienda evitar el uso de caracteres no presentes en nuestro
alfabeto para
evitar problemas.
A su vez VBA tiene reservados algunos nombres, los cuales ovbiemante
no pueden ser
utilizados como variables propias, algunas de estas palabras son: Sub,
End, with, do,
loop etc, ya que son nombres que tienen un significado propio dentro de
VBA.
Cuando declaramos una variable, por ej:
Dim SALUDOS as String
a medida que utilicemos la variable saludos an cuando la escribamos en
minsculas
VBA nos la corregir automticamente, ya que ha sido creada en
maysculas.
Es decir no debemos preocuparnos entre maysculas o minsculas salvo
en la
declaracin de variables y solo si queremos.
Podemos declarar todo tipo evariables, por ello conviene tambin adquirir
la
costumbre de hacer que el propio nombre de nuestras variable resulte
descriptivo de
Page 5 of 106
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, porque 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 no declararamos las variables VBA manipularia
todas las
variables
como Variant siendo el consumo de memoria bastante mayor.
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:
qu significa la instruccin Option Explicit?
Se usa en el nivel de mdulo para forzar declaraciones explcitas de todas
las variables
en dicho mdulo, debe aparecer en un mdulo antes de cualquier
procedimiento.
Cuando Option Explicit aparece en un mdulo, debemos declarar
explcitamente todas
las variables mediante las instrucciones Dim, Private, Public, ReDim o
Static.
De hecho si intentamos usar un nombre de variable no declarado,
ocurrir un error en
tiempo de compilacin o bien en el momento en el que el cdigo de
origen se traduce
a cdigo de ejecucin.
Page 6 of 106
la variable no est claro.
Ejemplo de la instruccin Option Explicit:
En este ejemplo se utiliza la instruccin Option Explicit para forzar la
declaracin
explcita de todas las variables. Si se intenta utilizar una variable no
declarada se
obtiene un error en el tiempo de compilacin. Recordar que la instruccin
Option
Explicit slo se utiliza en el nivel de mdulo.
' Fuerza la declaracin explcita de variables.
Option Explicit
Sub MacroMensaje()
' Declaramos la variable saludo como variable tipo texto
Dim saludo As String
' Damos un valor a la variable declarada
saludo = "Hola que tal"
' Damos un valor a esta otra variable, que NO ha sido declarada
despedida = "Adios"
MsgBox saludo
MsgBox despedida
End Sub
Cuando ejecutamos esta macro obtenemos un error de 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
Page 7 of 106
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).
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
Intervalo
Byte
1 byte
0 a 255
Boolean
2 bytes
True o False
Integer
2 bytes
-32,768 a 32,767
Long (entero largo)
4 bytes
-2,147,483,648 a
2,147,483,647
Single (coma flotante/
4 bytes
-3,402823E38 a -1,401298E-45
para valores
precisin simple)
negativos; 1,401298E-45 a
3,402823E38
para valores positivos
Double (coma flotante/
8 bytes
-1.79769313486231E308 a
precisin doble)
-4,94065645841247E-324 para
valores
negativos;
4,94065645841247E-324 a
1,79769313486232E308 para
valores
positivos
Currency (entero a escala)
8 bytes
-922.337.203.685.477,5808 a
922.337.203.685.477,5807
Decimal
14 bytes
+/-79.228.162.514.264.337.59
3.543.950.33
5 sin punto decimal;
+/-7,922816251426433759354
3950335 con
28 posiciones a la derecha del
signo decimal;
el nmero ms pequeo distinto
de cero es
+/-0,000000000000000000000
0000001
Date
8 bytes
1 de enero de 100 a 31 de
diciembre de 9999
Object
4 bytes
Cualquier referencia a tipo
Object
String (longitud variable)
10 bytes + longitud de la
Desde 0 a 2.000 millones
cadena
String (longitud fija)
Longitud de la cadena
Desde 1 a 65.400
aproximadamente
Variant (con nmeros)
16 bytes
Cualquier valor numrico hasta
el intervalo de
un tipo Double
Variant (con caracteres)
22 bytes + longitud de la
El mismo intervalo que para un
tipo String de
cadena
longitud variable
Definido por el usuario
Nmero requerido por los
El intervalo de cada elemento es
el mismo que
(utilizando Type)
elementos
el intervalo de su tipo de datos.
Lgicamente si sabemos que una variable va a utilizar valores numricos
sin
decimales y entre 1 y 25, conviene que lo declaremos como Byte, como
se ve en este
Page 8 of 106
ejemplo:
Option Explicit
Sub Macro()
Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
La macro anterior utiliza bastantes menos recursos que esta prxima que
no fuerza la
declaracin de la variable X (y por lo tanto es considerada como Variant):
Sub Macro()
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
Que incluyamos la declaracion Option Explicit no implica que vayamos a
hacer un
buen uso de las variables pues en el siguiente ejemplo, hemos
considerado que X es
Long, cuando podra utilizar menos recursos siendo Byte:
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 forma. Observa que hemos 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:
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
Page 9 of 106
Y en ambos ejemplos obtendramos el resultado Long, mientras que si
hubiramos
puesto:
Option Explicit
Sub Macro()
Dim X
For X = 1 To 1500 ' Aqu escribimos un intervalo menor
Cells(X, 1) = X
Next X
MsgBox TypeName(X)
End Sub
obtendramos como resultado Integer.
Este mtodo no simpre sirve ya que:
Option Explicit
Sub Macro()
Dim X
For X = 1 To 25
Cells(X, 1) = X
Next X
MsgBox TypeName(X)
End Sub
Daria como resultado Integer, en lugar de Byte, no obstante el ahorro de
recursos
resulta en cualquier caso evidente.
Locales
Las variables locales se declaran dentro de cada macro, y solo pueden
ser utilizadas
dentro de la macro en la que han sido creadas, cuando la macro termina
de
ejecutarse, la variable desaparece y Excel libera la memoria que estaba
utilizando
recordando a qu 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:
Option Explicit
Sub Macro()
Dim x As Byte, y As Single, z As Long, Resultado As Variant
Page 10 of 106
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 = "ExceLuciones"
ActiveCell = Autor
End Sub
Sub Macro2()
Dim Autor As String
Autor = "Pedro"
ActiveCell = Autor
End Sub
Sub Macro3()
Dim Autor As String
Autor = "Jose"
ActiveCell = Autor
End Sub
Sub Macro4()
Dim Autor As String
Autor = "Salvador"
ActiveCell = Autor
End Sub
Se recomienda la 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.
created with Help to RTF file format converter
Pblicas
Las variables declaradas mediante la instruccin Public estn disponibles
para todos
Page 11 of 106
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:
Public X As New Worksheet
Si no utilizamos la palabra clave New al declarar una variable de objeto,
la variable
que se refiere a un objeto debe asignarse a un objeto existente mediante
la
instruccin Set antes de que se pueda usar. Hasta que se le asigne un
objeto, la
variable de objeto declarada tiene el valor especial Nothing, el cual indica
que no se
refiere a ninguna instancia en particular de un objeto.
Tambin podemos utilizar una instruccin Public con parntesis vacos
para declarar
matrices dinmicas. Despus de declarar una matriz dinmica, usamos la
instruccin
ReDim dentro de un procedimiento para definir el nmero de
dimensiones y
elementos de la matriz. Si intentamos volver a declarar un dimensin
para una matriz
cuyo tamao se ha especificado explcitamente en una instruccin
Private, Public o
Dim, ocurrir un error. Si no especificamos un tipo de datos o un tipo de
objeto y no
existe una instruccin Deftipo en el mdulo, la variable es Variant de
manera
predeterminada.
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.
Ejemplo de la instruccin Public
En este ejemplo se utiliza la instruccin Public a nivel de mdulo (seccin
General) de
Page 12 of 106
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
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
Page 13 of 106
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, ta solo se llaman igual, de hecho a
medida que la
macro1 vaya ejecutndose x en el primera macro ira desde 1 hasra 25
mientra que en
la macro2 desde 10 hasta ?, dependiendo de cuantas veces utilicemos
esta macro.
Pero en principio si es utilizada solo a travs de la macro1 desde 10 hasta
250.
Option Explicit
Public Rg As Range
Sub Macro1()
Dim x As Byte
For x = 1 To 25
Set Rg = Cells(x, 1)
Call Macro2
Next x
End Sub
Sub Macro2()
Static x As Byte
x=x+5
Rg.Select
Rg = x
End Sub
Si una vez ejecutada la macro1, 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
Page 14 of 106
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.
Constantes
Por lo general las variables hacen referencia a valores que acostumbran a
cambiar tal
que, por ej:
Sub Macro()
Dim Rng As Range
Dim x As Byte
For x = 1 To 25
Set Rng = Cells(x, 1)
Rng.Select
Rng = x
Next x
End Sub
Pero a veces queremos que una variable no cambie, es decir que siempre
haga
referencia al mismo valor, ejemplo: mi nombre, la capital de Francia etc.
Lgicamente
carece de sentido declarar variables como constante si stas no son
pblicas.
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
Page 15 of 106
Const autorLibro As String = "ExceLuciones"
En la 1 lnea hemos definido una variable como nPaises as byte y su
valor sera
siempre 53.
La 2 lnea de cdigo declara dos variables como constantes pero no
especifica si son
as double o as, con lo cual se consideraran as variant.
La 3 linea de cdigo declara autorLibro como una constante de tipo
string y le da el
valor Exceluciones.
Conversin
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:
Funcin
Tipo devuelto
Intervalo del argumento
expresin
CBool
Boolean
Cualquier expresin de cadena o
numrica vlida.
CByte
Byte
0 a 255
CCur
Currency
-922.337.203.685.477,5808 a
922.337.203.685.477,5807.
CDate
Date
Cualquier expresin de fecha
CDbl
Double
-1.79769313486231E308 a
-4,94065645841247E-324 para
valores negativos;
4,94065645841247E-324 a
1,79769313486232E308 para
valores positivos.
Cdec
decimal
+/-79.228.162.514.264.337.593.5
43.950.335 para nmeros basados
en cero, es decir, nmeros sin
decimales. Para nmeros con 28
decimales, el intervalo es
+/-7,922816251426433759354395
0335. La menor posicin para un
nmero que no sea cero es
0,00000000000000000000000000
01.
Cint
integr
-32.768 a 32.767; las fracciones se
redondean.
Clong
Long
-2.147.483.648 a 2.147.483.647;
las fracciones se redondean.
Page 16 of 106
CSng
Single
-3,402823E38 a -1,401298E-45
para valores negativos;
1,401298E-45 a 3,402823E38 para
valores positivos.
Cstr
String
El mismo intervalo que Double para
valores numricos. El mismo
intervalo que String para valores no
numricos.
CVar
Variant
El valor de retorno de CStr
depende del argumento expresin.
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 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.
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
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.
Ejemplos
Recordar siempre que antes de utilizar una variable, debemos saber
como funciona:
Page 17 of 106
Las variables String siempre deben ir entre comillas:
Sub ejString()
Dim QAZ As String
QAZ = "Exceluciones"
Debug.Print QAZ
' Debug.Print es 1 comodn que solemos utilizar para ver lo que sucede a traves
de la ventana
inmediata de VBA
MsgBox QAZ
End Sub
Salvo cuando hacen referencia a 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
Pero en este caso si ActiveCell.Value=255, QAZ hara referencia a 255
como si de un
nombre se tratara y no como si de una cifra.
Para utilizar este valor 255 guardado como QAZ deberamos previamente
convertirlo
a alguna variable que permita la 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 celda A1, en la ventana inmediata y en un
mensaje tal
que:
Sub ejString()
Dim QAZ As String
QAZ = ActiveCell.Value
Dim WSX As String
WSX = "Exceluciones"
Dim EDC As String
Debug.Print QAZ & WSX
MsgBox QAZ & WSX
EDC = QAZ & WSX
[A1] = EDC
Page 18 of 106
End Sub
La fechas se pueden guardar como string pero no pueden ser utilizads en
operaciones
como fechas salvo que las convertamos a Date:
Sub EjByte()
Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub
Sub EjInteger()
Dim X As Integer, Y As Integer
For X = 1 To 1000
Y = Y + 20
Cells(X, 1) = X + Y
Next X
End Sub
Sub EjLong()
Dim X As Integer, Y As Long
' de haber definido Y as Integer
' obtendramos un desbordamiento
For X = 1 To 2000
Y = Y + 20
Cells(X, 1) = X + Y
Next X
End Sub
Libros
Mediante macros VBA podemos manipular de distintas formas tanto libros
Excel como
archivos con otras extensiones. En este captulo veremos como hacerlo.
Abrir libros
Para abrir un libro excel utilizamos la instruccin Open. Si queremos
abrir un libro
determinado podemos utilizar la siguiente macro:
Sub AbrirLibro()
Dim Nombre As String
Nombre = "C:\MiLibro.xls"
' Si no se encuentra el libro hacemos que salga un mensaje de aviso
If Dir(Nombre) = "" Then
MsgBox Nombre & " no se encuentra"
Else
Workbooks.Open FileName:=Nombre, updateLinks:=False
End If
End Sub
Page 19 of 106
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",
WriteResPassword:="qaz")
End Sub
Para abrir un libro cuando tiene vnculos deberamos especificar si
queremos
actualizar los vnculos o no, tal como se ve a continuacin:
Sub Abrir()
Application.EnableEvents = True
Workbooks.Open Filename:="c:\Directorio\MiLibro.xls", UpdateLinks:=False
End Sub
Para obtener informacin de un libro:
Sub Informacion ()
ActiveWorkbook.Name
' Obtendramos su nombre, por ej. Libro4.xls
ActiveWorkbook.Path
' Obtendramos la ruta del libro activo, por ej.
C:\Windows
ActiveWorkbook.FullName
' Obtendramos ruta+nombre, por ej.
C:\Windows\Libro4.xls
End Sub
Para abrir todos los libros de un directorio:
Sub AbrirLibros()
Dim X As Long
Dim Libro As Workbook
Dim Directory As String
Directory = ActiveWorkbook.Path
On Error Resume Next
Application.EnableEvents = False ' Para evitar macros de evento en los libros
abiertos
With Application.FileSearch
.NewSearch
.LookIn = Directory
.Filename = "*.Xls" ' si solo 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
Cerrar libros
Page 20 of 106
Para cerrar un libro utilizamos la instruccin Close:
Sub Cerrar()
ActiveWorkbook.Close
End Sub
Si queremos cerrarlo sin que nos pregunte si queremos guardar los
posibles
cambios realizados, debemos indicar que no queremos que se muestren
los mensajes
de alerta:
Sub Cerrar()
Application.DisplayAlerts = False
ActiveWorkbook.Close
End Sub
Para cerrar todos los libros abiertos sin que nos pregunte si queremos
guardar los
posibles cambios registrados en cada libro si los hubiese:
Sub Cerrar()
Application.DisplayAlerts = False
Application.Workbooks.Close
End Sub
Y dejando que nos pregunte:
Sub Cerrar()
Application.Workbooks.Close
End Sub
Con lo cual si 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...?
Si quisieramos cerrar Excel:
Sub CierraExcel()
Application.Quit
End Sub
Guardar libros
Para guardar un libro utilizamos la instruccin SaveAs. Si queremos
guardarlo con
un nombre que figura en una celda (por ej. si en la celda A1 est el
nombre "QAZ"):
Sub Macro()
On Error Resume Next
' Ponemos On Error Resume Next, para evitar el error derivado de una celda vaca
y/o con un
caracter con el que excel no permite guardar un libro
ActiveWorkbook.SaveAs [A1].Value
Page 21 of 106
' 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 del alfabeto son vlidos para guardar un libro, por
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 guardarlo en diferentes formatos. Por
defecto cuando
guardamos un libro y no especificamos su extensin Excel lo hace como
un .XLS, es
decir un libro de Excel. Pero tambin podramos especificar el formato
como si de otra
propiedad se tratara:
Sub Macro()
Dim Carpeta As String
On Error Resume Next
Carpeta = "F:\"
ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlTemplate
' Lo 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
created with Help to RTF file format converter
Page 22 of 106
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 ()
' Se elimina el archivo.
Kill "PRUEBA"
' Se eliminan todos los archivos *.TXT del directorio actual
Kill "*.TXT"
End Sub
Para eliminar el libro activo, en caso de que estuviera abierto, primero
deberiamos
cerrarlo, tal que:
Sub Eliminar()
Dim strFile As String
strFile = ActiveWorkbook.FullName
ActiveWorkbook.Close SaveChanges:=False
Kill strFile
End Sub
o bien:
Kill "C:\Hola.xls"
o bien:
Sub BorrarLibros()
Dim X As Long
Dim Libro As Workbook
Dim Directory As String
Directory = ActiveWorkbook.Path
On Error Resume Next
Application.EnableEvents = False ' Para avitar macros de evento en los libros
abiertos
With Application.FileSearch
.NewSearch
.LookIn = Directory
.Filename = "*.Xls" 'si solo 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)
Page 23 of 106
Next X
End With
Application.EnableEvents = True ' Para volverlo a su estado natural
End Sub
Crear libros
Para crear 1 nuevo libro utilizamos la instruccin Add, por ejemplo:
Sub NuevoLibro()
Workbooks.Add
End Sub
Si quisiramos crear 2 nuevos libros:
Sub NuevoLibro()
Workbooks.Add
Workbooks.Add
End Sub
Abrir un libro en blanco o crear un libro es lo mismo, pero 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
Page 24 of 106
'QAZ9
'QAZ10
'QAZ11
End Sub
Imprimir libros
Para imprimir libros u hojas utilizamos la instruccin PrintOut, por
ejemplo:
Sub Imprimir ()
' Imprime el libro activo
ActiveWorkbook.Printout
End Sub
Si queremos imprimir un libro y hoja determinada:
Sub Imprimir ()
' Imprime el libro y hoja indicados
Workbooks("MiLibro.Xls").Sheets("Hoja1").Printout
End Sub
Calcular libros
Los clculos se realizan con la instruccin Calculate. Las distintas formas
de realizar
clculos con macros son:
Para realizar todos los clculos que tengan que realizarse en el libro:
Sub CalculaTodo()
Calculate
End Sub
Calcular hoja: calcula la hoja de clculo activa, as como los grficos y
las hojas de
grfico vinculados a esta hoja de clculo:
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
Page 25 of 106
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
Manual: slo calcula los libros abiertos cuando se presiona la tecla F9
Sub CalculoAutomatico ()
Application.Calculation = xlManual
End Sub
Listar libros
Para listar libros con extensin *.* de un directorio (o con otra extensin)
de un
Page 26 of 106
directorio y los subdirectorios, podemos utilizar la siguiente macro:
Sub AbrirLibros()
Dim X As Long
Dim Libro As Workbook
Dim Directory As String
Directory = ActiveWorkbook.Path
On Error Resume Next
Application.EnableEvents = False ' Para evitar macros de evento en los libros
abiertos
With Application.FileSearch
.NewSearch
.LookIn = Directory
.Filename = "*.Xls" ' si solo 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
Hojas
Mediante macros VBA podemos manipular de distintas formas las hojas
de los libros
Excel. En este captulo veremos como hacerlo.
Agregar
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 AgregarHoja()
ActiveWorkbook.Worksheets.Add
End Sub
Otra forma de hacerlo es:
Sub AgregarHoja()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add
End Sub
Utilizando los cdigos anteriores la nueva hoja creada se colocar justo
delante de la
hoja activa de nuestro libro activo.
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:
Page 27 of 106
agregando
una instruccin On Error al comienzo de la macro:
Sub Agregar()
Page 28 of 106
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.
Si quisiramos crear 5 nuevas hojas antes que la 3 hoja en un libro
que contiene 7
hojas:
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(before:=Sheets(3), Count:=10)
End Sub
y si esta 3 hoja se llamara "Ventas":
Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(before:=Sheets("Ventas"), Count:=10)
End Sub
Seleccionar hojas
Dentro de los libros de excel, podemos encontrar hojas y 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
Page 29 of 106
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
.Select
End With
End Sub
Para selecionar todas las hojas de un libro utilizaremos la siguiente
instruccion:
Sub SeleccionarTodas()
Activeworkbook.Sheets.Select
End Sub
La 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
Page 30 of 106
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):
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.
created with Help to RTF file format converter
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,
Page 31 of 106
Select o Activate es lo mismo (es decir seleccionar o activar da igual), tal
como se ve
en el siguiente ejemplo:
Sub SeleccionarHoja()
'en este caso da igual selecionar que activar
'Selecciona la primera hoja del libro
Sheets(1).Select
'activa la 3 hoja del libro
Sheets(3).Activate
End Sub
Para seleccionar una hoja debemos tener en cuenta si est oculta o no,
pues de lo
contrario no podemos selecionarla, por ej:
With ActiveWorkbook.Sheets(1)
.Visible = True
.Select
End With
Para selecionar todas las hojas de un libro utilizaremos la siguiente
instruccion:
Sub SeleccionarTodas
activeworkbook.Sheets.select
End Sub
La 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.
Mover hojas
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.
La sintaxis de esta intruccin es:
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.
Page 32 of 106
End Sub
En el caso anterior movemos la Hoja1 a la derecha de la Hoja3
(asumiendo que esas
hojas se llaman as). Conviene recordar que si la hoja se llama Hoja3 no
significa que
su 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
La siguiente macro realizara la misma funcin en un libro con 3 hojas:
Sub moverHoja()
Dim Hoja As Worksheet
Set Hoja = Sheets(2)
Hoja.Move before:=Sheets(1)
Set Hoja = Sheets(1)
Hoja.Move after:=Sheets(Sheets.Count)
End Sub
La siguiente macro contiene 2 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:
Sub moverHoja()
Dim Hoja As Worksheet
Set Hoja = Sheets("Hoja1")
Hoja.Move before:=Sheets(1)
Set Hoja = Sheets(1)
Hoja.Move after:=Sheets(Sheets.Count)
End Sub
Borrar hojas
Cuando se elimina una hoja o un libro, excel siempre nos pide
confirmacin, del
mismo modo que cuando eliminamos cualquier otro fichero.
Page 33 of 106
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
Copiar hojas
Para copiar hojas utilizamos la instruccin Copy cuya sintaxis es:
expresin.Copy(Before, After)
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.
After Variant (opcional): la hoja de clculo despus de la cual se copiar
sta. No se
puede especificar After si se especifica Before.
Page 34 of 106
Worksheets("Hoja1").Copy after:=Worksheets("Hoja3")
End Sub
Veamos otro ejemplo de cmo copiar una hoja:
Sub copiarHoja()
Dim Hoja As Worksheet
Set Hoja = ActiveSheet
Hoja.Copy before:=Sheets(1)
Set Hoja = Sheets(1)
Hoja.Copy after:=Sheets(Sheets.Count)
End Sub
Page 35 of 106
Sheets(2).Visible = True
Sheets("ventas").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
Nombrar
Para renombrar una hoja utilizamos la instruccin Name, tal como se ve
a
continuacin:
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".
Page 36 of 106
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.
Sub Proteger()
Dim Sht As Worksheet
For Each Sht In ThisWorkbook.Sheets 'If TypeName(Sht) = "worksheet"
With Sht
If TypeName(Sht) = "Worksheet" Then
Page 37 of 106
.Protect Password:="hola"
End If
End With
Next Sht
End Sub
Ahora bien, existen gran cantidad de datos y elementos dentro de las
hojas que
queremos proteger (y otra gran cantidad que no queremos proteger).
Todas ellas
figuran en la lista del men Excel Herramientas > Proteger > Proteger
hoja.
La siguiente macro explica como proteger todo (podemos cambiar True
por False en
caso de no querer aplicar la proteccin a algn elemento en particular):
Sub ProtegerTodo()
With ActiveSheet
.Protect DrawingObjects:=True
' Protegemos objetos
.Protect Contents:=True
' Protegemos contenidos
.Protect Scenarios:=True
' Protegemos escenarios
.Protect AllowFormattingCells:=True
' Protegemos formato de celdas
.Protect AllowFormattingColumns:=True
' Protegemos formato de columnas
.Protect AllowFormattingRows:=True
' Protegemos formato de filas
.Protect AllowInsertingColumns:=True
' Protegemos la posibilidad que se inserten columnas
.Protect AllowInsertingRows:=True
' Protegemos la posibilidad que se inserten filas
.Protect AllowInsertingHyperlinks:=True
' Protegemos la posibilidad que se inserten hipervcnulos
.Protect AllowDeletingColumns:=True
' Protegemos la posibilidad que se borren columnas
.Protect AllowDeletingRows:=True
' Protegemos la posibilidad que se borren filas
.Protect AllowSorting:=True
' Protegemos la posibilidad que se utilice la opcin de Ordenar
.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"
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.
No obstante conviene entender que hay propiedades que al ser aplicadas
impiden que
Page 38 of 106
otras que no han sido aplicadas puedan ser utilizadas (en este sentido es
como si yo
te dejara ver un partido en el estadio de ftbol del Real Madrid, pero te
impidiera estar
en Madrid). Lgicamente no podras llegar a ver el partido, pues una de
las
restricciones impide otro de los permisos. Lo mismo ocurre en Excel, por
lo que
debemos tener cuidado y recordar esto.
Imprimir hojas
Para imprimir la hoja actual hacemos la instruccin PrintOut, tal que:
Sub ImprimeHoja ()
ActiveSheet.PrintOut
End Sub
Si adems deseamos fijar previamente un rango de impresin hacemos:
Sub ImprimeRango ()
ActiveSheet.PageSetup.PrintArea = Range("$A$1:$C$10").Address
ActiveSheet.PrintOut
End Sub
En la macro anterior, cuando queremos imprimir un rango, es necesario
agregar la
Page 39 of 106
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):
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim Sht As Worksheet
For Each Sht In ThisWorkbook.Sheets
With Sht.PageSetup
.LeftHeader = "Reporte Trimestral" ' O cualquier otro mensaje...
End With
Next Sht
End Sub
created with Help to RTF file format converter
Color de etiquetas
Es posible cambiar el color de las etiquetas (las que figuran en la parte
inferior y
muestran el nombre de la hoja). La etiqueta es el objeto Tag y con su
propiedad
ColorIndex podemos cambiar su color. Esto solo se puede hacer en Excel
2.002 o
superior (en versiones anteriores de Excel NO es posible cambiar el color
de etiquetas
de hojas).
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
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.
Ordenar hojas
Page 40 of 106
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
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.
Otras maneras de ordenar podran ser:
Sub OrdenarAscendentemente()
Dim X As Long, Y As Long
For X = 1 To Worksheets.Count
Y=X
Do While Y > 1
If Worksheets(Y).Name < Worksheets(Y - 1).Name Then
Worksheets(Y).Move Before:=Worksheets(Y - 1)
End If
Y=Y-1
Loop
Next
End Sub
Sub OrdenarDescendentemente()
Dim X As Long, Y As Long
For X = 1 To Worksheets.Count
Y=X
Page 41 of 106
Do While Y > 1
If Worksheets(Y).Name > Worksheets(Y - 1).Name Then
Worksheets(Y).Move Before:=Worksheets(Y - 1)
End If
Y=Y-1
Loop
Next
End Sub
Rangos
Mediante macros VBA podemos manipular de distintas formas los rangos
y celdas de
las hojas Excel. En este captulo veremos como hacerlo.
Seleccin de celdas
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
' Finalmente podemos seleccionar de esta otra forma
' El primer N equivale a fila y el segundo a columna.
Sub Seleccionar ()
Cells(4, 3).Select
End Sub
En los 3 casos anteriores se selecciona la celda C4. En el primer caso
utilizamos el
Page 42 of 106
objeto Range y en el tercer caso el objeto Cells.
Tambin podemos seleccionar determinadas celdas (con datos, con
frmulas, etc).
En la siguiente macro iremos seleccionando distintos tipos de celdas:
Sub Seleccionando ()
On Error Resume Next
' Colocamos On Error Resume Next
' para evitar el error re compilacin derivado de no poder selecionar un rango que
no existe
' por ej., si la hoja activa no tuviera comentarios, no podramos selecionarla con el
cdigo
' Para seleccionar todas la celdas que contienen comentarios.
Cells.SpecialCells(xlCellTypeComments).Select
'Para seleccionar todas la celdas cuyo valor es una constante.
Cells.SpecialCells(xlCellTypeConstants, 23).Select
' Para seleccionar todas la celdas que contienen frmulas.
Cells.SpecialCells(xlCellTypeFormulas, 23).Select
' Para seleccionar todas la celdas vacas, dentro de la regin usada.
Cells.SpecialCells(xlCellTypeBlanks).Select
' Para seleccionar todas la celdas visibles en nuestra hoja.
Cells.SpecialCells(xlCellTypeVisible).Select
End Sub
Conviene deducir que si quisiramos seleccionar las celdas que
contienen
comentarios en un rango concreto y no en toda la hoja deberamos
utilizar:
Sub Seleccion ()
On Error Resume Next
' Mtodo 1
Range("A1:G10").SpecialCells(xlCellTypeComments).Select
' Mtodo 2
[A1:G10].SpecialCells(xlCellTypeComments).Select
' Mtodo 3
Range(cells(1,1),cells(10,7)).SpecialCells(xlCellTypeComments).Select
End Sub
Para seleccionar hasta la ltima celda no vaca:
Sub Seleccion ()
On Error Resume Next ' Es un buen hbito utilizar comodines como este
' aunque si lo mantenemos activo resultara difcil saber donde podra estar el
problema
' Selecciona desde la celda actual hasta la ltima celda no vaca hacia la derecha.
Page 43 of 106
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 la ltima celda no vaca hacia la izquierda.
Selection.End(xlToLeft).Select
' Selecciona desde la celda actual hasta la ltima celda no vaca hacia arriba.
Selection.End(xlUp).Select
End Sub
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).
La sintaxis es: Origen.Offset.(filas, columnas).select.
Las filas y nmeros se indican como nmeros. Si estos son positivos el
desplazamiento es hacia abajo - derecha respectivamente. Si son
negativos el
desplazamiento es hacia arriba - izquierda respectivamente.
Veamos los siguiente ejemplos para entender mejor la seleccin con
Offset:
Sub Selecciona ()
On Error Resume Next
' Selecciona desde la celda actual hasta una celda (fila) hacia abajo.
Selection.Offset(1, 0).Select
' La 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
' Hace lo mismo que la anterior. Poner 0 u omitirlo es lo mismo.
Selection.Offset(1).Select
' Selecciona desde la celda actual, + una celda hacia abajo + una celda hacia la
derecha.
Selection.Offset(1, 1).Select
'Selecciona una columna y/o celda hacia la derecha desde la celda [A1]
[A1].Offset(0, 1).Select
' Selecciona desde la celda actual hasta la misma celda selecionada, sin cambio
alguno.
Selection.Offset().Select
' Desde B1 selecciona una celda hacia arriba y otra a la izquierda
[B2].Offset(-1, -1).Select
' Recuerda que al poner un signo negativo el movimiento cambia de 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
Page 44 of 106
' 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 una celda hacia la izquierda (si fuera
posible)
Selection.Offset(-1).Select
'Selecciona desde la celda actual hasta una celda hacia la arriba (si fuera posible)
Selection.Offset(, -1).Select
' Desde la celda actual, seleciona todo el cuadrante de celdas contiguas.
Selection.CurrentRegion.Select
' Selecciona el cuadrante de celdas selecionadas en bloque una celda ms hacia
la derecha y
abajo.
Selection.CurrentRegion.Offset(1, 1).Select
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.
Luego iramos hasta la ltima celda no vaca hacia la derecha desde esta
nueva
posicin. Finalmente de nuevo hacia abajo desde esta nueva posicin.
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
Estos 3 lneas de cdigo selecionan el mismo rango de celdas:
Sub Seleccionar ()
Range("A1:E5").Select
[A1:E5].Select
Page 45 of 106
Range(Cells(1, 1), Cells(5, 5)).Select
End Sub
Seleccin de rangos
Veamos ahora distintas formas equivalentes de seleccionar un rango:
' Mtodo clsico para seleccionar el rango de celdas B6:B10
Sub Seleccionar ()
Range("B6:B10").Select
End Sub
Sub Seleccionar ()
'Otro mtodo para seleccionar el rango de celdas B6:B10
[B6:B10].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:
' Selecciona la regin actual
Sub Seleccionar ()
Selection.CurrentRegion.Select
End Sub
Con la macro anterior se seleciona el cuadrante, rectngulo y/o cuadrado
de celdas
adyacentes a nuestra celda activa. El rectngulo queda definido por las
celdas con
informacin.
Tambin podramos modificar la macro anterior para que seleccione la
regin actual
desde una celda determinada, por ejemplo:
' Selecciona el rectngulo adyacente a C2.
Page 46 of 106
Sub Seleccionar ()
[C2].CurrentRegion.Select
End Sub
o tambin podemos hacer:
' Selecciona el rectngulo adyacente a C2.
Sub Seleccionar ()
Range("C2").CurrentRegion.Select
End Sub
Seleccin de filas
Para seleccionar filas podemos utilizar la instruccin Rows, tal como
vemos en las
siguientes macros:
' Seleccionar la Fila 1.
Sub SeleccionaFila ()
Rows("1:1").Select
End Sub
' Selecciona la fila 4.
Sub SeleccionaFila ()
Rows("4:4").Select
End Sub
' Selecciona desde la fila 4 hasta la 11, ambas inclusive
Sub SeleccionaFilas ()
Rows("4:11").Select
End Sub
' Selecciona las siguientes filas a la vez: 4,8,15 y 22.
Sub SeleccionaFilas ()
Range("4:4,8:8,15:15,22:22").Select
End Sub
Seleccin de columnas
Para seleccionar columnas podemos utilizar la instruccin Columns, tal
como vemos
en las siguientes macros:
Sub SeleccionaColumna ()
' Selecciona la Columna B
Columns("B:B").Select
' Selecciona la Columna H
Columns("H:H").Select
Page 47 of 106
' Selecciona des de la Columna C hasta la F
Columns("C:F").Select
' Selecciona las siguientes Columnas: A,C,E,G, I y K.
Range("A:A,C:C,E:E,G:G,I:K").Select
End Sub
Otras selecciones
Para seleccionar todas las celdas que contengan cierto color:
Sub SeleccionarPorColor()
On Error Resume Next
Dim Columna As Single, Fila As Long
Dim Rg As Range, miRango As Range, RgColores As Range
' Vamos a selecionar todas las celdas del UsedRange que contengan el mismo
color que la celda
activa
' Utilizamos el rango de las celdas usadas (el rango que excel debe analizar), pues
de lo contrario
' la macro tardara mucho al tener que analizar 65536 filas y 256 columnas es decir,
16 millones
de celdas !
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
End With
Set RgColores = ActiveCell
For Each Rg In miRango
If Rg.Interior.ColorIndex = ActiveCell.Interior.ColorIndex Then
Set RgColores = Union(RgColores, Rg)
End If
Next Rg
RgColores.Select
End Sub
Para seleccionar todas las celdas que contengan cierto Valor:
Sub SeleccionarPorValor()
On Error Resume Next
Dim Columna As Single, Fila As Long, X as Long
Dim Rg As Range, miRango As Range, RgValores As Range
'vamos a selecionar todas las celdas del UsedRange que contengan el valor que
introduzcamos:
Dim MiValor As String
MiValor = InputBox("Introduce el valor que deseas selecionar!", "Por Favor:")
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
End With
Page 48 of 106
For Each Rg In miRango
If LCase(Rg.Value) = LCase(MiValor) Then
If X = 0 Then
X = 1: Set RgValores = Rg
Else
Set RgValores = Union(RgValores, Rg)
End If
End If
Next Rg
RgValores.Select
End Sub
Para seleccionar todas las celdas que contengan Valores no duplicados
en el rango
utilizado:
Sub SeleccionarValoresUnicos()
On Error Resume Next
Dim Columna As Single, Fila As Long, X As Long
Dim Rg As Range, miRango As Range, RgValores As Range
'vamos a selecionar todas las celdas del UsedRange que contengan el valor que
introduzcamos:
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
End With
For Each Rg In miRango
If Application.CountIf(miRango, Rg.Value) = 1 Then
If X = 0 Then
X = 1: Set RgValores = Rg
Else
Set RgValores = Union(RgValores, Rg)
End If
End If
Next Rg
RgValores.Select
End Sub
Para seleccionar todas las celdas que contengan Valores no duplicados
en
UsedRange:
Sub SeleccionarValoresdUPLICADOS()
On Error Resume Next
Dim Columna As Single, Fila As Long, X As Long
Dim Rg As Range, miRango As Range, RgValores As Range
'vamos a seleccionar todas las celdas del UsedRange que contengan el valor que
introduzcamos:
With ActiveSheet
Page 49 of 106
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 nfima cantidad de estas filas y columnas.
Para saber el rango de celdas que utilizamos basta con utilizar el
siguiente cdigo:
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
' Selecionara la celda D5
Cells(R, C).Select
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
Page 50 of 106
' 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 ()
' Definimos las variables
Dim R As Long, C As Single
With [A1].SpecialCells(xlCellTypeLastCell)
R = .Row
C = .Column
End With
Cells(R, C).Select
End Sub
' 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
' Mtodo 4
Sub Seleccionar ()
With Selection.CurrentRegion
.Cells(.Cells.Count).Select
End With
End Sub
Insertar rangos
Como es lgico de suponer, existen numerosas maneras de insertar
rangos, para lo
cual utilizamos la instruccin Insert:
Sub Insertar ()
' Inserta una nueva fila sobre la fila 1.
Rows(1).Insert
' Inserta una nueva columna a la izquierda de la columna A
Columns("A:A").Insert
Page 51 of 106
' Tambin inserta una nueva columna a la izquierda de la columna A
[A1].EntireColumn.Insert
' Inserta una nueva fila sobre la fila 1
[A1].EntireRow.Insert
End Sub
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
created with Help to RTF file format converter
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
' Borra el contenido de la celda A1, no el formato
Sub Borrar ()
Cells(1,1)..ClearContents
End Sub
Si queremos realizar el borrado de diferentes propiedades de un mismo
rango
podramos hacer:
Sub Borrar ()
With Range("A1")
.ClearComments
.ClearContents
Page 52 of 106
.ClearFormats
.ClearNotes
.Clear
End With
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
Tambin podemos realizar borrados sobre filas y columnas enteras:
Sub Borrar ()
On Error Resume Next
' Borra toda informacion de la Fila 1.
Rows(1).Clear
' Borra el formato de la Columna A.
Columns("A:A").ClearFormats
' Borra toda informacin, formato, etc, de la columna A
[A1].EntireColumn.Clear
' Borra los comentarios de la Fila 1.
[A1].EntireRow.ClearComments
' Borra toda informacin de las 5 primeras Filas.
Rows("1:5").Clear
' Borra toda informacin de las Filas 10 a 15 inclusives
Rows("10:15").Clear
' Borra toda la informacin del rango actual utilizado, comenzando desde A1
Rango("A1").CurrentRegion.Clear
End Sub
Page 53 of 106
' Copia la celda C4
Range("C4").Copy
' Copia la celda C4, esta es otra terminologa tambin vlida.
[C4].Copy
' Copia la celda C2 (la primera posicin equivale a fila y la segunda a columna).
Cells(2, 4).Copy
' Copia el rango de celdas B6:B10
Range("B6:B10").Copy
' Copia el rango de celdas B12:B22, esta es otra terminologa tambin vlida.
[B12:B22].Copy
' Copia el cuadrante, rectngulo y/o cuadrado de celdas adyacentes a nuestra
celda. El
rectngulo queda definido por las celdas con informacin.
Selection.CurrentRegion.Copy
' Copia el cuadrante, rectngulo y/o cuadrado de celdas comenzando en C2 y en
direccin
derecha-inferior. 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
derecha-inferior. El rectngulo queda definido por las celdas con informacin.
Range("C4").CurrentRegion.Copy
' Copia la Fila 1.
Rows("1:1").Copy
' Copia la fila 4.
Rows("4:4").Copy
' Copia desde la fila 4 hasta la 11 ambas inclusive.
Rows("4:11").Copy
' Copia las siguientes filas a la vez: 4,5,15 y 22.
Range("4:4,8:8,15:15,22:22").Copy
' Copia la Columna B
Columns("B:B").Copy
' Copia desde la Columna C hasta la F, ambas inclusive
Columns("C:F").Copy
' Copia las siguientes Columnas: A,C,E,G y I-K.
Range("A:A,C:C,E:E,G:G,I:K").Copy
Para realizar el pegado de los rangos copiados utilizamos las siguientes
macros:
' Copia todo contenido de la celda A1 y lo pega en la celda B1
Range("A1").Copy Range("B1")
' Aqu realizamos lo mismo solo que de otra manera, especificando donde
queremos que la
Page 54 of 106
informacin sea pegada mediante la utilizacion de propiedades
Range("B1").Copy Destination:=Range("C1")
A la hora de pegar podemos elegir que es lo que queremos pegar:
valores,
formatos, todo, etc. La opcin ms utilizada es xlPasteValues, que solo
pega los
valores. La lista de las cosas que podemos pegar es:
Valores con formatos: xlPasteValuesAndNumberFormats
Valores: xlPasteValues
Validacin xlPasteValidation
Frmulas y nmeros: xlPasteFormulasAndNumberFormats
Frmulas: xlPasteFormulas
Formatos: xlPasteFormats
Comentarios: xlPasteComments
Ancho de columna: xlPasteColumnWidths
Todo excepto bordes: xlPasteAllExceptBorders
Todo: xlPasteAll
Veamos ejemplos sobre como pegar distintas cosas:
Sub Copiar()
' Copia la celda A1 y la pega en B1
Range("A1").Copy
Range("B1")
' Copia la celda A1 y la pega en B1 (podemos escribirlo en la misma lnea)
Range("A1").Copy Range("B1")
' Misma operacin, copia la celda A1 y la pega en B1
Range("A1").Copy
Cells(1, 2).PasteSpecial(xlPasteAll)
' Copia la celda A1 pero solo pega el valor en B1, no el formato
Range("A1").Copy
[B1].PasteSpecial(xlPasteValues)
' Copia la celda A1 y pega solo la frmula en B1, ni el valor ni el formato
Range("A1").Copy
Range("A1").Offset(, 1).PasteSpecial(xlPasteFormulas)
' Cuando copiamos algo se ve que Excel deja un rastro sobre lo copiado. Para
quitarlo utilizamos:
Application.CutCopyMode=false
End Sub
Page 55 of 106
Nombrar rangos
Existen varias maneras de nombrar un rango. Cuando hacemos esto
desde Excel, sin
macros, primero seleccionamos el rango que queremos nombrar y una
vez
selecionado debemos ir al men Insertar > Nombre > Definir. Luego
escribimos el
nombre que querramos y aceptamos (de tal manera que podremos
refererirnos a ese
rango con el nombre que le hayamos dado).
Otra forma de nombrar un rango es seleccionndolo y luego encima de la
columna A,
existe un espacio que nos da 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
Ventas.
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 de una Tabla Dinmica. En lugar de tener
que cambiar
el rango utilizado en la TD, cada vez que aadimos un nuevo 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
Combinar rangos
Para combinar celdas utilizamos la instruccin MergeCells. Solo podemos
combinar
Page 56 of 106
Sub Combinar ()
Application.DisplayAlerts = False
Range("B4:D4").MergeCells = True
End Sub
Conviene recordar que si combinamos desde una macro, y las celdas
que queremos
combinar no estan 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
Page 57 of 106
Columns("B:B").EntireColumn.Hidden = True
' Ocultar las columnas contiguas D,E,F y G selecionndolas primero
Columns("D:G").Select
Selection.EntireColumn.Hidden = True
' Ocultar varias columnas discontnuas, sin necesidad de selecionarlas
Range("I:K,M:O,Q:Q,S:S").EntireColumn.Hidden = True
End Sub
Si luego queremos volver a mostrar la columna oculta, simplemente
cambiamos el
True por False.
Transponer 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.
Dicho de otra forma es una manera particular de pegar los datos
copiados
previamente con lo cual:
Sub Seleccion ()
Page 58 of 106
' Convertir fila en columna
Range("A1:A15").Copy
Range("D4").PasteSpecial Paste:=xlPasteAll, Transpose:=True
' Convertir columna en fila
Range("A1:B10").Copy
Range("D4").PasteSpecial Paste:=xlPasteAll, Transpose:=True
End Sub
Ordenar rangos
La ventaja de ordenar rangos desde macros es que podemos ordenar
siguiendo ms
de 3 criterios, que es el mximo que permite Excel si lo hacemos desde el
men Datos
> Ordenar.
Cuando ordenamos podemos aplicar muchas propiedades, como ser:
OrderCustom,
MatchCase, Orientation, DataOption,Order, etc. Sin embargo podemos reducir
las
mismas y no es necesario utilizarlas todas. Para ordenar utilizamos la
instruccin
Sort.
Para ordenar el rango utilizado, por los campos de columnas G, F, A, B
y C hacemos:
Sub Ordenar ()
With [A1].CurrentRegion
' [A1].CurrentRegion 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:
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, _
Page 59 of 106
Key3:=.Cells(3), Order3:=xlAscending, _
Header:=xlGuess
End With
End Sub
Borrar rangos
Imprimir rangos
Para definir el rango a imprimir utilizamos la instruccin PrintArea. Es
conveniente
que definamos y guardemos el rango a imprimir:
Sub DefinirRango()
ActiveSheet.PageSetup.PrintArea = "$A$1:$G$22"
End Sub
En el caso anterior si presionramos sobre el botn Imprimir se imprimira
el rango
A1:G22.
Page 60 of 106
Tambin podramos imprimir automticamente desde una macro tal que:
Sub ImprimeHoja ()
ActiveSheet.PrintOut
End Sub
Page 61 of 106
End Sub
El mtodo anterior es bastante ms rpido que el primero, pero todava
no es el
ptimo.
Tercer mtodo para borrar filas vacas
Sub BorrarFilasVacias3()
Dim FilaBorrable As Range
Dim R As Single
' Para aumentar la velocidad de ejecucin
Application.ScreenUpdating = False
' insertamos una nueva fila para despus aplicar un criterio de bsqueda y borrar
los valores
obtenidos de esta bsqueda
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:
Sub Desocultar()
With Cells
.EntireColumn.Hidden = False
.EntireRow.Hidden = False
End With
End Sub
Restringir movimiento
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:
' Limitamos el movimiento al rango A1:G15 de la Hoja1
Sub LimitarMov()
ActiveWorkbook.Worksheets("Hoja1").ScrollArea = "A1:G15"
End Sub
' Eliminamos la limitacin anterior
Sub QuitarLimitacion()
ActiveWorkbook.Worksheets("Sheet1").ScrollArea = ""
End Sub
Page 62 of 106
Scroll Bars
Cada hoja Excel tiene una barra vertical y horizontal que al moverla nos
permite
desplazarnos por la hoja hacia abajo o hacia la derecha respectivamente.
Estas barras
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:
Private Sub Worksheet_Activate()
' Movemos el ScrollBar vertical a la fila 1
ActiveWindow.ScrollRow = 1
' Movemos el ScrollBar horizontal a la columna 1
ActiveWindow.ScrollColumn = 1
Range("A1").Select
End Sub
Arrays
Los Arrays son conjuntos de elementos y son muy tiles a la hora de
manipular varios
objetos de forma simultnea. En este captulo veremos ms en detalle
como crearlos
y los diferentes tipos que existen.
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.
Definicin
Un Array es un grupo de elementos secuencialmente puestos con un
ndice, que
tienen el mismo nombre y tipo de datos intrnseco.
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
Page 63 of 106
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.
Fijos
Una array con los das de la semana (nmero fijo de elementos)
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
Page 64 of 106
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
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
Page 65 of 106
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.
Bidimensionales
Los array unidimensionales son muy frecuentes, aunque tambin se
pueden usar
arrays bidemensinales, por ej:
Dim MiArray(1 to 10, 1 to 10) as Integer
Esto sera como pensar en una matriz de 100 elementos, 10 filas x 10
columnas, con
lo cual para referirte a la segunda fila y tercera fila utilizaramos:
Debug.Print MiArray(2,3)
Lo mas comn es que siempre declaremos en principio un array como
Variant.
created with Help to RTF file format converter
Ejemplo
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
ActiveSheet
MyShapesArray = Array("IShape", "SB_H", "SB_V", "BPlay", "SB_Bombs")
' MyShapesRgArray en un array que contiene el lugar donde pondremos los
controles
Page 66 of 106
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.
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.
Preserve
La instruccin Preserve se utiliza para conservar los valores de cada
elemento, an
cuando redimensionamos el array:
Sub EjArrays()
Page 67 of 106
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
Tambin podemos asignar los valores de un rango a un array, tal que:
aaa=range("A1:A15").values
lo cual significa que es un array Bidemensional ya que aunque solo tiene
una columna
(en este caso la columna A), para referirnos a cualquier elemento de este
array
deberemos especificar no solo la fila sino tambin la columna.
Hemos asignado los valores de un rango a un array con lo que para
referirnos a lo
elementos del array deberemos hacerlo como si de un array
bidemensional se tratara,
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
Estructuras
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.
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.
Page 68 of 106
Do Loop
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:
Si la celda contiene datos coloreamos toda la fila:
Sub Colorea()
[A1].EntireRow.Select ' Comenzamos desde la fila 1
Do ' Comenzamos a evaluar
If ActiveCell.Value = "" Then Exit Do ' Si la celda activa no tiene valor salimos
de la
macro
Selection.EntireRow.Interior.ColorIndex = 15 ' Si la celda tiene valor pinta la fila
de gris
Selection.Offset(2).Select ' Nos movemos a la fila siguiente
Loop ' Comenzamos nuevamente "el rulo" desde el Do
End Sub
Podemos retocar lo anterior y poner la 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
Page 69 of 106
O bien:
Sub Colorea()
[A1].EntireRow.Select
Do Until ActiveCell.Value = ""
Selection.EntireRow.Interior.ColorIndex = 15
Selection.Offset(2).Select
Loop
End Sub
Este ltimo caso podra dar lugar a que el looping terminara antes de
empezar.
El caso es que todos estos ejemplos son prcticamente idnticos y
depende de
nosotros utilizar uno u otro, salvo en contadas ocasiones donde algunos
obviamente
no sirven. El tlimo ejemplo no valdra si quisiramos que el looping
ejecutara las
instrucciones internas al menos una vez.
For Next
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]
La sintaxis de la instruccin For...Next consta de las siguientes partes:
-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
Page 70 of 106
es decir el valor del incremento es positivo donde 1 es el Principio y 50 el
Fin, es decir
1<= 50, o bien Principio <= Fin
o bien:
For X = 50 to 1
es decir el valor del incremento es negativo donde 50 es el Principio y 1
el Fin, es decir
50 >= 1, o bien Principio >= Fin
Cuando el incremento es negativo es necesario especificar el incremento
que va a
tener lugar en el bucle mediante la palabra Step tal que:
Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones, con incremento negativo de 2
For X = 10 To 1 Step -2
Cells(X, 1) = X
Next X
End Sub
En el caso anterior X tomara los valores 10,8,6,4,2 sucesivamente.
Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones, con incremento negativo de 1
For X = 10 To 1 Step -1
Cells(X, 1) = X
Next X
End Sub
En el caso anterior X tomara los valores 10,9,8,7,6,5,4,3,2,1
sucesivamente.
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
En el ejemplo anterior realizaramos un bucle de 10 repeticiones pero si
en el
Page 71 of 106
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)
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 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
Page 72 of 106
La instruccin For Each Next repite un grupo de instrucciones para cada
elemento de
una matriz o coleccin. Su sintaxis es:
For Each elemento In grupo
[instrucciones]
[Exit For]
[instrucciones]
Next [elemento]
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
"Exceluciones"
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim Hoja As Worksheet
For Each Hoja In ThisWorkbook.Sheets
Hoja.PageSetup.LeftFooter = "Exceluciones"
Next Hoja
End Sub
' Queremos borrar todo el contenido de cada hoja antes de cerrar un libro
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Hoja As Worksheet
For Each Hoja In ThisWorkbook.Sheets
Hoja.Cells.Clear
Next Hoja
End Sub
La entrada al bloque For Each se produce si hay al menos un elemento en
grupo. Una
vez que se ha entrado en el bucle, todas las instrucciones en el bucle se
ejecutan para
el primer elemento en grupo. 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")
' Instrucciones...
Next Cell
como:
Page 73 of 106
While Wend
La instruccin While Wend ejecuta una serie de instrucciones mientras
una condicin
dada sea True, es decir verdadera, o tenga lugar. Su sintaxis es:
While condicin
[intrucciones]
Wend
Condicin (requerido): expresin numrica o expresin de cadena cuyo
valor es True
o False. Si condicin es Null, condicin se considera False.
Instrucciones (opcional): una o ms instrucciones que se ejecutan
mientras la
condicin es True.
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.
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.
Go To
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:
Page 74 of 106
GoTo lnea
El argumento lnea puede ser cualquier etiqueta de lnea o nmero de
lnea.
GoTo solamente puede saltar a lneas del procedimiento en el que
aparece.
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.
Veamos un ejemplo:
Sub Macro()
GoTo Adios
Range("A1").Font.Bold = True
Range("A1").Font.Size = 50
Range("A1").Font.ColorIndex = 3
Range("A1").Interior.ColorIndex = 5
Range("A1").Select
Adios:
End Sub
La macro anterior no realiza ninguna 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.
created with Help to RTF file format converter
Page 75 of 106
' La siguiente macro NO utiliza With
Sub Macro()
Range("A1").Font.Bold = True
Range("A1").Font.Size = 50
Range("A1").Font.ColorIndex = 3
End Sub
' Repetimos lo anterior pero con With
Sub Macro()
With Range("A1")
.Font.Bold = True
.Font.Size = 50
.Font.ColorIndex = 3
End With
End Sub
En el ejemplo anterior se ve que al utilizar el With, no es necesario volver
a repetir el
objeto Range("A1"). Todo lo que est entre With y End With se aplica al
objeto
Range("A1").
Veamos otro ejemplo algo 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()
With Range("A1")
With .Font
.Bold = True
.Size = 50
.ColorIndex = 3
End With
.interior.ColorIndex = 5
.Select
End With
End Sub
Nota: una vez que se ha entrado en un bloque With no es posible
cambiar el objeto.
Por tanto, no podemos utilizar una nica instruccin With para varios
objetos
Page 76 of 106
If Then
La instruccin If Then permite escoger entre 2 o ms posibilidades, para
decidir sobre
que es lo que queremos, entre una serie de alternativas.
La instruccin ejecuta condicionalmente un grupo de instrucciones,
dependiendo del
valor de una expresin. Su sintaxis es:
If condicin Then [instrucciones]-[Else instrucciones_else]
Tambien podemos utilizar la siguiente sintaxis en formato de bloque:
If condicin Then
[instrucciones]
[ElseIf condicin-n Then
[instrucciones_elseif] ...
[Else
[instrucciones_else]]
End If
Condicin (requerido): uno o ms de los siguientes dos tipos de
expresiones: Una
expresin numrica o expresin de 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). igual que -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 condicin o 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 cual se ejecuta la instruccin definida
para tal caso,
en este ejemplo lanzamos un mensaje, que dice: "La celda A1> 15"
Sub IF_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
End Sub
En esta otra macro si el valor de la celda es >15 se cumple con la
condicin
demandada con lo cual se ejecuta la primera opcin, en caso de que no
sea TRUE (es
decir en caso de que sea FALSE) ejecutamos la segunda instruccin, 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"
Page 77 of 106
End Sub
Tambin hubiramos podido escribir el anterior ejemplo a travs de dos
construcciones If tal que:
Sub IF_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
If [A1] < 15 Then MsgBox "La celda A1< 15"
End Sub
Si el valor de la celda A1 fuera 200, la siguiente macro lanzara dos
mensajes pues
las dos instrucciones IF... seran TRUE:
Sub IF_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
If [A1] > 15 Then MsgBox "La celda A1< 15"
End Sub
En el caso de que querramos realizar ms de una operacin si una
condicin devuelve
True, o bien si devuelve False, conviene utilizar una construccin en
bloque.
Veamos algunos ejemplos de If, escritos en bloque:
En caso de que el valor de la celda A1>15 entonces la condicion es
True, y siendo
True, lanzaramos un mensaje y 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
' 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
Page 78 of 106
"de lo contrario", "o". La instruccin ElseIf impide que el cdigo contine
verificndose
cuando una de las condiciones se a presentado como True. Veamos un
ejemplo:
Si el valor de la celda A1 fuera 500 al confirmarse como verdadera la
primera
condicin (>15) ejecutaramos las tres instrucciones tal que, (MsgBox "La
celda A1>
15"), ([A1].Interior.ColorIndex = 10), y ([A1].Font.Bold = True) y a
continuacin
acabaramos con la ejecucin de la condicin:
Sub IF_Then()
If [A1] > 15 Then
MsgBox "La celda A1> 15"
[A1].Interior.ColorIndex = 10
[A1].Font.Bold = True
ElseIf [A1] > 10 Then
[A1].Interior.ColorIndex = 10
[A1].Font.Size = 50
ElseIf [A1] > 2 Then
MsgBox "2"
End If
End Sub
En el caso anterior, si el valor de A1 fuera 3, an cuando las tres
condiciones
devolveran True por separado, solo se 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
Tardes!"
If Time >= TimeValue("20:30:00") Then MsgBox "Buenas noches!"
End Sub
on bien escrito de diferente manera:
Sub IF_Then()
If Time < TimeValue("08:30:00") Then
MsgBox "Buenos Dias!"
ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then
MsgBox
"Buenas Tardes!"
Else: MsgBox "Buenas noches!" 'cuando ninguna de las anteriores posibilidades
se cumple:
End If
End Sub
o bien:
Sub IF_Then()
If Time < TimeValue("08:30:00") Then
MsgBox "Buenos Dias!"
ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then
MsgBox "Buenas Tardes!"
Else
MsgBox "Buenas noches!"
Page 79 of 106
End If
End Sub
o bien:
Sub IF_Then()
If Time < TimeValue("08:30:00") Then MsgBox "Buenos Dias!"
ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then
MsgBox
"Buenas Tardes!"
Else: MsgBox "Buenas noches!"
End If
End Sub
o bien:
Sub IF_Then()
If Time < TimeValue("08:30:00") Then
MsgBox "Buenos Dias!"
Else
If Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then
MsgBox "Buenas Tardes!"
Else
MsgBox "Buenas noches!"
End If
End If
End Sub
Como se ve hay muchsimas maneras de escribir la misma Macro. Ahora
depende de
cada uno decidir cual se prefiere.
Select Case
La instruccin Select Case se utiliza cuando las alternativas en una
estructura de If
Then son muchas. En tal caso conviene evitar el If Then y hacer uso de
Select Case,
que permite ejecutar uno de varios grupos de instrucciones, dependiendo
del valor de
una expresin.
La sintaxis de Select Case es:
Select Case expresin_prueba
[Case lista_expresion-n
[instrucciones-n]] ...
[Case Else
[instrucciones_else]]
End Select
Veamos un ejemplo:
Sub Select_Case()
Dim Nmero As Variant
' la declaramos como Variant para evitar el error de compilacin
que
Page 80 of 106
' 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
Si expresin_prueba coincide con cualquier lista_expresin asociada con una
clusula
Case, las instrucciones que siguen a esa clusula Case se ejecutan hasta
la siguiente
clusula Case o, para la ltima clusula, hasta la instruccin End Select.
El control
pasa despus a la instruccin que sigue a End Select. Si expresin_prueba
coincide
con una expresin de lista_expresin en ms de una clusula Case, slo se
ejecutan
las instrucciones que siguen a la primera 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 ' 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.
' Nmero entre 1 y 25, inclusive.
Case 1 To 25:
Debug.Print "Entre 1 y 25"
' Nmero entre 6 y 8.
Case 10, 14, 15: Debug.Print "Bien 10, 14 o 15"
Case 15 To 18
' Nmero entre 15 y 18.
Debug.Print "'Nmero entre 15 y 18, inclusive."
Case Else
' Otros valores.
Debug.Print "Valor no comprendido en los diferentes Casos"
End Select
End Sub
La clusula Case Else se utiliza para indicar las instrucciones que se van a
ejecutar si
no se encuentran coincidencias entre expresin_prueba y una lista_expresin
en
cualquiera de las otras selecciones de Case. Aunque no es necesario, es
buena idea
tener una instruccin Case Else en el bloque Select Case para controlar
valores
imprevistos de expresin_prueba. Cuando no hay una instruccin Case Else
y ninguna
expresin de la lista en las clusulas Case coincide con la expresin de
prueba, la
ejecucin contina en la instruccin que sigue a End Select, es decir la
instruccin no
Page 81 of 106
ejecuta ninguna opcin pues no hay valor que devuelva TRUE.
Lgicamente Select Case ayuda bastante como se ve en el siguiente
ejemplo
conocido, pues ya lo hemos utilizado al explicar IF Then:
Sub Select_Case()
Select Case Time
Case Is < TimeValue("08:30:00"): MsgBox "Buenos Dias!"
Case Is >= TimeValue("20:30:00"): MsgBox "Buenas Noches!"
Case Else: MsgBox "Buenas Tardes!"
End Select
End Sub
Constuir la macro anterior con Select Case en lugar de If Then hace que
sea ms
sencilla de entender y de escribir.
En la siguiente macro nos daria igual no utilizar la opcin o comodn
Case Else ya
que sabemos que los das de la semana son 7:
Sub Select_Case()
Select Case Weekday(Now, vbMonday) ' o bien: Weekday(Now, 2)
Case 1: MsgBox "Hoy es Lunes"
Case 2: MsgBox "Hoy es Martes "
Case 3: MsgBox "Hoy es 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 Weekday puede dar como resultado 1-7 en funcin
del da por
el que querramos comenzar la semana. La semana que empieza por el
da se pone tal
que:
Weekday(Now, vbMonday)
o bien:
Weekday(Now, 2)
VBA permite realizar la misma operacin de cientos de maneras distintas,
como ya se
ha demostrado antes. De hecho la macro anterior podra simplificarse tal
que:
Sub Macro()
Dim ArrayDiaSemana
ArrayDiaSemana = Array("", "Lunes", "Martes", "Mircoles", "Jueves", "Viernes",
"Sbado",
"Domingo")
MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday))
End Sub
Page 82 of 106
En la macro anterior hemos utilizado un array que contiene los das de la
semana,
pero cuyo primer elemento esta vaco "", pues Weekday(Now,2) jams
dara 0, 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 que:
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
DoEvents
La instruccin DoEvents cede el control de la ejecucin al sistema
operativo, para que
ste pueda procesar otros eventos.
Su Sintaxis es:
DoEvents( )
La funcin DoEvents pasa el control al sistema operativo. El control no se
devuelve
hasta que el sistema operativo haya terminado de procesar los eventos
en cola y se
hayan enviado todas las teclas de la cola SendKeys.
Advertencia: siempre que demos preferencia al procesador
temporalmente dentro de
un procedimiento de evento, debemos asegurarnos que el procedimiento
no se
ejecute de nuevo desde una parte diferente del cdigo antes de que
devuelva la
primera llamada. Esto podra causar resultados impredecibles. Adems,
no debemos
utilizar la funcin DoEvents si existe la posibilidad de que otras
aplicaciones
Page 83 of 106
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target
As Range,
Cancel As Boolean)
End Sub
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target
As Range,
Cancel As Boolean)
End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
End Sub
Las macros dentro de las opciones anteriores se ejecutan antes de volver
al looping o
For Next que contiene el cdigo DoEvents().
Si quisiramos que una macro realizara cierta cantidad de operaciones
siguiendo un
looping, y supiramos que no debemos seleccionar ninguna celda
mientras tanto,
podramos utilizar la siguiente macro "DoEventsMacro" en conjuncin con
la macro
de evento.
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.
En la siguiente macro
Sub GOTOMacro()
Dim X, Y
On Error GoTo CasoError
Y = [A1] / [B1]
' Si A1/B1 diera como resultado un error, la macro 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
Page 84 of 106
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.
Built in Dialogs
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.
Ejemplos
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:
Page 85 of 106
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.
2.
3.
Page 86 of 106
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
Si quisiramos abrir ms de un libro de excel:
Sub Ejemplo2()
Dim Nombre_del_Fichero As Variant 'o bien: As String
Nombre_del_Fichero = Application.GetOpenFilename( _
FileFilter:="Hojas de clculo (*.xl*),*.xl*", _
Filterindex:=1, _
Title:="Sobre que Libro deseas operar?", MultiSelect:=True)
On Error Resume Next
If Nombre_del_Fichero <> False Then
NumFiles = UBound(Nombre_del_Fichero) - LBound(Nombre_del_Fichero) +
1
If Nombre_del_Fichero(LBound(Nombre_del_Fichero)) = False Then Exit Sub
' Para evitar que las macros de evento Private Sub Workbook_Open()
' se ejecuten
Application.EnableEvents = False
For X = LBound(Nombre_del_Fichero) To UBound(Nombre_del_Fichero)
Workbooks.Open Nombre_del_Fichero(X)
Page 87 of 106
Next X
Application.EnableEvents = True
Else
Exit Sub
End If
End Sub
FileFilter se aplica para definir el tipo de ficheros sobre los que deseamos
trabajar.
En este sentido si 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 (*.*),*.*"
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
Title es el ttulo que mostrar el cuadro de dilogo:
Title:="Sobre que Libro deseas operar?"
Title:="Que Libros deseas Abrir?"
Title:="Que Libros deseas Guardar?"
MultiSelect:=True,
Si queremos tener la posibilidad de operar sobre ms de un libro
deberemos poner
True, de lo contrario False.
He aqui un Ejemplo que podemos utilizar:
Sub Ejemplo3()
Dim FileList As Variant
Page 88 of 106
"Archivos de texto (*.txt),*.TXT," & _
"Todos los archivos de Microsoft Excel (*.Xls),*.Xls," & _
"Todos los archivos (*.*),*.*", _
3, _
"Seleccione los Ficheros sobre los que desees Trabajar!", _
,_
True)
' Permitimos seleccionar mas de un Fichero
' la 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
If FileList <> False Then
NumFiles = UBound(FileList) - LBound(FileList) + 1
If FileList(LBound(FileList)) = False Then Exit Sub
Cells.Clear
For X = LBound(FileList) To UBound(FileList)
Cells(X, 1) = FileList(X)
' Debug.Print FileList(x)
' Hubiramos podido trabajar con ellos tal que
' Creando otra macro que trabajara con ellos
' Call ReporteVentas
Next X
Else
Application.EnableEvents = True
Exit Sub
End If
End Sub
Barras de Herramientas
Podemos personalizar o adaptar nuestros propios mens y barras de
herramientas
dentro de Excel. En este captulo veremos como hacerlo.
created with Help to RTF file format converter
Crear Toolbar
Excel no deja de ser otra aplicacin de las muchas que conocemos como
MS Word, MS
PowerPoint, MS Access, Contawin, WordPad etc. Y al igual que todas las
dems
aplicaciones contiene una serie de funcionalidades y/o disposiciones
comunes 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
Page 89 of 106
La barra de men: tambin es comn en todas las aplicaciones
existentes, ahora bien
las palabras que contiene esta barra varan en funcin de la funcionalidad
que tenga
la aplicacion en si. En este sentido la barra de menu de MS Word difiere
de la barra de
men de MS Excel. Independientemente de cual sea la aplicacin en si
tendremos los
siguientes menus dentro de la barra de menus: (Archivo, Edicin y
Ayuda, aunque
este ltimo trmino en Excel venga expresado con el caracter "?").
Puesto que Excel
es una hoja de clculos, Word un procesador de textos y access una base
de datos,
estas aplicaciones diferirn en cuanto a las palabras que contengan su
barra de men,
as como en cuanto a los controles que contengan cada 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 lgico. Si sobre cualquier punto de la
horizontal que
representa la barra de men hacemos clic con el botn derecho del ratn
cualquier
aplicacin nos permitira ver el nmero de barras de herramientas
disponibles para la
aplicacin en si, as como cuales de ellas estn visibles y cuales no o
cuales podemos
personalizar.
Page 90 of 106
Si abriramos un documento de texto desde el escritorio, obervaramos
que un
documento de texto posee una barra de ttulos idntica a la de Excel pero
una barra de
men que solo tendra 4 menus (Archivo, Edicin, Formato y Ayuda). Si
hiciramos
clic derecho en la misma, observaramos que un documento de texto
"bloc de notas"
no contiene barra de herramientas.
Si abrimos Internet Explorer, observaremos que la barra de ttulos estar
siempre,
con la misma disposicin que la descrita al principio de este captulo
(Logotipo,
Nombre del documento contenido en la aplicacin, nombre de la
aplicacin,
minimizar, maximizar o restaurar y cerrar). Despues la barra de mens (
Ver,
Favoritos y Herramientas). Si hiciramos clic drecho sobre la barra de
mens,
observaramos que contiene entre otras la siguientes barras de
herramientas (Barra
de direcciones, botones estndar, vnculos, personalizar, etc.), es decir la
barra de
herramientas de MS Internet Explorer pueden ser personalizadas, pero
hasta cierto
punto y/o lmite ya que solo podemos variar los vnculos, la disoposicin
de la
diferentes barras de herramientas y la disposicin y presencia de los
botones dentro
de la barra de heraamientas llamada "botones estandar".
Tambin conviene recordar que Excel, Word, y el resto de aplicaciones
Office siempre
mantienen la ltima configuracin utilizada. En este sentido si
ocultramos todas la
barras de herramientas y cerrramos la aplicacin la siguiente vez que
abriramos la
misma aplicacin todas las barras de herramientas estaran ocultas.
Tras esta introduccin, podemos decir que en Excel todo es posible en
cuando a
barras de herramintas y barra de mens, entendiendo como todo es
posible:
1.
Crear una nueva barra de herramientas personalizada
2.
Page 91 of 106
Si quisiramos volver a permitir la modificacin de las barra de
herramientas, tan solo
necesitariamos cambiar el False por True. En ambos casos, la funcin es
evitar que el
usuario final aada y/o modifique las Barras de Herramientas (BH).
A la hora de crear una BH, conviene borrarla previamente, para evitar el
problema
derivado de crear una BH con un nombre preexistente, por ej:
Sub BorrarToolbar()
On Error Resume Next
' Borra la barra de Herramientas llamada Exceluciones
' On error resume next evita el problema derivado en caso de que no
' hubiera ninguna barra de herramientas llamada ExceLuciones
CommandBars("ExceLuciones").Delete
End Sub
Es decir si quisiramos crear una BH llamada "Exceluciones", sera
conveniente llamar
a la macro anterior primero tal que:
Sub CrearToolbar()
Dim X As Byte
On Error Resume Next
Call BorrarToolbar ' Llamamos a la macro BorrarToolbar, para evitar problemas
en cdigo
' Creamos la barra deHerramientas
With CommandBars.Add(Name:="ExceLuciones")
.Visible = True
' esta BH tendr 3 controles, o mejor dicho 2 controles de botn y un Dropdown
control
With .Controls.Add(Type:=msoControlButton)
.Caption = "VBA"
.Visible = True
.OnAction = "SheetVBA"
.FaceId = 1954
.TooltipText = "Muestra el Editor de VBA"
.Style = msoButtonIconAndCaption ' el 1 control ensear la imagen y el
texto
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "Saludos:"
.OnAction = "Msg"
.FaceId = 1954
.BeginGroup = True
.TooltipText = "Simple Saluda!"
.Style = msoButtonCaption
' An cuando hemos puesto un FacedID=1954,
' al definir que solo queremos ensear el texto y no la imagen del botn, el
cdigo
' .FaceId = 1954 no es necesario
End With
With .Controls.Add(Type:=msoControlDropdown)
' Cuando el control es ejecutado la macro MacroDiaSemana se ejecutar.
.OnAction = "MacroDiaSemana"
' el 3 control es de tipo ContolDropDown, por ello necesitamos saber los valores
que tendr
For X = 2 To 8
.AddItem Application.WorksheetFunction.Proper(Format(X, "DDDD"))
Next X
' los valores aadidos son: Lunes, Martes, Mircoles, Jueves, Viernes, Sbado,
Domingo
.ListIndex = 1
.BeginGroup = True
Page 92 of 106
.TooltipText = "Que da es Hoy?!"
End With
End With
End Sub
Conviene recordar que al ejecutar esta macro crearemos una BH llamada
"ExceLuciones", y al cerrar el libro, esta BH seguir como una de las BH
de Excel, ya
que no la hemos borrado antes de cerrar el libro. Es por ello que
preferimos no utilizar
BH creadas con VBA, ya que todo lo que realizamos a travs de ellas
puede ser
realizado mediante simples comandos adjuntos en las hojas. Cmo
solucin
podramos utilizar una nacro de evento que al cerrar el libro activo
llamara a la macro
"BorrarToolbar", y con ello borraramos esta BH recin creada, por
ejemplo:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call BorrarToolbar
End Sub
Sub BorrarToolbar()
On Error Resume Next ' Para evitar la imposibilidad de Borrar algo que no existe.
Application.CommandBars("Exceluciones").Delete ' Borraramos la BH
"Exceluciones"
End Sub
Finalmente, si lo que queremos es utilizar una BH y no queremos utilizar
eventos,
tambin podremos utilizar PopUps, que son BH que solo aparecen cuando
una
caracterstica dada tiene lugar. Esto lo veremos en la prxima seccin.
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:="ExceLucionesPOPUP", _
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"
Page 93 of 106
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)
With SubPOPUPControl
.Caption = "Portugal"
.FaceId = 73
.OnAction = "MacroEg"
End With
End With
End Sub
Private Sub MacroEg()
MsgBox "en lugar de este mensaje hubieramos podido ejecutar nuestra macro",
vbInformation, "LOGICAMENTE..."
End Sub
Sub BorrarPOPUP()
On Error Resume Next
CommandBars("ExceLucionesPOPUP").Delete
End Sub
Al ser una BH PopUp, no necesitamos crearla cada vez que hacemos clic
con el botn
derecho del ratn, tal que:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As
Boolean)
If Not Intersect(Range("RangoCeldas"), Target) Is Nothing Then
Call CrearPOPUP
Page 94 of 106
Application.CommandBars("ExceLucionesPOPUP").ShowPopup
' CommandBars("ExceLucionesPOPUP").ShowPopup '.showpopup
' Pues queremos observar como los comandos del boton derecho
' de nuestro raton varan
Cancel = True
End If
End Sub
Pero para ello si necesitaremos crearla al abrir el libro tal que:
Private Sub Workbook_Open()
Call CrearPOPUP
End Sub
y una vez creada, podremos visualizarla cuando lo querramos tal que:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As
Boolean)
If Not Intersect(Range("RangoCeldas"), Target) Is Nothing Then
Application.CommandBars("ExceLucionesPOPUP").ShowPopup
' Pues queremos observar como los comandos del botn derecho
' de nuestro raton varan
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.
Page 95 of 106
Deshabilitar Controles
No son pocas las veces que queremos deshabilitar ciertos controles
dentro de un libro
Excel dado. A veces no queremos que nadie imprima la hoja activa, o
bien queremos
que nadie copie una celdas determinadas. Para realizar esto con acierto
deberemos
saber:
1. Qu es una Barra de Men
2. Personalizar una Barra de Herramientas (BH)
Volvemos a estos temas por el siguiente motivo. Si no queremos tener
los controles
de copiar, cortar y pegar en ninguna de nuestras BHs...para que
tenerlos desde el
botn derecho del ratn?. Con esto queremos decir que si queremos
deshabilitar los
controles de copiar, cortar y pegar, deberamos tambin deshailitarlos del
botn
derecho del ratn y no solo los de la barra estndar. No obstante tambin
podramos
ir al men Edicin > Copiar con lo que an deshabilitando los controles de
las BH, los
controles del men bar seguiran activos, como as tambin CONTROL+C
que es la
combinacin de teclas para copiar y CONTROL+V que es la combinacin
de teclas para
pegar.
En definitiva, para deshabilitar todos los controles de copiar deberamos:
1) Saber si existe alguna combinacin de teclas que ejecuten la accin
que queremos
evitar y deshabilitarla. Luego al cerrar el libro esto se hace tal que:
Application.OnKey "^C", ""
' Con esto deshabilitaramos las teclas Control + C
Application.OnKey "^C"
' Con esto re-habilitaramos las teclas Control + C
2) Deshabilitar los contoles de copiar en cada una de las BH disponibles
en Excel. Esto
se hace dela siguiente forma:
Sub DeshabilitaCiertosControles()
Dim CBControl As CommandBarControl
Dim CBar As Integer
Dim MyArray
Dim X As Byte
Application.ScreenUpdating = False
Page 96 of 106
End Sub
Hemos utilizado un array de los identificadores de los comandos que
queremos
deshabilitar que son 19,21,22 es decir, Copiar, Cortar y Pegar
respectivamente. Una
vez que hemos deshabilitado todos los controles con estos ID,
necesitamos a su vez
realizar el siguiente paso...
3) Evitar la 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 cualquier BH bien sea personalizada o de las que
trae Excel,
por ej Estndar.
4) Deshabilitar copiado de hoja:
Application.CommandBars("PLY").Enabled = False
Deberemos deshabilitar al mismo tiempo la copia de la hoja desde el
botn derecho
del ratn en los tabuladores (etiquetas) de hoja, pues de lo contrario lo
realizado
hasta ahora sera inservible.
5) Deshabilitar opciones del botn derecho del reatn:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As
Boolean)
Cancel = True
End Sub
Como hemos mencionado en repetidas ocasiones el botn derecho del
ratn siempre
tiene las opciones de copiar, cortar y pegar 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 mover o copiar la hoja. Es decir que
necesitaramos saber
todos los controles que sirven para realizar lo mismo, o que pueden
servir para de
alguna manera llegar a evitar el fin pretendido. E incluso, si conociramos
todos los
ID's, luego quedara la posibilidad de acceder al editor de VBA y desde
aqu habilitar
los comandos deshabilitados. Puede que lleguemos a la conclusin que
finalmente es
Page 97 of 106
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
.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
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As
Boolean)
' Utilizamos este cdigo porque si el commandbar PLY esta activo no merece la
pena
deshabilitar el botn derecho.
If Application.CommandBars("PLY").Enabled = True Then Exit Sub
Cancel = True
End Sub
Recordemos nuevamente que cualquier ExcelManaco podra sin gran
dificultad
habilitar cualquier comando y/o control previamente deshabilitado.
Mens
Podemos personalizar o adaptar nuestros propios mens y barras de
herramientas
dentro de Excel. En este captulo veremos como hacerlo.
Crear men
La creacin de un men no vara con respecto a la creacin de una barra
de
herramientas (BH). Ahora bien, siempre debe haber una barra de men
visible,
mientras que las BH pueden estar todas ocultas. Se puede crear una
barra de men
totalmente nueva, o bien utilizando la existente, la que excel agrega y
muestra por
defecto, aadir nuevos mens y o submenus, o bien podemos aadir
nuevos controles
a un menu existente.
Page 98 of 106
Como norma general, aunque no escrita, si quisiramos agregar un
nuevo men a
nuestra barra de mens (por ej. el men "Exceluciones"), los menus
agregados se
colocan antes del menu ayuda de excel llamado "?" (el men que viene
despus del
men "Ventana").
El siguiente ejemplo muestra como podemos crear un men
"Exceluciones" en Excel.
Al igual que cuando creamos las BH, para crear un men deberemos
borrarlo
previamente, para evitar el error de compilacin derivado de crear un
men que ya
existe.
Sub BorrarMenu()
On Error Resume Next
Application.CommandBars("Worksheet Menu
Bar").Controls("ExceLuciones").Delete
End Sub
Sub CrearMenu()
Dim HelpMenu As CommandBarControl
Dim MenuNuevo As CommandBarPopup
Dim MenuItem As CommandBarControl
Dim SubmenuItem As CommandBarButton
' Borra el Menu "Exceluciones" llamando a otra macro
Call BorrarMenu
' Busca por el men Ayuda, esto es simplemente un convenio no firmado entre
programadores
' para los cuales cualquier menu creado y aadido debe ir antes que el menu
llamado Ayuda y/o
Help, el cual tiene como ID =30010
Set HelpMenu = Application.CommandBars("Worksheet Menu
Bar").FindControl(ID:=30010)
If HelpMenu Is Nothing Then
' Aade el menu "Exceluciones" al final
Set MenuNuevo = Application.CommandBars("Worksheet Menu
Bar").Controls.Add(Type:=msoControlPopup, Temporary:=True)
Else
' Si Ayuda existe, entonces antes que el menu "?" es decir ID=30010
Set MenuNuevo = Application.CommandBars("Worksheet Menu
Bar").Controls.Add(Type:=msoControlPopup, Before:=HelpMenu.Index,
Temporary:=True)
End If
' 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 no solamente con el ratn sino desde el teclado con la combinacion de teclas
"ALT + X"
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 botn "&Informe Ventas...", o cuando utilicemos la combinacin de teclas
"ALT
+X...ALT+I"
End With
Page 99 of 106
'2)
Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlButton)
With MenuItem
.Caption = "&Plan Contable..."
.FaceId = 36
.OnAction = "MacroEjemplo"
End With
'3)
Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlPopup)
With MenuItem
.Caption = "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 suelen colocar tantos botones como macros querramos utilizar,
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 MenuExceLuciones").Shapes("ImgMenu").Visible = True
End Sub
Esta es la macro que hemos creado para que sea ejecutada al hacer clic
sobre
cualquier control del men creado:
Private Sub MacroEjemplo()
MsgBox "en lugar de un mensaje hubieramos podido...", vbInformation,
"LOGICAMENTE..."
End Sub
Haber decidido colocar el menu "Exceluciones" antes que el men y/o
control Ayuda
"?" no significa que debamos hacerlo siempre asi. Pero debemos de saber
el ID del
men para poder maniobrar sobre el y/o con el.
30002 =&Archivo
30003 =&Edicin
Comandos
En este captulo se explicarn algunos comandos tiles que suelen
utilizarse con
frecuencia en las macros.
Mensajes de alerta
Los mensajes de alerta son avisos que dispara Excel antes de realizar
determinadas
acciones. Por ejemplo, al intentar borrar una Hoja, nos aparece una aviso
de
confirmacin. A nivel de macros, es importante tenerlos presentes, tal
como vemos a
continuacin:
Sub BorrarHoja()
Barra de estado
La barra de estado de Excel es la que figura en la parte inferior y suele
mostrar
distintos mensajes. Esta barra se puede mostrar u ocultar desde el men
Ver > Barra
de estado.
Usualmente la Barra de estado muestra la palabra Listo, tal como se ve a
continuacin:
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. A
continuacin se exponen algunas instrucciones para saber como
manipularla y
modificarla:
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:
En este otro ejemplo, el mensaje lo tomamos de una celda Excel:
Sub Saludo()
' El mensaje mostrar el contenido de la celda A1
Dim M as Variant
M = range("A1").value
Msgbox M
End Sub
Inputbox
Un InputBox se utiliza cuando requerimos un input del Usuario (es decir,
cuando
esperamos que el usuario introduzca un dato). Bsicamente lo que
hacemos es
asignarle un valor a una variable, pero le damos el control al usuario para
que asigne
dicho valor o dato a gusto.
Dentro del InputBox utilizamos las siguientes instrucciones:
Prompt: mensaje del InputBox
Title: ttulo del InputBox
Fin
Aqu finaliza la 2 Parte del Manual.