Está en la página 1de 225

www.todoexcel.

com

Copyright

Todos los nombres propios de programas, sistemas operativos, equipos de hardware, etc. que aparecen en este curso son marcas registradas de
sus respectivas compañías.

Reservados todos los derechos. El contenido de esta obra está protegido por ley, que establece penas de prisión y/o multas, además de las
correspondientes indemnizaciones por daños y perjuicios, para quienes reprodujeren, plagiaren, distribuyeren o comunicasen pú blicamente, en
todo o en parte, una obra literaria, artística o científica, o su transformación, interpretación o ejecución artística fijada en cualquier tipo de soporte o
comunicada a través de cualquier medio, sin la preceptiva autorización.

Microsoft y Microsoft Excel son marcas registradas por Microsoft Corporation.

Todos los contenidos del Curso de Macros VBA Excel Copyright ©2.008 por TodoEXCEL.

1
www.todoexcel.com

Contenido

1. INICIO ..................................................................................................................................................................... 9

1.1. Presentación .................................................................................................................................................... 9

2. TEORIA .................................................................................................................................................................. 11

2.1. INTRODUCCION.................................................................................................................................................. 12

2.1.1. Excel y macros ......................................................................................................................................... 12

2.1.2. Una definición simple .............................................................................................................................. 12

2.1.3. Utilidad de una macro ............................................................................................................................. 12

2.1.4. Objetos, propiedades y métodos ............................................................................................................. 13

2.1.5. Lenguaje VBA........................................................................................................................................... 14

2.2. COMO COMENZAR ............................................................................................................................................. 16

2.2.1. Barra de herramientas ............................................................................................................................. 16

2.2.2. Editor VBA ............................................................................................................................................... 17

2.3. ESCRIBIR UNA MACRO........................................................................................................................................ 21

2.3.1. Mi primera macro .................................................................................................................................... 21

2.3.2. Escribir la macro ...................................................................................................................................... 21

2.3.3. Ejecutar la macro ..................................................................................................................................... 23

2.3.4. Comprender la macro .............................................................................................................................. 25

2.3.5. Resumen ................................................................................................................................................. 27

2.3.6. OPM de la macro ..................................................................................................................................... 28

2.4. GRABAR UNA MACRO ........................................................................................................................................ 31

2.4.1. Mi primera macro .................................................................................................................................... 31

2.4.2. Grabando la macro .................................................................................................................................. 31

2.4.3. Resumen ................................................................................................................................................. 35

2.4.4. Escrita vs. grabada ................................................................................................................................... 36

2
www.todoexcel.com

2.4.5. Diferencias .............................................................................................................................................. 39

2.4.6. Conclusión ............................................................................................................................................... 40

2.5. EJEMPLOS DE MACROS ...................................................................................................................................... 42

2.5.1. Macro 1 ................................................................................................................................................... 43

2.5.2. Macro 2 ................................................................................................................................................... 44

2.5.3. Macro 3 ................................................................................................................................................... 44

2.6. EL EDITOR DE MACROS ....................................................................................................................................... 46

2.6.1. Cómo acceder.......................................................................................................................................... 46

2.6.2. Ventana Proyecto .................................................................................................................................... 47

2.6.3. Ventana Propiedades............................................................................................................................... 48

2.6.4. Ventana Código ....................................................................................................................................... 49

2.6.5. Ventana Inmediato .................................................................................................................................. 51

2.6.6. Proteger el código ................................................................................................................................... 52

2.7. EJECUCION DE MACROS ..................................................................................................................................... 54

2.7.1. Desde el código ....................................................................................................................................... 54

2.7.2. Desde el menú......................................................................................................................................... 54

2.7.3. Desde el teclado ...................................................................................................................................... 55

2.7.4. Desde objetos .......................................................................................................................................... 56

2.7.5. Desde botones......................................................................................................................................... 58

2.7.6. Automáticamente .................................................................................................................................... 60

2.8. MACROS DE EVENTOS ........................................................................................................................................ 61

2.8.1. Eventos de libros ..................................................................................................................................... 61

2.8.2. Eventos de hojas ...................................................................................................................................... 64

2.9. FORMULARIOS ................................................................................................................................................... 67

2.9.1. Crear un formulario ................................................................................................................................. 68

2.9.2. Controles del formulario .......................................................................................................................... 70

2.9.3. Ejemplo paso a paso ................................................................................................................................ 73

2.10. VARIOS ............................................................................................................................................................. 82


3
www.todoexcel.com

2.10.1. Ejecutar macro desde macro.................................................................................................................. 82

2.10.2. Depuración y errores ............................................................................................................................. 83

2.10.3. Complementos (Add Ins)........................................................................................................................ 85

2.10.4. Seguridad de macros ............................................................................................................................. 88

2.10.5. Firma digital........................................................................................................................................... 91

2.10.6. Macros privadas .................................................................................................................................... 93

2.10.7. Acelerar el código .................................................................................................................................. 94

3. MACROS ............................................................................................................................................................... 97

3.1. Importante ......................................................................................................................................................... 98

3.2. VARIABLES ....................................................................................................................................................... 100

3.2.1. Definición .............................................................................................................................................. 100

3.2.2. Declaración............................................................................................................................................ 101

3.2.3. Tipos...................................................................................................................................................... 103

3.2.4. Locales .................................................................................................................................................. 106

3.2.5. Públicas ................................................................................................................................................. 107

3.2.6. Estáticas ................................................................................................................................................ 109

3.2.7. Constantes ............................................................................................................................................ 111

3.2.8. Conversión ............................................................................................................................................ 111

3.2.9. Ejemplos................................................................................................................................................ 113

3.3. LIBROS ............................................................................................................................................................. 116

3.3.1. Abrir Libros ............................................................................................................................................ 116

3.3.2. Cerrar Libros .......................................................................................................................................... 117

3.3.3. Guardar Libros ....................................................................................................................................... 118

3.3.4. Borrar Libros .......................................................................................................................................... 119

3.3.5. Crear Libros ........................................................................................................................................... 120

3.3.6. Imprimir Libros ...................................................................................................................................... 121

3.3.7. Calcular Libros ....................................................................................................................................... 122

3.3.8. Proteger/Desproteger Libros ................................................................................................................. 123


4
www.todoexcel.com

3.3.9. Listar Libros ........................................................................................................................................... 124

3.4. HOJAS .............................................................................................................................................................. 125

3.4.1. Agregar.................................................................................................................................................. 125

3.4.2. Selecionar.............................................................................................................................................. 127

3.4.3. Selecionar vs. Activar ............................................................................................................................. 129

3.4.4. Mover Hojas .......................................................................................................................................... 130

3.4.5. Borrar Hojas .......................................................................................................................................... 131

3.4.6. Copiar Hojas .......................................................................................................................................... 132

3.4.7. Ocultar/Mostrar Hojas ........................................................................................................................... 132

3.4.8. Nombrar ................................................................................................................................................ 133

3.4.9. Proteger / Desproteger Hojas ................................................................................................................ 134

3.4.10. Vista Previa de Hojas ........................................................................................................................... 136

3.4.11. Imprimir Hojas ..................................................................................................................................... 137

3.4.12. Color de Hojas ..................................................................................................................................... 137

3.4.13. Ordenar Hojas ..................................................................................................................................... 138

3.5. RANGOS ........................................................................................................................................................... 140

3.5.1. Selección de celdas ................................................................................................................................ 140

3.5.2. Selección de rangos ............................................................................................................................... 143

3.5.3. Selección de filas ................................................................................................................................... 144

3.5.4. Selección de columnas ........................................................................................................................... 144

3.5.5. Otras selecciones ................................................................................................................................... 145

3.5.6. Insertar rangos ...................................................................................................................................... 148

3.5.7. Borrar rangos......................................................................................................................................... 149

3.5.8. Copiar y pegar rangos ............................................................................................................................ 150

3.5.9. Nombrar rangos .................................................................................................................................... 152

3.5.10. Combinar rangos ................................................................................................................................. 153

3.5.11. Ocultar y mostrar rangos ..................................................................................................................... 154

3.5.12. Proteger y desproteger rangos............................................................................................................. 155


5
www.todoexcel.com

3.5.13. Transponer rangos ............................................................................................................................... 155

3.5.14. Ordenar rangos.................................................................................................................................... 156

3.5.15. Borrar rangos....................................................................................................................................... 156

3.5.16. Imprimir rangos ................................................................................................................................... 157

3.5.17. Eliminar filas vacías .............................................................................................................................. 157

3.5.18. Restringir movimiento ......................................................................................................................... 159

3.5.19. Scroll Bars ............................................................................................................................................ 159

3.6. ARRAYS ............................................................................................................................................................ 160

3.6.1. Definición .............................................................................................................................................. 160

3.6.2. Fijos ....................................................................................................................................................... 160

3.6.3. Variables................................................................................................................................................ 161

3.6.4. Bidimensionales..................................................................................................................................... 162

3.6.5. Ejemplo ................................................................................................................................................. 163

3.6.6. Redim .................................................................................................................................................... 163

3.6.7. Preserve ................................................................................................................................................ 164

3.7. ESTRUCTURAS .................................................................................................................................................. 166

3.7.1. Do Loop ................................................................................................................................................. 166

3.7.2. For Next................................................................................................................................................. 167

3.7.3. For Each Next ........................................................................................................................................ 170

3.7.4. While Wend........................................................................................................................................... 171

3.7.5. GoTo...................................................................................................................................................... 172

3.7.6. With End With ....................................................................................................................................... 172

3.7.7. If Then ................................................................................................................................................... 174

3.7.8. Select Case ............................................................................................................................................ 177

3.7.9. DoEvents ............................................................................................................................................... 180

3.7.10. On Error GoTo ..................................................................................................................................... 181

3.7.11. On Error Resume Next ......................................................................................................................... 182

3.8. CUADROS DE DIALOGO .................................................................................................................................... 183


6
www.todoexcel.com

3.8.1. Ejemplos................................................................................................................................................ 183

3.9. BARRAS DE HERRAMIENTAS ............................................................................................................................. 187

3.9.1. Crear Toolbar......................................................................................................................................... 187

3.9.2. PopUp ................................................................................................................................................... 191

3.9.3. Mostrar y ocultar ................................................................................................................................... 193

3.9.4. Deshabilitar controles ............................................................................................................................ 193

3.10. MENUS........................................................................................................................................................... 197

3.10.1. Crear Menú ......................................................................................................................................... 197

3.10.2. Agregar controles ................................................................................................................................ 199

3.11. COMANDOS ................................................................................................................................................... 201

3.11.1. Mensajes de alerta .............................................................................................................................. 201

3.11.2. Barra de estado ................................................................................................................................... 201

3.11.3. Msgbox................................................................................................................................................ 202

3.11.4. InputBox .............................................................................................................................................. 204

4. LIBRERIA ............................................................................................................................................................. 206

4.1. Borrar Filas ................................................................................................................................................... 207

4.2. Búsquedas .................................................................................................................................................... 207

4.3. Cálculos ........................................................................................................................................................ 208

4.4. ComboBox .................................................................................................................................................... 208

4.5. CommandBars .............................................................................................................................................. 208

4.6. CopiarPegar.................................................................................................................................................. 209

4.7. Demos .......................................................................................................................................................... 209

4.8. Eventos ........................................................................................................................................................ 210

4.9. ExcelVersions ............................................................................................................................................... 212

4.10. LayOut ........................................................................................................................................................ 212

4.11. Filtros ......................................................................................................................................................... 214

4.12. FTP ............................................................................................................................................................. 215

4.13. Funciones ................................................................................................................................................... 216


7
www.todoexcel.com

4.14. Guardar ...................................................................................................................................................... 216

4.15. Hojas .......................................................................................................................................................... 216

4.16. Imágenes.................................................................................................................................................... 217

4.17. Imprimir ..................................................................................................................................................... 217

4.18. Msgbox ...................................................................................................................................................... 218

4.19. Ordenar ...................................................................................................................................................... 218

4.20. Proteger ..................................................................................................................................................... 218

4.21. Rangos ....................................................................................................................................................... 219

4.22. Resolución de Pantalla................................................................................................................................ 220

4.23. Selección .................................................................................................................................................... 220

4.24. Tablas ......................................................................................................................................................... 220

4.25. Tablas Dinámicas ........................................................................................................................................ 220

4.26. Varios ......................................................................................................................................................... 221

5. EXTRAS................................................................................................................................................................ 223

6. TodoEXCEL .......................................................................................................................................................... 225

8
www.todoexcel.com

1. INICIO

1.1. Presentación

Bienvenido a nuestro Curso de Macros VBA Excel !


Estamos seguros que este curso será tu agrado. Hemos trabajado muy duro para hacer un curso de
altísima calidad.
Las ventajas de hacer nuestro curso en formato de libro electrónico son:

Solo requieres de un PC
No pierdes tiempo en traslados
Lo haces a tu propio ritmo
Lo puedes consultar desde cualquier lugar
No contiene farragosos y pesados apuntes en papel
Lo tienes siempre disponible a tan solo un clic
Posee un potente buscador de contenidos
Contiene variados elementos multimedia
Permite navegar los contenidos más fácilmente

Composición del curso


Este curso se compone de 4 partes:

TEORIA: si eres principiante debes comenzar por aquí. En esta sección te explicaremos lo básico y
elemental para poder comenzar a entender el mundo de las macros. La sección está debidamente
ilustrada con fotos a todo color y explicaciones sencillas y fáciles de seguir.

MACROS: si ya dominas la teoría o eres nivel intermedio deberías continuar en esta sección. En la
misma se explican las principales macros o rutinas que debes conocer. Hemos hecho un "barrido"
por todos los temas o necesidades que podrías tener a la hora de programar.

LIBRERIA: en esta sección ponemos a tu disposición una "librería de macros". Una librería no es más
que una forma de ir guardando todas aquellas macros de interés que vas creando en tus desarrollos.
Muchas de ellas las necesitarás nuevamente así que para no tener que empezar de cero, lo ideal es
ir guardándolas en una librería de fácil acceso. Nuestra librería pretende ir creciendo día a día, tanto
con nuestros propios aportes como con los tuyos !

EXTRAS: esta sección es una recopilación muy interesante de diferentes recursos y macros vba que
se obtienen en la web. No te preocupes porque nos hemos tomado el trabajo de recopilarlas y
ponerlas a tu disposición de forma ordenada.

Otras secciones del curso, no menos importantes, son:

9
www.todoexcel.com

Sobre el autor
"TodoExcel" está formado por un grupo de expertos en hojas de cálculo Excel. Somos unos
"enamorados" de Excel y las posibilidades que ofrece. Hemos trabajado muchísimos años con este
programa y todavía no dejamos de sorprendernos con las maravillas que permite hacer.

Nuestra experiencia proviene de haber trabajado de forma intensiva con Excel, construyendo todo
tipo de modelos, plantillas y soluciones a medida. Nuestra misión es ser "los más entendidos en
hojas de cálculo Excel" para lo cual nos esforzamos día a día en conocer y divulgar mejor esta
herramienta y sus posibilidades.

Confiamos en tener el mejor equipo de expertos en Excel, con especialistas en funciones y fórmulas,
macros vba, tablas y datos y todas las herramientas y opciones en general que ofrece Excel.

Si deseas conocer mejor a nuestro equipo, puedes visitar nuestra web para mayor información.

10
www.todoexcel.com

2. TEORIA

En la primera parte de este curso veremos la teoría respecto a la programación de macros. Dominar
la teoría es sumamente importante para luego poder entrar a la parte práctica y comprender las
macros más rápido y mejor.

Introducción: qué son las macros y para que se utilizan.

Cómo comenzar: las principales herramientas del editor de macros.

Escribir una macro: escribiendo nuestra primera macro.

Grabar una macro: grabando nuestra primera macro.

Ejemplos de macros: otros ejemplos sencillos de macros.

El editor de macros: las principales partes y funciones del editor de macros.

Ejecución de macros: diversas formas para ejecutar las macros.

Macros de eventos: ejecución automática de macros.

Formularios: cómo armar formularios de todo tipo.

Varios: temas diversos de importancia.

11
www.todoexcel.com

2.1. INTRODUCCION

Bienvenido al Curso de Macros de TodoEXCEL. Estás por comenzar una de las experiencias más
fascinantes y atractivas de la Hoja de Cálculos Excel.

Con las macros podrás sorprender y sorprenderte porque incrementarás las prestaciones y el
potencial de Excel de forma ilimitada. El único límite que tendrás será tu imaginación.

2.1.1. Excel y macros

La Hoja de Cálculos Excel es una de las herramientas más poderosas para el tratamiento de datos y
su análisis. Una de las mayores ventajas que posee es la flexibilidad que ofrece y la rapidez con la
que podemos construir plantillas y todo tipo de modelos, para diversos usos y aplicaciones.

Sin embargo, si realmente quieres "exprimir todo el jugo" a Excel, deberás conocer y utilizar una de
sus mayores y más potentes herramientas: las macros.

Si eres usuario principiante de la hoja Excel con este curso darás un salto cuántico y te convertirás
rápidamente en todo un experto. Y si eres un usuario avanzado de Excel y ya tienes conocimientos
previos de macros, este curso te servirá para refrescar algunos conceptos pero también te
sorprenderás con nuevos códigos y secciones especiales que hemos preparado para ti.

2.1.2. Una definición simple

Una buena forma de introducirnos al mundo de las macros es con una definción sencilla y directa:

Macro: es un conjunto de instrucciones de código (programado) que permiten realizar una tarea
determinada como así también expandir e incrementar las prestaciones de Excel. Las macros se
escriben en lenguaje de programación VBA (Visual Basic for Applications). El Excel ya trae
incorporado un editor de VBA por lo que las macros se programan dentro del mismo programa Excel.

Mucha gente le tiene un poco de miedo a la palabra "programación". Bueno, si ese es tu caso no
debes preocuparte. Hace unos años nosotros mismos no teníamos la más mínima idea de
programación Excel. Pero la buena noticia es que con un buen curso (confiamos en que este lo es!)
podrás aprender y "tomar vuelo" rápidamente en el mundo de las macros.
Verás que es fácil, divertido y que puedes expandir al infinito los límites de Excel!

2.1.3. Utilidad de una macro

Anteriormente definimos a las macros como algo que nos permite expandir e incrementar las
prestaciones de la hoja Excel. ¿Cuáles serían algunos ejemplos de esto? Bueno, los ejemplos los
iremos viendo en este curso, pero a grandes rasgos podemos comentar que las 4 grandes "áreas"
donde se aplican las macros son:

12
www.todoexcel.com

1. Automatización de procesos
Supongamos que todos los días debemos trabajar en nuestro libro Excel en el cual debemos
seleccionar un rango, centrarlo, cambiarle la fuente, poner la fuente en cursiva, aplicarle negrita y
finalmente aplicarle bordes a toda la selección. Estas 6 acciones las hacemos manualmente y no
parecen muchas, ¿pero que tal si hay que hacer esto en repetidas ocasiones y todos los días? Una
macro nos permite ejecutar los 6 pasos automáticamente, tan solo presionando un botón o una
tecla. Las tareas ideales para automatizar son aquellas que se hacen de forma repetida e involucran
muchos pasos, por ejemplo: imprimir informes, configurar la vista de la hoja, actualizar datos de
tablas dinámicas, etc...

2. Creación de funciones a medida


Las funciones y fórmulas Excel son quizás la esencia de la hoja de cálculos (si no se pudieran utilizar
funciones y fórmulas no habría cálculos!). Excel trae incorporada unas 330 funciones estándar las
cuales se pueden utilizar en forma aislada o en forma combinada (anidadas). Sin embargo suele
suceder que justo la función que necesitamos no existe. Nuevamente, las macros vienen a nuestra
salvación. Podemos programar funciones a medida que hagan exactamente lo que nosotros
queremos. Y esas funciones se comportarán igual que las de Excel (aparecerán en el menú de
funciones en la categoría que nosotros indiquemos, tendrán sus respectivos argumentos, etc).

3. Creación de nuevos comandos, complementos y menús


Excel trae una gran cantidad de comandos y menús predefinidos que nos asisten para las
operaciones más habituales. Las macros nos permiten crear nuestros propios comandos y menús
personalizados, e incorporarlos al Excel. La utilidad de los mismos depende tan solo de nuestras
necesidades. Los complementos Excel también están creados con macros. Si ves en el menú
Herramientas > Complementos verás una lista de los que tienes instalado en tu Excel. Los mismos
suelen ser distribuidos de forma gratuita o también se compran. Su utilidad reside en agregar alguna
funcionalidad extra al Excel.

4. Creación de aplicaciones a medida


Excel es utilizado en diversos campos y por una gran cantidad de usuarios. Las macros te permitirán
construir complejas y elegantes aplicaciones para cualquier uso que quieras darles. El límite solo es
tu imaginación. Una aplicación Excel consiste en algo más que una simple plantilla con datos y
fórmulas. Una aplicación Excel es un verdadero programa de software con una serie de
características que lo hacen utilizable por cualquier usuario sin que el mismo tenga que entender la
lógica "exceliana" que hay por detrás.

2.1.4. Objetos, propiedades y métodos

Cuando hablamos de macros hablamos de Objetos, Propiedades y Métodos (OPM). Estos son los 3
conceptos generales más importantes que debes conocer a la hora de programar las macros. De
momentos solo te daremos una sencilla definición y luego iremos profundizando más en ellos.
Hay un ejemplo muy práctico para comprender lo que son los Objetos, Propiedades y Métodos
(OPM). Supongamos que tenemos una canasta con frutas. ¿Cuales serían los OPM de la misma?
Objetos: los objetos de la canasta de frutas serían las mismas frutas (manzanas, naranjas, peras…).
Propiedades: las propiedades serían las características de las frutas (color, olor, sabor, textura…).
Métodos: finalmente los métodos son las acciones que podríamos ejercer sobre las frutas
(comprarlas, venderlas, comerlas, almacenarlas, limpiarlas, quitarles la piel,…).

13
www.todoexcel.com

Veamos un ejemplo sencillo de algunos OPM de Excel.


Objetos: prácticamente cada cosa que veas en Excel es un objeto. Ejemplos de objetos son: un
libro excel, una hoja, un rango, una celda, un menú, un gráfico, una tabla dinámica, un cuadro de
diálogo, las etiquetas de hojas, las columnas, las filas, etc. En fin, cada partecita de Excel es un
objeto. Un objeto es algo que puedes ver e identificar con un nombre.

Propiedades: las propiedades son las características de los objetos. Por ejemplo, para el objeto
"celda" algunas de sus propiedades serían: alto, ancho, color, bloqueada o desbloqueada, vacía, con
un número o con una fórmula, etc. Por ejemplo para el objeto "hoja" algunas de sus propiedades
serían: visible u oculta, con o sin líneas de división, con o sin barras de desplazamiento vertical y
horizontal, etc.

Métodos: un método es una acción que podemos realizar sobre el objeto o una de sus propiedades.
Por ejemplo sobre el objeto "hoja" podemos: activar, mover, copiar o borrar.
De momento estas definiciones son suficientes para empezar a entender algunos conceptos.
Recuérdalas bien porque las usaremos en todo el curso. En la medida que adquieras mayores
conocimientos sobre como programar macros iras manejando y conociendo cada vez más objetos,
con sus propiedades y sus métodos. En definitiva, de eso se trata programar una macro: conocer el
nombre del objeto, conocer el nombre de alguna propiedad del mismo que quieras modificar y
también conocer el nombre de algún método que desees aplicarle.

2.1.5. Lenguaje VBA

Recuerda que la programación de macros se hace a través del lenguaje VBA (Visual Basic for
Applications) desde el editor VBA que trae incorporado Excel. Este tipo de programación también se
conoce como "Programación Orientada a Objetos" (OOP, Objects Oriented Programming). La
Programación orientada a Objetos nos permite trabajar sobre los objetos propios de Excel como
así también crear nuestros propios objetos. Esto se relaciona con lo que te comentábamos en la
sección anterior sobre Objetos, Propiedades y Métodos.

Macros = VBA = OPM


El lenguaje VBA es muy fácil de entender y siempre gira en torno a seleccionar los objetos, cambiar
sus propiedades y/o ejecutarles distintos métodos. La única particularidad es que el lenguaje VBA
solo está en inglés. Sin embargo, y para que no te desalientes, conocemos muchísimos
programadores de macros que prácticamente no saben inglés! Esto es así porque solo hay que
conocer la palabra en inglés para cada objeto, propiedad y método. Veamos un sencillo ejemplo de
algunos objetos de Excel y su denominación en inglés, el idioma utilizado por las macros:

Ejemplos de Objetos VBA


(entre paréntesis su significado en español)
Cell (celda)
Range (rango)
Worksheet (hoja)
Workbook (libro)

14
www.todoexcel.com

Ejemplos de Propiedades VBA


(entre paréntesis su significado en español)
Value (valor)
Color (color)
Format (formato)

Ejemplos de Métodos VBA


(entre paréntesis su significado en español)
Copy (copiar)
Protect (proteger)
Delete (borrar)

En la medida que avances con la lectura de este curso te irás familizarizando con la denominación de
los distintos objetos, propiedades y métodos. El lenguaje VBA tiene miles de OPM, y existe una
forma muy práctica de conocerlos todos que es con la grabadora de macros, tema que trataremos
más adelante.

Aprender macros es mucho más fácil de lo que tu te imaginas. Es cierto que hay macros muy
complicadas que requieren un conocimiento muy avanzado. Pero es un lenguaje fácil y muy intuitivo.
Además Excel posee una grabadora de macros que las escribe de forma automática. Luego nosotros
podemos retocarlas a gusto. Te aseguramos que en cuanto termines este curso estarás escribiendo
tus propias macros y te sorprenderás lo fácil que es seguir aprendiendo y profundizando tus
conocimientos. Nosotros te daremos las herramientas para que lo consigas!

15
www.todoexcel.com

2.2. COMO COMENZAR

Antes de comenzar a programar macros es necesario que conozcas la barra de herramientas VBA y
las distintas formas de acceder al editor de macros, que es la herramienta donde escribirás el código
de las mismas. En las secciones siguientes te enseñaremos ambos conceptos.

2.2.1. Barra de herramientas

La barra de herramientas de macros es considerablemente diferente entre Excel 2.003 e inferior y


Excel 2.007.

Excel 2.003 o inferior


El primer paso para empezar a programar macros es familiarizarnos con las herramientas que nos
ofrece Excel para programarlas.

Excel posee una Barra de Herramientas de Macros o VBA. Puedes acceder a la misma desde el menú
Herramientas > Macros. Dicho menú se ve como en la fotografía a continuación (fíjate que también
se indican las combinaciones de teclas para acceder a dichas opciones).

También tienes la opción de dejar siempre visible dicha barra de herramientas. Puedes hacer esto
desde el menú Ver > Barras de Herramientas > Visual Basic. Veras como aparece una nueva barra
de herramientas de macros. Puedes ubicar esta barra de herramientas donde te sea más cómodo.

16
www.todoexcel.com

Excel 2.007
En la nueva versión de Excel, las opciones del menú de macros se encuentran en la ficha
programador,.

Si no tienes visible la ficha Programador, puedes activarla de la siguiente forma


1. Presiona el botón de Office (botón redondo en la parte superior izquierda de la pantalla)
2. En la parte inferior del menú que se despliega, presiona el botón Opciones de Excel
3. En la lista de opciones Mas Frecuentes, selecciona la casilla de Mostrar ficha programador en la
cinta de opciones.

2.2.2. Editor VBA

El Editor de Visual Basic es la aplicación que trae Excel desde donde se escriben y guardan las
macros. Tienes 3 formas de acceder al editor:

Excel 2.003 o inferior


1. Desde el menú Herramientas > Macros > Editor de Visual Basic
2. Desde el botón Editor de Visual Basic de la Barra de Herramientas Visual Basic.
3. Desde el teclado (Teclas de Método Abreviado): ALT+F11
(el acceso a la Barra de Herramientas de la opción 1 y 2 los explicamos en la sección anterior)

Excel 2.007
1. Desde la ficha Programador > botón Visual Basic
2. Desde el teclado (Teclas de Método Abreviado): ALT+F11
(el acceso a la ficha programador lo explicamos en la sección anterior)

Nuestra forma preferida de acceder al editor de macros es con las teclas ALT + F11

Una vez que hayas accedido al editor de visual basic verás algo similar a la figura siguiente (no
importa si no lo ves estrictamente similar, eso dependerá de las ventanas que tengas visibles y
ocultas). Puedes mostrar u ocultar estas ventanas desde el menú Ver.

17
www.todoexcel.com

El editor contiene 4 ventanas principales:


la Ventana Proyecto (parte izquierda superior)
la Ventana de Código (parte derecha)
la Ventana Propiedades (parte izquierda inferior)
la Ventana Inmediato (parte inferior derecha)

Ventana Proyecto - VBA Project: esta ventana muestra los libros excel (xls) o los complementos
(xla) abiertos. Usualmente verás nombres del tipo "VBAProject" y entre paréntesis el nombre del
archivo o complemento excel. Veamos el caso de VBAProject (Libro1). Simplemente significa que
tienes abierto un libro Excel llamado Libro 1. Luego cuelgan 3 carpetas más: Hoja1 (Hoja1),
ThisWorkbook y Modulo (no importa si ves todos estos elementos ahora, luego te enseñaremos
como activarlos). Estas carpetas es donde habitan las macros. Haciendo doble clic en ellas activarás
la ventana donde se escriben las macros.

18
www.todoexcel.com

Ventana de Código: esta es el lugar donde escribiremos el código propiamente dicho de las
macros. Como no hemos escrito ninguna macro todavía veremos la hoja en blanco. Recuerda bien
estas dos ventanas, ya que las usaremos a continuación para escribir nuestra primera macro.

Como verás el Editor de VB tiene muchas ventanas. Pero de momento solo nos interesan las dos
ventanas que te indicamos anteriormente: la Ventana Proyecto – VBA Project y la Ventana de Código
donde se escribe el código de las macros. La Ventana de Propiedades e Inmediato las dejaremos
para más adelante.

Recuerda: presionando las teclas ALT+F11 puedes ir desde Excel al Editor o desde el Editor al Excel
de forma alterna (debes mantener presionada la tecla ALT y presionar F11 repetidas veces, verás
como pasas de Excel al editor y viceversa).

19
www.todoexcel.com

Si estas en el editor y quieres regresar a la hoja Excel también puedes utilizar el ícono de Excel que
se encuentra en el menú superior del editor (primer ícono de la izquierda, con la X de Excel).

20
www.todoexcel.com

2.3. ESCRIBIR UNA MACRO

A la hora de crear una nueva macro existen 3 métodos:

1. Escribirla manualmente
2. Utilizar la grabadora de macros
3. Combinación de los 2 métodos anteriores
(grabarla y luego retocarla manualmente)

En cada situación utilizarás un método distinto. Por ejemplo, las macros muy sencillas las puedes
escribir manualmente porque tienen pocas líneas y ya las conoces. En otros casos la podrás crear
con la grabadora de macros y olvidarte del código VBA. Sin embargo, en la medida que progreses
con las macros verás que el método más utilizado suele ser el número 3 mediante el cual primero
grabarás y luego harás ajustes manuales en el código para hacerlo más eficiente y que se ejecute
más rápido.

En este capítulo vamos a ver como se escribe una macro manualmente (método 1)

2.3.1. Mi primera macro

Vamos a escribir manualmente nuestra primera macro ahora!. Es una macro muy sencilla, pero te
servirá para orientarte en el Editor de Visual Basic y reconocer los pasos requeridos para hacer una
macro.

Objetivo de nuestra macro:


Escribir el valor 1.500 en la celda A1 de la hoja Excel.

¿qué significa esto? Que comenzaremos con una hoja Excel vacía y luego de ejecutar la macro veras
que aparece el valor 1.500 en la celda A1. El valor lo pondrá automáticamente la macro cuando
nosotros se lo indiquemos.
Suena demasiado simple, cierto? Sin embargo es suficiente como para comenzar y que aprendas
generalidades que luego aplicarás en todas tus macros. Como es una macro sencilla vamos a
escribirla manualmente para que comiences a empaparte del editor de macros y sus partes.

2.3.2. Escribir la macro

Bueno, es importante que recuerdes el objetivo: esta macro escribirá automáticamente el valor
1.500 en la celda A1 de tu hoja Excel. Los pasos que debes seguir son los siguientes:

1. Prepara el Editor de Visual Basic


1.1 Crea un nuevo libro Excel y guárdalo con el nombre Libro 1.
1.2 Abre el editor de Visual Basic con las teclas ALT+F11.
1.3 Doble clic en VBAProject (Libro1) para ver las carpetas.
21
www.todoexcel.com

1.4 Doble clic en Hoja1 (Hoja1) para empezar a escribir el código de la macro.

2. Escribimos la macro
2.1 En la ventana de macros escribe textualmente el siguiente código:

' Esta macro escribe el valor 1500 en la celda A1


Sub MiPrimeraMacro()
Range("A1").Value=1500
End Sub

2.2 Si la macro está bien copiada verás que la primera línea queda en color verde y la segunda y
cuarta en azul. Estos colores los asigna automáticamente el editor y te lo explicaremos más
adelante. Así es como debe quedar todo:

*Nota: si la ventana de tu editor tiene una instrucción "Option Explicit" escrita en la parte superior,
no le presetes atención, puedes dejarla. Más adelante te explicaremos que significa.

De momento no te preocupes por el código escrito. Más adelante te enseñaremos a interpretarlo.


Ahora que ya tienes la macro escrita pasemos a la siguiente sección para ver como ejecutarla.

22
www.todoexcel.com

2.3.3. Ejecutar la macro

Excel 2.003 o inferior


Si ya tienes escrita la macro en el editor, ahora podrás que ejecutarla, o sea hacer que funcione.
Tienes 2 formas de hacer esto:

A. Ejecutar la macro desde el mismo Editor


Si te posicionas en cualquiera de las líneas de código de la macro y luego presionas la tecla F5 la
macro se ejecutará (para ver el resultado puedes volver a la hoja excel con ALT+F11).

B. Ejecutar la macro desde Excel


Otra forma de ejecutar la macro es desde el mismo Excel. Puedes hacerlo desde el menú
Herramientas > Macros > Macro.

Se abrirá un cuadro que contiene una lista con los nombres de las macros creadas.
Selecciona MiPrimeraMacro y haz clic en Ejecutar.

Si has seguido cualquiera de los 2 pasos anteriores ya podrás ver el resultado de la macro. ¿Qué
hizo la Macro? Si te fijas en el Libro 1, Hoja 1, Celda A1 verás que se escribió el valor 1.500. Eso es
exáctamente lo que queríamos hacer con nuestra macro, así que tarea cumplida. Hemos escrito un
valor en una celda excel desde una macro !
23
www.todoexcel.com

Excel 2.007
Si ya tienes escrita la macro en el editor, ahora podrás que ejecutarla, o sea hacer que funcione.
Tienes 2 formas de hacer esto:

A. Ejecutar la macro desde el mismo Editor


Si te posicionas en cualquiera de las líneas de código de la macro y luego presionas la tecla F5 la
macro se ejecutará (para ver el resultado puedes volver a la hoja excel con ALT+F11).

B. Ejecutar la macro desde Excel


Otra forma de ejecutar la macro es desde el mismo Excel. Esto se hace desde la ficha Programador
> Macros

Se abrirá un cuadro que contiene una lista con los nombres de las macros creadas.
Selecciona MiPrimeraMacro y haz clic en Ejecutar.

Si has seguido cualquiera de los 2 pasos anteriores ya podrás ver el resultado de la macro. ¿Qué
hizo la Macro? Si te fijas en el Libro 1, Hoja 1, Celda A1 veras que se escribió el valor 1.500. Eso es
exactamente lo que queríamos hacer con nuestra macro, así que tarea cumplida. Hemos escrito un
valor en una celda excel desde una macro !

24
www.todoexcel.com

2.3.4. Comprender la macro

Recuerda que el propósito de nuestra primera macro fue escribir el valor 1500 en la celda A1 de
Excel. La macro ya fue escrita y ejecutada en los pasos anteriores. Ahora vamos a analizar cada una
de las líneas de su código. Recordemos como se veía nuestra macro escrita en el editor:

* los colores del código los asignó automáticamente el editor


* la primera línea que dice Option Explicit la explicaremos luego

Esta macro tiene 4 líneas de código, por eso es tan sencilla (cuando termines este curso seguro
podrás escribir macros de cientos o quizás miles de líneas de código!). Veamos que significa cada
línea. Las explicaciones que vienen a continuación suelen aplicarse a todas las macros, así que es
importante que las comprendas.

1º línea de código: el comentario


' Esta macro escribe el 1500 en la celda C10
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub

- La primera línea de una macro suele ser un comentario que hacemos sobre la misma, donde
podemos poner lo que queramos.
- Los comentarios se pueden poner en cualquier línea y cantidad.
- En la medida que nuestras macros crecen los comentarios se vuelven muy útiles para nuestra
propia referencia.
- Un comentario siempre comienza por un signo '. Si tipeamos dicho signo seguido de un texto y
luego damos al Enter, el editor detecta que es un comentario y lo pinta verde automáticamente.
- Un comentario no tiene efectos sobre la macro, es solo para nuestra referencia.

Recuerda: los comentarios son muy útiles para comentar nuestras macros y siempre deben
comenzar con el signo '. Si has puesto bien dicho signo al comienzo de la línea, el editor detecta
automáticamente que es un comentario y lo pinta de verde luego de darle a Enter.

2º línea de Código: el nombre de la macro


' Esta macro escribe el 1500 en la celda C10
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub

25
www.todoexcel.com

- Aquí es donde comienza realmente la macro.


- Toda macro siempre comienza con la palabra Sub, luego un espacio, luego un nombre (sin espacios
intermedios) y finalmente los paréntesis (). Más adelante veremos algunas excepciones a esto.
- Este nombre luego lo utilizaremos para ejecutar la macro.
- Luego de escribir esta línea y darle a Enter el Editor detectará que es el nombre de la macro y
pondrá la palabra Sub en color azul de forma automática.

Recuerda: el nombre de la macro siempre comienza con la palabra Sub, luego un espacio, luego
el nombre que quieras ponerle a tu macro (SIN espacios intermedios) y finalmente los paréntesis.

3º línea de código: la instrucción de la macro


' Esta macro escribe el 1500 en la celda C10
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub

- Esta es la instrucción principal de nuestra macro (el corazón de la macro). Con este código
logramos nuestro objetivo (que la macro escriba el valor 1500 en la celda C10).
- ¿Recuerdas el comienzo del curso donde hablábamos de Objetos (partes de Excel), Propiedades
(características) y Métodos (acciones)?. Aquí tenemos un ejemplo al respecto. Programar macros
siempre consiste en lo mismo: primero hacer referencia al objeto y luego asignarle una propiedad o
método. En nuestro ejemplo:
Range("A1").Value = 1500

Range("A1"). es el objeto
Value es la propiedad
= 1500 es el valor que le damos a la propiedad
- Esta línea de código se interpreta así: a la celda A10 de Excel asignarle el valor 1500.

Recuerda: siempre debes hacer referencia a un objeto para luego asignarle propiedades o
métodos.

4º línea de código: el fin de la macro


' Esta macro escribe el 1500 en la celda C10
Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub

- Una macro siempre termina con la instrucción End Sub.


- Luego de escribir esto y darle a Enter, el Editor detectará que es el fin de la macro y lo pondrá en
color azul de forma automática.

Recuerda: siempre debes finalizar tu macro con la instrucción End Sub.

26
www.todoexcel.com

2.3.5. Resumen

Nuestro objetivo fue crear una macro que escribiera el valor 1500 en la celda A1 de la Hoja1 de
Excel. Como era una macro sencilla decidimos escribir el código manualmente. Vamos a resumir
todos los pasos que hicimos hasta aquí:

1. Creamos un nuevo libro Excel y lo guardamos con el nombre Libro1.


2. Accedimos el Editor de Visual Basic con las teclas ALT+F11
3. En la Ventana Proyecto, en VBAProject (Libro1), hicimos doble clic en Hoja1 (Hoja1).
4. En la Ventana de Código escribimos textualmente el siguiente código:

' Esta macro escribe el 1500 en la celda A1


Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub

Todo quedó como se aprecia en la foto...

5. Finalmente abrimos el menú de macros con ALT+F8, seleccionamos MiPrimeraMacro desde la lista
de nombres y presionamos Ejecutar.

27
www.todoexcel.com

6. El resultado es que en la celda A1 se vuelve a escribir el valor 1500, que fue justamente lo que le
indicamos a la macro que haga.

Recuerda: en estos 5 pasos hemos visto rápidamente como escribir una macro sencilla y ejecutarla.
En las secciones siguientes iremos profundizando más estos temas, sobre todo el referente el código
de la macro.

2.3.6. OPM de la macro

Recordemos nuevamente el código de nuestra primera macro:

' Esta macro escribe el valor 1500 en la celda A1


Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub

Ahora recordemos brevemente el significado de cada línea de código:


1ª línea: es el comentario de la macro (simpre comienza con el signo ')
2ª línea: es el nombre de la macro (siempre se comienza con Sub)
3ª línea: es la instrucción principal de la macro
4ª línea: es el fin de la macro (siempre termina con End Sub)

28
www.todoexcel.com

La mayoría de las macros llevan una estructura similar, aunque hay algunas excepciones.

El comentario que aparece al comienzo lo ponemos a gusto y sirve para recordarnos lo que
queremos hacer con esa macro. El comentario siempre comienza con el signo ' y no afecta para nada
a la macro. Es un simple texto.

El nombre lo pondremos a gusto, anteponiendo la palabra Sub los paréntesis de apertura y cierre al
final. Conviene dar un nombre que nos indique que hace la macro.

La instrucción principal la veremos un par de párrafos más abajo. Este código siempre varía según lo
que se quiera hacer con la macro en cuestión.

El fin siempre es igual, con la frase End Sub.

Así que solo nos queda explicar con más detalle la instrucción principal de la macro. En general, las
líneas de código más importantes y donde debemos usar nuestros conocimientos de objetos,
propiedades y métodos son las que se encuentran entre las instrucciones Sub y End Sub. Es allí
donde realmente "se cocina" todo. Ese es el verdadero corazón de la macro.

Al comienzo del curso te mencionábamos que las macros consisten en operar sobre un Objeto, ya
sea alterando una de sus Propiedades o ejecutando un Método sobre el mismo.

Recuerda: para aprender a programar macros debes aprender cuales son los objetos, propiedades y
métodos de Excel. No olvides la definición de los mismos:

Objeto
- Es una parte de Excel
- Por ej. una celda de Excel, una hoja, un gráfico.

Propiedad
- Es una característica del objeto
- Por ej. el valor de la celda, el nombre de una hoja, el color de un gráfico.

Método
Es una acción sobre el objeto > por ej. copiar la celda, borrar la hoja, agrandar el gráfico.

Como te comentábamos al comienzo, la línea de código más importante de nuestra macros es:

Range("A1").Value = 1500

Ahora ya estamos en condiciones de identificar mejor los objetos, propiedades y métodos de la


misma.

Range("A1") es el objeto, recuerda que siempre que hacemos macros primero debemos indicar el
objeto excel sobre el que vamos a operar. En este caso usamos el objeto Range (Rango). El objeto
Range es el que se utiliza para hacer referencia a una celda o rango Excel. Luego se escribe la
29
www.todoexcel.com

referencia de la celda Excel (letra de columna y número de fila) entre comillas y paréntesis. Ya le
hemos indicado a la macro que deberá ocuparse de la celda A1 (objeto). Ahora debemos indicarle
que hacer con ella (propiedad o método).

Value = 1500 es la propiedad, que le asignaremos al objeto. Siempre empezamos por el objeto para
luego asignarle una propiedad o método. En este caso usamos la propiedad Value (Valor) que nos
permite asignar un valor al objeto range, anteponiendo un signo igual y luego el valor que
deseamos.

Esta macro es muy sencilla y no posee ningún método.

Hasta aquí es suficiente. Hemos visto el ejemplo de un objeto y una de sus propiedades. En la
medida que vayas avanzando con la lectura de este curso irás aprendiendo nuevos objetos,
propiedades y métodos.

30
www.todoexcel.com

2.4. GRABAR UNA MACRO

A la hora de crear una nueva macro existen 3 métodos.

A. Escribirla manualmente
B. Utilizar la grabadora de macros
C. Combinación de los 2 métodos anteriores
(grabarla y luego retocarla manualmente)

En cada situación utilizarás un método distinto. Por ejemplo, las macros muy sencillas las puedes
escribir manualmente porque tienen pocas líneas y ya las conoces. En otros casos la podrás crear
con la grabadora de macros y olvidarte del código VBA. Sin embargo, en la medida que progreses
con las macros verás que el método más utilizado suele ser el número 3 mediante el cual primero
grabarás y luego harás ajustes manuales en el código para hacerlo más eficiente y que se ejecute
más rápido.

En el capítulo anterior vimos como se escribía una macro de forma manual. Ahora veremos como
utilizar la grabadora de macros. Como te mencionábamos antes, la ventaja de la grabadora es que
prácticamente no requiere conocimientos de programación y código VBA. Simplemente encendemos
la grabadora, ejecutamos las acciones y listo. La grabadora genera el código automáticamente !

2.4.1. Mi primera macro

Vamos a grabar nuestra primera macro ahora!. Es la misma macro que hicimos en el capítulo
anterior, pero esta vez la haremos con la grabadora de macros.

Objetivo de nuestra macro


Escribir el valor 1.500 en la celda A1 de tu hoja Excel.

¿que significa esto? Que comenzaremos con una hoja Excel vacía y luego de ejecutar la macro verás
que aparece el valor 1.500 en la celda A1. El valor lo pondrá automáticamente la macro cuando
nosotros se lo indiquemos.

Suena demasiado simple, cierto? Sin embargo es suficiente como para comprender la metodología
de funcionamiento de la grabadora de macros.

2.4.2. Grabando la macro

Excel trae incorporada una grabadora de macros. La misma funciona de forma muy fácil.
Encendemos la grabadora, ejecutamos las acciones que nos interesan sobre la hoja excel, paramos
la grabadora y…listo!. Excel escribe de forma automática el código VBA de la macro.

Ahora podemos hacer un experimento muy interesante. Repetir nuestra primera macro, pero esta
vez haciéndola con la grabadora de macros. Sigue los pasos a continuación:

31
www.todoexcel.com

Excel 2.003 o inferior


1. Vamos a grabar la macro
1.1 Vé al menú Herramientas > Macros
1.2 Selecciona la opción Grabar nueva macro…

1.3 Se abrirá un cuadro de diálogo como el que se muestra a continuación.

1.4 Donde dice Nombre de la macro escribe MiPrimeraMacro. Ese será el nombre que le daremos a
nuestra macro.
1.5 Presiona Aceptar y la macro comenzará a grabar todo lo que hagas.
1.6 Posiciónate en la celda A1 y escribe el valor 1500.

2. Barra para frenar la grabación


Cuando comienza a grabar la macro activa una nueva barra de macros como la que se muestra en la
foto. El botón cuadrado de la izquierda te permitirá parar la grabación y finalizar la macro.

Otra forma de detener la grabación de la macro es desde el menú Herramientas > Macros > Detener
grabación. Hazlo ahora para detener la grabación.

32
www.todoexcel.com

3. Veamos como quedó la macro grabada


3.1 Accede al editor de visual basic con ALT+F11.
3.2 Debes hacer clic en Módulo1 para visualizar el código de la nueva macro grabada. Verás una
pantalla como la siguiente:

* Podrás obsevar que el código que se grabó es distinto que el código que habíamos escrito cuando
hicimos la macro manualmente. Más adelante en este mismo capítulo analizaremos y explicaremos
las diferencias.

4. Vamos a probar la macro


4.1 Vuelve a Excel con ALT+F11.
4.2 Verás que la celda A1 tiene el valor 1500 porque lo escribimos mientras grabábamos la macro.
4.3 Para ver como opera la macro borra dicho valor.
4.4 Abre el menú de macros desde el menú Herramientas > Macro > Macros
4.5 Selecciona MiPrimeraMacro (no te confundas con Hoja1.MiPrimeraMacro que es la que hicimos
primero).
4.6 Presiona Aceptar y verás como se escribe nuevamente el valor 1500 en la celda A1.

33
www.todoexcel.com

Excel 2.007
1. Vamos a grabar la macro
1.1 Vé a la ficha Programador > Grabar macro

1.2 Se abrirá un cuadro de diálogo como el que se muestra a continuación.

1.4 Donde dice Nombre de la macro escribe MiPrimeraMacro. Ese será el nombre que le daremos a
nuestra macro.
1.5 Presiona Aceptar y la macro comenzará a grabar todo lo que hagas.
1.6 Posiciónate en la celda A1 y escribe el valor 1500.

2. Detener la grabación
Para terminar de grabar, debemos presionar el botón de detener grabación

3. Veamos como quedó la macro grabada


3.1 Accede al editor de visual basic con ALT+F11.
3.2 Debes hacer clic en Módulo1 para visualizar el código de la nueva macro grabada. Verás una
pantalla como la siguiente:

34
www.todoexcel.com

* Podrás observar que el código que se grabó es distinto que el código que habíamos escrito cuando
hicimos la macro manualmente. Más adelante en este mismo capítulo analizaremos y explicaremos
las diferencias.

4. Vamos a probar la macro


4.1 Vuelve a Excel con ALT+F11.
4.2 Verás que la celda A1 tiene el valor 1500 porque lo escribimos mientras grabábamos la macro.
4.3 Para ver como opera la macro borra dicho valor.
4.4 Abre el menú de macros presionando ALT+F8
4.5 Selecciona MiPrimeraMacro (no te confundas con Hoja1.MiPrimeraMacro que es la que hicimos
primero).
4.6 Presiona Aceptar y verás como se escribe nuevamente el valor 1500 en la celda A1.

2.4.3. Resumen

Nuestro objetivo fue grabar una macro que escribiera el valor 1500 en la celda A1 de la Hoja1 de
Excel. Los pasos que seguimos para utilizar la grabadora de macros fueron:

1. Creamos un nuevo libro Excel y lo guardamos con el nombre Libro1.


2. Desde el menú Herramientas > Macros seleccionamos la opción Grabar nueva macro y la macro
comenzó a grabar.
3. En la celda A1 del Libro 1 escribimos el valor 1500.
4. Detuvimos la grabación desde el menú Herramientas > Macros > Detener grabación.
5. Borramos la celda A1 (quedó con el valor 1500 cuando grabamos la macro).
6. Ejecutamos la macro desde el menú Herramientas > Macro > Macros. Seleccionamos de la lista
MiPrimeraMacro y luego Aceptar.
7. El resultado es que en la celda A1 se vuelve a escribir el valor 1500, que fue justamente lo que
grabamos con la macro.

35
www.todoexcel.com

Recuerda: al utilizar la grabadora no accedemos en ningún momento al editor de macros ni tenemos


que escribir código. Todo lo hace automáticamente la grabadora.

2.4.4. Escrita vs. grabada

Llegados a este punto, interesa ver las diferencias entre la macro escrita manualmente y la grabada
automáticamente.

¿Qué fue lo que hicimos hasta aquí?


Hicimos una macro que escribió el valor 1500 en la celda A1 de la Hoja1 de Excel.
Pero recuerda que hicimos esta macro 2 veces:
A. la primera vez la escribimos manualmente
B. la segunda vez la grabamos directamente con la grabadora de macros.

Denominemos Macro Escrita a la primera y Macro Grabada a la segunda para diferenciarlas.


Aunque al ejecutarlas el resultado final fue el mismo, hay algunas diferencias que debemos estudiar.

A continuación veamos una tabla comparativa de ambos métodos utilizados para crear la macro que
nos permitirá revisar el proceso y obtener unas valiosas conclusiones. Las diferencias son analizadas
a continuación:

36
www.todoexcel.com

Excel 2.003

MACRO ESCRITA MACRO GRABADA

1. Como la hicimos 1. Como la hicimos

1.1 Creamos un Libro Excel llamado 1.1 Utilizamos el mismo Libro1.xls


Libro1. 1.2 Encendimos la grabadora de macros desde
1.2 Abrimos el editor de macros con el menú Herramientas > Macro > Grabar nueva
ALT+F11. macro
1.3 En VBAProject (Libro1) hicimos doble 1.3 Nos posicionamos en la celda A1 de la
clic en Hoja1 (Hoja1) Hoja1 y escribimos el valor 1500.
1.4 Escribimos el código de la macro. 1.4 Detuvimos la grabación de la macro desde
el menú Herramientas > Macro > Detener
grabación.

2. El código de la macro 2. El código de la macro


El código que escribimos fue:
2.1 Con ALT+F11 accedemos al editor de macros.
' Esta macro escribe el valor 1500 en la 2.2 El código que se grabó automáticamente fue el
celda A1 siguiente:
Sub MiPrimeraMacro()
Range("A1").Value=1500 Sub MiPrimeraMacro()
End Sub '
' MiPrimeraMacro Macro
' Esta macro escribe el valor 1500 en A1

Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub

Recuerda que este código quedó en VBAProject


(Libro1) > Módulo1

3. Ejecución de la macro 3. Ejecución de la macro


Posicionados sobre cualquier línea del código Para comprobar que funciona, primero borramos el
anterior presionamos F5. Luego con ALT+F11 valor 1500 de la celda A1, Hoja1 (lo habíamos escrito
volvimos a la hoja de Excel y comprobamos para grabar la macro). Luego ejecutamos la macro
que en la celda A1 de la Hoja1 se escribió el desde el menú Herramientas > Macro > Macros.
valor 1500. Seleccionamos de la lista MiPrimeraMacro y luego
Aceptar. De esta forma se volvió a escribir el valor
1500 en la celda A1 de la Hoja1.

En la sección siguiente analizamos el porqué de estas diferencias.

37
www.todoexcel.com

Excel 2.007

MACRO ESCRITA MACRO GRABADA

1. Como la hicimos 1. Como la hicimos

1.1 Creamos un Libro Excel llamado 1.1 Utilizamos el mismo Libro1.xls


Libro1. 1.2 Encendimos la grabadora de macros desde
1.2 Abrimos el editor de macros con la ficha Programador > Grabar macro
ALT+F11. 1.3 Nos posicionamos en la celda A1 de la
1.3 En VBAProject (Libro1) hicimos doble Hoja1 y escribimos el valor 1500.
clic en Hoja1 (Hoja1) 1.4 Detuvimos la grabación desde la ficha
1.4 Escribimos el código de la macro. Programador > Detener grabación

2. El código de la macro 2. El código de la macro


El código que escribimos fue:
2.1 Con ALT+F11 accedemos al editor de macros.

' Esta macro escribe el valor 1500 en la 2.2 El código que se grabó automáticamente fue el
celda A1 siguiente:
Sub MiPrimeraMacro()
Range("A1").Value=1500 Sub MiPrimeraMacro()
End Sub '
' MiPrimeraMacro Macro
' Esta macro escribe el valor 1500 en A1

Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub

Recuerda que este código quedó en VBAProject


(Libro1) > Módulo1

3. Ejecución de la macro 3. Ejecución de la macro


Posicionados sobre cualquier línea del código Para comprobar que funcionamiento, primero
anterior presionamos F5. Luego con ALT+F11 borramos el valor 1500 de la celda A1, Hoja1 (lo
volvimos a la hoja de Excel y comprobamos habíamos escrito para grabar la macro). Luego
que en la celda A1 de la Hoja1 se escribió el ejecutamos la macro desde la ficha Programador >
valor 1500. Macros. Seleccionamos de la lista MiPrimeraMacro y
luego Aceptar. De esta forma se volvió a escribir el
valor 1500 en la celda A1 de la Hoja1.

En la sección siguiente analizamos el porqué de estas diferencias.

38
www.todoexcel.com

2.4.5. Diferencias

En nuestro ejemplo, tanto la Macro Escrita como la Macro Grabada logran la misma función de
escribir el valor 1500 en la celda A1 de la Hoja1. Sin embargo, si te has fijado bien en los 3 puntos
de la tabla de la sección anterior verás que hay algunas diferencias. El análisis de las mismas nos
permitirá ver las ventajas y desventajas de escribir una macro de forma manual o de grabarla con la
grabadora de macros.

Volvamos a poner las tablas comparativas, pero esta vez comentando las diferencias:

MACRO ESCRITA MACRO GRABADA


1. Como la hicimos 1. Como la hicimos

Desventaja: escribir una macro Ventaja: no es necesario conocer código de


manualmente implica conocer los objetos programación. La grabadora lo escribe
y propiedades de excel. En este caso automáticamente.
teníamos que saber previamente que
existía un objeto Range y una propiedad
Value, y también debíamos saber como
era la sintaxis de los mismos >
Range("A1").Value=1500. Para un
principiante esto puede ser difícil de
saber.

2. El código de la macro 2. El código de la macro

Ventaja: nuestra macro escrita quedó Desventaja: generalmente, cuando utilizamos la


con 1 sola instrucción principal, la que grabadora, el código que se escribe automáticamente
indica poner el valor 1500 en la celda suele ser reduntante y excesivo. Recordemos el
A1. código que grabó la macro:

' Esta macro escribe el valor 1500 en la Sub MiPrimeraMacro()


celda A1 ' Esta macro escribe 1500 en A1
Sub MiPrimeraMacro() Range("A1").Select
Range("A1").Value=1500 ActiveCell.FormulaR1C1 = "1500"
End Sub Range("A2").Select
End Sub

La macro grabó nuestras acciones pero utilizó 3 líneas


de código (solo contamos las que están entre Sub y
End Sub). Vemos que el código es más largo y que
aparecen nuevos objetos, propiedades y métodos. La
macro se interpreta así:

Primero seleccionar el rango A1. Luego en la celda


activa introducir una fórmula con el valor 1500.
Finalmente, como presionamos Enter, se posiciona en
la celda siguiente, la A2.

El objetivo fue logrado, pero la macro generó más


código del necesario.

El método de la macro grabada parece el preferible, porque lo hace todo de forma automática y nos
evita tener que escribir un código que en esta etapa nos resulta desconocido. Sin embargo, en la
39
www.todoexcel.com

seeción siguiente veremos que el método a utilizar dependerá de cada situación particular. Además,
hay muchas cosas que la grabadora de macros no puede hacer.

2.4.6. Conclusión

En las 2 secciones anteriores vimos dos tablas comparativas de los 2 métodos que tenemos para
crear una macro:

1. El método de escribir manualmente la macro


2. El método de grabar la macro automáticamente.

En la primera tabla se mostró el proceso de elaborar cada una y en la segunda tabla se mostraron
las diferencias, con sus ventajas y desventajas.

A modo de conclusión podemos decir que la diferencia fundamental está en el código generado.
Aunque las macros grabadas son más sencillas porque no requieren conocer el código necesario
(objetos, propiedades y métodos) sin embargo la cantidad de código que generan suele ser más
largo (más líneas).

A pesar que el resultado final es el mismo, un código con más líneas siempre es menos deseable que
un código con menos líneas. Esto es así porque un código largo es más difícil de controlar y de
comprender y a la larga puede ser más propenso a que genere errores o disminuya la velocidad de
ejecución de la macro.

Recordemos los dos códigos generados (omitimos los comentarios del comienzo del código).
Recuerda que lo que nos interesa son las líneas entre Sub y End Sub. Ambas macros logran su
cometido de escribir el valor 1500 en la celda A1. Sin embargo fíjate que en la macro escrita solo
utilizamos una línea de código mientras que la macro grabada generó 3 líneas de código (solo
consideramos las líneas entre Sub y End Sub).

Macro escrita

Sub MiPrimeraMacro()
Range("A1").Value=1500
End Sub

Como conocíamos el objeto y la propiedad fuimos directamente al grano. Al objeto Rango A1 le


aplicamos la propiedad Valor 1500. Solo una línea de código. Rápido y certero.

Macro grabada

Sub MiPrimeraMacro()
Range("A1").Select
ActiveCell.FormulaR1C1 = "1500"
Range("A2").Select
End Sub

40
www.todoexcel.com

La macro grabada grabó todas nuestras acciones en 3 líneas de código. Cuando seleccionamos el
rango A1 se generó la 1º línea de código, cuando escribimos el valor 1500 se generó la 2º línea de
código y cuando dimos al "enter" luego de escribir el valor 1500 se generó la 3º línea de código.

En la macro grabada verás un nuevo objeto, ActiveCell (celda activa) y una nueva propiedad del
mismo, FormulaR1C1 (fórmula de la celda).

Nuestra recomendación respecto a las macros escritas y grabadas ya te la dimos al comienzo del
capítulo.

Lo mejor es escribir las macros manualmente y utilizar la grabadora en aquellos casos donde no
tenemos ni idea sobre cuál es el código que necesitamos o como es el nombre del objeto, propiedad
o método.

Lo usual es que si estás comenzando solo utilizarás la grabadora, y en la medida que vas conociendo
el lenguaje VBA, con sus distintos objetos, propiedades y métodos ya te irás animando a escribir tus
propias macros. Sin embargo, como los OPM son tantos, siempre se requiere de la grabadora para
descubrirlos.

A esta altura tu puedes pensar que todavía no tienes idea de ningún código. Sin embargo hemos
preparado este curso para hacerte la vida lo más fácil posible. La buena noticia es que este curso
tiene una 2º parte con una gran cantidad de macros ya escritas.

Así que nuestra recomendación final es que primero leas la 1º parte de este curso (la teoría), por lo
menos un par de veces, hasta que te encuentres cómodo con los conceptos. Luego ya podrás leer la
2º parte del curso, que tiene innumerable cantidad de macros ya escritas, comentadas y listas para
que puedas copiar, pegar y utilizar en tus desarrollos Excel.

Como instancia final, esperamos que con lo que has aprendido aquí junto con la ayuda de la
grabadora de macros, ya puedas crear tus propios códigos, aparte de los que nosotros te facilitamos
en la 2º parte del curso.

41
www.todoexcel.com

2.5. EJEMPLOS DE MACROS

¿Recuerdas el código que habíamos escrito para nuestra primera macro? El objetivo que
perseguíamos era escribir el valor 1500 en la celda A1 de la hoja1. Repasemos rápidamente todo lo
que habíamos hecho para escribir la macro:

1. Creamos un nuevo libro Excel y lo guardamos con el nombre Libro1.

2. Accedimos el Editor de Visual Basic con las teclas ALT+F11.

3. En la Ventana Proyecto, en VBAProject (Libro1), hicimos doble clic en Hoja1 (Hoja1).

4. En la Ventana de Código escribimos textualmente el siguiente código:

' Esta macro escribe el 1500 en la celda A1


Sub MiPrimeraMacro()
Range("A1").Value = 1500
End Sub

5. Finalmente ejecutamos la macro desde el menú de Excel Herramientas > Macros > Macro y luego
seleccionando MiPrimeraMacro desde la lista de nombres y dando clic a Aceptar.

Recordemos nuevamente las reglas de escritura de la mayoría de las macros:

1. La 1º línea de la macro es un comentario que no tiene efecto sobre la misma y que usamos para
nuestra referencia. Siempre comienza con el signo '. En nuestra macro:
' Esta macro escribe el 1500 en la celda A1

2. La 2º línea de la macro es el nombre, que comienza con la palabra Sub, seguida del nombre que
querramos ponerle sin espacios intermedios y finalizando con 2 paréntesis de apertura y cierre (). En
nuestra macro:
Sub MiPrimeraMacro()

3. La 3º línea era la instrucción principal que es donde nos referimos a los objetos, propiedades y
métodos. Todo esto va escrito entre Sub y End Sub y podríamos tener muchas líneas de código si la
macro fuera más compleja. Siempre se hace referencia al objeto y luego se le asignan propiedades o
métodos.

En nuestro caso el objeto es el rango A1 > Range("A1") y la propiedad que le asignamos fue el valor
1500 > Value=1500

La línea de la macro quedó así:

42
www.todoexcel.com

Range("A1").Value = 1500

4. La 4º línea representaba el final de la macro. Todas las macros se finalizan con la instrucción End
Sub.

También vimos que la macro se puede grabar automáticamente, con la grabadora de macros, pero
que preferimos escribirla para utilizar menos líneas de código y de paso aprender mejor los
fundamentos del código.

En la 2º parte de este curso están las macros más importantes que podrás necesitar, escritas,
comentadas y listas para que puedas copiar, pegar y adaptar en tus propios desarrollos. De todas
formas, como adelanto, veremos algunas macros nuevas aquí como para ir calentado motores.

2.5.1. Macro 1

Escribamos manualmente una nueva macro ahora:

1. Crea un nuevo libro Excel y guárdalo con el nombre Libro1.


2. Accede al Editor de visual basic con las teclas ALT+F11
3. Inserta un nuevo Módulo desde el menú Insertar > Módulo
4. Dentro del módulo escribe textualmente el siguiente código:

' Esta macro muestra un texto en una ventana emergente


Sub MostrarTexto()
Msgbox "Manual de Macros TodoExcel"
End Sub

5. Puedes ejecutar esta macro rápidamente posicionándote en cualquiera de sus líneas de código y
luego presionando la tecla F5 para ver lo que sucede.
También puedes ejecutarla volviendo a Excel con ALT+F11 y desde el menú Herramientas > Macros
> Macro, eligiendo de la lista la macro MostrarTexto y luego Aceptar.

6. Esta macro utiliza la instrucción Msgbox que sirve para abrir una ventana con la información que
le indiquemos. Más adelante verás como puedes mostrar en esa ventana información de celdas Excel
u otros resultados. De momento solo hacemos que muestre el texto que indicamos entre comillas.

Recuerda que esto es tan solo un adelanto. En la 2º parte de este curso están las macros más
importantes que podrás necesitar, escritas, comentadas y listas para que las puedas copiar, pegar
y adaptar en tus propios desarrollos.

43
www.todoexcel.com

2.5.2. Macro 2

Escribamos manualmente otra nueva macro ahora:

1. Puedes utilizar el mismo Libro1 de la macro anterior.


2. Accede al Editor de visual basic con las teclas ALT+F11
3. Puedes utilizar el mismo Módulo de la macro anterior
4. Dentro del módulo escribe textualmente el siguiente código

' Esta macro oculta las líneas de división de las celdas


Sub OcultarLineas()
ActiveWindow.DisplayGridlines = False
End Sub

5. Puedes ejecutar esta macro rápidamente posicionándote en cualquiera de sus líneas de código y
luego presionando la tecla F5 para ver lo que sucede.
También puedes ejecutarla volviendo a Excel con ALT+F11 y desde el menú Herramientas > Macros
> Macro, eligiendo de la lista la macro OcultarLineas y luego Aceptar.

6. Verás que la macro elimina las líneas de división de las celdas de la hoja activa (algo que también
puedes hacer desde Excel, menú Herramientas > Opciones > pestaña Ver > casilla Líneas de
división).

Esta macro utiliza el objeto ActiveWindow (ventana activa).


Luego le asigna la propiedad DisplayGridlines=False (mostrar líneas de división=falso)

Si quisieras volver a ver las líneas de división puedes cambiar la propiedad False por True, tal que:

ActiveWindow.DisplayGridlines = True

Recuerda que esto es tan solo un adelanto. En la 2º parte de este curso están las macros más
importantes que podrás necesitar, escritas, comentadas y listas para que puedas copiar, pegar y
adaptar en tus propios desarrollos.

2.5.3. Macro 3

Escribamos manualmente otra nueva macro ahora:

1. Puedes utilizar el mismo Libro1 de la macro anterior.


2. Accede al Editor de visual basic con las teclas ALT+F11
3. La escribiremos en un objeto hoja, así que has doble clic en Hoja1(Hoja1)
4. Escribe textualmente el siguiente código:

' Esta macro copia un rango a la celda activa


Sub CopiaRango()
Range("A1:A5").Copy Destination:=ActiveCell
End Sub
44
www.todoexcel.com

5. Para probar esta macro vuelve a Excel con ALT+F11 y escribe algunos números o palabras a
gusto en el rango A1:A5. Por ejemplo:

5.1 Posiciónate en la celda C1


5.2 Desde el menú Herramientas > Macros > Macro, elige de la lista la macro CopiaRango y luego
Aceptar.
5.3 El resultado será que el rango A1:A5 se copiará a partir de la celda C1 que era la celda activa al
ejecutar la macro.

6. Esta macro utiliza algunas OPM (objetos, propiedades y métodos) nuevos:

Range("A1:A5")
El objeto Range ya lo conocíamos...

Copy
Este es un método (una acción)

Destination:=ActiveCell
Este es otro objeto. Destination se suele utilizar luego de un Copy y ActiveCell hace referencia a la
celda activa.

Recuerda que esto es tan solo un adelanto. En la 2º parte de este curso están las macros más
importantes que podrás necesitar, escritas, comentadas y listas para que puedas copiar, pegar y
adaptar en tus propios desarrollos.

45
www.todoexcel.com

2.6. EL EDITOR DE MACROS

Es importante reconocer bien las principales opciones y secciones que tiene el editor de macros
(también conocido como editor de Visual Basic), dado que será la herramienta que utilizaremos para
escribir las macros. En esta sección veremos las distintas partes del editor y estudiaremos sus
principales características.

2.6.1. Cómo acceder

El Editor de Visual Basic es la aplicación que trae Excel desde donde se escriben y guardan las
macros. Tienes 3 formas de acceder al editor:

La forma más rápida de acceder al editor es presionando ALT+F11

También tienes otras formas de acceder:


Excel 2.003 o inferior: desde el menú Herramientas > Macros > Editor de Visual Basic
Excel 2.007: desde la ficha Programador > Visual Basic

Cuando accedas al editor verás algo como similar a esto:

Las principales ventanas de editor son:


Proyecto (arriba a la izquierda)
Propiedades (abajo a la izquierda)
Inmediato (arriba a la derecha)
46
www.todoexcel.com

Código (abajo a la derecha)

No importa si no ves todas las ventanas (se pueden mostrar u ocultar desde el menú "Ver"). En las
secciones siguientes te explicaremos la utilidad de cada una de estas ventanas.

2.6.2. Ventana Proyecto

Veamos una foto para ver como se ve la ventana de Proyecto. Si no la puedes visualizar esta
ventana puedes activarla desde el menú Ver > Explorador de proyectos, dentro del editor de visual
basic.

En la ventana de Proyecto hay carpetas donde se guardarán y escribirán las macros. Hemos
presionado el botón Alternar Carpetas para que se ordenen mejor los elementos, como se ve a
continuación:

Proyectos
En un primer nivel tenemos los proyectos. Por regla general, cada libro excel tiene asociado un
proyecto. Por ejemplo, si creas un nuevo libro Excel desde el menú de Excel Archivo > Nuevo y
vuelves al editor de macros (ALT+F11), verás que aparece el proyecto VBAProject(Libro1). Dentro
del paréntesis aparece el nombre de tu libro excel y lo de VBAProject podrás cambiarlo luego.

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.

Carpetas
En un segundo nivel tenemos 3 carpetas:
- Microsoft Excel Objetos
- Formularios

47
www.todoexcel.com

- Módulos.

Veamos cada una de ellas:

1. Microsoft Excel Objetos


En esta carpeta vemos que cuelgan dos elementos:

1.1 ThisWorkbook siempre está presente. Si escribimos una macro aquí la misma afectará a todo el
libro.

1.2 Hoja1(Hoja1) hace referencia las hojas de Excel (habrá 1 por cada hoja de nuestro libro). Si
escribimos una macro aquí la misma solo afectará a la hoja en cuestión.

2. Formularios
Los formularios son más conocidos como UserForms. Si no lo visualizas puedes agregarlos desde el
menú Insertar > Userform.

2.1 Dentro de la carpeta de Formularios vemos un elemento llamado Userform1.


Todo el tema de formularios lo veremos con más en detalle en el capítulo "Formularios".

3. Módulos
Los módulos sirven para escribir macros a nivel genérico, sin estar relacionadas a la hoja o libro en
particular. Si no visualizas ninguno puedes agregarlos desde el menú Insertar > Módulo.

3.1 Dentro de la carpeta de Módulos vemos que hay un elemento llamado Módulo1. Podemos
insertar tantos módulos como necesitemos. En los módulos podemos escribir macros que operan de
forma genérica, sin distinguir entre hojas o libros.

Haciendo doble clic izquierdo en cualquiera de estos objetos verás que se habilita la Ventana de
Código de la izquierda (una hoja en blanco grande). En la misma es donde se escriben las macros.

Recuerda: antes de escribir una macro debes evaluar donde hacerlo.


1. Si es una macro que solo debe afectar una hoja en particular escríbela en los objetos de Hoja, en
el nombre de Hoja correspondiente.
2. Si la macro debe afectar a todo un libro en particular escríbela en el objeto ThisWorkbook. Estas
suelen ser macros que se ejecutan al abrir, cerrar o guardar el libro.
3. Si la macro es de tipo genérica escríbela en un Módulo.
4. Si quieres hacer un formulario utiliza el objeto Userform.

2.6.3. Ventana Propiedades

Veamos como se ve la Ventana Propiedades. Esta ventana se ubica en la parte inferior izquierda de
la pantalla. Si no la puedes visualizar puedes activarla desde el menú Ver > Ventana propiedades.

48
www.todoexcel.com

Cada objeto tiene sus propiedades. Por ejemplo, si hacemos doble clic en el objeto Módulo1 que
vimos en la sección anterior, podremos ver sus propiedades:

Algunos objetos tienen muchas propiedades (por ej. los Userforms) así que tenemos la opción de
ordenar lso mismos de forma alfabética o por categoría. El objeto Módulo1 solo tiene la propiedad
(Name)Módulo1. Si quisiéramos podríamos reemplazar el nombre de Módulo1 y asignar otro nombre
a gusto.

Consejo: en la medida que vamos insertando muchas macros en nuestro proyecto, conviene ir
creando nuevos módulos con nombres apropiados para mantener ordenadas nuestras macros.

El resto de las propiedades de los otros objetos escapa al alcance de esta sección, pero podrás ver
algunas en la 2º parte de este curso.

2.6.4. Ventana Código

Veamos una foto para ver como se ve la Ventana de Código. Cada vez que hagas doble clic izquierdo
en algún Objeto de la Ventana Proyecto se activará a la derecha la Ventana de Código. Si no la
puedes visualizar puedes activarla posicionándote en el Objeto en cuestión y luego desde el menú
Ver > Código.

Si todavía no has escrito ninguna macro verás la ventana de código en blanco. En nuestro ejemplo
hemos escrito 3 macros:

49
www.todoexcel.com

Esta ventana no tiene mayores complicaciones. Lo que interesa es más bién el código que
escribamos aquí. Puedes escribir todas las macros que quieras en esta ventana. Recuerda que el
mismo editor asignará automáticamente los colores al código y además separará con una línea
contínua cada macro.

En la medida que empecemos a escribir muchas macros, existe una forma rápida de movernos entre
ellas. Desde la lista desplegable de la parte superior derecha podremos ver la lista de macros
escritas. Haciendo clic en cualquiera de ellas el editor nos posicionará rápidamente en la misma.

50
www.todoexcel.com

2.6.5. Ventana Inmediato

Veamos como se ve la Ventana de Inmediato. Si no la puedes visualizar puedes activarla desde el


menú Ver > Ventana Inmediato.

La ventana inmediato sirve para escribir, ejecutar y probar un código macro rápidamente, sin tener
que armar toda la macro con la estrucuta que comentamos en secciones anteriores.

Por ejemplo, si quisiéramos averiguar la cantidad de hojas que tiene un Libro podríamos escribir la
siguiente macro en un módulo y ejecutarla:

Sub ContarHojas()
Dim N As Long
N= thisworkbook.Sheets.Count
Msgbox N
End Sub

De momento no importa los objetos, propiedades o métodos que hemos utilizado. Solo te queremos
mostrar que es una macro de 5 líneas. Ahora supongamos que solo nos interesa saber el número de
hojas del libro, pero no queremos armar toda la macro, solo nos interesa obtener el resultado.
Entonces, en la ventana inmediato podemos escribir:
?thisworkbook.Sheets.Count y al presionar Enter en la fila siguiente nos mostrará el número de
hojas que posee el libro. El signo ? al comienzo significa que estamos buscando conocer el resultado
de algo. El resultado final se vería así, suponiendo que el libro tiene 1 hoja:

Veamos otro ejemplo. Si el libro fue guardado, podríamos querer averiguar el directorio donde se
encuentra. Podríamos averiguarlo desde la Ventana Inmediato, escribiendo ?thisworkbook.Path y
presionando Enter. Al presionar Enter, en la fila siguiente se mostrará la ruta del libro, por lo que en
la Ventana Inmediato veremos algo así, suponiendo que el libro se encuentra guardado en ese
directorio:

51
www.todoexcel.com

En los 3 ejemplos anteriores buscábamos un resultado y anteponíamos el signo ? al comienzo de la


instrucción (buscábamos un nombre o un número). En otros casos podemos ejecutar una acción
directamente y por lo tanto escribimos la macro sin el signo ?. Por ejemplo, si queremos que en la
celda A1 aparezca el valor 100 lo podemos ejecutar desde la Ventana Inmediato como se ve a
continuación:

En la celda A1 de la Hoja activa de Excel aparecerá el valor 100.

Recuerda: desde la Ventana Inmediato puedes ejecutar macros de forma inmediata, como su
nombre lo indica. Pero dichas macros solo se ejecutan 1 vez al presiona enter y no quedan
disponibles en la lista de macros ni las puedes utilizar en tus desarrollos (asignándolas a botones o
formularios).

2.6.6. Proteger el código

Así como se pueden proteger los libros, las hojas y las celdas de Excel, también es posible proteger
con una contraseña el código de nuestras macros. Una vez que tengas tus macros escritas en el
editor puedes ir al menú Herramientas > Propiedades de VBAProject... y luego hacer clic en la
pestaña de Protección. Verás una ventana como la de la siguiente:

52
www.todoexcel.com

Para proteger tus macros sigue estos pasos:


1. Tilda la casilla Bloquear proyecto para su visualización
2. Escribe una Contraseña
3. Vuelve e escribir tu contraseña en Confirmar contraseña

De esta forma, cuando alguien acceda al editor, verá la ventana proyecto del libro pero no podrá ver
los objetos donde quedan escritas las macros (módulos, hojas y userforms). Si hace doble clic en el
Proyecto aparecerá una ventana solicitando la clave.

53
www.todoexcel.com

2.7. EJECUCION DE MACROS

En varias secciones de este curso te indicamos como se ejecuta una macro. En realidad hay muchas
formas de hacerlo, así que te las explicaremos a todas.

Dependiendo del caso te interesará ejecutar la macro desde un menú, desde un botón o incluso
ejecutarla automáticamente cuando ocurran determinados eventos, como ser al abrir, cerrar o
guardar el libro, activar o desactivar una hoja, etc. Este tipo de macros que se ejecutan
automáticamente al ocurrir alguno de los eventos mencionados se explica en el capítulo "Macros de
Eventos".

2.7.1. Desde el código

La forma más rápida de ejecutar una macro es desde el mismo código. Cuando terminas de escribir
una macro puedes posicionarte en cualquiera de sus líneas de código y presionar la tecla F5.
Recuerda que puedes acceder al código de las macros desde el editor de macros, con las teclas
ALT+F11.

2.7.2. Desde el menú

Otra forma de ejecutar una macro es desde el menú de macros, que lo puedes visualizar
presionando ALT+F8
Verás que se abre un cuadro como el siguiente:

Para ejecutar la macro:


1. Elige el Nombre de la macro de la lista

54
www.todoexcel.com

2. Clic en Ejecutar

En la parte inferior figura una lista desplegable donde puedes elegir si quieres listar las macros de
Todos los libros abiertos, solo las de Este libro o las de PERSONAL.XLS

PERSONAL.XLS es un libro excel que se abre automáticamente cada vez que abres Excel. Este libro
permanece oculto desde Excel, pero es posible verlo desde el editor de macros. Todas las macros
que escribas en PERSONAL.XLS siempre estarán disponibles cada vez que habras tus libros Excel. Es
una opción muy útil por si tienes macros que quieres utilizar en todos tus libros Excel (solo estárán
disponibles en tu PC).

2.7.3. Desde el teclado

Otra forma muy práctica de ejecutar una macro es desde el teclado. Esto también se conoce como
teclas de método abreviado. Para configurar las teclas con las cuales ejecutar debes hacer los
siguiente:

1. Ir al menú de macros presionando ALT+F8


2. Elegir el nombre de la macro de la lista y luego hacer clic en el botón Opciones.

55
www.todoexcel.com

3. Donde dice Tecla de método abreviado presiona la tecla MAYUSC y luego una letra. En nuestro
ejemplo la macro se ejecutará con Ctrl+Mayúsc+Q

Recuerda: la macro siempre se ejecuta con la tecla Ctrl+ la letra que tu escribas en la casilla. Sin
embargo, hay muchas combinaciones de Ctrl+Letra que ya están ocupadas por Excel (Ctrl+C copiar,
Ctrl+V pegar, Ctrl+X pegar, etc) y no se aconsejamos que utilices dichas combinaciones. Por eso lo
que se hace es presionar Mayúsc antes de la letra de tal forma que la macro se ejecutará con
Ctrl+Mayús+Letra y de esta forma no alterar las teclas de método abreviado por defecto de Excel.

2.7.4. Desde objetos

Muchas veces, y sobre todo cuando desarrolles aplicaciones en Excel, te interesará asignar macros a
objetos gráficos insertados en la hoja. Excel posee una gran cantidad de figuras y dibujos que
puedes insertar en la hoja.
56
www.todoexcel.com

Excel 2.003: desde el menú Ver > Barra de Herramientas > Dibujo. Esto muestra un menú como el
siguiente:

Excel 2.007: desde la ficha Insertar > Formas. Esto muestra un menú como el siguiente:

Si ya has insertado una figura en tu hoja Excel, podrás asociarle una macro siguiendo estos pasos:

1. Haz clic izquierdo en la figura para desplegar su menú de opciones.


2. Elige la opción Asignar macro

3. Al elegir la opción de Asignar macro abrirás el el menú de macros. Selecciona de la lista la macro
de tu interés luego Aceptar.

57
www.todoexcel.com

4. Finalmente la figura quedará con la macro asignada, de tal forma que cada vez que hagas un clic
encima de la figura, se ejecutará la macro.

2.7.5. Desde botones

(solo para Excel 2.000 a 2.003)

También es posible crear nuevos botones para la barra de herramientas de Excel y asignarle macros
a los mismos. Para hacerlo sigue estos pasos:

1. Ir al menú Ver> Barra de herramientas > Personalizar.


1.1 Desde la pestaña Comandos, en la lista de Categorías, elegimos la opción Macros.
1.2 A la derecha aparecerá una opción de Personalizar botón sobre la cual debemos hacer clic
izquierdo y luego arrastar y soltar ese botón a la barra de botones de Excel.

58
www.todoexcel.com

2. Es importante que mantengas abierto el cuadro de Personalizar, porque si no no podrás editar el


botón. Si hacemos clic izquierdo sobre el botón se desplegará el menú de opciones. Las opciones
más importantes son las de Cambiar imagen del botón y la de Asignar macro. Esta última opción
nos permitirá abrir el cuadro de diáogo con la lista de macros creadas para asignarle una macro
determinada (visto en la sección anterior).

59
www.todoexcel.com

2.7.6. Automáticamente

Las macros también se pueden ejecutar automáticamente. Por ejemplo, se pueden hacer macros que
se ejecuten cada cierto tiempo o que se ejecuten solas cada vez que el usuario hace algo como abrir,
cerrar, guardar un libro, activar o desactivar una hoja, etc.

Este tema se trata con más detalle en el siguiente capítulo Macros de Eventos.

60
www.todoexcel.com

2.8. MACROS DE EVENTOS

Como decíamos en la sección anterior, las macros también se pueden ejecutar automáticamente. En
este caso se las denomina macros de evento, porque ante un determinado evento o acción realizada
por el usuario, la macro se ejecuta automáticamente.

En las secciones siguientes repasaremos los principales eventos que pueden disparar una macro
automáticamente. Existen una gran cantidad de macros de evento así que solo estudiaremos las más
utilizadas.

2.8.1. Eventos de libros

Los eventos de libros permiten disparar automáticamente una macro cuando suceden determinadas
acciones a nivel del libro excel en cuestión, por ejemplo al abrirlo, guardarlo, cerrarlo, imprimirlo,
etc.

Instrucciones para insertar una macro de evento a nivel libro:

1. Las macros de eventos se deben escribir en la carpeta ThisWorkbook del editor de macros.

2. Luego en la primera lista desplegable de la ventana de macros elegimos la opción Workbook.

61
www.todoexcel.com

3. Finalmente, en la lista desplegable de la derecha veremos todos los eventos de libro que podemos
utilizar para disparar nuestra macro.

4. Por ejemplo, si haces clic en la opción Activate, verás que en la ventana de macros se escribe
automáticamente el siguiente código:

Private Sub Workbook_Activate()

End Sub

Al seleccionar una macro de vento el editor escribe automáticamente la primera y útlima línea de su
código (no debes modificar esto). Luego podrás escribir tu código macro entre esas líneas. En este
caso, la macro que escribas se ejecutará cada vez que actives el libro excel en cuestión. Por ejemplo,
puedes hacer una macro que muestre un mensaje de saludo cada vez que abres el libro:

62
www.todoexcel.com

Entonces, cada vez que abras el libro, la macro se ejecutará automáticamente y verás el saludo:

En el caso de las macros de evento, siempre aparece la palabra Private. Eso significa que esa macro
no la podrás ver en la lista del menú de macros. Esto es así porque la macro no se puede ejecutar
manualmente, si no que se ejecuta automáticamente cuando ocurre el evento, en este caso cuando
se activa el libro excel en cuestión.

Existen más de 20 macros de evento a nivel libro. Puedes insertarlas siguiendo las instrucciones
dadas al comienzo. Las más importantes son:

Private Sub Workbook_BeforeClose(Cancel As Boolean)


' El código que escribas aquí se ejecutará automáticamente al cerrar el libro
End Sub

Private Sub Workbook_BeforePrint(Cancel As Boolean)


' El código que escribas aquí se ejecutará automáticamente al imprimir el libro
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)


' El código que escribas aquí se ejecutará automáticamente al guardar el libro
End Sub

Private Sub Workbook_Open()


'El código que escribas aquí se ejecutará automáticamente al abrir el libro
End Sub

63
www.todoexcel.com

2.8.2. Eventos de hojas

Los eventos de hojas permiten disparar automáticamente una macro cuando suceden determinadas
acciones a nivel de hojas excel, por ejemplo al activarla, desactivarla, calcularla, etc.

Instrucciones para insertar una macro de evento a nivel hoja:

1. Las macros de eventos se deben escribir en la carpeta Hoja1(Nombre) del editor de macros. Fíjate
que Hoja1 identifica el número de hoja de Excel y (Nombre) será el nombre que tenga asignado
dicha hoja en Excel. Por ejemplo, si en tu Excel la primera hoja se llama "Gastos", en el editor verías
Hoja1(Gastos).

En nuestro caso tenemos Hoja1(Hoja1). Al hacer doble clic en dicha carpeta, la macro que
escribamos solo afectará a dicha hoja.

2. Luego en la primera lista desplegable de la ventana de macros elegimos la opción Worksheet.

3. Finalmente, en la lista desplegable de la derecha veremos todos los eventos de hoja que podemos
utilizar para disparar nuestra macro automáticamente.

64
www.todoexcel.com

4. Por ejemplo, si haces clic en la opción Activate, verás que en la ventana de macros se escribe el
siguiente código:

Private Sub Worksheet_Activate()

End Sub

Al seleccionar una macro de evento el editor escribe automáticamente la primera y útlima línea de
su código (no debes modificar esto). Luego podrás escribir tu código macro entre esas líneas. En
este caso, la macro que escribas se ejecutará cada vez que actives la hoja excel en cuestión. Por
ejemplo, puedes hacer una macro que muestre un mensaje de saludo cada vez que activas la hoja:

Entonces, cada vez que actives la hoja, la macro se ejecutará automáticamente y verás el saludo:

En el caso de las macros de evento, siempre aparece la palabra Private. Eso significa que esa macro
no la podrás ver en la lista del menú de macros. Esto es así porque la macro no se puede ejecutar
manualmente, si no que se ejecuta automáticamente cuando ocurre el evento, en este caso cuando
se activa la hoja excel en cuestión.
65
www.todoexcel.com

Existen unas 9 macros de evento a nivel hoja. Puedes insertarlas siguiendo las instrucciones dadas al
comienzo. Las más importantes son:

Private Sub Worksheet_Activate()


' El código que escribas aquí se ejecutará automáticamente al activar la hoja
End Sub

Private Sub Worksheet_Calculate()


' El código que escribas aquí se ejecutará automáticamente al calcular la hoja
End Sub

Private Sub Worksheet_Deactivate()


' El código que escribas aquí se ejecutará automáticamente al desactivar la hoja
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)


' El código que escribas aquí se ejecutará automáticamente al moverte entre las celdas de la hoja
(cada vez que seleccionas y te posicionas en una nueva celda)
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)


' El código que escribas aquí se ejecutará automáticamente al producirse un cambio en la hoja (por
ejemplo al introducir un dato en una celda, seleccionar una opción de una lista desplegable, etc.)
End Sub

66
www.todoexcel.com

2.9. FORMULARIOS

Un Formulario (o su denominación en inglés Userform) se utiliza para crear un Cuadro de Diálogo


donde el usuario puede introducir información, o realizar otras operaciones. Al ejecutar muchas de
las opciones del menú de Excel se abren formularios. Por ejemplo, desde el menú Herramientas >
Opciones se abre un formulario como el siguiente, desde donde se pueden activar o desactivar
distintas opciones de Excel.

Este formulario es muy completo y posee pestañas en la parte superior, casillas de selección
(cuadraditos con tildes), casillas de opciones (círculos con un punto dentro) y listas desplegables
(lista con una flechita que despliega distintas opciones).

También podemos crear nuestros propios formularios como se ve a continuación.

67
www.todoexcel.com

Los Userforms se utilizan mucho para crear aplicaciones Excel que luzcan de forma profesional y
permitan al usuario introducir datos o elegir opciones de una forma guiada y más intuitiva.

En este capítulo aprenderemos como construir nuestros propios Userforms !

2.9.1. Crear un formulario

Para crear un Userform debemos hacer lo siguiente:

1. Abrir el editor de macros (por ejemplo, con CTRL+F11).


2. Insertar un objeto Userform. Esto podemos hacerlo fácilmente:
2.1 Seleccionamos el Libro Excel donde trabajaremos, en nuestro caso VBAProject (Libro2).
2.2 Hacemos clic derecho en el mismo y elegimos la opción Insertar > Userform
2.3 Como se ve en la fotografía, veremos que aparece un objeto Userform1 que cuelga de la carpeta
Formularios

68
www.todoexcel.com

3. En la ventana de Código de la derecha, veremos que aparece un Userform en blanco, sin


controles. Para abrir su Cuadro de Herramientas puedes hacerlo desde el menú Ver > Cuadro de
Herramientas. Ahí figuran los controles que podremos agregar dentro del Userform. Para añdir uno,
simplemente hacemos clic izquierdo en el control deseado y luego clic izquierdo dentro del Userform,
en el sitio donde querramos agregar el control.

La idea es que mediante estos controles podremos tanto capturar como enviar información o datos
desde o hacia las celdas de Excel respectivamente. También podemos asociar macros a los controles
que agreguemos al Userform (todo esto lo veremos en secciones siguientes).

Si te posicionas sobre los Controles del Cuadro de herramientas, verás que aparece su nombre.
Simplemente hacemos clic izquierdo en el control deseado y luego clic izquierdo en el Userform, en
el sitio donde querramos agregar el control. En nuestro caso hemos agregado algunos controles de
forma desordenada dentro del Userform.

69
www.todoexcel.com

2.9.2. Controles del formulario

Como veíamos anteriormente, tenemos una serie de controles para agregar al Userform, que los
podíamos visualizar desde el menú Ver > Cuadro de Herramientas.

Ahora explicaremos brevemente la utilidad de cada control. Los controles se explican en el mismo
orden que aparecen en el Cuadro de Herramientas y en la figura anterior (de izquierda a derecha y
de arriba hacia abajo).

Seleccionar objetos: sirve para seleccionar controles que hayamos insertado en el Userform.

Label (etiqueta): sirve para poner un título o un texto.


Ejemplo: podemos poner un texto del tipo "Complete las opciones a continuación" y ubicarlo en
cualquier sitio del Userform. También podemos agregar títulos o descripciones al resto de comandos
que agregemos en el Userform.

70
www.todoexcel.com

Textbox (cuadro de texto): 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 (cuadro combinado): sirve para que un usuario elija una opción de una lista.
Ejemplo: creamos una lista con los meses de Enero a Diciembre para que el usuario elija uno de
ellos.

ListBox (cuadro de lista): sirve para que un usuario rellene o elija varias opciones de una lista.
Ejemplo: creamos una lista con Regiones o Ciudades y el usario deberá elegir una o varias de ellas.

CheckBox (casilla de verificación): sirve para que un usuario active una determinada función.
Ejemplo: podemos hacer que al cerrar el Userform se imprima un reporte solo si la casilla de
selección está tildada.

OptionButton (botón de opción): sirve para que un usuario seleccione una opción determinada
entre varias posibilidades.
Ejemplo: queremos que el usuario indique si es de sexo Masculino o Femenino. De todas las
opciones solo se puede seleccionar una de ellas.

ToggleButton (botón de alternar): sirve para activar o desactivar alguna funcionalidad. Este
botón adopta el modo "Encendido" / "Apagado".
Ejemplo: queremos que el usuario defina su idioma, en modo encendido español y en modo apagado
inglés.

Frame (marco): sirve para agrupar elementos de un Userform (los elementos se deben ubicar
dentro del Frame).
Ejemplo: tenemos varias grupos de OptionButton y para distinguirlos los agrupamos con un Frame.
Si tenemos un grupo de opciones tipo masculino/femenino los agrupamos dentro de un frame. Si
luego tenemos otro gurpo de opciones del tipo Mayor de Edad / Menor de Edad los agrupamos
dentro de otro Frame.

71
www.todoexcel.com

CommandButton (botón de comando): es un simple botón que nos permite ejecutar acciones.
Ejemplo: un botón de Ayuda que ejecuta otro Userform con ayuda para el usuario.

TabStrip (barra de tabulaciones): en un mismo Userform se pueden crear distintas secciones.


Ejemplo: un userform con cuatro secciones: Norte, Sur, Este y Oeste. Dentro de cada sección
podemos ubicar distintos controles.

MultiPage (página múltiple): en un mismo Userform se pueden crear distintas páginas.


Ejemplo: un userform con 2 páginas: España y Resto del Mundo. Dentro de cada página podemos
ubicar distintos controles o distintas secciones.

ScrollBar (barra de desplazamiento): si tenemos una lista con muchos elementos el scrollbar nos
permite navegarlos.
Ejemplo: tenemos una lista con 150 países. Con el ScrollBar podemos subir y bajar por la lista de los
mismos utilizando las flechas de desplazamiento.

SpinButton (botón de número): permite aumentar o disminuir valores.


Ejemplo: tenemos una lista con tipos de interés y queremos que sean incrementados o disminuídos
en cantidades predeterminadas desde el SpinButton.

Image (imagen): permite introducir imágenes en el Userform.


Ejemplo: queremos introducir una fotografía como fondo del Userform para darle un aspecto más
profesional.

RefEdit (referencia): permite hacer referencia a una celda de Excel.


Ejemplo: queremos que el usuario seleccione un dato que fue introducido previamente en una celda
Excel.

Haciendo doble clic en cada control se abrirá una venta donde podremos escribir y asociarle una
macro. En la sección siguiente veremos un ejemplo simple sobre como crear un Userform paso a
paso.

72
www.todoexcel.com

Para ver como se verían estos controles dentro del Userform, vamos a crear un Userform que
contiene los 15 controles que se pueden agregar. Los hemos agregado en el mismo orden en que
aparecen en el Cuadro de Herramientas.

2.9.3. Ejemplo paso a paso

Antes de crear un Userform debemos pensar bien cual será su objetivo y cuáles son los controles
que utilizaremos.

Objetivo
Crear un Userform para que un usuario complete unos datos personales (Nombre, Edad y Fecha de
Nacimiento). Luego que el usuario complete sus datos, al apretar un botón, los mismos se volcarán
en una tabla de Excel.

Los controles que utilizaremos son:


Textbox: para que el usuario ingrese los datos
Label: para darle el nombre e los Textbox
CommandButton: para proceder con el ingreso de datos o cancelar

1. Creamos la tabla en la hoja Excel


Primero debemos crear un nuevo libro que contenga una tabla Excel donde se volcarán los datos del
Userform. Para esto creamos un nuevo libro llamado Datos.xls y creamos la siguiente tabla:

73
www.todoexcel.com

2. Creamos un Userform (UF)

Los UF se crean desde el editor de visual basic.


2.1 Abrimos el editor con ALT+F11
2.2 Seleccionamos Ver > Explorador de Proyectos para ver la lista de proyectos disponibles (los
mismos se verán en la parte izquierda de la ventana).
2.3 En la venta de Proyectos seleccionamos VBAProject(Datos.xls)
2.4 Desde el menú superior elegimos Insertar > Userform
2.5 Aparecerá un nuevo Userform vacío junto con el Cuadro de Herramientas (si el mismo no
aparece se puede abrir desde el menú Ver > Cuadro de Herramientas)

74
www.todoexcel.com

3. Nombramos el Userform

3.1 Abrimos las propiedades desde el menú Ver > Ventana Propiedades.
3.2 Hacemos doble clic en donde dice (Name) UserForm1, en la parte superior y tipeamos DatosUF,
luego Enter (este es el nombre con el que nos referiremos al Userform desde las macros).
3.3 El nombre del Userform cambió en la Ventana de Proyecto, pero el Userform mismo sigue
mostrando "Userform1" en su barra de su título. Para cambiarlo vamos a la Ventana Propiedades,
hacemos doble clic en Caption, escribimos Datos Personales (encima de Userform1) y luego Enter.
Ahora, la barra de título del Userform es más apropiada para nuestro propósito y para darle mejor
información al usuario.

4. Agregamos un Cuadro de Texto

Para permitir que el usuario ingrese datos en el Userform agregamos un control TextBox, desde el
Cuadro de Herramientas.
4.1 Hacemos clic en el control de TextBox y luego hacemos clic en el Userform, en la parte donde
querramos ubicarlo.

75
www.todoexcel.com

4.2 Con el nuevo TextBox seleccionado hacemos doble clic en la Ventana de Propiedades, propiedad
(Name), tipeamos la palabra UFNombre y luego enter (este es el nombre que le asignamos al objeto
para luego referirnos a él desde las macros).

4.3 Hacemos clic en una parte vacía del Userform, para volver a seleccionar todo el Userform.

5. Agregamos un Texto

Para ayudar al usuario a ingresar sus datos, debemos indicarle que es lo que debe introducir en el
Cuadro de Texto del Paso anterior. Podemos agregar una etiqueta de texto que describa la
información que se debe introducir.

5.1 En el Cuadro de Herramientas hacemos clic en el botón Label o Etiqueta

5.2 En el Userform hacemos clic a la izquierda del TextBox, para agregar la Etiqueta de texto.

76
www.todoexcel.com

5.3 Si fuera necesario podemos cambiar el tamaño de la etiqueta de texto o del Cuadro de Texto
para que no se superpongan. Se puede hacer clic en sus bordes (pequeños cuadraditos) y arrastrar
para cambiar su tamaño.

5.4. Seleccionamos la nueva etiqueta, hacemos doble clic en la propiedad Caption de la ventana de
propiedades, tipeamos Nombre y luego Enter.

5.5 Hacemos clic en alguna parte vacía del Userform para seleccionarlo y mostrar el cuadro de
herramientas.

6. Agregamos los Cuadros de Texto restantes

Agregamos los cuadros de texto y las etiquetas restantes (ya lo hicimos para el nombre así que
repetimos para Edad y Fecha de Nacimiento).

Repetimos los pasos 4 y 5 y agregamos:

* Un TextBox cuyo (Name) sea UFEdad, con una Etiqueta llamada "Edad"
* Un TextBox cuyo (Name) sea UFFecha, con una Etiqueta llamada "Fecha Nac."

Es muy importante que no olvides asignar bien los nombres (Name) a los Textbox, si no la macro
dará error. Puedes revisar los pasos 4 y 5 para recordar como hacerlo.

77
www.todoexcel.com

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 vacía del Userform para seleccionarlo y mostrar el cuadro de
herramientas.

7. Agregamos los Botones

Para permitir que el usuario ejecute una acción, se pueden agregar un Botón de comando. Nuestro
Userform tendrá un botón para Agregar los datos a la tabla Excel y otro botón para Cerrar el
Userform.

7.1 En el Cuadro de Herramientas hacemos clic en Botón de comando.


7.2 En el Userform hacemos clic en la parte inferior izquierda para agregar el botón.
7.3 Con el nuevo botón seleccionado hacemos doble clic en la propiedad (Nombre) de la Ventana de
Propiedades, tipeamos UFAgregar y luego enter.
7.4 Con el nuevo botón seleccionado hacemos doble clic en su propiedad Caption en la Ventana de
Propiedades, tipeamos Agregar y luego enter.
7.5 Hacemos clic en alguna parte vacía del Userform para seleccionarlo y mostrar el Cuadro de
Herramientas.
7.6 Repetimos los pasos anteriores para agregar otro Botón de comando llamado UFCerrar y nombre
"Cerrar".
7.8 Si fuese necesario podemos reubicar los botones dentro del Userform.

Es muy importante que no olvides asignar bien los nombres (Name) a los Botones de comando, si no
la macro dará error. Esto se explica en el paso 7.3 y luego deberás repetirlo para el otro botón, tal
cual se indica en el paso 7.6.

78
www.todoexcel.com

8. Agregamos el código al botón Agregar

8.1 Seleccionamos nuestro botón de comando Agregar


8.2 Desde el menú superior elegimos la opción Ver > Código. Esto abrirá una ventana donde
podremos escribir código macro para dicho objeto.
8.3 Donde titila el cursor escribimos lo siguiente:

Private Sub UFAgregar_Click()


Dim iFila As Long
Dim ws As Worksheet
Set ws = Worksheets(1)

'encuenta la siguiente fila vacía


iFila = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

'Verifica que se ingrese un nombre


If Trim(Me.UFNombre.Value) = "" Then
Me.UFNombre.SetFocus
MsgBox "Debe ingresar un nombre"
Exit Sub
End If

'copy the data to the database


ws.Cells(iFila, 1).Value = Me.UFNombre.Value
ws.Cells(iFila, 2).Value = Me.UFEdad.Value
ws.Cells(iFila, 3).Value = Me.UFFecha.Value

'limpa el formulario
Me.UFNombre.Value = ""
Me.UFEdad.Value = ""
Me.UFFecha.Value = ""
Me.UFNombre.SetFocus

End Sub

8.4 En el menú superior elegimos Ver > Objeto para regresar al Userform.

79
www.todoexcel.com

No te preocupes si no comprendes el código. Hay muchos objetos, propiedades y métodos nuevos.


Todos ellos se explican mejor en la 2º parte de este curso.

9. Agregamos el código al botón Cerrar

9.1 Seleccionamos el botón de comando Cerrar


9.2 En el menú superior elegimos Ver > Código
9.3 Donde titila el cursor escribimos el siguiente código:

Private Sub UFCerrar_Click()


Unload Me
End Sub

9.4 En el menú superior elegimos Ver > Objeto para regresar al Userform.

10. Permitir al usuario cerrar el Userform con la tecla ESC

10.1 Seleccionamos el botón de comando Cerrar


10.2 En la Ventana Propiedades cambiamos la propiedad Cancel a True.

Probar el Userform
Ya podemos probar el funcionamiento del Userform !

1. Hacemos clic en alguna parte vacía del Userform para seleccionarlo y mostrar el cuadro de
herramientas.
2. En el menú superior elegimos Ejecutar > Ejecutar Sub/Userform
3. Ahora podemos comenzar a completar el primer cuadro del Userform y escribimos un nombre, por
ej. Juan.
4. Presionamos la tecla TAB para movernos al siguiente cuadro de texto.
5. Cuando hemos completado todos los cuadros de texto, hacemos clic en el botón de Agregar y los
datos se completarán en la Tabla de Excel.
6. Podemos repetir los pasos anteriores e ir agregando distintos nombres con sus respectivos datos.
7. Hacemos clic en Cerrar para volver al editor de macros.

La tecla TAB sirve para moverse entre los distintos controles de un Userform. Si al presionar TAB el
orden del movimiento no es el correcto, es posible camabiarlo:

1. Clic derecho en una parte vacía del USerform


2. Elegimos Orden de Tabulación.
3. Seleccionamos el control de la lista y con los botones de Mover Arriba o Mover Abajo ajustamos el
orden.
4. Hacemos clic en OK
80
www.todoexcel.com

Asignar un botón para ejecutar el Userform

Podemos agregar un botón para que un usuario pueda ejecutar el Userform desde la hoja Excel.

1. Activamos Excel, libro Datos.xls, Hoja 1


2. En la Barra de Dibujo, en el menú Ver > Barras de Herramientas > Dibujo hacemos clic en una
figura, por ejemplo el cuadrado, y lo insertamos en la hoja.
3. Seleccionamos dicha figura y con clic derecho en su borde elegimos Asignar Macro
4. Hacemos clic en el botón Nuevo
5. Donde titila el cursor escribimos: DatosUF.Show
6. Cada vez que hagamos clic en la figura se ejecutará el Userform.

81
www.todoexcel.com

2.10. VARIOS

En este capítulo se comentan temas diversos pero que no dejan de ser importantes sobre macros.

2.10.1. Ejecutar macro desde macro

Muchas veces nos interesa ejecutar o llamar una macro desde otra macro. Esto es muy útil porque si
tenemos un desarrollo muy grande, para mantener ordenado el código conviene dividir la tarea en
distintas macros y luego vamos ejecutando la macro que se necesite en cada momento.

Para llamar una macro desde otra macro simplemento se escribe el nombre de la macro invocada
dentro del código de la macro principal. Por ejemplo, si ejecutamos la Macro1 y queremos que desde
la misma se ejecute la Macro2 lo haríamos así:

Sub Macro1()
'El código de mi Macro1
Macro2
End Sub

Si queremos identificar mejor que estamos llamando una macro desde otra macro podemos
anteponer la palabra Call. El efecto es el mismo, solo que al anteponer la instrucción Call, la misma
queda en azul automáticamente, y nos permite identificar mejor que estamos llamando otra macro.

Sub Macro1()
'El código de mi Macro1
Call Macro2
End Sub

Por ejemplo, tenemos una SuperMacro que realiza la función siguiente:

Sobre el rango seleccionado:


1. Asigna un formato numérico
2. Asigna bordes
3. Asigna color de relleno

El código de la SuperMacro es el siguiente:

Sub SuperMacro()
'Asigna Formato Numérico
Selection.NumberFormat = "#,##0;[Red]#,##0"
'Asigna Bordes
With Selection.Borders
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
'Asigna Color de Relleno
With Selection.Interior
.ColorIndex = 36
82
www.todoexcel.com

.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
End Sub

Esta SuperMacro podríamos simplificarla de tal forma que ejecute 3 MiniMacros:

Sub SuperMacro()
Call FormatoN
Call Bordes
Call Relleno
End Sub

La palabra Call se puede omitir pero recomendamos utilizarla para identificar mejor que estamos
llamando otras macros. Como se vé en el código, la SuperMacro ejecuta 3 macros. Estas 3 macros
deben estar ubicadas en el mismo módulo y las escribimos a continuación:

Sub FormatoN()
'Asigna Formato Numérico
Selection.NumberFormat = "#,##0;[Red]#,##0"
End Sub

Sub Bordes()
'Asigna Bordes
With Selection.Borders
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Sub

Sub Relleno()
'Asigna Color de Relleno
With Selection.Interior
.ColorIndex = 36
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
End Sub

2.10.2. Depuración y errores

Es común que cuando ejecutamos una macro la misma tenga algún error. Los errores pueden ser
errores de tipeo o estructuras mal escritas. El editor de macros tiene un autocontrol que permite
corregir estos errores comunes. Veamos algunos casos:

En este primer ejemplo utilizaremos una macro sencilla cuya única función es seleccionar la celda
A2. Si escribimos correctamente la macro, el editor asigna automáticamente los colores azules, lo
que significa que ha reconocido la estructura Sub() - End Sub.
Ejemplo:

'Esta macro selecciona la celda A2


83
www.todoexcel.com

Sub Macro()
Range("A2").Select
End Sub

Si las instrucciones están bien escritas el editor convierte automáticamente las mayúsculas y asigna
los colores azules a las estrucutras reconocidas y verde a los comentarios. Las estructuras
reconocidas son aquellas que siempre se deben respetar y se explican mejor en la 2º parte del
curso, capítulo "Estrucuturas".

Si cometiéramos un error al referirnos al objeto "Range" y por ejemplo olvidáramos poner la comilla
luego del 2, al dar enter a dicha línea aparecería un mensaje de error y la línea se pintaría
automáticamente de rojo, como se ve a continuación.

Sub Macro()
Range("A2).Select
End Sub

Cuando sucede esto aparece un aviso que nos indica el error cometido. Si vemos que la línea está
roja es señal que debemos corregir algo (usualmente falta o sobra algún caracter). En nuestro caso,
hemos olvidado poner la comilla (el objeto Range siempre requiere que la celda esté entre comillas y
luego entre paréntesis).

Veamos otro error de tipeo. En ese caso escribimos erróneamente "Sab", en lugar de "Sub". A pesar
que no aparecerá ningún mensaje de error, vemos que el editor no ha pintado de azul la palabra
"Sab".

Sab Macro()
Range("A2").Select
End Sub

Al intentar ejecutar esta macro no sucederá nada, porque no se ha respetado la estructura de Sub()
- End Sub con la que debe comenzar y finalizar una macro respectivamente.

En otras ocasiones, la macro arrastra un error pero el mismo no aparece hasta ejecutarla. Veamos el
caso de la siguiente macro. Al escribirla no ha generado error y ninguna línea se ha pintado de rojo.
Sin embargo, al ejecutarla sí aparece un error.

Sub Macro()
If Range("a2").value = 2 Then
MsgBox "Mal"
End Sub

El error que aparece al ejecutarla es un aviso que indica:

"Error de compilación: Bloque If sin End If"

Al hacer clic en aceptar la macro queda en "Modo Interrupción", lo que significa que todo queda en
pausa y no se podrán ejecutar nuevas macros (el modo de interrupción se identifica porque el
nombre de la macro queda resaltado en amarillo). Lo que debemos hacer en esta instancia es salir
de modo interrupción desde el mismo editor, menú Ejecutar > Reestablecer. Luego procedemos a
corregir la macro. En este caso el mensaje fue claro: la esctructura estaba incompleta, nos faltó el

84
www.todoexcel.com

End If (existe una estructura If - End If que se explica mejor en la 2º parte del curso, capítulo
"Estructuras").

Una vez que se ha interrumpido la macro, tenemos la opción de ejecutarla paso a paso (o línea por
línea) y así determinar en qué línea está el error. Este lo puedes hacer posicionándote en la primera
fila de la macro y luego presionar la tecla F8. De esta forma se irá resaltando con amarillo y
ejecutando cada fila, hasta que llegues a la que produce el error. También puedes hacerlo desde la
opción del menú Depuración > Paso a paso por instrucciones.

2.10.3. Complementos (Add Ins)

Una vez que tenemos nuestras macros, es posible "empaquetarlas" bajo la forma de un
Complemento, también conocidos como Add-in, de tal forma que se pueden distribuir a otros
usuarios para que lo instalen y tengan acceso a las macros.

En general, estos complementos no son más que nuevas funcionalidades y opciones para Excel,
realizadas con macros.

Si utilizas Excel 2.003 o inferior continúa aquí...


Si utilizas Excel 2.007 continúa aquí...

Excel 2.003 o inferior


Para acceder a los complementos puedes hacerlo desde el menú Herramientas > Complementos de
la hoja Excel, y verás un cuadro similar al que se muestra a continuación:

85
www.todoexcel.com

A la izquierda se ve la lista de complementos disponibles siendo posible activarlos o desactivarlos


(seleccionando o deseleccionando la casilla a la izquierda de su nombre).

Cuando queremos instalar nuevos complementos debemos hacerlo con el botón Examinar. Dicho
botón nos permitirá buscar el directorio donde se encuentra el complemento que deseamos instalar.
La extensión de los archivos de complementos es XLA.

La utilidad de un complemento es que podemos crear nuestras macros y luego guardarlas como
complemento. De esta forma, dichas macros estarán disponibles en todas las hojas Excel que
abramos, dado que el complemento se cargará automáticamente (Excel carga automáticamente
todos los complementos que estén seleccionados al abrirse).

El proceso de creación de un complemento es sencillo:

1. Primero debes crear tus macros normalmente, desde el editor de macros


2. Luego debes guardar dicho archivo excel desde el menú Archivo > Guardar como...
3. Se abrirá el Cuadro de diálogo de guardar y en la parte inferior hay una lista desplegable llamada
Guardar como tipo. En dicha lista debes elegir la opción Complemento de Microsoft Excel, que suele
ser la última de las opciones.

4. Deberás elegir un nombre para tu complemento y guardarlo normalmente. Dicho archivo se


guardará automáticamente con la extensión XLA.

5. Para instalar el complemento debes hacerlo desde el menú Herramientas > Complementos y
luego la opción Examinar, tal como te señalábamos al comienzo. Deberás buscar el directorio donde
guardaste el archivo XLA y seleccionarlo. De este modo, cada vez que abras el Excel, el
complemento estará activo.

Excel 2.007
Para visualizar los complementos instalados, puedes hacerlo desde la ficha Complementos, y verás
un cuadro similar al que se muestra a continuación (los complementos visibles dependen de los que
tengas activados, en nuestro caso solo tenemos activado un complemento llamado "ASAP Utilities").

86
www.todoexcel.com

Si quieres instalar nuevos complementos, deberás hacerlo desde el menú Office > Opciones de Excel
> Complementos. Con el botón Ir podrás abrir el cuadro de complementos.

Y se abrirá el cuadro de complementos

87
www.todoexcel.com

A la izquierda se ve la lista de complementos disponibles siendo posible activarlos o desactivarlos


(seleccionando o deseleccionando la casilla a la izquierda de su nombre).

Cuando queremos instalar nuevos complementos debemos hacerlo con el botón Examinar. Dicho
botón nos permitirá buscar el directorio donde se encuentra el complemento que deseamos instalar.
La extensión de los archivos de complementos es XLA.

La utilidad de un complemento es que podemos crear nuestras macros y luego guardarlas como
complemento. De esta forma, dichas macros estarán disponibles en todas las hojas Excel que
abramos, dado que el complemento se cargará automáticamente (Excel carga automáticamente
todos los complementos que estén seleccionados al abrirse).

El proceso de creación de un complemento es sencillo:

1. Primero debes crear tus macros normalmente, desde el editor de macros


2. Luego debes guardar dicho archivo excel desde el menú Archivo > Guardar como...
3. Se abrirá el Cuadro de diálogo de guardar y en la parte inferior hay una lista desplegable llamada
Guardar como tipo. En dicha lista debes elegir la opción Complemento de Microsoft Excel, que suele
ser la última de las opciones.

4. Deberás elegir un nombre para tu complemento y guardarlo normalmente. Dicho archivo se


guardará automáticamente con la extensión XLA.

5. Para instalar el complemento debes hacerlo desde el menú Herramientas > Complementos y
luego la opción Examinar, tal como te señalábamos al comienzo. Deberás buscar el directorio donde
guardaste el archivo XLA y seleccionarlo. De este modo, cada vez que abras el Excel, el
complemento estará activo.

2.10.4. Seguridad de macros

Las opciones de seguridad de macros han cambiado considerablemente en la nueva versión Excel
2.007.

Excel 2.003
Excel posee 3 niveles de seguridad de macros. Los mismos se pueden definir desde el menú
Herramientas > Opciones > pestaña Seguridad > botón Seguridad de macros. El cuadro de diálogo
que se abre se ve así:

88
www.todoexcel.com

Lo recomendable es tener el nivel de seguridad en Medio. De esta forma cada vez que abramos un
archivo tendremos la opción de habilitar o deshabilitar las macros, mediante un mensaje automático
de aviso que aparece. Si el archivo proviene de una fuente segura las podremos habilitar sin
problemas.

Excel 2.007
Esta versión de Excel posee gran cantidad de novedades respecto a temas de seguridad. En primer
lugar, las opciones de niveles de seguridad de macros las encontramos en el menú Office > Opciones
de Excel > Centro de confianza > Configuración del Centro de confianza tal cual se ve a
continuación:

89
www.todoexcel.com

Al presionar el botón de Configuración del Centro de confianza aparece una nueva ventana en la cual
debemos elegir de Configuración de macros (parte izquierda) y luego seleccionar la opción
Deshabilitar todas las macros con notificación. Esto hará que cada vez que se abra un libro con
macros, aparezca un mensaje notificando de las mismas y dando la opción de habilitarlas o
deshabilitarlas.

90
www.todoexcel.com

No mostrar el mensaje de "Habilitar Macros"

Otra opción muy interesante que ofrece Excel 2.007 es la de generar "Carpetas de confianza", de tal
modo que para cualquier archivo que esté guardado en esas carpetas, se habilitarán
automáticamente las macros (nos evitaremos el molesto mensaje de "Habilitar macros"). Para
configurar esto vamos al Centro de Confianza, seleccionamos Ubicaciones de confianza y luego
indicamos una carpeta desde el botón de Agregar nueva ubicación...

2.10.5. Firma digital

Excel 2.003
Cuando se abre un libro Excel que contiene macros, aparece un mensaje de aviso indicando si se
desean habilitar o deshabilitar las mismas.

91
www.todoexcel.com

Si quieres ejecutar las macros y que no vuelva a aparecer dicho mensaje, deberás crear una Firma
Digital.

Para crear una firma digital hay que ejecutar un archivo llamado Selfcert.exe (en mi caso particular
se encuentra ubicado en C:\Archivos de programa\Microsoft Office\Office\). Si no lo tienes allí,
puedes buscarlo en tu PC con la opción de buscar archivos.

Al ejecutar Selfcert.exe se abre una pequeña ventana donde se pide el ingreso del texto de la firma
digital y luego aceptar.

Ahora lo que debemos hacer es asociar dicha firma a nuestro archivo xls con macros. Para esto
abrimos nuestro xls con macros, pasamos al editor de macros y elegimos las opciones del menú
Herramientas > Firma Digital. Luego hacemos click en el botón Elegir, escogemos la firma creada,
aceptamos y todo listo, macros firmadas.

Cuando abramos el xls con macros nuevamente, Excel indicará que posee macros firmadas por XXXX
(nombre de la persona que creo la firma). Si marcamos la casilla de confiar de esta fuente, ya nunca
más aparecerá el mensaje de macros al abrir dicho archivo. Todos los xls que lleven esa firma se
abrirán con sus macros habilitadas.

92
www.todoexcel.com

2.10.6. Macros privadas

Recuerda que puedes visualizar las macros de tu libro presionando ALT+F8. Verás que se abre un
cuadro como el siguiente:

En el mismo figuran los nombres de las macros creadas, así que solo tienes que seleccionar la macro
y luego hacer clic en el botón de Ejecutar.

Si deseas ocultar las macros del libro en dicho cuadro puedes hacerlo utilizando la instrucción Private
cuando escribas tu macro. Debes utilizar dicha instrucción delante de la palabra Sub. De este modo
solo ocultarás la macro en cuestión. Ejemplo:
93
www.todoexcel.com

Private Sub MiMacro()


'Esta macro no aparecerá en la lista de macros
'Código de tu macro aquí
End Sub

Si tienes muchas macros en el módulo y quieres ocultarlas todas, en lugar de escribir la palabra
Private en cada una de ellas, puedes colocar la siguiente instrucción al comienzo de tu módulo:

Option Private Module

De esta forma todas las macros de dicho módulo quedarán ocultas.

2.10.7. Acelerar el código

En la medida que la cantidad de código contenido en las macros se incrementa, es posible que la
velocidad de ejecución de las mismas disminuya. Sin embargo, existen algunas recomendaciones
para mantener las macros rápidas:

1. Evitar actualización de pantalla

Cuando ejecutamos la macro, podemos ir viendo en la pantalla todo lo que sucede, sobre todo en el
caso de macros que activan o desactivan hojas, seleccionan rangos, etc. Esto hace que la macro se
ejecute un poco más lento. Si solo queremos ver el resultado final y ganar velocidad, debemos
utilizar la instrucción Application.ScreenUpdating=False. En general se recomienda incluir siempre
esta línea al comienzo de cada macro, por ejemplo:

Sub SuperMacro()
Application.ScreenUpdating=False
'El código de la macro aquí
Application.ScreenUpdating=True
End Sub

Al final, volvemos a dejarla en True, que es como debe quedar por defecto.

2. Prevenir cálculos mientras se ejecuta el código

Si nuestra macro realiza cambios en distintas celdas, en cada cambio realizado se recalculará la
hoja. Si el libro tuviera muchas fórmulas y la macro cambiara muchas celdas, esto haría que se
ejecute muy lento, porque se estaría recalculando la hoja repetidas veces. Lo recomendable es
deshabilitar el cálculo, ejecutar la macro y luego volver a activar el modo de cálculo automático. Por
ejemplo:

Sub SuperMacro()
Application.Calculation = xlCalculationManual
'El código de la macro aquí

94
www.todoexcel.com

Application.Calculation = xlCalculationAutomatic
End Sub

3. Utilizar la instrucción With

Cuando tenemos que definir muchas propiedades de un único objeto, no es necesario hacer mención
al objeto cada vez, porque esto le quita velocidad de ejecución a la macro. Para ganar velocidad y
mantener el código más simple, conviene hacer mención al objeto una única con la instrucción With
y luego definir sus propiedades, por ejemplo:

Sub CambiarFormatoRango()
With Range("A1")
.Value = 10
.Font.Bold = True
.Interior.ColorIndex = 5
End With
End Sub

Esto se explica mejor en la 2º parte del curso, capítulo Estructuras.

4. Insertar fórmulas relativas

Si queremos insertar fórmulas en celdas mediante macros, existe una forma más rápido de hacerlo
que con Copiar y pegar. Por ejemplo:

Sub CopiarFormula()
Range("A1:A10").FormulaR1C1 = "=SUM(RC[1]:RC[5])"
End Sub

Para saber como obtener la fórmula podemos hacer lo siguiente:


4.1 Insertamos la fórmula en la celda
4.2 Vamos al menú Herramientas > Macros > Grabar nueva macro
4.3 Desde la celda con la fórmula presionamos la tecla F2 y luego Enter.
4.4 Revisamos la macro grabada para obtener el código

5. Evitar el uso de Copiar, Pegar y Seleccionar

Cuando se utiliza la grabadora de macros, es común que se genere más código del necesario y esto
hace que funcione un poco más lento. Las intrucciones que suelen ser redundantes son Select,
Selection.Copy y Paste. Supongamos que queremos copiar un rango en otro rango. Si utilizamos la
grabadora el código será el siguiente:

Sub CopiaRango()
Range("C10:C12").Select

95
www.todoexcel.com

Selection.Copy
Range("E10").Select
ActiveSheet.Paste
End Sub

Sin embargo hay una forma más directa donde evitamos el Select, el Selection y el Paste:

Sub CopiaRango()
Range("C10:C12").Copy Range("E10")
End Sub

96
www.todoexcel.com

3. MACROS

En esta parte del curso veremos casos prácticos de macros, listas para utilizar o adaptar.

Variables: qué son las variables y cómo se utilizan.

Libros: macros para manipular libros.

Hojas: macros para manipular hojas.

Rangos: macros para manipular rangos.

Arrays: que son los arrays y cómo se utilizan.

Estructuras: las estructuras y macros más comunes.

Cuadros de diálogo: utilización y funciones de los cuadros de diálogo.

Barras de herramientas: como crear y manipular barras de herramientas.

Menús: como crear y manipular menús.

Comandos: diversos comandos útiles muy utilizados.

97
www.todoexcel.com

3.1. Importante

Antes de comenzar con esta 2º parte del curso, es importante que tengas en cuenta lo siguiente:

Dificultad
Esta 2º parte del Manual de Macros está pensada para usuarios Excel con conocimientos intermedios
y avanzados de macros. Por eso te recomendamos previamente tener un buen dominio de la 1º
parte de este curso, que contiene la teoría para principiantes.

Dudas adicionales sobre macros


Todas las dudas y consultas sobre Excel las respondemos desde nuestra web.

400 Recursos y Extras VBA


Este curso contiene una 3º parte que contiene 400 Recursos y Extras VBA, incluidos gran parte de
los ejemplos que acompañan los capítulos del Manual. Por ejemplo, en los Extras hay un xls llamado
"Estructuras.xls", que ya contiene ejemplos didácticos y bién comentados de todo lo explicado en el
capítulo "Estructuras" de este curso.
Puedes accedes a estos extras desde aquí...

Mosaico vertical y revisión de macros con F8


Un buen método para entender el funcionamiento de las macros consiste en cerrar y minimizar todas
las aplicaciones que tenemos abiertas en nuestro ordenador. Luego maximizar Excel al igual que el
editor de VBA y crear un mosaico vertical con las aplicaciones abiertas y maximizadas, es decir con
Excel y VBA. Esto lo hacemos con el botón derecho del ratón en la parte inferior de la pantalla
(encima de la hora) y seleccionando la opción "Mosaico vertical". Podrás visualizar la hoja
cuadriculada Excel y el editor de VBA al mismo tiempo (muy útil a la hora de revisar lo que hace la
macro).

Luego, utilizando la tecla F8 podrás ver como las diferentes macros se ejecutan pausadamante línea
a línea (esto fue explicado en la 1º parte del Manual, capítulo "Varios", sección "Depuración y
errores").

Utilizando el Application.Wait
Muchas de las macros adjuntas en los libros, muestran la siguiente línea de código:
Application.Wait Now + TimeValue("00:00:01")
Esto produce que la macro se ejecute de forma más lenta, para poder observar mejor el cometido
que está realizando, pues de lo contrario, y sobre todo en las macros con poco código, la macro
finalizaría en apenas unas décimas de segundo.

Por ejemplo,con Application.Wait Now + TimeValue("00:00:02")


obligamos a Excel a esperar 2 segundos más que el tiempo actual para continuar con la línea del
código que estuviese a continuación.

98
www.todoexcel.com

Escritura de las macros


En muchos ejemplos las macros no tienen su línea de comienzo (Sub) ni su línea de final (End Sub),
como por ejemplo: ActiveSheet.PageSetup.PrintArea = "$A$1:$G$22"
Esta línea la podrías utilizar dentro de la ventana Inmediato del editor VBA.

Pero en la mayoría de los casos, la macro está completa, de tal forma que puedas copiarla
directamente en el editor, por ejemplo:
Sub AAA()
ActiveSheet.PageSetup.PrintArea = "$A$1:$G$22"
End Sub

Utilización de los Msgbox


Es común que hagamos uso de los Msgbox para indicar que puedes continuar con tu código. Esto
quiere decir que como el código siguiente dependerá de lo que tú necesites, el Msgbox es una forma
de finalizar la macro. Si quisieras continuar tu macro simplemente deberías eliminar el Msgox y
reemplazarlo por el resto de tu código.

Utilización de los Print.Debug


Muchas veces, cuando queremos mostrar un resultado, lo hacemos directamente en la Ventana
Inmediato, utilizando la instrucción de Print.Debug.

99
www.todoexcel.com

3.2. VARIABLES

Como prácticamente todas las macros utilizan variables, es importante comenzar a entenderlas. Una
variable es sencillamente un dato o valor que VBA guarda en memoria.

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 asignamos un valor a la variable (también podríamos indicarle una celda Excel)
Nombre = "Pedro"
' Mostramos el valor de la variable en un mensaje
Msgbox Nombre
End Sub

La idea es que Excel recordará que la variable "Nombre" tiene asignado el valor "Pedro". Podremos
utilizar dicha variable más adelante en nuestro código.

3.2.1. Definición

Una variable es un lugar de almacenamiento con nombre que puede contener cierto tipo de datos
que puede ser modificado durante la ejecución del programa. Cada variable tiene un nombre único
que la identifica dentro de su nivel de ámbito. Puede especificar un tipo de datos o no. Los nombres
de variable deben comenzar con un carácter alfabético, deben ser únicos dentro del mismo ámbito,
no deben contener más de 255 caracteres y no pueden contener un punto o carácter de declaración
de tipo.

Es decir las variables pueden contener caracteres alfanuméricos, pero siempre deben empezar por
una letra y no deben exceder en longitud de 255 caracteres
Se recomienda evitar el uso de caracteres no presentes en nuestro alfabeto para evitar problemas.

A su vez VBA tiene reservados algunos nombres, los cuales ovbiamante no pueden ser utilizados
como variables propias, algunas de estas palabras son: Sub, End, with, do, loop etc, ya que son
nombres que tienen un significado propio dentro de VBA.

Cuando declaramos una variable, por ej:

Dim SALUDOS as String

100
www.todoexcel.com

a medida que utilicemos la variable saludos aún cuando la escribamos en minúsculas VBA nos la
corregirá automáticamente, ya que ha sido creada en mayúsculas.
Es decir no debemos preocuparnos entre mayúsculas o minúsculas salvo en la declaración de
variables y solo si queremos.

Podemos declarar todo tipo evariables, por ello conviene también adquirir la costumbre de hacer que
el propio nombre de nuestras variable resulte descriptivo de la función que cumplirá, por ejemplo:

Sub Macro()
' Definimos una variable numérica TipoCambio, que es el factor de conversión entre el euro y la
libra
Dim TipoCambio As Double ' Variable definida como valor con 2 decimales
TipoCambio = 1.45
' Esta macro multiplica el valor de la celda activa por el valor de la variable anterior
ActiveCell.Value = TipoCambio * ActiveCell.Value
End Sub

Si el código de nuestra macro crece mucho, al haber dado un nombre apropiado a la variable nos
permitirá reconocerla fácilmente, mucho mejor que haber hecho:

Sub Macro()
Dim valor As Double
valor = 1.45
ActiveCell.Value = valor * ActiveCell.Value
End Sub

En el caso anterior, si la macro creció mucho, llegaría un punto donde no recordaríamos que había
en valor, porque es un nombre que no nos dice mucho.

La declaración de variables agiliza el consumo de memoria y hace que el código se ejecute mas
rápido. Si no declararamos las variables VBA manipularia todas las variables
como Variant siendo el consumo de memoria bastante mayor.

3.2.2. Declaración

Antes de seguir avanzando con las variables, su uso y sus tipos, conviene preparar nuestro editor de
macros, para que siempre nos veamos en la obligación de declarar todas las variables que podamos
ir utilizando en nuestros módulos (es decir obligarnos a definir nuestras variables de entrada).

Esto lo podemos realizar desde el editor de VBA, a traves del menú Herramientas > Opciones >
pestaña Editor > y seleccionar la casilla Requerir declaración de variables

Con esta acción cada vez que insertamos un nuevo módulo en el editor de Visual Basic, el módulo
añadido incluirá automáticamente la instrucción Option Explicit al comienzo de todo, como se ve a
continuación:

101
www.todoexcel.com

¿qué significa la instrucción Option Explicit?

Se usa en el nivel de módulo para forzar declaraciones explícitas de todas las variables en dicho
módulo, debe aparecer en un módulo antes de cualquier procedimiento.
Cuando Option Explicit aparece en un módulo, debemos declarar explícitamente todas las variables
mediante las instrucciones Dim, Private, Public, ReDim o Static.
De hecho si intentamos usar un nombre de variable no declarado, ocurrirá un error en tiempo de
compilación o bien en el momento en el que el código de origen se traduce a código de ejecución.

Cuando no usamos la instrucción Option Explicit todas las variables no declaradas son Variant
(pueden tomar cualquier valor) a menos que el tipo predeterminado esté especificado de otra
manera con una instrucción Deftipo (es decir salvo que luego vayamos definiendo la variables).

La declaración Option Explicit se utiliza para evitar escribir incorrectamente el nombre de una
variable existente o para evitar confusiones en el código, donde el alcance de la variable no está
claro.

Ejemplo de la instrucción Option Explicit:


En este ejemplo se utiliza la instrucción Option Explicit para forzar la declaración explícita de todas
las variables. Si se intenta utilizar una variable no declarada se obtiene un error en el tiempo de
compilación. Recordar que la instrucción Option Explicit sólo se utiliza en el nivel de módulo.

' Fuerza la declaración explícita de variables.


Option Explicit

Sub MacroMensaje()

' Declaramos la variable saludo como variable tipo texto


Dim saludo As String

' Damos un valor a la variable declarada


saludo = "Hola que tal"

' Damos un valor a esta otra variable, que NO ha sido declarada


despedida = "Adios"

MsgBox saludo
MsgBox despedida

End Sub

102
www.todoexcel.com

Cuando ejecutamos esta macro obtenemos un error de compilación , en el que se nos dice que la
palabra seleccionada, no ha sido declarada, y VBA selecciona la palabra "despedida", es decir
requiere de nosotros la necesidad de declarar esta variable antes de ser usada. Si corregimos la
macro anterior y declaramos ambas variables, tendríamos:

Sub MacroMensaje()

' Declaramos la variable saludo como variable tipo texto


Dim saludo As String

' Aquí declaramos la variable que habíamos olvidado antes


Dim despedida As String

' Damos un valor a la variable declarada


saludo = "Hola que tal"

' Damos un valor a la variable declarada


despedida = "Adios"

MsgBox saludo
MsgBox despedida

End Sub

La declaración de variables es primordial, totalmente necesaria, pues ayuda a saber el código que
estamos manipulando y utilizar menos memoria, es por ello una buena acción forzar la declaración
de variables siempre (por eso recomendamos seguir los pasos indicados al comienzo de esta
sección).

3.2.3. Tipos

La tabla siguiente muestra los tipos de datos compatibles, incluyendo el tamaño de almacenamiento
y el intervalo.

En la 1º columna (Tipo de datos) se define el tipo variables que podemos usar


En la 2º columna (Tamaño) se define cuanto espacio ocupa en memoria
En la 3º columna (Intervalo) se definen los valores que puede adquirir la variable

Tipo de datos Tamaño Intervalo


Byte byte 0 a 255

Boolean bytes True o False

Integer bytes -32,768 a 32,767

Long (entero largo) bytes -2,147,483,648 a 2,147,483,647

Single (coma flotante/ precisión bytes -3,402823E38 a -1,401298E-45 para valores


simple) negativos; 1,401298E-45 a 3,402823E38 para
valores positivos

103
www.todoexcel.com

Double (coma flotante/ precisión bytes -1.79769313486231E308 a -


doble) 4,94065645841247E-324 para valores
negativos; 4,94065645841247E-324 a
1,79769313486232E308 para valores
positivos

Currency (entero a escala) bytes -922.337.203.685.477,5808 a


922.337.203.685.477,5807

Decimal bytes +/-79.228.162.514.264.337.593.543.950.335


sin punto decimal; +/-
7,9228162514264337593543950335 con 28
posiciones a la derecha del signo decimal; el
número más pequeño distinto de cero es +/-
0,0000000000000000000000000001

Date bytes 1 de enero de 100 a 31 de diciembre de 9999

Object bytes Referencia a tipo Object

String (longitud variable) bytes + longitud de la cadena 0 a 2.000 millones

String (longitud fija) longitud de la cadena 1 a 65.400 aproximadamente

Variant (con números) bytes valor numérico hasta el intervalo de un tipo


Double

Variant (con caracteres) bytes + longitud de la cadena mismo intervalo que para un tipo String de
longitud variable

Definido por el usuario número requerido por los elementos intervalo de cada elemento es el mismo que el
(utilizando Type) intervalo de su tipo de datos.

Lógicamente si sabemos que una variable va a utilizar valores numéricos sin decimales y entre 1 y
25, conviene que lo declaremos como Byte, como se ve en este ejemplo:

Option Explicit
Sub Macro()
Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub

La macro anterior utiliza bastantes menos recursos que esta próxima que no fuerza la declaración de
la variable X (y por lo tanto es considerada como Variant):

Sub Macro()
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub

104
www.todoexcel.com

Que incluyamos la declaracion Option Explicit no implica que vayamos a hacer un buen uso de las
variables pues en el siguiente ejemplo, hemos considerado que X es Long, cuando podría utilizar
menos recursos siendo Byte:

Option Explicit
Sub Macro()
Dim X As Long ' Aunque sería recomendable Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub

Una solución momentánea para saber que tipo de variable deberíamos utilizar podría ser de la
siguiente forma. Observa que hemos eliminado la instrucción Option Explicit, pues nuestro objetivo
es descubrir que tipo de variable necesitaremos:

Sub Macro()
' Dim X As Long
For X = 1 To 65536
Cells(X, 1) = X
Next X
MsgBox TypeName(X)
End Sub

O bien:

Option Explicit
Sub Macro()
' Decimos que es variant, que es lo mismo que no decir nada pero definiendo esa nada y luego…
Dim X
For X = 1 To 65536
Cells(X, 1) = X
Next X
MsgBox TypeName(X)
End Sub

Y en ambos ejemplos obtendríamos el resultado Long, mientras que si hubiéramos puesto:

Option Explicit
Sub Macro()
Dim X
For X = 1 To 1500 ' Aquí escribimos un intervalo menor
Cells(X, 1) = X
Next X
MsgBox TypeName(X)
End Sub

obtendríamos como resultado Integer.

Este método no simpre sirve ya que:

Option Explicit
Sub Macro()
105
www.todoexcel.com

Dim X
For X = 1 To 25
Cells(X, 1) = X
Next X
MsgBox TypeName(X)
End Sub

Daria como resultado Integer, en lugar de Byte, no obstante el ahorro de recursos resulta en
cualquier caso evidente.

3.2.4. Locales

Las variables locales se declaran dentro de cada macro, y solo pueden ser utilizadas dentro de la
macro en la que han sido creadas, cuando la macro termina de ejecutarse, la variable desaparece y
Excel libera la memoria que estaba utilizando recordando a qué hacían referencia.

Una variable se declara como local cuando está declarada dentro de la macro que hará uso de la
misma, por ej:

Sub Macro()
Dim X As Single
Dim Y As Single
Dim Z As Single
X=5
Y = 10
Z = 50
ActiveCell = X * Y * Z
End Sub

También se pueden declarar varias variables en la misma línea de código tal que:

Option Explicit
Sub Macro()
Dim x As Byte, y As Single, z As Long, Resultado As Variant
x = 5: y = 2000: z = 50000
Resultado = x * y * z
MsgBox TypeName(Resultado)
' en este caso el resultado seria Double
ActiveCell = Resultado
End Sub

Si una variable es local todas el resto de las macros podrán utilizar el mismo nombre de la variable
tal que:

Option Explicit

Sub Macro1()
Dim Autor As String
Autor = "TodoEXCEL"
ActiveCell = Autor
End Sub

106
www.todoexcel.com

Sub Macro2()
Dim Autor As String
Autor = "Pedro"
ActiveCell = Autor
End Sub

Sub Macro3()
Dim Autor As String
Autor = "Jose"
ActiveCell = Autor
End Sub

Sub Macro4()
Dim Autor As String
Autor = "Salvador"
ActiveCell = Autor
End Sub

Se recomienda la utilización de variables locales antes que la de variables públicas (las veremos en
la sección siguiente), ya que una vez que la macro termina de ejecutarse, VBA ya no las reconoce de
nuevo y libera memoria, mientras que si son públicas aún cuando la macro termina, el valor al que
hacen referencia las variables sigue vigente y ocupando espacio en memoria.

3.2.5. Públicas

Las variables declaradas mediante la instrucción Public están disponibles para todos los
procedimientos en todos los módulos de todas las aplicaciones, a menos que Option Private Module
esté en efecto; en este caso, las variables sólo son públicas dentro del proyecto en el que residen.

Este tipo de variables son útiles cuando empezamos a trabajar con macros pues facilitan la
comprensión, y nos ahorran el hecho de tener que declarar lo mismo una y otra vez.

Usamos la instrucción Public para declarar el tipo de datos de una variable. Por ejemplo, la
instrucción siguiente declara una variable como de tipo Integer:

Public NúmeroDeEmpleados As Integer

Usamos también la instrucción Public para declarar el tipo de objeto de una variable. La instrucción
siguiente declara una variable para una nueva instancia de una hoja de cálculo:

Public X As New Worksheet

Si no utilizamos la palabra clave New al declarar una variable de objeto, la variable que se refiere a
un objeto debe asignarse a un objeto existente mediante la instrucción Set antes de que se pueda
usar. Hasta que se le asigne un objeto, la variable de objeto declarada tiene el valor especial
Nothing, el cual indica que no se refiere a ninguna instancia en particular de un objeto.

107
www.todoexcel.com

También podemos utilizar una instrucción Public con paréntesis vacíos para declarar matrices
dinámicas. Después de declarar una matriz dinámica, usamos la instrucción ReDim dentro de un
procedimiento para definir el número de dimensiones y elementos de la matriz. Si intentamos volver
a declarar un dimensión para una matriz cuyo tamaño se ha especificado explícitamente en una
instrucción Private, Public o Dim, ocurrirá un error. Si no especificamos un tipo de datos o un tipo de
objeto y no existe una instrucción Deftipo en el módulo, la variable es Variant de manera
predeterminada.

Cuando se inicializan las variables, una variable numérica se inicializa a 0, una cadena de longitud
variable se inicializa a una cadena de longitud cero ("") y una cadena de longitud fija se rellena con
ceros. Las variables Variant se inicializan a Empty.

Ejemplo de la instrucción Public

En este ejemplo se utiliza la instrucción Public a nivel de módulo (sección General) de un módulo
estándar para declarar variables como públicas; es decir, disponibles para todos los procedimientos
en todos los módulos de todas las aplicaciones (a menos que Option Private Module esté en vigor).

Cuando una variable es declarada como Public y es colocada al principio del módulo, puede ser
utilizada por cualquier macro, mientras que si fuera una variable no pública deberíamos definir su
nombre cada vez que la necesitemos en cada macro, por ejemplo:

Option Explicit

Public X As Byte

Sub Macro()
For X = 1 To 25
Call Macro2
Next X
End Sub

Sub Macro2()
Cells(X, 1) = X
End Sub

' Aún cuando este ejemplo puede resultar absurdo pues:


Sub Macro()
Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub

Con el ejemplo anterior tan solo pretendemos hacer referencia a que a veces conviene utilizar
variables públicas pues son variables que van a ser utilizadas ampliamente y es absurdo ir
definiéndolas en cada macro.

Que una variable sea pública no significa que su valor deba ser constante, tan solo que no es
necesario definirla en cada macro y que mientras no le asignemos otro valor conserva el que tenía.

108
www.todoexcel.com

En el siguiente ejemplo hemos decidido no definir dos veces la variable Rg, no obstante hemos
querido que en cada macro haga referencia a diferentes rangos:

Public Rg As Range

Sub Macro()
Dim x As Byte
For x = 1 To 25
Set Rg = Cells(x, 1)
Rg.Value = x
Next x
End Sub

Sub Macro2()
Set Rg = Range("A1:A25")
Rg.Interior.ColorIndex = 3
End Sub

3.2.6. Estáticas

Las variables declaradas con la instrucción Static conservan su valor mientras el código se está
ejecutando.
Una vez que el código del módulo se está ejecutando, las variables declaradas con la instrucción
Static conservan su valor hasta que se reinicie o restablezca el módulo. En los módulos de clase, las
variables declaradas con la instrucción Static conservan su valor en cada instancia de clase hasta
que se destruye la instancia. En módulos de formulario, las variables estáticas conservan su valor
hasta que se cierra el formulario. Use la instrucción Static en procedimientos no estáticos para
declarar explícitamente variables que son visibles sólo dentro de un procedimiento, pero cuya vida
es la misma que la del módulo en la que se definió el procedimiento.

Usamos una instrucción Static dentro de un procedimiento para declarar el tipo de datos de una
variable que conserva su valor entre llamadas a procedimiento. Se declaran dentro de cada macro,
pero retienen el valor que tenían la última vez que fueron utilizados, se declaran tal que:

Static X as byte, o Static Y as Long

En este ejemplo trabajaremos con dos macros: macro1 y macro2.


Ambas utilizarán una variable común tal que: Public Rg As Range
Utilizaremos Option Explicit para forzar la declaración de variables.

El hecho de que ambas macros utilicen una variable llamada x no significa que hagan referencia a la
misma variable, tan solo se llaman igual, de hecho a medida que la macro1 vaya ejecutándose x en
el primera macro ira desde 1 hasta 25 mientras que en la macro2 desde 10 hasta ¿?, dependiendo
de cuantas veces utilicemos esta macro. Pero en principio si es utilizada solo a través de la macro1
desde 10 hasta 250.

Option Explicit

Public Rg As Range

Sub Macro1()

109
www.todoexcel.com

Dim x As Byte
For x = 1 To 25
Set Rg = Cells(x, 1)
Call Macro2
Next x
End Sub

Sub Macro2()
Static x As Byte
x=x+5
Rg.Select
Rg = x
End Sub

Si una vez ejecutada la macro1, ejecutáramos la macro2 repetidas veces, la celda A25 seguiría
seleccionada, pero su valor aumentaría hasta 255. Y porque no más?
Porque aunque sea static hemos definido x en esta macro como Byte luego cuando x>255
obtendríamos un error de recompilación, ya que habría un desbordamiento.

Para poder utilizar x>255 deberiamos haber usado en la macro2: Static x As single.

Nota: la instrucción Static y la palabra clave Static son similares, pero se utilizan para conseguir
efectos diferentes. Si declara un procedimiento con la palabra clave Static (como en Static Sub
ContarVentas()), el espacio de almacenamiento correspondiente a todas las variables locales dentro
del procedimiento se asigna una única vez y el valor de las variables se conserva durante todo el
tiempo que se esté ejecutando el programa. Para procedimientos no estáticos, el espacio de
almacenamiento para las variables se asigna cada vez que se llama al procedimiento y se libera
cuando se sale del procedimiento. La instrucción Static se usa para declarar variables específicas
dentro de procedimientos no estáticos para conservar su valor mientras el programa se esté
ejecutando.

En este ejemplo se utiliza la instrucción Static para conservar el valor de una variable mientras el
código del módulo se esté ejecutando.

' Definición de función.


Function ConservarTotal(Número)
' Sólo la variable Acumulado conserva su valor entre distintas llamadas.
Static Acumulado
Acumulado = Acumulado + Número
ConservarTotal = Acumulado
End Function

' Definición de una función como Static.


Static Function MiFunción(Arg1, Arg2, Arg3)
' Todas las variables locales conservan su valor entre llamadas a la función.
Acumulado = Arg1 + Arg2 + Arg3
Mitad = Acumulado / 2
MiFunción = Mitad
End Function

Ya sean públicas, locales o estáticas, cuando se inicializan las variables, una variable numérica se
inicializa a 0, una cadena de longitud variable se inicializa a una cadena de longitud cero ("") y una
cadena de longitud fija se rellena con ceros. Las variables Variant se inicializan a Empty. Cada

110
www.todoexcel.com

elemento de una variable de un tipo definido por el usuario se inicializa como si fuera una variable
distinta.

3.2.7. Constantes

Por lo general las variables hacen referencia a valores que acostumbran a cambiar tal que, por ej:
Sub Macro()
Dim Rng As Range
Dim x As Byte
For x = 1 To 25
Set Rng = Cells(x, 1)
Rng.Select
Rng = x
Next x
End Sub

Pero a veces queremos que una variable no cambie, es decir que siempre haga referencia al mismo
valor, ejemplo: mi nombre, la capital de Francia etc. Lógicamente carece de sentido declarar
variables como constante si éstas no son públicas.

Para declarar una variable como constante utilizamos la instrucción Const, por ej:

Option Explicit
Const nPaises As Byte = 53
Const UKrate = 1.43, USrate = 0.78
Const autorLibro As String = "TodoEXCEL"

En la 1º línea hemos definido una variable como nPaises as byte y su valor sera siempre 53.
La 2º línea de código declara dos variables como constantes pero no especifica si son as double o as,
con lo cual se consideraran as variant.
La 3º linea de código declara autorLibro como una constante de tipo string y le da el valor
TodoEXCEL.

3.2.8. Conversión

Es posible convertir variables de un tipo a otro. Existen distintas funciones que que permiten hacer
estas conversiones, por ej:

CBool(expresión), CByte(expresión), CCur(expresión), CDate(expresión), CDbl(expresión),


CDec(expresión), CInt(expresión), CLng(expresión), CSng(expresión), CStr(expresión),
CVar(expresión)

El argumento obligatorio expresión es cualquier expresión de cadena o expresión numérica.

111
www.todoexcel.com

Tipos devueltos: el nombre de la función determina el tipo devuelto, como se muestra a


continuación:

Función Tipo devuelto Intervalo del argumento


expresión
CBool Boolean expresión de cadena o
numérica válida.
CByte Byte 0 a 255
CCur Currency .337.203.685.477,5808 a
922.337.203.685.477,5807.
CDate Date expresión de fecha
CDbl Double .79769313486231E308 a
-4,94065645841247E-324 para
valores negativos;
4,94065645841247E-324 a
1,79769313486232E308 para
valores positivos.
Cdec +/-
79.228.162.514.264.337.593.54
3.950.335 para números
basados en cero, es decir,
números sin decimales. Para
números con 28 decimales, el
intervalo es +/-
7,922816251426433759354395
0335. La menor posición para un
número que no sea cero es
0,000000000000000000000000
0001.
Cint .768 a 32.767; las
fracciones se redondean.
Clong .147.483.648 a
2.147.483.647; las fracciones se
redondean.
CSng ,402823E38 a -
1,401298E-45 para valores
negativos; 1,401298E-45 a
3,402823E38 para valores
positivos.
Cstr mismo intervalo que
Double para valores numéricos.
El mismo intervalo que String
para valores no numéricos.
CVar valor de retorno de CStr
depende del argumento
expresión.

Si la expresión del argumento expresión que se pasa a la función está fuera del intervalo del tipo de
dato al que se va a convertir, se produce un error. En general, el código se puede documentar
utilizando las funciones de conversión de tipos de datos para indicar que el resultado de alguna de
las operaciones se debería expresar como un tipo de datos en particular, no como el tipo de datos
predeterminado.

112
www.todoexcel.com

Cuando la parte fraccionaria es exactamente 0,5, CInt y CLng siempre redondean al número par más
cercano. Por ejemplo, 0,5 redondea a 0, y 1,5 redondea a 2. CInt y CLng se diferencian de las
funciones Fix e Int en que truncan, en lugar de redondear, la parte fraccionaria de un número.
Además, Fix e Int siempre devuelven un valor del mismo tipo del que se le pasa.

Utilizamos la función IsDate para determinar si se puede convertir date a una fecha o una hora. Si
tubiéramos una cadena de texto tal que:

Sub EjCdate()
Dim QAZ As String
QAZ = "5/5/2008"
If IsDate(QAZ) Then
QAZ = CDate(QAZ)
MsgBox QAZ & " SI es una Fecha."
Else
MsgBox QAZ & " no es una Fecha"
End If
End Sub

CDate reconoce literales de fecha y literales de hora además de números comprendidos dentro del
intervalo de fechas aceptables. Al convertir un número a una fecha, la parte numérica entera se
convierte a una fecha. Cualquier parte fraccionaria del número se convierte a la hora del día,
comenzando a medianoche.

CDate reconoce formatos de fecha que se ajusten a la configuración regional de tu sistema. Es


posible que no se determine el orden correcto del día, mes y año si se proporciona en un formato
diferente del que reconoce la configuración de fecha. Además, no se puede reconocer un formato de
fecha largo si contiene la cadena del día de la semana.

3.2.9. Ejemplos

Recordar siempre que antes de utilizar una variable, debemos saber como funciona:
Las variables String siempre deben definirse entre comillas:

Sub ejString()
Dim QAZ As String
QAZ = "TodoEXCEL"
Debug.Print QAZ
' Debug.Print es 1 comodín que solemos utilizar para ver lo que sucede a traves de la ventana
inmediata de VBA
MsgBox QAZ
End Sub

Salvo cuando hacen referencia a algún valor que venga de la misma hoja de Excel tal que:

Sub ejString()
Dim QAZ As String
QAZ = ActiveCell.Value
Debug.Print QAZ
MsgBox QAZ
113
www.todoexcel.com

End Sub

Pero en este caso si ActiveCell.Value=255, QAZ haría referencia a 255 como si de un nombre se
tratara y no como si de una cifra.

Para utilizar este valor 255 guardado como QAZ deberíamos previamente convertirlo a alguna
variable que permita la manipulación de cifras (Byte, Single, Long, Integr, Variant, etc), por ej:

Sub ejString()
Dim QAZ As String
QAZ = ActiveCell.Value
Debug.Print QAZ
MsgBox QAZ
' CInt se utiliza para convertir una variable ej de texto a integer como en este ejemplo
[A1] = CInt(QAZ) + 50
'Range('A1')=[A1] ' Es lo mismo
' La mar = El mar
End Sub

En este otro ejemplo definimos tres variables como String y concatenamos sus valores para
mostrarlos en la celda A1, en la ventana inmediata y en un mensaje tal que:

Sub ejString()
Dim QAZ As String
QAZ = ActiveCell.Value
Dim WSX As String
WSX = "TodoEXCEL"
Dim EDC As String
Debug.Print QAZ & WSX
MsgBox QAZ & WSX
EDC = QAZ & WSX
[A1] = EDC
End Sub

La fechas se pueden guardar como string pero no pueden ser utilizads en operaciones como fechas
salvo que las convertamos a Date:

Sub EjByte()
Dim X As Byte
For X = 1 To 25
Cells(X, 1) = X
Next X
End Sub

Sub EjInteger()
Dim X As Integer, Y As Integer
For X = 1 To 1000
Y = Y + 20
Cells(X, 1) = X + Y
Next X
End Sub

Sub EjLong()
114
www.todoexcel.com

Dim X As Integer, Y As Long


' de haber definido Y as Integer
' obtendríamos un desbordamiento
For X = 1 To 2000
Y = Y + 20
Cells(X, 1) = X + Y
Next X
End Sub

115
www.todoexcel.com

3.3. LIBROS

Mediante macros VBA podemos manipular de distintas formas tanto libros Excel como archivos con
otras extensiones. En este capítulo veremos como hacerlo.

3.3.1. Abrir Libros

Para abrir un libro excel utilizamos la instrucción Open. Si queremos abrir un libro determinado
podemos utilizar la siguiente macro:

Sub AbrirLibro()
Dim Nombre As String
Nombre = "C:\MiLibro.xls"
' Si no se encuentra el libro hacemos que salga un mensaje de aviso
If Dir(Nombre) = "" Then
MsgBox Nombre & " no se encuentra"
Else
Workbooks.Open FileName:=Nombre, updateLinks:=False
End If
End Sub

Para abrir un libro cuando tiene clave debemos especificar la contraseña y al mismo tiempo
escribirla tal que:

Sub Abrir()
Dim Libro As Workbook
Set Libro = Workbooks.Open(Filename:="C:\Directorio\Libro.xls", Password:="qaz",
WriteResPassword:="qaz")
End Sub

Para abrir un libro cuando tiene vínculos deberíamos especificar si queremos actualizar los
vínculos o no, tal como se ve a continuación:

Sub Abrir()
Application.EnableEvents = True
Workbooks.Open Filename:="c:\Directorio\MiLibro.xls", UpdateLinks:=False
End Sub

Para obtener información de un libro:

Sub Informacion ()
ActiveWorkbook.Name 'Obtendríamos su nombre, por ej. Libro4.xls
ActiveWorkbook.Path ' Obtendríamos la ruta del libro activo, por ej. C:\Windows
ActiveWorkbook.FullName ' Obtendríamos ruta+nombre, por ej. C:\Windows\Libro4.xls
End Sub

116
www.todoexcel.com

Para abrir todos los libros de un directorio:

Sub AbrirLibros()
Dim X As Long
Dim Libro As Workbook
Dim Directory As String
Directory = ActiveWorkbook.Path
On Error Resume Next
Application.EnableEvents = False ' Para evitar macros de evento en los libros abiertos
With Application.FileSearch
.NewSearch
.LookIn = Directory
.Filename = "*.Xls" ' si solo quisiéramos abrir libros Excel, extensión = XLS
.SearchSubFolders = False ' Si no quisiéramos abrir los Subdirectorios
.Execute
For X = 1 To .FoundFiles.Count
Set Libro = Workbooks.Open(Filename:=.FoundFiles(X))
Next X
End With
Application.EnableEvents = True ' Para volverlo a su estado natural
End Sub

3.3.2. Cerrar Libros

Para cerrar un libro utilizamos la instrucción Close:

Sub Cerrar()
ActiveWorkbook.Close
End Sub

Si queremos cerrarlo sin que nos pregunte si queremos guardar los posibles cambios realizados,
debemos indicar que no queremos que se muestren los mensajes de alerta:

Sub Cerrar()
Application.DisplayAlerts = False
ActiveWorkbook.Close
End Sub

Para cerrar todos los libros abiertos sin que nos pregunte si queremos guardar los posibles cambios
registrados en cada libro si los hubiese:

Sub Cerrar()
Application.DisplayAlerts = False
Application.Workbooks.Close
End Sub

Y dejando que nos pregunte:

117
www.todoexcel.com

Sub Cerrar()
Application.Workbooks.Close
End Sub

Con lo cual si tubiéramos 5 libros abiertos y en cuatro de estos libros hubiéramos cambiado algo
obtendríamos 4 mensajes con la pregunta:

microsoft Excel:
Desea guardar los cambios efectuados en...?

Si quisieramos cerrar Excel:

Sub CierraExcel()
Application.Quit
End Sub

3.3.3. Guardar Libros

Para guardar un libro utilizamos la instrucción SaveAs. Si queremos guardarlo con un nombre que
figura en una celda (por ej. si en la celda A1 está el nombre "QAZ"):

Sub Macro()
On Error Resume Next
' Ponemos On Error Resume Next, para evitar el error derivado de una celda vacía y/o con un caracter
con el que excel no permite guardar un libro
ActiveWorkbook.SaveAs [A1].Value
' También podríamos poner
' ActiveWorkbook.SaveAs Filename:=Range('A1').Value

End Sub

La macro anterior guardaría el libro activo con el nombre QAZ. Debemos recordar que no todos los
caracteres del alfabeto son válidos para guardar un libro, por ejemplo los caracteres @ ? ¿ . | NO
son caracteres válidos.

Para guardar un libro en otra carpeta deberíamos especificar en que carpeta queremos guardarlo tal
que :

Sub Macro()
Dim Carpeta As String
On Error Resume Next
Carpeta = "F:\"
ActiveWorkbook.SaveAs Carpeta & [A1].Value ' Si utilizamos el nombre de la celda A1
ActiveWorkbook.SaveAs "F:\Ventas.xls" ' O podríamos especificar este otro nombre
End Sub

118
www.todoexcel.com

Del mismo modo que podemos guardar y abrir un documento desde y donde querramos, también
podemos guardarlo en diferentes formatos. Por defecto cuando guardamos un libro y no
especificamos su extensión Excel lo hace como un .XLS, es decir un libro de Excel. Pero también
podríamos especificar el formato como si de otra propiedad se tratara:

Sub Macro()
Dim Carpeta As String
On Error Resume Next
Carpeta = "F:\"

ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlTemplate


' Lo guardaría como una plantilla es decir con una extensión: XLA

ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlNormal


' Lo guardaría como una hoja normal es decir con una extensión: XLS

ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlHtml


' Lo guardaría como una Hoja Web es decir con una extensión: Htm

ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlUnicodeText


' Lo guardaría como una Hoja de texto es decir con una extensión: TxT

End Sub

3.3.4. Borrar Libros

Para borrar un libro utilizamos la instrucción Delete:

Sub BorraLibro ()
Workbooks("C:\TuLibro.xls").Delete
End Sub

Conviene recordar que excel nos pedira confirmación antes de borrarlo.

Ejemplo de la instrucción Kill


En este ejemplo se utiliza la instrucción Kill para borrar un archivo de un disco.
Se supone que PRUEBA es un archivo que contiene información.

Sub Killer ()

' Se elimina el archivo.


Kill "PRUEBA"

' Se eliminan todos los archivos *.TXT del directorio actual


Kill "*.TXT"

End Sub

Para eliminar el libro activo, en caso de que estuviera abierto, primero deberiamos cerrarlo, tal que:

119
www.todoexcel.com

Sub Eliminar()
Dim strFile As String
strFile = ActiveWorkbook.FullName
ActiveWorkbook.Close SaveChanges:=False
Kill strFile
End Sub

o bien:

Kill "C:\Hola.xls"

o bien:

Sub BorrarLibros()
Dim X As Long
Dim Libro As Workbook
Dim Directory As String
Directory = ActiveWorkbook.Path
On Error Resume Next
Application.EnableEvents = False ' Para avitar macros de evento en los libros abiertos
With Application.FileSearch
.NewSearch
.LookIn = Directory
.Filename = "*.Xls" 'si solo quisiéramos borrar los libros Excel, extension = XLS
.SearchSubFolders = False ' Si no quisiéramos borrar los libros de los Subdirectorios
.Execute
For X = 1 To .FoundFiles.Count
kill .FoundFiles(X)
Next X
End With
Application.EnableEvents = True ' Para volverlo a su estado natural
End Sub

3.3.5. Crear Libros

Para crear 1 nuevo libro utilizamos la instrucción Add, por ejemplo:

Sub NuevoLibro()
Workbooks.Add
End Sub

Si quisiéramos crear 2 nuevos libros:

Sub NuevoLibro()
Workbooks.Add
Workbooks.Add
End Sub

120
www.todoexcel.com

Abrir un libro en blanco o crear un libro es lo mismo, pero también podemos crear libros basados en
plantillas o en otras hojas de cálculo, es decir en otros libros tal que:

Sub Macro()
Dim Libro1 As Workbook
Dim Libro2 As Workbook
Set Libro1 = Workbooks.Add
Debug.Print Libro1.Name ' Utilizamos la ventana Inmediata del editor de VBA
Set Libro2 = Workbooks.Add
Libro1.Activate
End Sub

Podemos crear 2 nuevos libros y activar el primero de ellos creado, pero la palabra Add permite
crear un nuevo libro y el libro creado no tiene por que estar guardado como una plantilla es decir con
la extension xla, puede ser un libro xls:

Sub Macro()
Dim OtroLibro As Workbook
Dim X As Byte
For X = 1 To 10
Set OtroLibro = Workbooks.Add(template:="C:\QAZ.xls")
Debug.Print OtroLibro.Name
Next X
' Abriríamos 10 libros que saldrían con los siguientes nombres, en la ventana inmediata de VBA
'QAZ2
'QAZ3
'QAZ4
'QAZ5
'QAZ6
'QAZ7
'QAZ8
'QAZ9
'QAZ10
'QAZ11
End Sub

3.3.6. Imprimir Libros

Para imprimir libros u hojas utilizamos la instrucción PrintOut, por ejemplo:

Sub Imprimir ()
' Imprime el libro activo
ActiveWorkbook.Printout
End Sub

Si queremos imprimir un libro y hoja determinada:

Sub Imprimir ()
' Imprime el libro y hoja indicados
Workbooks("MiLibro.Xls").Sheets("Hoja1").Printout
End Sub

121
www.todoexcel.com

Si queremos imprimir un rango determinado, por ejemplo A4:H100

Sub ImprimirRango ()
' Imprime el rango indicado
Sheets("Hoja1").PageSetup.PrintArea = "$A$4:$H$100"
Workbooks("MiLibro.Xls").Sheets("Hoja1").Printout
End Sub

3.3.7. Calcular Libros

Los cálculos se realizan con la instrucción Calculate. Las distintas formas de realizar cálculos con
macros son:

Para realizar todos los cálculos que tengan que realizarse en el libro:

Sub CalculaTodo()
Calculate
End Sub

Calcular hoja: calcula la hoja de cálculo activa, así como los gráficos y las hojas de gráfico vinculados
a esta hoja de cálculo:

Sub CalculaHoja()
ActiveSheet.Calculate
End Sub

También podemos especificar las opciones de cálculo para indicarle a Excel como realizar los
cálculos. La configuración de cálculo predeterminada de Excel es Automático, pero también
podríamos definir otras formas:

Automático: calcula todas las fórmulas dependientes cada vez que se cambia un valor, una fórmula o
un nombre.

Sub CalculoAutomatico ()
Application.Calculation = xlAutomatic
End Sub

Automático excepto tablas: calcula todas las fórmulas dependientes, salvo las tablas de datos (para
calcular las tablas de datos podemos hacer clic en "Calcular ahora" en la ficha Cálculo del menú
Herramientas, Opciones):

122
www.todoexcel.com

Sub CalculoAutomaticoSinTablas ()
Application.Calculation = xlSemiautomatic
End Sub

Manual: sólo calcula los libros abiertos cuando se presiona la tecla F9

Sub CalculoAutomatico ()
Application.Calculation = xlManual
End Sub

3.3.8. Proteger/Desproteger Libros

La protección de libros se hace con las instrucciones Protect y Unprotect, por ejemplo:

Sub ProtegeLibro()
With ActiveWorkbook
' Primero protegemos esctuctura (mover, copiar, insertar hojas) y ventana (cambiar tamaño o mover
ventana)
.Protect Structure:=True, Windows:=True
' Desprotegemos con clave 'Excel'
.Unprotect ("Excel")
' Protegemos con clave 'Excel'
.Protect ("Excel")
End With
End Sub

Para proteger un libro primero se debe desproteger con Unprotect y luego protegemos con Protect.
La clave se pone entre comillas y paréntesis y es sensible a las mayúsculas (si protejo con "Excel" la
clave "excel" no funcionará).

Para desproteger el libro hacemos:

Sub DesprotegeLibro ()
ActiveWorkbook.Unprotect ("Excel")
End Sub

123
www.todoexcel.com

3.3.9. Listar Libros

Para listar libros con extensión *.* de un directorio (o con otra extensión) de un directorio y los
subdirectorios, podemos utilizar la siguiente macro:

Sub AbrirLibros()
Dim X As Long
Dim Libro As Workbook
Dim Directory As String
Directory = ActiveWorkbook.Path
On Error Resume Next
Application.EnableEvents = False ' Para evitar macros de evento en los libros abiertos
With Application.FileSearch
.NewSearch
.LookIn = Directory
.Filename = "*.Xls" ' si solo quisiéramos abrir libros Excel, extension = XLS
.SearchSubFolders = False ' Si no quisiéramos abrir los Subdirectorios
.Execute
For X = 1 To .FoundFiles.Count
Set Libro = Workbooks.Open(Filename:=.FoundFiles(X))
Next X
End With
Application.EnableEvents = True ' Para volverlo a su estado natural
End Sub

124
www.todoexcel.com

3.4. HOJAS

Mediante macros VBA podemos manipular de distintas formas las hojas de los libros Excel. En este
capítulo veremos como hacerlo.

3.4.1. Agregar

Para agregar una nueva hoja al libro utilizamos la instrucción Add. Si queremos agregar una nueva
hora al libro activo utilizamos el siguiente código:

Sub AgregarHoja()
ActiveWorkbook.Worksheets.Add
End Sub

Otra forma de hacerlo es:

Sub AgregarHoja()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add
End Sub

Utilizando los códigos anteriores la nueva hoja creada se colocará justo delante de la hoja activa de
nuestro libro activo.

Si quisiéramos crear una nueva hoja en nuestro libro, y que fuera colocada a la derecha de todas las
demas hojas, podríamos utilizar la siguiente sintaxis:

expresión.Add(Before, After, Count, Type)

expresión (requerida): expresión que devuelve uno de los objetos arriba mencionados, en nuestro
caso Worksheets.

Before Variant (opcional): un objeto que especifica la hoja antes de la cual se agregará la hoja
nueva.

After Variant (opcional): un objeto que especifica la hoja después de la cual se agregará la hoja
nueva.

Count Variant (opcional): el número de hojas de cálculo que se agregarán. El valor predeterminado
es uno.

Type Variant (opcional): especifica el tipo de hoja. Puede ser una de las siguientes constantes
XlSheetType: xlWorksheet, xlChart, xlExcel4MacroSheet o xlExcel4IntlMacroSheet. Si deseas insertar
una hoja basada en una plantilla existente, especifica la ruta de acceso a dicha plantilla. El valor
predeterminado es xlWorksheet.

125
www.todoexcel.com

Teniendo en cuenta lo anterior, podríamos hacer:

Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets(Worksheets.Count))
End Sub

Esta macro crea una nueva hoja y la coloca despues de la ultima hoja, a la cual hacemos mención
con "Sheets(Worksheets.Count)".

También hubiéramos podido utilizar el siguiente código en base a lo dicho al principio de esta
sección:

Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets("hoja3"))
End Sub

Es decir crearíamos una hoja después de la hoja llamada "hoja3".

En el caso anterior, podría darse el caso de que el nombre de esta hoja estuviera mal escrito tal que:

Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets("oja3")) ' Escribimos 'oja' en lugar de 'Hoja'
End Sub

Entonces obtendríamos un error de compilación, el cual podemos evitar agregando una instrucción
On Error al comienzo de la macro:

Sub Agregar()
On Error Resume Next
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets("oja3"))
End Sub

En el caso anterior evitaríamos el error de compilación. Como "oja3" no existe, la macro, al no saber
que hacer, continuaría a la siguiente línea de código saltándose las instrucciones dadas y que han
provocado el error.

Si quisiéramos crear 5 nuevas hojas antes que la 3º hoja en un libro que contiene 7 hojas:

Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(before:=Sheets(3), Count:=10)
End Sub

y si esta 3º hoja se llamara "Ventas":

126
www.todoexcel.com

Sub Agregar()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(before:=Sheets("Ventas"), Count:=10)
End Sub

3.4.2. Selecionar

Dentro de los libros de excel, podemos encontrar hojas y gráficos. Para referirnos a una hoja dentro
de un libro tenemos distintas posibilidades. Podemos utilizar las instrucciones Select o Activate (en la
sección siguiente veremos la diferencia).

Seleccionar una hoja utilizando su número de hoja contenida dentro del libro, como se ve a
continuación:

Sub Seleccionar()
' para seleccionar la primera hoja del libro activo
ActiveWorkbook.Sheets(1).Select
' para seleccionar la segunda hoja del libro activo
ActiveWorkbook.Sheets(2).Select
' para seleccionar la tercera hoja del libro activo
ActiveWorkbook.Sheets(3).Select
End Sub

Ahora bien, si una hoja esta oculta no podremos seleccionarla ni activarla. Esto lo solucionamos de la
siguiente forma:

Sub Seleccionar()
With ActiveWorkbook.Sheets(1)
.Visible = True
.Select
End With
End Sub

o bien:

Sub Seleccionar()
With Sheets(1)
.Visible = True
.Activate
End With
End Sub

Seleccionar una hoja utilizando el nombre de la hoja contenida dentro del libro, como se ve a
continuación:

Sub Seleccionar()
' para seleccionar la segunda hoja del libro activo
ActiveWorkbook.Sheets("Hoja2").Select
End Sub
127
www.todoexcel.com

o lo que es lo mismo en caso de que una hoja este oculta:

Sub Seleccionar()
With ActiveWorkbook.Sheets("Hoja2")
.Visible = True
.Select
End With
End Sub

Para selecionar todas las hojas de un libro utilizaremos la siguiente instruccion:

Sub SeleccionarTodas()
Activeworkbook.Sheets.Select
End Sub

La instrucción anterior a su vez activará una hoja...cual? La primera del libro. La manera de
comprobarlo es sencilla, ya que la hoja activa es aquella que presenta su nombre en negrita.

También se pueden seleccionar hojas mediante la instrucción Array, por ej. creando un array que
contenga en índice de las hojas que querramos selecionar (ver capítulo "Arrays" para más detalle).

Esta instrucción seleccionaría las hojas 3 y 1 en este orden con lo cual la hoja 3 será la hoja activa.

Sub Seleccionar ()
ActiveWorkbook.Sheets(Array(3, 1)).Select
End Sub

Esta instrucción seleccionaría las hojas 1,2,3 y la hoja activa seria la 1

Sub Seleccionar ()
ActiveWorkbook.Sheets(Array(1,2,3)).Select
End Sub

También se puede crear un Array que contenga los nombres de las hojas que queramos selecionar.

Esta instrucción activaría la hoja llamada "hoja3" y selecionaría las hojas llamadas "hoja3" y "pedro":

Sub Seleccionar ()
ActiveWorkbook.Sheets(Array("hoja3", "pedro")).Select
End Sub

Con esta otra instrucción selecionaríamos las hojas cuyos nombres son: "ventas","compras",
"resultado" y activaría la hoja "ventas".

Sub Seleccionar ()
ActiveWorkbook.Sheets(Array("ventas","compras", "resultado")).Select
End Sub

128
www.todoexcel.com

También podemos al mismo tiempo mezclar ambos métodos comentados antes (seleccionar por
nombre o por número de hoja):

Sub Seleccionar ()
ActiveWorkbook.Sheets(Array(1, 2, "ventas")).Select
End Sub

En el ejemplo anterior la hoja activa sería la primera de nuestro libro y las hojas selecionadas serían
las 2 primeras y la llamada "ventas".

Recordar que la hoja activa siempre es la que figura como primer miembro del array.

3.4.3. Selecionar vs. Activar

Conviene recordar la diferencia entre selecionar y activar una hoja (la diferencia es la misma entre
seleccionar y activar una celda). La instrucción para seleccionar es Select y la instrucción para
activar es Activate.

Cuando sleccionamos un rango en excel, por ejemplo B2:C15, estamos seleccionando las celdas
contenidas en las columnas B y C y las filas 2 y 15, ambas inclusive, pero entre todas estas celdas
seleccionadas tan solo una de ellas es la Activa, es decir aquella sobre la que observaríamos como
escribimos algo cuando tecleamos en nuestro teclado. Del mismo modo podemos tener tres hojas
seleccionadas al mismo tiempo, pero tan solo una de ellas será la hoja activa.

Lógicamente, cuando operamos solo sobre una hoja y la misma está selecionada, Select o Activate
es lo mismo (es decir seleccionar o activar da igual), tal como se ve en el siguiente ejemplo:

Sub SeleccionarHoja()
'en este caso da igual selecionar que activar
'Selecciona la primera hoja del libro
Sheets(1).Select
'activa la 3 hoja del libro
Sheets(3).Activate
End Sub

Para seleccionar una hoja debemos tener en cuenta si está oculta o no, pues de lo contrario no
podemos selecionarla, por ej:

With ActiveWorkbook.Sheets(1)
.Visible = True
.Select
End With

Para selecionar todas las hojas de un libro utilizaremos la siguiente instruccion:

Sub SeleccionarTodas
activeworkbook.Sheets.select
End Sub

129
www.todoexcel.com

La instrucción anterior a su vez activará una hoja...Cual? La primera del libro !


La manera de comprobarlo es sencilla, ya que la hoja activa es aquella que presenta su nombre en
negrita.

3.4.4. Mover Hojas

Para mover hojas de un lugar del libro a otro debemos utilizar la instrucción Move, la cual desplaza
la hoja de cálculo a otro lugar del libro.

La sintaxis de esta intrucción es:


expresión.Move(Before, After)
expresión (requerida): expresión que devuelve un objeto de la lista Aplicar a.
Before Variant (opcional): la hoja de cálculo antes de la cual se situará la desplazada. No se puede
especificar Before si se especifica After.
After Variant (opcional): la hoja de cálculo después de la cual se situará la desplazada. No se puede
especificar After si se especifica Before.

Si no se especifica Before o After, Microsoft Excel creará un nuevo libro que contenga la hoja
desplazada.

Veamos un ejemplo de cómo mover una hoja:

Sub Mover()
Worksheets("Hoja1").Move after:=Worksheets("Hoja3")
End Sub

En el caso anterior movemos la Hoja1 a la derecha de la Hoja3 (asumiendo que esas hojas se llaman
así). Conviene recordar que si la hoja se llama Hoja3 no significa que su posición sea la tercera
dentro del libro, tan solo que se llama Hoja3 (del mismo modo que mi perro se llama Excel, y dudo
que sepa algo sobre Microsoft). Por ejemplo, nuestro libro podría tener solo 2 hojas (Hoja1 y Hoja3
respectivamente). De tal modo la macro anterior les cambiaría el orden, poniendo Hoja3 y luego
Hoja1.

Si abrimos un libro con 3 hojas (teniendo la hoja 2 como activa) la siguiente macro primero movería
la hoja 2 delante de la hoja 1, y después moveria la hoja 2 al final de todo hacia la derecha.

Sub moverHoja()
Dim Hoja As Worksheet
Set Hoja = ActiveSheet
Hoja.Move before:=Sheets(1)
Set Hoja = Sheets(1)
Hoja.Move after:=Sheets(Sheets.Count)
End Sub

La siguiente macro realizaría la misma función en un libro con 3 hojas:

Sub moverHoja()
Dim Hoja As Worksheet

130
www.todoexcel.com

Set Hoja = Sheets(2)


Hoja.Move before:=Sheets(1)
Set Hoja = Sheets(1)
Hoja.Move after:=Sheets(Sheets.Count)
End Sub

La siguiente macro contiene 2 líneas absurdas ya que al ser en principio, Hoja1 la primera hoja
cuando abrimos un nuevo libro, moverla de la posición 1 sería como volver a selecionar una celda
que ya estaba selecionada:

Sub moverHoja()
Dim Hoja As Worksheet
Set Hoja = Sheets("Hoja1")
Hoja.Move before:=Sheets(1)
Set Hoja = Sheets(1)
Hoja.Move after:=Sheets(Sheets.Count)
End Sub

3.4.5. Borrar Hojas

Cuando se elimina una hoja o un libro, excel siempre nos pide confirmación, del mismo modo que
cuando eliminamos cualquier otro fichero.
Cuando se elimina una hoja o un libro, este método muestra un cuadro de diálogo en el que se nos
pide confirmar la eliminación. Este cuadro de diálogo se muestra de manera predeterminada. Al
llamar a este método en el objeto Workbook o Worksheet, el método Delete devuelve un valor de
tipo Boolean, es decir True (verdadero o sí) o False (falso o no). Este valor es False si el usuario hizo
clic en Cancelar en el cuadro de diálogo o es True si el usuario hizo clic en Eliminar.

En este ejemplo se elimina la hoja llamada "Hoja1" en caso de que confirmemos la opción que
observaremos cuando se ejecute el código:

Sub BorrarHoja()
Sheets("Hoja1").Delete
End Sub

En este otro ejemplo se elimina la hoja1 del libro activo sin mostrar el cuadro de diálogo de
confirmación:

Sub borrarHoja()
Application.DisplayAlerts = False
Sheets("Hoja1").Delete
Application.DisplayAlerts = True
End Sub

En este otro ejemplo se elimina la hoja situada en primer lugar del libro activo sin mostrar el cuadro
de diálogo de confirmación:

Sub borrarHoja()
Application.DisplayAlerts = False
Sheets(1).Delete
Application.DisplayAlerts = True
End Sub

131
www.todoexcel.com

3.4.6. Copiar Hojas

Para copiar hojas utilizamos la instrucción Copy cuya sintaxis es:

expresión.Copy(Before, After)
expresión (Requerida): expresión que devuelve uno de los objetos arriba mencionados.
Before Variant (opcional): la hoja de cálculo antes de la cual se copiará ésta. No se puede especificar
Before si se especifica After.
After Variant (opcional): la hoja de cálculo después de la cual se copiará ésta. No se puede
especificar After si se especifica Before.

Veamos un ejemplo de cómo copiar una hoja:

Sub Copiar()
' Copiamos la Hoja1 después de la Hoja3
Worksheets("Hoja1").Copy after:=Worksheets("Hoja3")
End Sub

Veamos otro ejemplo de cómo copiar una hoja:

Sub copiarHoja()
Dim Hoja As Worksheet
Set Hoja = ActiveSheet
Hoja.Copy before:=Sheets(1)
Set Hoja = Sheets(1)
Hoja.Copy after:=Sheets(Sheets.Count)
End Sub

3.4.7. Ocultar/Mostrar Hojas

La propiedad para mostrar u ocultar es Visible y debemos asignarle True o False en caso de querer
mostrar u ocultar, respectivamente. Todo libro debe tener al menos una hoja visible. Esto implica
que si el libro tiene 10 hojas solo podremos ocultar 9, y si el libro solo tiene 1 hoja no la podremos
ocultar.

Si tenemos 1 libro con más de 1 hoja, veamos como ocultar la primer hoja del libro (sin importar
como se llame):

Sub Ocultar ()
ActiveWorkbook.Sheets(1).Visible=False
End Sub

Y para volver a mostrar la hoja oculta simplemente cambiamos el False por True:

Sub Mostrar ()
ActiveWorkbook.Sheets(1).Visible=True
End Sub
132
www.todoexcel.com

También podemos ocultar varias hojas utilizando la instrucción Array:

Sub Ocultar
ActiveWorkbook.Sheets(Array(1, 2, "ventas")).Visible = False
End Sub

La instrucción anterior oculta las dos primeras hojas como así también la hoja llamada "ventas".
Ahora bien, la intrucción no funcionaría para volver a mostrar, ya que esto debe ser realizado de una
en una.

Sub Mostrar()
Sheets(1).Visible = True
Sheets(2).Visible = True
Sheets("ventas").Visible = True
End Sub

Esta manera de ocultar las hojas no evitaría poder saber que existen hojas ocultas. Podríamos saber
si hay hojas ocultas desde el menú Formato > Hojas > Mostrar de Excel y podríamos observar el
nombre de las hojas ocultas, aún cuando estas estuvieran ocultas con una contraseña que nos
impidiera mostrarlas. Que no podamos mostrarlas no implica que no sepamos que algo esta oculto si
lo quisiéramos.

Si queremos ocultar hojas y además ocultarlas desde el menú Formato > Hojas > Mostrar de Excel
(aún cuando estas hojas no contengan contraseña para ser desprotegidas) deberíamos hacer:

Sub SuperOcultas()
ActiveWorkbook.Sheets("ventas").Visible = xlSheetVeryHidden
End Sub

3.4.8. Nombrar

Para renombrar una hoja utilizamos la instrucción Name, tal como se ve a continuación:

Sub Renombrar()
Sheets("Ventas").Name = "Compras"
End Sub

En el caso anterior renombraríamos la hoja llamada "Ventas" con el nuevo nombre "Compras".

Si queremos renombrar la primer hoja del libro con el nombre "total":

Sub Renombrar()
Sheets(1).Name = "total"
End Sub

Conviene recordar que da lo mismo que los nombres de las hojas estén escritos en mayúsculas o en
minúsculas, ya que:
133
www.todoexcel.com

Sheets("Ventas").select
Sheets("VenTAs").select
Sheets("ventas").select

sería lo mismo, Excel no diferenciaría mayúsculas o minúsculas y en todos los casos seleccinaría la
hoja "Ventas".

Con la siguiente macro crearíamos una hoja, la situaríamos al final (después de la última hoja del
libro) y finalmente la llamaríamos con el nombre "ventas":

Sub Macro()
Dim Hoja As Worksheet
Set Hoja = Worksheets.Add(After:=Sheets(Worksheets.Count))
Hoja.Name = "Ventas"
End Sub

En la macro anterior, Worksheets.Count devuelve un número que representa la cantidad de hojas


que tiene el libro.

Ante el caso de que otra de nuestras hojas se llamara "ventas" nos encontraríamos ante un error de
compilación, ya que no es posible llamar dos hojas con el mismo nombre. Entonces, primero
deberíamos renombrar previamente.

3.4.9. Proteger / Desproteger Hojas

Para proteger y desproteger una hoja sin contraseña, utilizamos las intrucciones Protect y Unprotect,
tal como se ve a continuación:

' Para proteger la primera hoja


Sub Proteger ()
Sheets(1).Protect
End Sub

' Para desproteger la primera hoja


Sub Desproteger()
Sheets(1).Unprotect
End Sub

Para realizar lo anterior, pero utilizando como contraseña la palabra "hola", debemos agregar la
propiedad Password, tal que:

' Para proteger la primera hoja con la palabra 'hola'


Sub Proteger ()
Sheets(1).Protect Password:="hola"
End Sub

' Para desproteger la primera hoja con la palabra 'hola'


Sub Desproteger()

134
www.todoexcel.com

Sheets(1).Unprotect Password:="hola"
End Sub

Desde Excel no podemos proteger varias hojas en simultáneo, nos obliga proteger una a una. Sin
embargo desde una macro sí podemos proteger las hojas que querramos de forma simultánea. La
siguiente macro protegería todas las hojas del libro activo, excepto las hojas que son gráficos.
Además las protegería con la contraseña "hola".

Sub Proteger()
Dim Sht As Worksheet
For Each Sht In ThisWorkbook.Sheets 'If TypeName(Sht) = 'worksheet'
With Sht
If TypeName(Sht) = "Worksheet" Then
.Protect Password:="hola"
End If
End With
Next Sht
End Sub

Ahora bien, existen gran cantidad de datos y elementos dentro de las hojas que queremos proteger
(y otra gran cantidad que no queremos proteger). Todas ellas figuran en la lista del menú Excel
Herramientas > Proteger > Proteger hoja.

La siguiente macro explica como proteger todo (podemos cambiar True por False en caso de no
querer aplicar la protección a algún elemento en particular):

Sub ProtegerTodo()
With ActiveSheet

.Protect DrawingObjects:=True
' Protegemos objetos

.Protect Contents:=True
' Protegemos contenidos

.Protect Scenarios:=True
' Protegemos escenarios

.Protect AllowFormattingCells:=True
' Protegemos formato de celdas

.Protect AllowFormattingColumns:=True
' Protegemos formato de columnas

.Protect AllowFormattingRows:=True
' Protegemos formato de filas

.Protect AllowInsertingColumns:=True
' Protegemos la posibilidad que se inserten columnas

.Protect AllowInsertingRows:=True
' Protegemos la posibilidad que se inserten filas

.Protect AllowInsertingHyperlinks:=True

135
www.todoexcel.com

' Protegemos la posibilidad que se inserten hipervícnulos

.Protect AllowDeletingColumns:=True
' Protegemos la posibilidad que se borren columnas

.Protect AllowDeletingRows:=True
' Protegemos la posibilidad que se borren filas

.Protect AllowSorting:=True
' Protegemos la posibilidad que se utilice la opción de Ordenar

.Protect AllowFiltering:=True
' Protegemos la posibilidad que se utilice la opción de Filtrar

.Protect AllowUsingPivotTables:=True
' Protegemos la posibilidad que se utilicen Tablas Dinámicas

.Protect Password:="WW"
' Asignamos la clave de protección 'WW'

End With
End Sub

En la macro anterior protegemos todo dentro de la hoja, y lo hacemos con la contraseña "WW" la
cual SI que distingue entre mayúsculas y minúsculas. Recuerda que si no quisiéramos proteger
alguna de esas propiedades bastaría con poner:=False.

No obstante conviene entender que hay propiedades que al ser aplicadas impiden que otras que no
han sido aplicadas puedan ser utilizadas (en este sentido es como si yo te dejara ver un partido en el
estadio de fútbol del Real Madrid, pero te impidiera estar en Madrid). Lógicamente no podrías llegar
a ver el partido, pues una de las restricciones impide otro de los permisos. Lo mismo ocurre en
Excel, por lo que debemos tener cuidado y recordar esto.

3.4.10. Vista Previa de Hojas

La Vista previa no es una opción muy utilizada, salvo en las macros de evento, las cuales son
ejecutadas cuando un ocurre un evento, por ej:

Private Sub Workbook_BeforePrint(Cancel As Boolean)

End Sub

La anterior es una macro que ocurre cuando presionamos el botón de vista preliminar en cualquier
hoja del libro.

Si quisiéramos evitar que alguien utilizara la vista preliminar, haríamos:

Private Sub Workbook_BeforePrint(Cancel As Boolean)


Cancel = True
End Sub

136
www.todoexcel.com

La macro anterior anularía la utilidad del botón de vista preliminar, pues el mismo quedaría
inutilizado de inmediato.

3.4.11. Imprimir Hojas

Para imprimir la hoja actual hacemos la instrucción PrintOut, tal que:

Sub ImprimeHoja ()
ActiveSheet.PrintOut
End Sub

Si además deseamos fijar previamente un rango de impresión hacemos:

Sub ImprimeRango ()
ActiveSheet.PageSetup.PrintArea = Range("$A$1:$C$10").Address
ActiveSheet.PrintOut
End Sub

En la macro anterior, cuando queremos imprimir un rango, es necesario agregar la instrucción


Address, caso contrario no funcionará.

Si deseamos poner un encabezado a la izquierda de cada hoja, con la frase "Reporte Trimestral" (o
cualquier otro mensaje):

Private Sub Workbook_BeforePrint(Cancel As Boolean)


Dim Sht As Worksheet
For Each Sht In ThisWorkbook.Sheets
With Sht.PageSetup
.LeftHeader = "Reporte Trimestral" ' O cualquier otro mensaje...
End With
Next Sht
End Sub

3.4.12. Color de Hojas

Es posible cambiar el color de las etiquetas (las que figuran en la parte inferior y muestran el
nombre de la hoja). La etiqueta es el objeto Tab y con su propiedad ColorIndex podemos cambiar su
color. Esto solo se puede hacer en Excel 2.002 o superior (en versiones anteriores de Excel NO es
posible cambiar el color de etiquetas de hojas).

También podrías cambiar el color de etiqueta de hoja con clic derecho sobre la misma y eligiendo la
opción "Color de Etiquetas".

Para cambiar el color de etiqueta con una macro (Excel 2.002 o superior) podemos hacer:

Sub ColorEtiqueta()

137
www.todoexcel.com

ActiveWorkbook.Sheets("Hoja1").Tab.ColorIndex = 5
End Sub

El número que se le asigna a ColorIndex indica el color. Si quieres averiguar el número


correspondiente para un determinado color, puedes hacer lo siguiente:

1. Clic derecho sobre una etiqueta de hoja


2. Elige la opción "Color de Etiquetas"
3. Elige un color de la paleta
4. Aceptar
5. En la ventana Inmediato del editor VBA escribe: ?Activesheet.Tab.ColorIndex
6. Enter

Verás que aparece un número que representa el color de la etiqueta. Podrás utilizar dicho número en
la macro.

3.4.13. Ordenar Hojas

Para ordenar las hojas se suele utilizar la instrucción Move. Una forma rápida de ordenar las hojas de
un libro alfabéticamente en el orden ascendente y/o descendente es:

Sub OrdenarAscendentemente()
Dim X As Integer, Y As Integer
For X = 1 To Sheets.Count
For Y = X To Sheets.Count
If UCase(Worksheets(Y).Name) < UCase(Worksheets(X).Name) Then
Worksheets(Y).Move Before:=Worksheets(X)
End If
Next Y
Next X
End Sub

Sub OrdenarDescendentemente()
Dim X As Integer, Y As Integer
For X = 1 To Sheets.Count
For Y = X To Sheets.Count
If UCase(Worksheets(Y).Name) > UCase(Worksheets(X).Name) Then
Worksheets(Y).Move Before:=Worksheets(X)
End If
Next Y
Next X
End Sub

También se podrían ordenar las hojas de un libro utilizando un array con los nombres de las hojas,
ordenando este array y luego moviendo en función del orden. El caso es que el anterior ejemplo
funciona perfectamente, ya que saca provecho de la función uppercase "mayúsculas" pues
A>AA>AB>ABC es decir, que nos dice el orden necesario.

138
www.todoexcel.com

Otras maneras de ordenar podrían ser:

Sub OrdenarAscendentemente()
Dim X As Long, Y As Long
For X = 1 To Worksheets.Count
Y=X
Do While Y > 1
If Worksheets(Y).Name < Worksheets(Y - 1).Name Then
Worksheets(Y).Move Before:=Worksheets(Y - 1)
End If
Y=Y-1
Loop
Next
End Sub

Sub OrdenarDescendentemente()
Dim X As Long, Y As Long
For X = 1 To Worksheets.Count
Y=X
Do While Y > 1
If Worksheets(Y).Name > Worksheets(Y - 1).Name Then
Worksheets(Y).Move Before:=Worksheets(Y - 1)
End If
Y=Y-1
Loop
Next
End Sub

139
www.todoexcel.com

3.5. RANGOS

Mediante macros VBA podemos manipular de distintas formas los rangos y celdas de las hojas Excel.
En este capítulo veremos como hacerlo.

3.5.1. Selección de celdas

Existen diversas formas de seleccionar celdas, y en todas ellas utilizamos el método Select.

Veamos 3 métodos (equivalentes) para seleccionar una celda, por ejemplo la celda C4:

' La forma clásica de seleccionar


Sub Seleccionar ()
Range("C4").Select
End Sub

' Esta es otra terminología válida para seleccionar


Sub Seleccionar ()
[C4].Select
End Sub

' Finalmente podemos seleccionar de esta otra forma


' El primer Nº equivale a fila y el segundo a columna.
Sub Seleccionar ()
Cells(4, 3).Select
End Sub

En los 3 casos anteriores se selecciona la celda C4. En el primer caso utilizamos el objeto Range y en
el tercer caso el objeto Cells.
También podemos seleccionar determinadas celdas (con datos, con fórmulas, etc). En la siguiente
macro iremos seleccionando distintos tipos de celdas:

Sub Seleccionando ()
On Error Resume Next
' Colocamos On Error Resume Next
' para evitar el error re compilación derivado de no poder selecionar un rango que no existe
' por ej., si la hoja activa no tuviera comentarios, no podríamos selecionarla con el código

' Para seleccionar todas la celdas que contienen comentarios.


Cells.SpecialCells(xlCellTypeComments).Select

'Para seleccionar todas la celdas cuyo valor es una constante.


Cells.SpecialCells(xlCellTypeConstants, 23).Select

' Para seleccionar todas la celdas que contienen fórmulas.


Cells.SpecialCells(xlCellTypeFormulas, 23).Select

' Para seleccionar todas la celdas vacías, dentro de la región usada.


Cells.SpecialCells(xlCellTypeBlanks).Select

' Para seleccionar todas la celdas visibles en nuestra hoja.

140
www.todoexcel.com

Cells.SpecialCells(xlCellTypeVisible).Select

End Sub

Conviene deducir que si quisiéramos seleccionar las celdas que contienen comentarios en un rango
concreto y no en toda la hoja deberíamos utilizar:

Sub Seleccion ()
On Error Resume Next

' Método 1
Range("A1:G10").SpecialCells(xlCellTypeComments).Select

' Método 2
[A1:G10].SpecialCells(xlCellTypeComments).Select

' Método 3
Range(cells(1,1),cells(10,7)).SpecialCells(xlCellTypeComments).Select

End Sub

Para seleccionar hasta la última celda no vacía:

Sub Seleccion ()
On Error Resume Next ' Es un buen hábito utilizar comodines como este
' aunque si lo mantenemos activo resultaría difícil saber donde podría estar el problema

' Selecciona desde la celda actual hasta la última celda no vacía hacia la derecha.
Selection.End(xlToRight).Select

' Selecciona desde la celda indicada hasta la última celda no vacía hacia abajo.
Range("AF10").End(xlDown).Select

' Selecciona desde la celda actual hasta la última celda no vacía hacia la izquierda.
Selection.End(xlToLeft).Select

' Selecciona desde la celda actual hasta la última celda no vacía hacia arriba.
Selection.End(xlUp).Select

End Sub

Otra forma interesante de seleccionar es con el método Offset, que permite seleccionar un rango de
acuerdo a unas coordenadas indicadas. Esta instrucción requiere que le indiquemos un origen y una
cantidad de filas y columnas desde el origen (es muy útil para seleccionar rangos variables).

La sintaxis es: Origen.Offset.(filas, columnas).select.

Las filas y números se indican como números. Si estos son positivos el desplazamiento es hacia
abajo - derecha respectivamente. Si son negativos el desplazamiento es hacia arriba - izquierda
respectivamente.

141
www.todoexcel.com

Veamos los siguiente ejemplos para entender mejor la selección con Offset:

Sub Selecciona ()
On Error Resume Next

' Selecciona desde la celda actual hasta una celda (fila) hacia abajo.
Selection.Offset(1, 0).Select
' La instrucción Selection hace que el origen sea la celda actual
' El 1 indica las filas a desplazarce hacia abajo
' El 0 indica las columnas a desplazarce a la derecha

' Hace lo mismo que la anterior. Poner 0 u omitirlo es lo mismo.


Selection.Offset(1).Select

' Selecciona desde la celda actual, + una celda hacia abajo + una celda hacia la derecha.
Selection.Offset(1, 1).Select

'Selecciona una columna y/o celda hacia la derecha desde la celda [A1]
[A1].Offset(0, 1).Select

' Selecciona desde la celda actual hasta la misma celda selecionada, sin cambio alguno.
Selection.Offset().Select

' Desde B1 selecciona una celda hacia arriba y otra a la izquierda


[B2].Offset(-1, -1).Select
' Recuerda que al poner un signo negativo el movimiento cambia de dirección
' Si el negativo el movimiento es hacia abajo/derecha. Con el negativo es hacia arriba/izquierda

' Si desde A1 intentamos seleccionar una celda hacia arriba y otra a la izquierda...
[A1].Offset(-1, -1).Select
' Se produciría un error, porque como A1 es la primera celda, no podemos seleccionar
' una celda ni a la izquierda ni arriba de A1. De todas formas el error se ignora ya que
' hemos escrito On Error Resume Next al comienzo de la macro.

' Selecciona desde la celda actual hasta una celda hacia la izquierda (si fuera posible)
Selection.Offset(-1).Select

'Selecciona desde la celda actual hasta una celda hacia la arriba (si fuera posible)
Selection.Offset(, -1).Select

' Desde la celda actual, seleciona todo el cuadrante de celdas contiguas.


Selection.CurrentRegion.Select

' Selecciona el cuadrante de celdas selecionadas en bloque una celda más hacia la derecha y abajo.
Selection.CurrentRegion.Offset(1, 1).Select

End Sub

Todas las acciones anteriores se pueden concatenar de tal manera que podríamos realizar lo
siguiente:

Sub Seleccion ()
On Error Resume Next
[F7].End(xlDown).Offset(4).End(xlToRight).End(xlDown).Select
' Si F7 estuviera vacío y la columna F también,
' tras ejecutar [F7].End(xlDown). nos encontraríamos en la última fila (F65536)
' Pero no podríamos ir a [F7].End(xlDown).Offset(4) pues excel tiene 65536 filas y no 65536+X+4
142
www.todoexcel.com

End Sub

Con la macro anterior iriamos desde la celda F7 hasta la última celda no vacía hacia abajo. Luego
nos desplazaríamos 4 celdas desde esta nueva posición hacia abajo.
Luego iríamos hasta la última celda no vacía hacia la derecha desde esta nueva posición. Finalmente
de nuevo hacia abajo desde esta nueva posición.

También es posible la selección de rangos utilizando variables en filas y columnas, utilizando el


objeto Cells. Esta forma es muy útil cuando queremos utilizar variables en la fila la columna.

La sintaxis debe ser: cells(fila,columna)

Sub Seleccion()
' Selección desde A1 hasta fila N y columna J (asumimos que N y J son variables)
range(cells(1,1),cells(N,J)).select
End Sub

Estos 3 líneas de código seleccionan el mismo rango de celdas:

Sub Seleccionar ()
Range("A1:E5").Select
[A1:E5].Select
Range(Cells(1, 1), Cells(5, 5)).Select
End Sub

3.5.2. Selección de rangos

Veamos ahora distintas formas equivalentes de seleccionar un rango:

' Método clásico para seleccionar el rango de celdas B6:B10


Sub Seleccionar ()
Range("B6:B10").Select
End Sub

Sub Seleccionar ()
'Otro método para seleccionar el rango de celdas B6:B10
[B6:B10].Select
End Sub

Supongamos que queremos seleccionar un rango, pero no conocemos su dimensión, por ejemplo
porque la misma va cambiando. Un ejemplo puede ser una tabla donde se van agregando nuevos
registros. Con la instrucción CurrentRegion Excel seleccionará todo el rango utilizado
automáticamente, aunque no conozcamos su tamaño de antemano:

' Selecciona la región actual


Sub Seleccionar ()
Selection.CurrentRegion.Select
End Sub

143
www.todoexcel.com

Con la macro anterior se seleciona el cuadrante, rectángulo y/o cuadrado de celdas adyacentes a
nuestra celda activa. El rectángulo queda definido por las celdas con información.

También podríamos modificar la macro anterior para que seleccione la región actual desde una celda
determinada, por ejemplo:

' Selecciona el rectángulo adyacente a C2.


Sub Seleccionar ()
[C2].CurrentRegion.Select
End Sub

o también podemos hacer:

' Selecciona el rectángulo adyacente a C2.


Sub Seleccionar ()
Range("C2").CurrentRegion.Select
End Sub

3.5.3. Selección de filas

Para seleccionar filas podemos utilizar la instrucción Rows.Select, tal como vemos en las siguientes
macros:

' Seleccionar la Fila 1.


Sub SeleccionaFila ()
Rows("1:1").Select
End Sub

' Selecciona la fila 4.


Sub SeleccionaFila ()
Rows("4:4").Select
End Sub

' Selecciona desde la fila 4 hasta la 11, ambas inclusive


Sub SeleccionaFilas ()
Rows("4:11").Select
End Sub

' Selecciona las siguientes filas a la vez: 4,8,15 y 22.


Sub SeleccionaFilas ()
Range("4:4,8:8,15:15,22:22").Select
End Sub

3.5.4. Selección de columnas

Para seleccionar columnas podemos utilizar la instrucción Columns.Select, tal como vemos en las
siguientes macros:

144
www.todoexcel.com

Sub SeleccionaColumna ()
' Selecciona la Columna B
Columns("B:B").Select

' Selecciona la Columna H


Columns("H:H").Select

' Selecciona des de la Columna C hasta la F


Columns("C:F").Select

' Selecciona las siguientes Columnas: A,C,E,G, I y K.


Range("A:A,C:C,E:E,G:G,I:K").Select
End Sub

3.5.5. Otras selecciones

Para seleccionar todas las celdas que contengan cierto color:

Sub SeleccionarPorColor()
On Error Resume Next
Dim Columna As Single, Fila As Long
Dim Rg As Range, miRango As Range, RgColores As Range
' Vamos a selecionar todas las celdas del UsedRange que contengan el mismo color que la celda activa
' Utilizamos el rango de las celdas usadas (el rango que excel debe analizar), pues de lo contrario
' la macro tardaría mucho al tener que analizar 65536 filas y 256 columnas es decir, 16 millones de
celdas !
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
End With
Set RgColores = ActiveCell
For Each Rg In miRango
If Rg.Interior.ColorIndex = ActiveCell.Interior.ColorIndex Then
Set RgColores = Union(RgColores, Rg)
End If
Next Rg
RgColores.Select
End Sub

Para seleccionar todas las celdas que contengan cierto Valor:

Sub SeleccionarPorValor()
On Error Resume Next
Dim Columna As Single, Fila As Long, X As Long
Dim Rg As Range, miRango As Range, RgValores As Range
'vamos a selecionar todas las celdas del UsedRange que contengan el valor que introduzcamos:
Dim MiValor As String
MiValor = InputBox("Introduce el valor que deseas selecionar!", "Por Favor:")
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
145
www.todoexcel.com

End With
For Each Rg In miRango
If LCase(Rg.Value) = LCase(MiValor) Then
If X = 0 Then
X = 1: Set RgValores = Rg
Else
Set RgValores = Union(RgValores, Rg)
End If
End If
Next Rg
RgValores.Select
End Sub

Para seleccionar todas las celdas que contengan Valores no duplicados en el rango utilizado:

Sub SeleccionarValoresUnicos()
On Error Resume Next
Dim Columna As Single, Fila As Long, X As Long
Dim Rg As Range, miRango As Range, RgValores As Range
'vamos a selecionar todas las celdas del UsedRange que contengan el valor que introduzcamos:
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
End With
For Each Rg In miRango
If Application.CountIf(miRango, Rg.Value) = 1 Then
If X = 0 Then
X = 1: Set RgValores = Rg
Else
Set RgValores = Union(RgValores, Rg)
End If
End If
Next Rg
RgValores.Select
End Sub

Para seleccionar todas las celdas que contengan Valores no duplicados en UsedRange:

Sub SeleccionarValoresdUPLICADOS()
On Error Resume Next
Dim Columna As Single, Fila As Long, X As Long
Dim Rg As Range, miRango As Range, RgValores As Range
'vamos a seleccionar todas las celdas del UsedRange que contengan el valor que introduzcamos:
With ActiveSheet
Fila = Range([A1], .UsedRange).Rows.Count
Columna = Range([A1], .UsedRange).Columns.Count
Set miRango = Range([A1], Cells(Fila, Columna))
End With
For Each Rg In miRango
If Application.CountIf(miRango, Rg.Value) > 1 Then
If X = 0 Then
X = 1: Set RgValores = Rg
Else
146
www.todoexcel.com

Set RgValores = Union(RgValores, Rg)


End If
End If
Next Rg
RgValores.Select
End Sub

Excel considera que pese a que tengamos 65.536 filas y 256 columnas, prácticamente siempre
utilizamos una ínfima cantidad de estas filas y columnas.

Para saber el rango de celdas que utilizamos basta con utilizar el siguiente código:

Sub Rango()
ActiveSheet.UsedRange.Select
End Sub

Para selecionar desde la celda A1 hasta la última celda del rango utilizado:

Sub Rango()
Range([a1], ActiveSheet.UsedRange).Select
End Sub

Para selecionar la última celda con datos del rango utilizado (suponemos que tenemos seleccionado
B4:D4):

Sub Seleccion ()

' Esto daría como resultado 5


R = Range([a1], ActiveSheet.UsedRange).Rows.Count

' Esto daría como resultado 4


C = Range([a1], ActiveSheet.UsedRange).Columns.Count

' Selecionaría la celda D5


Cells(R, C).Select

End Sub

En la macro anterior, el objeto UsedRange seleciona el rango "cuadrado o rectángulo" utilizado.

Si quisiéramos seleccionar la última celda con información del rango seleccionado, he aquí 4
métodos posibles:

' Método 1
Sub Seleccionar ()
' Definimos las variables
Dim R As Long, C As Single

147
www.todoexcel.com

' Utilizamos R que indicaría la última fila que contiene datos


R = Range([A1], ActiveSheet.UsedRange).Rows.Count

' Utilizamos C que indicaría la última columna que contiene datos


C = Range([A1], ActiveSheet.UsedRange).Columns.Count

'Selecionamos la última celda del rango UsedRange


Cells(R, C).Select
End Sub

' Método 2
Sub Seleccionar ()
' Definimos las variables
Dim R As Long, C As Single
With [A1].SpecialCells(xlCellTypeLastCell)
R = .Row
C = .Column
End With
Cells(R, C).Select
End Sub

' Método 3
Sub Seleccionar ()
' El código on error evita el error debido a que no haya celdas con valor
On Error Resume Next
' Definimos las variables
Dim R As Long, C As Single
R = Cells.Find("*", Range("A1"), xlFormulas, , xlByRows, xlPrevious).Row
C = Cells.Find("*", Range("A1"), xlFormulas, , xlByColumns, xlPrevious).Column
Cells(R, C).Select
End Sub

' Método 4
Sub Seleccionar ()
With Selection.CurrentRegion
.Cells(.Cells.Count).Select
End With
End Sub

3.5.6. Insertar rangos

Como es lógico de suponer, existen numerosas maneras de insertar rangos, para lo cual utilizamos
la instrucción Insert:

Sub Insertar ()

' Inserta una nueva fila sobre la fila 1.


Rows(1).Insert

' Inserta una nueva columna a la izquierda de la columna A


Columns("A:A").Insert

' También inserta una nueva columna a la izquierda de la columna A

148
www.todoexcel.com

[A1].EntireColumn.Insert

' Inserta una nueva fila sobre la fila 1


[A1].EntireRow.Insert

End Sub

También podemos insertar tantas nuevas filas o columnas como tenga el rango:

Sub Inserta ()

' Inserta 3 nuevas columnas a la izquierda de la columna B


Range("B1:D10").EntireColumn.Insert

' Inserta 5 nuevas filas sobre la fila 10.


Rows("10:15").Insert

End Sub

3.5.7. Borrar rangos

Podemos borrar comentarios, contenidos, formatos, etc. En general utilizamos la instrucción Clear
seguida de lo que queremos borrar. A continuación vemos como hacerlo:

' Borra los comentarios sobre la celda A1


Sub Borrar ()
Range("A1").ClearComments
End Sub

' Limpia la celda A1 de cualquier formato que tenga, por ej. color
Sub Borrar ()
[A1].ClearFormats
End Sub

' Borra el contenido de la celda A1, no el formato


Sub Borrar ()
Cells(1,1)..ClearContents
End Sub

Si queremos realizar el borrado de diferentes propiedades de un mismo rango podríamos hacer:

Sub Borrar ()
With Range("A1")
.ClearComments 'Borra comentarios
.ClearContents 'Borra contenidos
.ClearFormats 'Borra formatos
.ClearNotes 'Borra notas
.Clear 'Borra todo lo anterior

149
www.todoexcel.com

End With
End Sub

La instrucción Clear sola, como se vé en la macro anterior, borra toda información de la celda
(formato, contenido, comentarios, etc).

A veces queremos borrar el contenido de ciertas celdas, por ej. las celdas que contienen fórmulas:

Sub BorrarFormulas()
Cells.SpecialCells(xlCellTypeFormulas, 23).ClearContents
End Sub

También podemos realizar borrados sobre filas y columnas enteras:

Sub Borrar ()
On Error Resume Next

' Borra toda informacion de la Fila 1.


Rows(1).Clear

' Borra el formato de la Columna A.


Columns("A:A").ClearFormats

' Borra toda información, formato, etc, de la columna A


[A1].EntireColumn.Clear

' Borra los comentarios de la Fila 1.


[A1].EntireRow.ClearComments

' Borra toda información de las 5 primeras Filas.


Rows("1:5").Clear

' Borra toda información de las Filas 10 a 15 inclusives


Rows("10:15").Clear

' Borra toda la información del rango actual utilizado, comenzando desde A1
Rango("A1").CurrentRegion.Clear

End Sub

3.5.8. Copiar y pegar rangos

Para copiar rangos utilizamos el método Copy. Algunos ejemplos sobre cómo copiar son:

Sub Copiar()

' Copia la celda C4


Range("C4").Copy

' Copia la celda C4, esta es otra terminología también válida.


150
www.todoexcel.com

[C4].Copy

' Copia la celda C2 (la primera posición equivale a fila y la segunda a columna).
Cells(2, 4).Copy

' Copia el rango de celdas B6:B10


Range("B6:B10").Copy

' Copia el rango de celdas B12:B22, esta es otra terminología también válida.
[B12:B22].Copy

' Copia el cuadrante, rectángulo y/o cuadrado de celdas adyacentes a nuestra celda. El rectángulo
queda definido por las celdas con información.
Selection.CurrentRegion.Copy

' Copia el cuadrante, rectángulo y/o cuadrado de celdas comenzando en C2 y en dirección derecha-
inferior. El rectángulo queda definido por las celdas con información.
[C2].CurrentRegion.Copy

' Copia el cuadrante, rectángulo y/o cuadrado de celdas comenzando en C4 y en dirección derecha-
inferior. El rectángulo queda definido por las celdas con información.
Range("C4").CurrentRegion.Copy

' Copia la Fila 1.


Rows("1:1").Copy

' Copia la fila 4.


Rows("4:4").Copy

' Copia desde la fila 4 hasta la 11 ambas inclusive.


Rows("4:11").Copy

' Copia las siguientes filas a la vez: 4,5,15 y 22.


Range("4:4,8:8,15:15,22:22").Copy

' Copia la Columna B


Columns("B:B").Copy

' Copia desde la Columna C hasta la F, ambas inclusive


Columns("C:F").Copy

' Copia las siguientes Columnas: A,C,E,G y I-K.


Range("A:A,C:C,E:E,G:G,I:K").Copy

Para realizar el pegado de los rangos copiados utilizamos las siguientes macros:

' Copia todo contenido de la celda A1 y lo pega en la celda B1


Range("A1").Copy Range("B1")

' Aquí realizamos lo mismo solo que de otra manera, especificando donde queremos que la
información sea pegada mediante la utilizacion de propiedades
Range("B1").Copy Destination:=Range("C1")

151
www.todoexcel.com

A la hora de pegar podemos elegir que es lo que queremos pegar: valores, formatos, todo, etc. La
opción más utilizada es xlPasteValues, que solo pega los valores. La lista de las cosas que podemos
pegar es:

Valores con formatos: xlPasteValuesAndNumberFormats


Valores: xlPasteValues
Validación xlPasteValidation
Fórmulas y números: xlPasteFormulasAndNumberFormats
Fórmulas: xlPasteFormulas
Formatos: xlPasteFormats
Comentarios: xlPasteComments
Ancho de columna: xlPasteColumnWidths
Todo excepto bordes: xlPasteAllExceptBorders
Todo: xlPasteAll

Veamos ejemplos sobre como pegar distintas cosas:

Sub Copiar()

' Copia la celda A1 y la pega en B1


Range("A1").Copy
Range("B1")

' Copia la celda A1 y la pega en B1 (podemos escribirlo en la misma línea)


Range("A1").Copy Range("B1")

' Misma operación, copia la celda A1 y la pega en B1


Range("A1").Copy
Cells(1, 2).PasteSpecial(xlPasteAll)

' Copia la celda A1 pero solo pega el valor en B1, no el formato


Range("A1").Copy
[B1].PasteSpecial(xlPasteValues)

' Copia la celda A1 y pega solo la fórmula en B1, ni el valor ni el formato


Range("A1").Copy
Range("A1").Offset(, 1).PasteSpecial(xlPasteFormulas)

' Cuando copiamos algo se ve que Excel deja un rastro sobre lo copiado. Para quitarlo utilizamos:
Application.CutCopyMode=False

End Sub

3.5.9. 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).

152
www.todoexcel.com

Otra forma de nombrar un rango es seleccionándolo y luego encima de la columna A, existe un


espacio que nos da información sobre la celda activa. Se puede escribir un nombre allí y ya quedaría
nombrado dicho rango.

Para nombrar un rango desde una macro utilizamos la instrucción Name, por ej.:

Sub Nombrar()

' En el caso de que quisiéramos crear un nombre para un valor constante


Names.Add Name:="Euro", RefersTo:=166.67

' En el caso de que quisieramos crear un nombre para refererirnos al rango A1:B4 con el nombre
Ventas.
Range("A1:B4").Name = "Ventas"

End Sub

Los nombre creados pueden utilizar fórmulas, esto es muy frecuente si queremos aplicar un nombre
a un rango de una Tabla Dinámica. En lugar de tener que cambiar el rango utilizado en la TD, cada
vez que añadimos un nuevo registro a nuetra base de datos,
podemos utilizar nombres que hagan referencia a rangos dinámicos mediante fórmulas tal que:

Sub RangoNombrado()
ActiveWorkbook.Names.Add _
Name:="RangoTD", _
RefersToR1C1:= "=OFFSET(Hoja1!R1C1,0,0,(COUNTA(Hoja1!C1)-0),COUNTA(Hoja1!R1)+0)"
End Sub

3.5.10. Combinar rangos

Para combinar celdas utilizamos la instrucción MergeCells. Solo podemos combinar celdas que estén
contiguas y siempre que formen o un cuadrado o un rectángulo, pues de lo contrario Excel no lo
permitiría.

Para combinar un rango de celda hacemos:

' Combinar las celdas del rango B4:D4


Sub Combinar ()
Application.DisplayAlerts = False
Range("B4:D4").MergeCells = True
End Sub

Conviene recordar que si combinamos desde una macro, y las celdas que queremos combinar no
estan vacías, Excel nos pedirá confirmación, pues podríamos perder información. Para evitar la
confirmación deberíamos modificar la macro anterior agregando una nueva línea al comienzo:

' Combinar las celdas del rango B4:D4 y evitar confirmación


Sub Combinar ()
Application.DisplayAlerts = False
153
www.todoexcel.com

Range("B4:D4").MergeCells = True
End Sub

3.5.11. Ocultar y mostrar rangos

Para ocultar o mostrar filas debemos utilizas la instrucción Hidden y luego le asignamos True o False
para ocultar o mostrar respectivamente. Por ej.:

Sub Ocultar ()

' Ocultar la fila 3


Rows("3:3").EntireRow.Hidden = True

' Ocultar varias filas contiguas, aún cuando no es necesario selecionar un rango para operar con él
Rows("7:14").Select
Selection.EntireRow.Hidden = True

' Ocultar varias filas no contiguas


Range("19:19,26:26,32:32,36:39").EntireRow.Hidden = True

End Sub

Si luego queremos volver a mostrar la fila oculta, simplemente cambiamos el True por False:

Sub Mostrar ()
' Mostrar la fila 3
Rows("3:3").EntireRow.Hidden = False
End Sub

Para ocultar columnas es exactamente igual:

Sub Ocultar ()

' Ocultar la columna B, sin selecionarla primero


Columns("B:B").EntireColumn.Hidden = True

' Ocultar las columnas contiguas D,E,F y G selecionándolas primero


Columns("D:G").Select
Selection.EntireColumn.Hidden = True

' Ocultar varias columnas discontínuas, sin necesidad de selecionarlas


Range("I:K,M:O,Q:Q,S:S").EntireColumn.Hidden = True

End Sub

Si luego queremos volver a mostrar la columna oculta, simplemente cambiamos el True por False.

154
www.todoexcel.com

3.5.12. Proteger y desproteger rangos

Para proteger utilizamos la instrucción Locked, y luego le asignamos True o False para proteger o
desproteger respectivamente. La protección de rangos es útil cuando queremos proteger el libro o la
hoja ya que de lo contrario carece de sentido, de hecho por defecto todas las celdas de un libro y/o
una hoja estan protegidas inicialmente.

Ahora bien, la protección de celdas o rangos no toma efecto mientras la hoja y/o el libro no estén
protegidas.

Suponiendo que sea nuestra intención proteger la hoja y/o el libro posteriormente, podríamos usar
estas macros para proteger rangos:

Sub Proteger ()

' Protege el rango seleccionado


Selection.Locked = True

' Protege el rango indicado


Range("T7:T16").Locked = True

' Protege la celda indicada


Range("T11").Locked = True

' Desprotege el rango indicado


Range("T7:T16").Locked = False

End Sub

3.5.13. Transponer rangos

La operación de transponer se realiza cuando queremos que los valores de una fila se copien como
una columna o viceversa. Para ello utilizamos la instrucción Transpose.

Dicho de otra forma es una manera particular de pegar los datos copiados previamente con lo cual:

Sub Seleccion ()

' Convertir fila en columna


Range("A1:A15").Copy
Range("D4").PasteSpecial Paste:=xlPasteAll, Transpose:=True

' Convertir columna en fila


Range("A1:B10").Copy
Range("D4").PasteSpecial Paste:=xlPasteAll, Transpose:=True

End Sub

155
www.todoexcel.com

3.5.14. Ordenar rangos

La ventaja de ordenar rangos desde macros es que podemos ordenar siguiendo más de 3 criterios,
que es el máximo que permite Excel si lo hacemos desde el menú Datos > Ordenar.
Cuando ordenamos podemos aplicar muchas propiedades, como ser: OrderCustom, MatchCase,
Orientation, DataOption,Order, etc. Sin embargo podemos reducir las mismas y no es necesario
utilizarlas todas. Para ordenar utilizamos la instrucción Sort.

Para ordenar el rango utilizado, por los campos de columnas G, F, A, B y C hacemos:

Sub Ordenar ()

With [A1].CurrentRegion
' [A1].CurrentRegion podría ser = Range('A1:Z45')
.Sort Key1:=Range("G9"), Order1:=xlAscending, Header:=xlGuess
.Sort Key1:=Range("F3"), Order1:=xlDescending, Header:=xlGuess
.Sort _
Key1:=Range("A2"), Order1:=xlAscending, _
Key2:=Range("B2"), Order2:=xlAscending, _
Key3:=Range("C2"), Order3:=xlAscending, _
Header:=xlGuess
End With

End Sub

Otra forma de hacer lo anterior es:

Sub Ordenar ()

With [A1].CurrentRegion
.Sort Key1:=.Cells(7), Order1:=xlAscending, Header:=xlGuess
.Sort Key1:=.Cells(6), Order1:=xlDescending, Header:=xlGuess
.Sort _
Key1:=.Cells(1), Order1:=xlAscending, _
Key2:=.Cells(2), Order2:=xlAscending, _
Key3:=.Cells(3), Order3:=xlAscending, _
Header:=xlGuess
End With

End Sub

3.5.15. Borrar rangos

Para borrar utilizamos la instrucción Clear. Existen distintas cosas que podemos borrar: borrar todo,
solo formatos, solo contenidos, etc.

El borrado es sencillo:

Sub Borrar ()
With Range("A1").CurrentRegion
' Borra comentarios

156
www.todoexcel.com

.ClearComments
' Borra contenidos
.ClearContents
' Borra formatos
.ClearFormats
' Borra notas
.ClearNotes
' Borra todo
.Clear
End With
End Sub

En la macro anterior hemos ido realizando un borrado escalonado, para al final resumir todo en un
único borrado que realizaría todo lo anterior de una vez (instrucción Clear), es decir, que si
queremos borrar todo junto directamente utilizamos Clear.

3.5.16. Imprimir rangos

Para definir el rango a imprimir utilizamos la instrucción PrintArea. Es conveniente que definamos y
guardemos el rango a imprimir:

Sub DefinirRango()
ActiveSheet.PageSetup.PrintArea = "$A$1:$G$22"
End Sub

En el caso anterior si presionáramos sobre el botón Imprimir se imprimiría el rango A1:G22.

También podríamos imprimir automáticamente desde una macro tal que:

Sub ImprimeHoja ()
ActiveSheet.PrintOut
End Sub

3.5.17. Eliminar filas vacías

Existen muchas formas de eliminar las filas vacías. Supongamos que tenemos una base de datos o
tabla definida en el rango A1:Z500 y queremos borrar las filas cuyo valor en la columna B este
vacío:

Primer método para borrar filas vacías

Sub BorrarFilasVacias1()

Application.ScreenUpdating = False ' Para aumentar la velocidad de ejecución


Dim FilaBorrable As Range
Set FilaBorrable = Range("B:B").Find(what:="")
Do Until FilaBorrable Is Nothing
FilaBorrable.Select
157
www.todoexcel.com

FilaBorrable.EntireRow.Delete
Set FilaBorrable = Range("B:B").FindNext
Loop
End Sub

El método anterior tiene el inconveniente que si el rango es muy grande y hay muchas filas vacías,
el looping se eterniza aún con el Application.ScreenUpdating = False

Segundo método para borrar filas vacías

Sub BorrarFilasVacias1()
Dim X As Long
Dim R As Long
' Para aumentar la velocidad de ejecución
With ActiveSheet
R = Range([a1], .UsedRange).Rows.Count
Application.ScreenUpdating = False
For X = R To 1 Step -1
Rows(X).Select
If Application.CountA(Rows(X)) = 0 Then ' Si la Fila tiene algun valor >< 0
Rows(X).Delete
End If
Next X
End With
End Sub

El método anterior es bastante más rápido que el primero, pero todavía no es el óptimo.

Tercer método para borrar filas vacías

Sub BorrarFilasVacias3()
Dim FilaBorrable As Range
Dim R As Single
' Para aumentar la velocidad de ejecución
Application.ScreenUpdating = False
' insertamos una nueva fila para después aplicar un criterio de búsqueda y borrar los valores obtenidos
de esta búsqueda
With ActiveSheet
.Rows(1).Insert
.Cells(1, 2) = "Valores a borrar"
R = Range(.Range("B2"), .UsedRange).Rows.Count
Set FilaBorrable = Range("B1", Cells(R, 2))
FilaBorrable.AutoFilter Field:=1, Criteria1:=""
'Borra solo las celdas visibles
FilaBorrable.SpecialCells(xlCellTypeVisible).EntireRow.Delete
.UsedRange
End With
End Sub

El anterior es el método más rápido.

158
www.todoexcel.com

Recuerda que para desocultar todas las filas y columnas ocultas debes hacer:

Sub Desocultar()
With Cells
.EntireColumn.Hidden = False
.EntireRow.Hidden = False
End With
End Sub

3.5.18. Restringir movimiento

Con la instrucción ScrollArea podremos hacer que un usuario solo pueda moverse dentro de un
rango determinado de la hoja Excel. Veamos un ejemplo sencillo:

' Limitamos el movimiento al rango A1:G15 de la Hoja1


Sub LimitarMov()
ActiveWorkbook.Worksheets("Hoja1").ScrollArea = "A1:G15"
End Sub

' Eliminamos la limitación anterior


Sub QuitarLimitacion()
ActiveWorkbook.Worksheets("Sheet1").ScrollArea = ""
End Sub

3.5.19. Scroll Bars

Cada hoja Excel tiene una barra vertical y horizontal que al moverla nos permite desplazarnos por la
hoja hacia abajo o hacia la derecha respectivamente. Estas barras también se conocen como
ScrollBars.

Es posible hacer que cada vez que se activa una hoja las ScrollBars estén al comienzo,
indepnedientemente de dónde quedaron la última vez que se ingresó a la hoja. Esto permite que
cuando el usuario activa la hoja, siempre verá el comienzo de la misma:

Private Sub Worksheet_Activate()


' Movemos el ScrollBar vertical a la fila 1
ActiveWindow.ScrollRow = 1
' Movemos el ScrollBar horizontal a la columna 1
ActiveWindow.ScrollColumn = 1
Range("A1").Select
End Sub

159
www.todoexcel.com

3.6. ARRAYS

Los Arrays son conjuntos de elementos y son muy útiles a la hora de manipular varios objetos de
forma simultánea. En este capítulo veremos más en detalle como crearlos y los diferentes tipos que
existen.

Recuerda que la mayoría de macros de este capítulo están están en el libro Arrays.xls, dentro de los
400 Extras que se envían junto con el Manual.

3.6.1. Definición

Un Array es un grupo de elementos secuencialmente puestos con un índice, que tienen el mismo
nombre y tipo de datos intrínseco.

Cada elemento de un array tiene un número de índice que lo identifica como único.
Los cambios realizados a un elemento de un array no afectan los otros elementos.
Antes de que poner valores en un Array, primero debemos crearlo. El Array es declarado utilizando
la instrucción Dim.

En resumen, un array es un grupo de elementos del mismo tipo, cada elemento en un grupo array
es único y puede ser cambiado sin que afecte al resto de los elementos del siguiente array.

Por ejemplo:

Dim MiArray(0 To 3)

El array anterior contiene 4 elementos: el elemento 0,1,2 y 3


Dicho array puede ser simplificado como:

Dim Miarray(3)

Esta última definición significa que los elementos de un array empiezan por el 0, que siempre resulta
ser el primer elemento.

3.6.2. Fijos

Una array con los días de la semana (número fijo de elementos)

Sub EjArrays()
Dim DiaSemana(0 To 6) As String
' Tambien podríamos poner:
' Dim DiaSemana(6) As String, es decir un array de 7 elementos
DiaSemana(0) = "Lunes"
DiaSemana(1) = "Martes"
DiaSemana(2) = "Miércoles"
160
www.todoexcel.com

DiaSemana(3) = "Jueves"
DiaSemana(4) = "Viernes"
DiaSemana(5) = "Sábado"
DiaSemana(6) = "Domingo"
Debug.Print DiaSemana(0) ' Esto nos permite visualizar 'Lunes' en la Ventana Inmediato
End Sub

Recuerda que el primer elemento del array es el equivalente a DiaSemana(0). Esta terminología es
un préstamo de otros lenguajes de programación, ahora bien si quieres refererirte al primer
elemento de un array como miarray(1) la solución es introducir la instrucción Option Base 1 al
comienzo de la macro, tal que:

Option Base 1
Sub EjArrays()
Dim DiaSemana(1 To 7) As String
' Tambien podríamos poner:
' Dim DiaSemana(7) As String es decir un array de 7 elementos pues es Option Base 1
DiaSemana(1) = "Lunes"
DiaSemana(2) = "Martes"
DiaSemana(3) = "Miercoles"
DiaSemana(4) = "Jueves"
DiaSemana(5) = "Viernes"
DiaSemana(6) = "Sábado"
DiaSemana(7) = "Domingo"
Debug.Print DiaSemana(1) ' Esto nos permite visualizar 'Lunes' en la Ventana Inmediato
End Sub

La mayoría de las veces los elementos de los arrays quedan definidos desde un rango o bien desde
una única línea tal que:

Option Base 1
Sub EjArrays()
Dim DiaSemana() As Variant
DiaSemana = Array("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
Debug.Print DiaSemana(1) ' Esto nos permite visualizar 'Lunes' en la Ventana Inmediato
End Sub

3.6.3. Variables

Un array no tiene por qué tener un número fijo de elementos, es decir un array puede contener un
número variable de elementos en cualquier momento.

Los arrays se utilizan para aumentar la velocidad de las macros pues permiten la manipulación de
gran cantidad de información sin necesidad de operar con ella, salvo en memoria.

La utilización de Arrays dinámicos (aquellos que no tienen un número fijo de elementos), en muchas
ocasiones es obligatoria.

161
www.todoexcel.com

Por ej. supongamos que queremos obtener el número de directorios existentes en en el dicos C.
Deberíamos utilizar un array como el siguiente:

Sub ArrayDirectorios()
Dim X As Single
Dim NXls() As String
Dim MiRuta As String, MiNombre As String
Cells.ClearContents
' Muestra los nombres en C:\ que representan directorios.
MiRuta = "C:\" ' Establece la ruta.
' Recupera la primera entrada, del directorio C:\
MiNombre = Dir(MiRuta, vbDirectory)
Do While MiNombre <> "" ' Inicia el bucle.
' Ignora el directorio actual y el que lo abarca.
If MiNombre <> "." And MiNombre <> ".." Then
' Realiza una comparación a nivel de bit para asegurarse de que MiNombre es un directorio.
If (GetAttr(MiRuta & MiNombre) And vbDirectory) = vbDirectory Then
X=X+1
ReDim Preserve NXls(1 To X)
NXls(X) = MiNombre
Debug.Print MiNombre ' Muestra la entrada
End If ' solamente si representa un directorio.
End If
MiNombre = Dir ' Obtiene siguiente entrada.
Loop
If X = 0 Then MsgBox "No hay directorios en C:\": Exit Sub
For X = LBound(NXls) To UBound(NXls)
Cells(X, 1) = NXls(X)
Next X
Columns.AutoFit
End Sub

Del mismo modo hubiéramos podido crear un Array con los Libros xls, contenidos en un directorio
cualquiera.

Las arrays expuestos hasta aquí son unidireccionales, y aunque los array pueden tener hasta 60
direcciones, casi nunca utilizaremos Arrays com más de tres dimensiones.

3.6.4. Bidimensionales

Los array unidimensionales son muy frecuentes, aunque también se pueden usar arrays
bidemensinales, por ej:

Dim MiArray(1 To 10, 1 To 10) As Integer

Esto sería como pensar en una matriz de 100 elementos, 10 filas x 10 columnas, con lo cual para
referirte a la segunda fila y tercera fila utilizaríamos:

Debug.Print MiArray(2,3)

Lo mas común es que siempre declaremos en principio un array como Variant.

162
www.todoexcel.com

3.6.5. Ejemplo

A continuación observaremos diferentes ejemplos que utilizan arrays. Supongamos que tenemos
diferentes controles en una hoja y queremos colocarlos en determinados lugares:

Sub EjArrays()
Dim X As Byte
Dim Rg As Range
Dim MyShapesArray() As Variant
Dim MyShapesRgArray
Dim MyShape As Shape
' Es lo mismo poner () as VARIANT QUE NO PONER NADA
' MyShapesArray es un array que contiene los nombre the diferentes controles en nuestra ActiveSheet
MyShapesArray = Array("IShape", "SB_H", "SB_V", "BPlay", "SB_Bombs")
' MyShapesRgArray en un array que contiene el lugar donde pondremos los controles
MyShapesRgArray = Array(Range(ActiveCell.Offset(-5, -5), ActiveCell.Offset(-2, -2)), _
Range(ActiveCell.Offset(-3, 0), ActiveCell.Offset(-2, 4)), _
Range(ActiveCell.Offset(0, -3), ActiveCell.Offset(1, -2)), _
Range(ActiveCell.Offset(5, -5), ActiveCell.Offset(-1, -2)), _
Range(ActiveCell.Offset(-3, 5), ActiveCell.Offset(-2, -1)))
For X = LBound(MyShapesArray) To UBound(MyShapesArray)
With ActiveSheet
Set MyShape = .Shapes(MyShapesArray(X))
Set Rg = MyShapesRgArray(X)
'Rg.Select
With MyShape
'.Select
'.Visible = True 'True
.Height = Rg.Height
.Width = Rg.Width
.Left = Rg.Left: .Top = Rg.Top
End With
End With
Next X
End Sub

Este código lo utilizamos para colocar los controles en el lugar deseado. Es posible ver esta macro en
funcionamiento en los juegos:

Buscaminas.xls y MinesWeeper.xls

la macro se llama GameSetup, dentro del modulo GameSetup.

3.6.6. Redim

Cuando utilizamos el comando Redim redimensionamos el Array y al hacerlo perdemos todos los
valores que habíamos creado inicialmente, por ej:

Sub EjArrays()
Dim DiaSemana() As Variant

163
www.todoexcel.com

DiaSemana = Array("Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sábado", "Domingo")


Debug.Print DiaSemana(1)
ReDim DiaSemana(2)
' Al redimensionar el array para con 3 elementos perdemos los valores previamente asignados en:
' DiaSemana = Array('Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo')
' con lo que:
Debug.Print DiaSemana(1)
' no devuelve valor alguno!
End Sub

La macro anterior no devuelve ningún valor porque hemos perdido los mismos al no utilizar la
instrucción REDIM PRESERVE, que la veremos en la sección siguiente.

3.6.7. Preserve

La instrucción Preserve se utiliza para conservar los valores de cada elemento, aún cuando
redimensionamos el array:

Sub EjArrays()
Dim NAleatorios() As Variant
NAleatorios = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
Dim X As Byte
Do
MsgBox "El array tiene: " & UBound(NAleatorios) & " Elementos"
ReDim Preserve NAleatorios(UBound(NAleatorios) + 1)
NAleatorios(UBound(NAleatorios)) = Rnd * 100
Cells(X + 1, 1).Value = Round(Rnd * UBound(NAleatorios))
X=X+1
Loop While UBound(NAleatorios) <> 15
' Seleccionaría la celda:
Cells(UBound(NAleatorios), 1).Select
End Sub

También podemos asignar los valores de un rango a un array, tal que:

aaa=range("A1:A15").values

lo cual significa que es un array Bidemensional ya que aunque solo tiene una columna (en este caso
la columna A), para referirnos a cualquier elemento de este array deberemos especificar no solo la
fila sino también la columna.

Hemos asignado los valores de un rango a un array con lo que para referirnos a lo elementos del
array deberemos hacerlo como si de un array bidemensional se tratara, aún cuando todas las celdas
del rango estén en la misma columna como en el caso siguiente:

Private Sub RgArray_Click()


Dim X As Single
Dim Rango() As Variant
Dim miarray As Variant
Rango = Range("Col1")

164
www.todoexcel.com

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

165
www.todoexcel.com

3.7. ESTRUCTURAS

Las estructuras son conjuntos de instrucciones VBA que deben respetar una sintáxis determinada y
que nos permiten realizar diversas operaciones. En este capítulo las veremos en detalle.

Recuerda que la mayoría de macros de este capítulo están están en el libro Estructuras.xls, dentro
de los 400 Extras que se envían junto con el Manual.

3.7.1. Do Loop

La instrucción Do Loop es utilizada para repetir las mismas instrucciones una y otra vez hasta que
una condición tenga lugar. Es probablemente la estructura más simple de cuantas hay en cuanto a
repeticiones, pues no establece condiciones de entrada ni de salida como ocurre en Do While o Do
Until. Veamos algunos ejemplos:

Si la celda contiene datos coloreamos toda la fila:

Sub Colorea()
[A1].EntireRow.Select ' Comenzamos desde la fila 1
Do ' Comenzamos a evaluar
If ActiveCell.Value = "" Then Exit Do ' Si la celda activa no tiene valor salimos de la macro
Selection.EntireRow.Interior.ColorIndex = 15 ' Si la celda tiene valor pinta la fila de gris
Selection.Offset(2).Select ' Nos movemos a la fila siguiente
Loop ' Comenzamos nuevamente 'el rulo' desde el Do
End Sub

Podemos retocar lo anterior y poner la condición no de inicio dentro del Looping tal que:

Sub Colorea()
[A1].EntireRow.Select
Do While ActiveCell.Value <> ""
Selection.EntireRow.Interior.ColorIndex = 15
Selection.Offset(2).Select
Loop
End Sub

Donde obviamente hemos tenido que cambiar la condición de = "" a <>"", es decir distinta de
vacía. De haber querido poner una condición no de inicio sino de salida, es decir que el looping se
ejecute por lo menos una vez:

Sub Colorea()
[A1].EntireRow.Select
Do
Selection.EntireRow.Interior.ColorIndex = 15
Selection.Offset(2).Select
Loop While ActiveCell.Value <> ""
End Sub

166
www.todoexcel.com

En el caso anterior, aún cuando la celda A1 estuviera vacía el looping se ejecutaría por lo menos una
vez. También hubiéramos podido jugar tal que:

Sub Colorea()
[A1].EntireRow.Select
Do
Selection.EntireRow.Interior.ColorIndex = 15
Selection.Offset(2).Select
Loop Until ActiveCell.Value = ""
End Sub

O bien:

Sub Colorea()
[A1].EntireRow.Select
Do Until ActiveCell.Value = ""
Selection.EntireRow.Interior.ColorIndex = 15
Selection.Offset(2).Select
Loop
End Sub

Este último caso podría dar lugar a que el looping terminara antes de empezar.

El caso es que todos estos ejemplos son prácticamente idénticos y depende de nosotros utilizar uno
u otro, salvo en contadas ocasiones donde algunos obviamente no sirven. El útlimo ejemplo no
valdría si quisiéramos que el looping ejecutara las instrucciones internas al menos una vez.

3.7.2. For Next

La instrucción For Next repite un grupo de instrucciones un número especificado de veces. La


sintaxis es:

For contador = principio To fin [Step incremento]


[instrucciones]
[Exit For]
[instrucciones]
Next [contador]

La sintaxis de la instrucción For...Next consta de las siguientes partes:

-Contador (requerido): variable numérica que se utiliza como contador de bucle. La variable no
puede ser Booleana ni un elemento de matriz.

-Principio (requerido): valor inicial del contador.

-Fin (requerido): valor final del contador.

167
www.todoexcel.com

-Incremento (opcional): cantidad en la que cambia el contador cada vez que se ejecuta el bucle. Si
no se especifica, el valor predeterminado de incremento es uno.

-Instrucciones (opcional): una o más instrucciones entre For y Next que se ejecutan un número
especificado de veces.

El argumento incremento puede ser positivo o negativo. El valor del argumento incremento
determina la manera en que se procesa el bucle, como se muestra a continuación:

For X = 1 to 50

es decir el valor del incremento es positivo donde 1 es el Principio y 50 el Fin, es decir 1<= 50, o
bien Principio <= Fin

o bien:

For X = 50 to 1

es decir el valor del incremento es negativo donde 50 es el Principio y 1 el Fin, es decir 50 >= 1, o
bien Principio >= Fin

Cuando el incremento es negativo es necesario especificar el incremento que va a tener lugar en el


bucle mediante la palabra Step tal que:

Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones, con incremento negativo de 2
For X = 10 To 1 Step -2
Cells(X, 1) = X
Next X
End Sub

En el caso anterior X tomaría los valores 10,8,6,4,2 sucesivamente.

Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones, con incremento negativo de 1
For X = 10 To 1 Step -1
Cells(X, 1) = X
Next X
End Sub

En el caso anterior X tomaría los valores 10,9,8,7,6,5,4,3,2,1 sucesivamente.

Se pueden colocar en el bucle cualquier número de instrucciones Exit For como una manera
alternativa de salir del mismo. La instrucción Exit For, que se utiliza a menudo en la evaluación de
alguna condición (por ejemplo, If...Then), transfiere el control a la instrucción que sigue
inmediatamente a la instrucción Next. ej:

168
www.todoexcel.com

Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones.
For X = 1 To 10
If Cells(X, 1) = "" Then Exit Sub
Cells(X, 1) = X
Next X
End Sub

En el ejemplo anterior realizaríamos un bucle de 10 repeticiones pero si en el trascurso del mismo


las celdas (X,1) estuvieran vacías el bucle se rompería y saldríamos de él.

Del mismo modo se puede modificar el valor del contador volviendo a un valor dado tal que:

Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones.
For X = 1 To 10
If Cells(X, 1) = "" Then
X=1
Cells(X, 1) = X + Cells(X, 1)
End If
Cells(X, 1) = X + Cells(X, 1)
Next X
End Sub

En el ejemplo anterior, si el valor de (X,1) estuviera vacío volveríamos a X=1, y para evitar un bucle
infinito le daríamos a la celda (X,1) el valor igual a = X + Cells(X, 1)

Este otro ejemplo muestra que cambiar el valor del contador mientras está dentro de un bucle puede
acarrear un bucle infinito, haciendo difícil su lectura y depuración. Ejemplo:

Sub For_Next()
Dim X As Integer
' Establece 10 repeticiones.
For X = 1 To 10
If Cells(X, 1) = "" Then
X=1
Else
Cells(X, 1) = X
End If
Next X
End Sub

En el ejemplo anterior, si el valor de la celda (1,1) estuviera vacío tendríamos un bucle repetitivo
infinito ya que x siempre sería = a 1.

Se pueden anidar bucles For...Next, colocando un bucle For...Next dentro de otro. Para ello,
proporcionamos a cada bucle un nombre de variable único como su contador. La siguiente
construcción sería la correcta:

For I = 1 To 10
For J = 1 To 10
169
www.todoexcel.com

For K = 1 To 10
...
Next K
Next J
Next I

3.7.3. For Each Next

La instrucción For Each Next repite un grupo de instrucciones para cada elemento de una matriz o
colección. Su sintaxis es:

For Each elemento In grupo


[instrucciones]
[Exit For]
[instrucciones]
Next [elemento]

Por lo general la instrucción For Each Next suele utilizarse para evaluar rangos y o hojas, como se ve
en los siguientes ejemplos:

' Queremos colocar en el encabezado de cada una de las hojas del libro la palabra 'TodoEXCEL'
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim Hoja As Worksheet
For Each Hoja In ThisWorkbook.Sheets
Hoja.PageSetup.LeftFooter = "TodoEXCEL"
Next Hoja
End Sub

' Queremos borrar todo el contenido de cada hoja antes de cerrar un libro
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Hoja As Worksheet
For Each Hoja In ThisWorkbook.Sheets
Hoja.Cells.Clear
Next Hoja
End Sub

La entrada al bloque For Each se produce si hay al menos un elemento en grupo. Una vez que se ha
entrado en el bucle, todas las instrucciones en el bucle se ejecutan para el primer elemento en
grupo. Después, mientras haya más elementos en grupo, las instrucciones en el bucle continúan
ejecutándose para cada elemento. Cuando no hay más elementos en el grupo, se sale del bucle y la
ejecución continúa con la instrucción que sigue a la instrucción Next.

Se pueden colocar en el bucle cualquier número de instrucciones Exit For. La instrucción Exit For se
utiliza a menudo en la evaluación de alguna condición (por ejemplo, If...Then) y transfiere el control
a la instrucción que sigue inmediatamente a la instrucción Next.

Podemos anidar bucles For Each...Next, colocando un bucle For Each...Next dentro de otro. Sin
embargo, cada elemento del bucle debe ser único.
170
www.todoexcel.com

Nota: si omitimos un elemento en una instrucción Next, la ejecución continúa como si se hubiera
incluído, es decir tanto:

For Each Cell In Range("Rg")


' Instrucciones...
Next Cell
como:

For Each Cell In Range("Rg")


' Instrucciones...
Next

funcionarían mientras hubiera mas elementos en el grupo, en el caso anterior dentro del rango
llamado "Rg".

Si se encuentra una instrucción Next antes de su instrucción For correspondiente, se producirá un


error.

No se puede utilizar la instrucción For Each...Next con una matriz de tipos definidos por el usuario
porque un tipo Variant no puede contener un tipo definido por el usuario.

3.7.4. While Wend

La instrucción While Wend ejecuta una serie de instrucciones mientras una condición dada sea True,
es decir verdadera, o tenga lugar. Su sintaxis es:

While condición
[intrucciones]
Wend

Condición (requerido): expresión numérica o expresión de cadena cuyo valor es True o False. Si
condición es Null, condición se considera False.

Instrucciones (opcional): una o más instrucciones que se ejecutan mientras la condición es True.

Si condición es True, todas las instrucciones se ejecutan hasta que se encuentra la instrucción Wend.
Después, el control vuelve a la instrucción While y se comprueba de nuevo condición. Si condición es
aún True, se repite el proceso. Si no es True, la ejecución se reanuda con la instrucción que sigue a
la instrucción Wend.

Los bucles While...Wend se pueden anidar a cualquier nivel. Cada Wend coincide con el While más
reciente.

En principio no es frecuente utilizar este tipo de intrucciones, se aconseja la utilización de Looping,


que sirve para lo mismo.

171
www.todoexcel.com

3.7.5. GoTo

La instrucción GoTo es un método bastante rudo de variar el sentido que debería tomar una macro,
ya que cuando una macro llega a una línea que contiene dicha instrucción "salta" al lugar
especificado en GoTo (es decir, saltamos incondicionalmente a una línea especificada en el
procedimiento). La Sintaxis de GoTo es:

GoTo línea

El argumento línea puede ser cualquier etiqueta de línea o número de línea.


GoTo solamente puede saltar a líneas del procedimiento en el que aparece.

Nota: demasiadas instrucciones GoTo pueden ser difíciles de leer y de depurar. Siempre que sea
posible, conviene utilizar instrucciones de control estructuradas (Do...Loop, For...Next,
If...Then...Else, Select Case). Es decir conviene no habituarse a utilizar este código, salvo cuando no
quede otro remedio.

Veamos un ejemplo:

Sub Macro()
GoTo Adios
Range("A1").Font.Bold = True
Range("A1").Font.Size = 50
Range("A1").Font.ColorIndex = 3
Range("A1").Interior.ColorIndex = 5
Range("A1").Select
Adios:
End Sub

La macro anterior no realiza ninguna operación, ya que nada más empezar saltamos a la línea
"Adios:" y después no hay más código.

Nota: en principio nunca deberíamos utilizar GoTo, pues siempre, o prácticamente siempre
deberíamos ser capaces de encontrar una alternativa a través de instrucciones de control
estructuradas tales como: Do...Loop, For...Next, If...Then...Else, Select Case.

3.7.6. With End With

La instrucción With End With ejecuta una serie de instrucciones sobre un único objeto o sobre un tipo
definido por el usuario. Permite realizar múltiples operaciones sobre el mismo objeto. La sintaxis que
emplea es:

With objeto
[instrucciones]
End With

Objeto (requerido): nombre de un objeto o de un tipo definido por el usuario.


Instrucciones (opcional): una o más instrucciones que se van a ejecutar sobre objeto.
172
www.todoexcel.com

Veamos un ejemplo sencillo con el cual asignamos un formato a la celda A1:

' La siguiente macro NO utiliza With


Sub Macro()
Range("A1").Font.Bold = True
Range("A1").Font.Size = 50
Range("A1").Font.ColorIndex = 3
End Sub

' Repetimos lo anterior pero con With


Sub Macro()
With Range("A1")
.Font.Bold = True
.Font.Size = 50
.Font.ColorIndex = 3
End With
End Sub

En el ejemplo anterior se ve que al utilizar el With, no es necesario volver a repetir el objeto


Range("A1"). Todo lo que está entre With y End With se aplica al objeto Range("A1").

Veamos otro ejemplo algo más complejo con el cual asignamos un formato a la celda A1 y además
aplicamos el With en dos niveles:

' La siguiente macro NO utiliza With


Sub Macro()
Range("A1").Font.Bold = True
Range("A1").Font.Size = 50
Range("A1").Font.ColorIndex = 3
Range("A1").Interior.ColorIndex = 5
Range("A1").Select
End Sub

' La siguiente macro realiza las mismas operaciones utilizando With


Sub Macro_With()
With Range("A1")
With .Font
.Bold = True
.Size = 50
.ColorIndex = 3
End With
.interior.ColorIndex = 5
.Select
End With
End Sub

Nota: una vez que se ha entrado en un bloque With no es posible cambiar el objeto. Por tanto, no
podemos utilizar una única instrucción With para varios objetos diferentes, pero si podemos utilizar
otro bloque que utilice el anterior bloque, como lo hace el ejemplo anterior.

Aunque en principio parece que la segunda macro es más difícil de entender, es un buen hábito
utilizar estructuras With pues aumentan la velocidad de ejecución de las macros, siendo más fáciles
de manipular a medida que nos acostumbramos a ellas.
173
www.todoexcel.com

3.7.7. If Then

La instrucción If Then permite escoger entre 2 o más posibilidades, para decidir sobre que es lo que
queremos, entre una serie de alternativas.

La instrucción ejecuta condicionalmente un grupo de instrucciones, dependiendo del valor de una


expresión. Su sintaxis es:

If condición Then [instrucciones]-[Else instrucciones_else]

Tambien podemos utilizar la siguiente sintaxis en formato de bloque:

If condición Then
[instrucciones]
[ElseIf condición-n Then
[instrucciones_elseif] ...
[Else
[instrucciones_else]]
End If

Condición (requerido): uno o más de los siguientes dos tipos de expresiones: Una expresión
numérica o expresión de cadena que puede ser evaluada como True o False. Si condición es Null,
condición se considera False.
Una o más instrucciones separadas por dos puntos ejecutados si la condición es True. condición-n
(Opcional). igual que -condición.
instrucciones_elseif (Opcional): una o más instrucciones ejecutadas si la condición-n asociada es
True.
instrucciones_else (opcional): una o más instrucciones ejecutadas si ninguna de las expresiones
anteriores condición o condición-n es True.

Veamos algunos ejemplos de If, escritos en una sola línea:

En esta macro si el valor de la celda A1 es > a 15, entonces la condición es verdadera (es decir
TRUE) con lo cual se ejecuta la instrucción definida para tal caso, en este ejemplo lanzamos un
mensaje, que dice: "La celda A1> 15"

Sub If_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
End Sub

En esta otra macro si el valor de la celda es >15 se cumple con la condición demandada con lo cual
se ejecuta la primera opción, en caso de que no sea TRUE (es decir en caso de que sea FALSE)
ejecutamos la segunda instrucción, en nuestro ejemplo, el mensaje: "La celda A1< 15"

Sub If_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15" Else MsgBox "La celda A1< 15"
End Sub

174
www.todoexcel.com

También hubiéramos podido escribir el anterior ejemplo a través de dos construcciones If tal que:

Sub If_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
If [A1] < 15 Then MsgBox "La celda A1< 15"
End Sub

Si el valor de la celda A1 fuera 200, la siguiente macro lanzaría dos mensajes pues las dos
instrucciones IF... serían TRUE:

Sub If_Then()
If [A1] > 15 Then Msgbox "La celda A1> 15"
If [A1] > 15 Then MsgBox "La celda A1< 15"
End Sub

En el caso de que querramos realizar más de una operación si una condición devuelve True, o bien si
devuelve False, conviene utilizar una construcción en bloque.

Veamos algunos ejemplos de If, escritos en bloque:

En caso de que el valor de la celda A1>15 entonces la condicion es True, y siendo True, lanzaríamos
un mensaje y después pondríamos la celda A1 en negrita y con fondo Rojo.

Sub If_Then()
If [A1] > 15 Then
Msgbox "La celda A1> 15"
With [A1]
.Interior.ColorIndex = 3
.Font.Bold = True
End With
End If
End Sub

o bien:

Sub If_Then()
If [A1] > 15 Then ' si la condicion es TRUE
MsgBox "La celda A1> 15" ' lanzaríamos un mensaje
[A1].Interior.ColorIndex = 3 ' el fondo de la celda [A1] seria rojo
[A1].Font.Bold = True ' y la celda [A1] estaría en negrita
Else ' Si la condicion fuera False
[A1].Interior.ColorIndex = 10 'el fondo de la celda [A1] sería Verde
[A1].Font.Size = 50 ' y la fuente tendría tamaño 50
End If
End Sub

Un boloque If puede tener así mismo varias secciones ElseIf, que vendrían a decir "de lo contrario",
"o". La instrucción ElseIf impide que el código continúe verificándose cuando una de las condiciones
se a presentado como True. Veamos un ejemplo:

175
www.todoexcel.com

Si el valor de la celda A1 fuera 500 al confirmarse como verdadera la primera condición (>15)
ejecutaríamos las tres instrucciones tal que, (MsgBox "La celda A1> 15"), ([A1].Interior.ColorIndex
= 10), y ([A1].Font.Bold = True) y a continuación acabaríamos con la ejecución de la condición:

Sub If_Then()
If [A1] > 15 Then
MsgBox "La celda A1> 15"
[A1].Interior.ColorIndex = 10
[A1].Font.Bold = True
ElseIf [A1] > 10 Then
[A1].Interior.ColorIndex = 10
[A1].Font.Size = 50
ElseIf [A1] > 2 Then
MsgBox "2"
End If
End Sub

En el caso anterior, si el valor de A1 fuera 3, aún cuando las tres condiciones devolverían True por
separado, solo se ejecutaría la primera.

Veamos otro ejemplo donde en función de la hora del día obtendremos un mensaje diferente:

Sub If_Then()
If Time < TimeValue("08:30:00") Then MsgBox "Buenos Dias!"
If Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then MsgBox "Buenas
Tardes!"
If Time >= TimeValue("20:30:00") Then MsgBox "Buenas noches!"
End Sub

On bien escrito de diferente manera:

Sub If_Then()
If Time < TimeValue("08:30:00") Then
MsgBox "Buenos Dias!"
ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then MsgBox "Buenas
Tardes!"
Else: MsgBox "Buenas noches!" 'cuando ninguna de las anteriores posibilidades se cumple:
End If
End Sub

o bien:

Sub If_Then()
If Time < TimeValue("08:30:00") Then
MsgBox "Buenos Dias!"
ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then
MsgBox "Buenas Tardes!"
Else
MsgBox "Buenas noches!"
End If
End Sub

176
www.todoexcel.com

o bien:

Sub If_Then()
If Time < TimeValue("08:30:00") Then MsgBox "Buenos Dias!"
ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then MsgBox "Buenas
Tardes!"
Else: MsgBox "Buenas noches!"
End If
End Sub

o bien:

Sub If_Then()
If Time < TimeValue("08:30:00") Then
MsgBox "Buenos Dias!"
Else
If Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then
MsgBox "Buenas Tardes!"
Else
MsgBox "Buenas noches!"
End If
End If
End Sub

Como se ve hay muchísimas maneras de escribir la misma Macro. Ahora depende de cada uno
decidir cual se prefiere.

3.7.8. Select Case

La instrucción Select Case se utiliza cuando las alternativas en una estructura de If Then son
muchas. En tal caso conviene evitar el If Then y hacer uso de Select Case, que permite ejecutar uno
de varios grupos de instrucciones, dependiendo del valor de una expresión.

La sintaxis de Select Case es:

Select Case expresión_prueba


[Case lista_expresion-n
[instrucciones-n]] ...
[Case Else
[instrucciones_else]]
End Select

Veamos un ejemplo:

Sub Select_Case()
Dim Número As Variant ' la declaramos como Variant para evitar el error de compilación que
' obtendríamos en el caso de que [A1] fuera texto
Número = [A1] ' Inicializa variable.

177
www.todoexcel.com

Select Case Número ' Evalúa Número.


Case 1 To 5: MsgBox "Entre 1 y 5" ' Para Nºs entre 1 y 5, inclusive
Case 6, 7, 8: MsgBox "Entre 6 y 8" ' Para Nºs entre 1 y 5, inclusive
Case 9 To 10: MsgBox "Mayor que 8" ' Para Nºs entre 9 y 10, inclusive
Case Else ' Para otros valores.
MsgBox "No está entre 1 y 10"
End Select
End Sub

Si expresión_prueba coincide con cualquier lista_expresión asociada con una cláusula Case, las
instrucciones que siguen a esa cláusula Case se ejecutan hasta la siguiente cláusula Case o, para la
última cláusula, hasta la instrucción End Select. El control pasa después a la instrucción que sigue a
End Select. Si expresión_prueba coincide con una expresión de lista_expresión en más de una
cláusula Case, sólo se ejecutan las instrucciones que siguen a la primera coincidencia.

En el ejemplo anterior, si [A1] fuera "pedro" se ejecutaría la condicion

Case Else ' Otros valores

Si [A1] fuera 5 se ejecutaría la instrucción

Case 1 To 5: MsgBox "Entre 1 y 5"

En la siguiente macro, si A1 fuera 15, solo se ejecutaría la primera opción del Case Select, al
devolver TRUE:

Sub Select_Case()
Dim Número As Variant ' La declaramos como Variant para evitar el error de compilación que
obtendríamos en el caso de que [A1] fuera texto
Número = [A1] ' Inicializa variable.
Select Case Número ' Evalúa Número.
' Número entre 1 y 25, inclusive.
Case 1 To 25: Debug.Print "Entre 1 y 25"
' Número entre 6 y 8.
Case 10, 14, 15: Debug.Print "Bien 10, 14 o 15"
Case 15 To 18 ' Número entre 15 y 18.
Debug.Print "'Número entre 15 y 18, inclusive."
Case Else ' Otros valores.
Debug.Print "Valor no comprendido en los diferentes Casos"
End Select
End Sub

La cláusula Case Else se utiliza para indicar las instrucciones que se van a ejecutar si no se
encuentran coincidencias entre expresión_prueba y una lista_expresión en cualquiera de las otras
selecciones de Case. Aunque no es necesario, es buena idea tener una instrucción Case Else en el
bloque Select Case para controlar valores imprevistos de expresión_prueba. Cuando no hay una
instrucción Case Else y ninguna expresión de la lista en las cláusulas Case coincide con la expresión
de prueba, la ejecución continúa en la instrucción que sigue a End Select, es decir la instrucción no
ejecuta ninguna opción pues no hay valor que devuelva TRUE.

178
www.todoexcel.com

Lógicamente Select Case ayuda bastante como se ve en el siguiente ejemplo conocido, pues ya lo
hemos utilizado al explicar IF Then:

Sub Select_Case()
Select Case Time
Case Is < TimeValue("08:30:00"): MsgBox "Buenos Dias!"
Case Is >= TimeValue("20:30:00"): MsgBox "Buenas Noches!"
Case Else: MsgBox "Buenas Tardes!"
End Select
End Sub

Constuir la macro anterior con Select Case en lugar de If Then hace que sea más sencilla de
entender y de escribir.

En la siguiente macro nos daria igual no utilizar la opción o comodín Case Else ya que sabemos que
los días de la semana son 7:

Sub Select_Case()
Select Case Weekday(Now, vbMonday) ' o bien: Weekday(Now, 2)
Case 1: MsgBox "Hoy es Lunes"
Case 2: MsgBox "Hoy es Martes "
Case 3: MsgBox "Hoy es Miércoles"
Case 4: MsgBox "Hoy es Jueves"
Case 5: MsgBox "Hoy es Viernes"
Case 6: MsgBox "Hoy es Sábado"
Case 7: MsgBox "Hoy es Domingo"
End Select
End Sub

En la macro anterior utilizamos la opción Weekday(Now, vbMonday) o Weekday(Now, 2), porque la


fórmula Weekday puede dar como resultado 1-7 en función del día por el que querramos comenzar
la semana. La semana que empieza por el día se pone tal que:

Weekday(Now, vbMonday)

o bien:

Weekday(Now, 2)

VBA permite realizar la misma operación de cientos de maneras distintas, como ya se ha demostrado
antes. De hecho la macro anterior podría simplificarse tal que:

Sub Macro()
Dim ArrayDiaSemana
ArrayDiaSemana = Array("", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado",
"Domingo")
MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday))
End Sub

179
www.todoexcel.com

En la macro anterior hemos utilizado un array que contiene los días de la semana, pero cuyo primer
elemento esta vacío "", pues Weekday(Now,2) jamás dara 0, con lo cual o bien utilizaríamos la
macro anterior o bien:

Sub Macro()
Dim ArrayDiaSemana
ArrayDiaSemana = Array("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday) - 1)
End Sub

o bien ponemos la Option Base 1, que se utiliza cuando queremos que un array no contemple el
valor 0 de inicio tal que:

Option Base 1
Sub Macro()
Dim ArrayDiaSemana
ArrayDiaSemana = Array("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday))
End Sub

3.7.9. DoEvents

La instrucción DoEvents cede el control de la ejecución al sistema operativo, para que éste pueda
procesar otros eventos.

Su Sintaxis es:

DoEvents( )

La función DoEvents pasa el control al sistema operativo. El control no se devuelve hasta que el
sistema operativo haya terminado de procesar los eventos en cola y se hayan enviado todas las
teclas de la cola SendKeys.

Advertencia: siempre que demos preferencia al procesador temporalmente dentro de un


procedimiento de evento, debemos asegurarnos que el procedimiento no se ejecute de nuevo desde
una parte diferente del código antes de que devuelva la primera llamada. Esto podría causar
resultados impredecibles. Además, no debemos utilizar la función DoEvents si existe la posibilidad de
que otras aplicaciones interactúen con el procedimiento, de manera imprevista, durante el tiempo en
que éste ha cedido el control.

DoEvents suele utilizarse muchas veces para que a medida que una instrucción Looping o For Next
se está ejecutando si presionamos otro control tal que:

Private Sub Workbook_SheetActivate(ByVal Sh As Object)


End Sub

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As


Boolean)
End Sub
180
www.todoexcel.com

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As


Boolean)
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)


End Sub

Las macros dentro de las opciones anteriores se ejecutan antes de volver al looping o For Next que
contiene el código DoEvents().

Si quisiéramos que una macro realizara cierta cantidad de operaciones siguiendo un looping, y
supiéramos que no debemos seleccionar ninguna celda mientras tanto, podríamos utilizar la
siguiente macro "DoEventsMacro" en conjunción con la macro de evento.

3.7.10. On Error GoTo

La instrucción On Error GoTo se utiliza para controlar un error de macro en caso de haberlo. Lo ideal
es que el usuario final de la aplicación con macros pueda ver un mensaje más comprensible.
Entonces podemos indicarle a la macro que si se produce un error haga un salto a otra línea donde
se le indica cómo proceder.

En la siguiente macro

Sub GOTOMacro()
Dim X, Y
On Error GoTo CasoError
Y = [A1] / [B1]
' Si A1/B1 diera como resultado un error, la macro saltaría a la línea 'CasoError'
' de lo contrario continuaríamos con
For X = 1 To 50
Cells(X, 1) = X
Next X

Exit Sub

CasoError:
MsgBox "Ha surgido un error, intente con otros valores en A1 y B1"

End Sub

En el caso anterior, al dividir A1 entre B1 podría existir un error, por ejemplo, si en B1 hubiese un
valor 0 o una letra. Como la macro no puede realizar dicha operación habría un error de VBA. Pero
con el On Error GoTo podemos controlar dicho error y mostrar un mensaje personalizado, tal como lo
hemos armado en la línea CasoError.

181
www.todoexcel.com

3.7.11. On Error Resume Next

Otra alternativa en caso de error es ingnorarlo y continuar con la ejecución del código, (aunque sería
peligroso, porque ignorar un error no significa que el mismo desaparezca!). Para ignorar un error lo
hacemos con la intrucción On Error Resume Next, ubicándo esta línea al comienzo del código:

Sub Macro ()
' Si hay un error lo ignora y continúa ejecutando el resto del código
On Error Resume Next
' Aquí iría el resto del código
End Sub

182
www.todoexcel.com

3.8. CUADROS DE DIALOGO

Los Built In Dialogs son Cuadros de Diálogo predeterminados que permiten realizar diversas
operaciones fácilmente, sin tener que recurrir a una macro. En este capítulo los veremos más en
detalle.

3.8.1. Ejemplos

Como se suele decir en programación, cuando queremos realizar algo, antes que inventarlo conviene
descubrir si ya esta inventado!

Para que crear algo que ya ha sido creado con anterioridad, desde VBA tenemos acceso a la mayoría
de lo Built In Dialogs.

Por ejemplo, si quisiéramos que el usuario guarde su libro con con el cuadro de diálogo "Guardar
como" podríamos llamarlo desde el Built In Dialog xlDialogSaveAs. La instrucción completa sería:

Application.Dialogs(xlDialogSaveAs).Show

La instrucción anterior abriría nuestro viejo y conocido cuado de diálogo "Guardar como", tal como
se ve en la siguiente figura:

Los built-in dialogs son funcionalidades que permiten interactuar con la voluntad del usuario en la
ejecución de la macro. Para tener acceso a todos los built-in dialogs, lo podemos hacer desde el
editor de VBA:

183
www.todoexcel.com

1. Presionamos la tecla F2 para abrir el Examinador de objetos.


2. En la lista Clases elegimos XLBuiltInDialog
3. En la lista Miembros de la derecha veremos todos los disponibles.

En el siguiente ejemplo abrimos un archivo mediante el Built In Dialog GetOpenFilename pero solo
listamos los archivos XL* (el asterisco significa "cualquier caracter"). En este caso solo listaríamos
archivos XLS y XLA:

Sub Ejemplo1()
Dim Nombre_del_Fichero As Variant 'o bien: As String
Nombre_del_Fichero = Application.GetOpenFilename( _
FileFilter:="Hojas de cálculo (*.xl*),*.xl*", _
Filterindex:=1, _
' Podemos definir el título del Built In Dialog
Title:="¿Sobre que Libro deseas operar?", MultiSelect:=False)
Workbooks.Open Nombre_del_Fichero
End Sub

Si quisiéramos abrir más de un libro de excel:

Sub Ejemplo2()
Dim Nombre_del_Fichero As Variant 'o bien: As String
Nombre_del_Fichero = Application.GetOpenFilename( _
FileFilter:="Hojas de cálculo (*.xl*),*.xl*", _
Filterindex:=1, _
Title:="¿Sobre que Libro deseas operar?", MultiSelect:=True)
On Error Resume Next
If Nombre_del_Fichero <> False Then
NumFiles = UBound(Nombre_del_Fichero) - LBound(Nombre_del_Fichero) + 1
If Nombre_del_Fichero(LBound(Nombre_del_Fichero)) = False Then Exit Sub
' Para evitar que las macros de evento Private Sub Workbook_Open()
' se ejecuten
Application.EnableEvents = False
For X = LBound(Nombre_del_Fichero) To UBound(Nombre_del_Fichero)
Workbooks.Open Nombre_del_Fichero(X)
Next X
184
www.todoexcel.com

Application.EnableEvents = True
Else
Exit Sub
End If
End Sub

FileFilter se aplica para definir el tipo de ficheros sobre los que deseamos trabajar.
En este sentido si quiséramos que el usuario pudiera escoger entre abrir Ficheros de Text "TXT",
ficheros de Excel "Xls", o bien Cualquier Otro deberiamos utilizar:

FileFilter:="Archivos de texto (*.txt),*.TXT," & _


" Todos los archivos de Microsoft Excel (*.Xls),*.Xls," & _
" Todos los archivos (*.*),*.*"

dándole la oportunidad de elegir entre TXT, XLS. También hubiéramos podido llamarles tal que:

FileFilter:="Archivos de texto (*.txt),*.TXT," & _


"hojas de cálculo Excel (*.Xls),*.Xls," & _
"cualquier otro (*.*),*.*"

Lo único que hay que respetar es la extensión aplicable a cada fichero sobre el que deseemos
trabajar

si colocaramos:
Filterindex:=1
El cuadro de diálogo abierto mostraría Archivos de texto como el tipo de archivo.

Filterindex:=2
El cuadro de diálogo abierto mostraría Hojas de Cálculo Excel como el tipo de archivo.

Filterindex:=3
El cuadro de diálogo abierto mostraría cualquier otro archivo como el tipo de archivo

Title es el título que mostrará el cuadro de diálogo:


Title:="¿Sobre que Libro deseas operar?"
Title:="¿Que Libros deseas Abrir?"
Title:="¿Que Libros deseas Guardar?"

MultiSelect:=True,
Si queremos tener la posibilidad de operar sobre más de un libro deberemos poner True, de lo
contrario False.

He aqui un Ejemplo que podemos utilizar:

Sub Ejemplo3()
Dim FileList As Variant
Dim NumFiles As Integer, X As Integer

185
www.todoexcel.com

On Error Resume Next

FileList = Application.GetOpenFilename( _
"Archivos de texto (*.txt),*.TXT," & _
"Todos los archivos de Microsoft Excel (*.Xls),*.Xls," & _
"Todos los archivos (*.*),*.*", _
3, _
"¡Seleccione los Ficheros sobre los que desees Trabajar!", _
,_
True)
' Permitimos seleccionar mas de un Fichero
' la opción deseada para mostrar es: Todos los archivos
' el título es='¡Seleccione los Ficheros sobre los que desees Trabajar!'
' esto tan solo otra forma de escribir lo mismo

If FileList <> False Then


NumFiles = UBound(FileList) - LBound(FileList) + 1
If FileList(LBound(FileList)) = False Then Exit Sub
Cells.Clear
For X = LBound(FileList) To UBound(FileList)
Cells(X, 1) = FileList(X)
' Debug.Print FileList(x)
' Hubiéramos podido trabajar con ellos tal que
' Creando otra macro que trabajara con ellos
' Call ReporteVentas
Next X
Else
Application.EnableEvents = True
Exit Sub
End If

End Sub

186
www.todoexcel.com

3.9. BARRAS DE HERRAMIENTAS

Podemos personalizar o adaptar nuestros propios menús y barras de herramientas dentro de Excel.
En este capítulo veremos como hacerlo. Las barras de herramientas también se conocen como
Toolbars.

3.9.1. Crear Toolbar

Excel no deja de ser otra aplicación de las muchas que conocemos como MS Word, MS PowerPoint,
MS Access, Contawin, WordPad etc. Y al igual que todas las demás aplicaciones contiene una serie
de funcionalidades y/o disposiciones comunes como:

La barra de título: es la que encontramos en la parte superior de cualquier aplicación.


Se caracteriza y es fácil de reconocer porque simpre, independientemente de la aplicación a la que
sirva contiene a la izquierda el logotipo de la aplicación, después el nombre de la aplicación y el
nombre del documento contenido en la aplicación, después el botón minimizar, seguido del de
maximizar y/o restaurar y finalmente el de cerrar. Sabemos que una aplicacion esta activa porque el
color de su barra de título está de color Azul, mientras que cuando no esta activa suele tener un
color gris.

La barra de menú: también es común en todas las aplicaciones existentes, ahora bien las palabras
que contiene esta barra varían en función de la funcionalidad que tenga la aplicacion en si. En este
sentido la barra de menu de MS Word difiere de la barra de menú de MS Excel. Independientemente
de cual sea la aplicación en si tendremos los siguientes menus dentro de la barra de menus:
(Archivo, Edición y Ayuda, aunque este último término en Excel venga expresado con el caracter
"?"). Puesto que Excel es una hoja de cálculos, Word un procesador de textos y access una base de
datos, estas aplicaciones diferirán en cuanto a las palabras que contengan su barra de menú, así
como en cuanto a los controles que contengan cada una de los menús de la barra de menú.

Los controles que contiene el menú formato de Word difieren de los que tiene el menú formato de
Excel, lo cual es lógico. Si sobre cualquier punto de la horizontal que representa la barra de menú
hacemos clic con el botón derecho del ratón cualquier aplicación nos permitiría ver el número de
barras de herramientas disponibles para la aplicación en si, así como cuales de ellas están visibles y
cuales no o cuales podemos personalizar.

187
www.todoexcel.com

Si abriéramos un documento de texto desde el escritorio, obervaríamos que un documento de texto


posee una barra de títulos idéntica a la de Excel pero una barra de menú que solo tendría 4 menus
(Archivo, Edición, Formato y Ayuda). Si hiciéramos clic derecho en la misma, observaríamos que un
documento de texto "bloc de notas" no contiene barra de herramientas.

Si abrimos Internet Explorer, observaremos que la barra de títulos estará siempre, con la misma
disposición que la descrita al principio de este capítulo (Logotipo, Nombre del documento contenido
en la aplicación, nombre de la aplicación, minimizar, maximizar o restaurar y cerrar). Despues la
barra de menús ( Ver, Favoritos y Herramientas). Si hiciéramos clic drecho sobre la barra de menús,
observaríamos que contiene entre otras la siguientes barras de herramientas (Barra de direcciones,
botones estándar, vínculos, personalizar, etc.), es decir la barra de herramientas de MS Internet
Explorer pueden ser personalizadas, pero hasta cierto punto y/o límite ya que solo podemos variar
los vínculos, la disoposición de la diferentes barras de herramientas y la disposición y presencia de
los botones dentro de la barra de heraamientas llamada "botones estandar".

También conviene recordar que Excel, Word, y el resto de aplicaciones Office siempre mantienen la
última configuración utilizada. En este sentido si ocultáramos todas la barras de herramientas y

188
www.todoexcel.com

cerráramos la aplicación la siguiente vez que abriéramos la misma aplicación todas las barras de
herramientas estarían ocultas.

Tras esta introducción, podemos decir que en Excel todo es posible en cuando a barras de
herramintas y barra de menús, entendiendo como todo es posible:

1. Crear una nueva barra de herramientas personalizada


2. Modificar cualquiera de la existentes añadiendo nuevos comandos y/ menús
3. Deshabilitar controles y/o funciones
4. Cambiar el nombre de las barras personalizadas

Nosotros somos partidarios de no crear barras de herramientas en Excel debido a que simpre
quedarán en el listado de barras de herramientas salvo que las eliminemos al cerrar el libro que las
creó. Est sería innecesario ya que en lugar de crear barras de herramientas nos podemos limitar a
añadir controles en la misma hoja o bien añadir barras de herramientas POPUP.

La dinámica y el el proceso de creación de una barra de herraminta y un menú, submenú o control


dentro de un submenú es el mismo.

Cualquier menú, submenú y/o control tiene un identificador "ID" al cual podremos hacer referencia
al crearlo y/o borrarlo.

La siguiente instruccion evita que podamos personalizar y/o modificar las barras de herramientas de
Excel, en caso que ninguna estuviera visible. Con el siguiente código, no podremos visualizar
ninguna barra.

CommandBars("Toolbar List").Enabled = False

Si quisiéramos volver a permitir la modificación de las barra de herramientas, tan solo


necesitariamos cambiar el False por True. En ambos casos, la función es evitar que el usuario final
añada y/o modifique las Barras de Herramientas (Barras de herramientas).

A la hora de crear una Barras de herramientas, conviene borrarla previamente, para evitar el
problema derivado de crear una Barras de herramientas con un nombre preexistente, por ej:

Sub BorrarToolbar()
On Error Resume Next
' Borra la barra de Herramientas llamada TodoEXCEL
' On error resume next evita el problema derivado en caso de que no
' hubiera ninguna barra de herramientas llamada TodoEXCEL
CommandBars("TodoEXCEL").Delete
End Sub

Es decir si quisiéramos crear una Barras de herramientas llamada "TodoEXCEL", sería conveniente
llamar a la macro anterior primero tal que:

Sub CrearToolbar()
Dim X As Byte
On Error Resume Next
189
www.todoexcel.com

Call BorrarToolbar ' Llamamos a la macro BorrarToolbar, para evitar problemas en código
' Creamos la barra deHerramientas
With CommandBars.Add(Name:="TodoEXCEL")
.Visible = True
' esta Barras de herramientas tendrá 3 controles, o mejor dicho 2 controles de botón y un
Dropdown control
With .Controls.Add(Type:=msoControlButton)
.Caption = "VBA"
.Visible = True
.OnAction = "SheetVBA"
.FaceId = 1954
.TooltipText = "Muestra el Editor de VBA"
.Style = msoButtonIconAndCaption ' el 1º control enseñará la imagen y el texto
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "Saludos:"
.OnAction = "Msg"
.FaceId = 1954
.BeginGroup = True
.TooltipText = "Simple Saluda!"
.Style = msoButtonCaption
' Aún cuando hemos puesto un FacedID=1954,
' al definir que solo queremos enseñar el texto y no la imagen del botón, el código
' .FaceId = 1954 no es necesario
End With
With .Controls.Add(Type:=msoControlDropdown)
' Cuando el control es ejecutado la macro MacroDiaSemana se ejecutará.
.OnAction = "MacroDiaSemana"
' el 3º control es de tipo ContolDropDown, por ello necesitamos saber los valores que tendrá
For X = 2 To 8
.AddItem Application.WorksheetFunction.Proper(Format(X, "DDDD"))
Next X
' los valores añadidos son: Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, Domingo
.ListIndex = 1
.BeginGroup = True
.TooltipText = "Que día es Hoy?!"
End With
End With
End Sub

Conviene recordar que al ejecutar esta macro crearemos una Barras de herramientas llamada
"TodoEXCEL", y al cerrar el libro, esta Barras de herramientas seguirá como una de las Barras de
herramientas de Excel, ya que no la hemos borrado antes de cerrar el libro. Es por ello que
preferimos no utilizar Barras de herramientas creadas con VBA, ya que todo lo que realizamos a
través de ellas puede ser realizado mediante simples comandos adjuntos en las hojas. Cómo
solución podríamos utilizar una nacro de evento que al cerrar el libro activo llamara a la macro
"BorrarToolbar", y con ello borraríamos esta Barras de herramientas recién creada, por ejemplo:

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.

190
www.todoexcel.com

Application.CommandBars("TodoEXCEL").Delete ' Borraríamos la Barras de herramientas


'TodoEXCEL'
End Sub

Finalmente, si lo que queremos es utilizar una Barras de herramientas y no queremos utilizar


eventos, también podremos utilizar PopUps, que son Barras de herramientas que solo aparecen
cuando una característica dada tiene lugar. Esto lo veremos en la próxima sección.

3.9.2. PopUp

Si lo que queremos es utilizar una BH solo cuando, por ejemplo, hacemos clic con el botón derecho
del ratón en una hoja determinada, podemos utilizar una macro de evento que cree una BH temporal
o PopUp, tal que:

Sub CrearPOPUP()
Dim CBarPOPUP As CommandBar
Dim POPUPControl As CommandBarControl
Dim SubPOPUPControl As CommandBarButton
' Borrar la Previa
Call BorrarPOPUP
Set CBarPOPUP = CommandBars.Add( _
Name:="TodoEXCELPOPUP", _
Position:=msoBarPopup, _
MenuBar:=False, _
Temporary:=False)
With CBarPOPUP
' Vamos añadiéndole diferentes botones tal que...
' 1)
Set POPUPControl = .Controls.Add(Type:=msoControlButton)
With POPUPControl
.Caption = "&Informe Ventas..."
.FaceId = 1922
.OnAction = "MacroEg"
End With
' 2)
Set POPUPControl = .Controls.Add(Type:=msoControlButton)
With POPUPControl
.Caption = "&Plan Contable..."
.FaceId = 1016
.OnAction = "MacroEg"
End With
' 3)
Set POPUPControl = .Controls.Add(Type:=msoControlPopup)
With POPUPControl
.Caption = "Paises"
.BeginGroup = True
End With
' 3.A)
Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton)
With SubPOPUPControl
.Caption = "Francia"
.FaceId = 71
.OnAction = "MacroEg"
191
www.todoexcel.com

End With
' 3.B)
Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton)
With SubPOPUPControl
.Caption = "España"
.FaceId = 72
.OnAction = "MacroEg"
End With
' 3.C)
Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton)
With SubPOPUPControl
.Caption = "Portugal"
.FaceId = 73
.OnAction = "MacroEg"
End With
End With
End Sub

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("TodoEXCELPOPUP").Delete
End Sub

Al ser una BH PopUp, no necesitamos crearla cada vez que hacemos clic con el botón derecho del
ratón, tal que:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)


If Not Intersect(Range("RangoCeldas"), Target) Is Nothing Then
Call CrearPOPUP
Application.CommandBars("TodoEXCELPOPUP").ShowPopup
' CommandBars('TodoEXCELPOPUP').ShowPopup '.showpopup
' Pues queremos observar como los comandos del boton derecho
' de nuestro raton varían
Cancel = True
End If
End Sub

Pero para ello si necesitaremos crearla al abrir el libro tal que:

Private Sub Workbook_Open()


Call CrearPOPUP
End Sub

192
www.todoexcel.com

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("TodoEXCELPOPUP").ShowPopup
' Pues queremos observar como los comandos del botón derecho
' de nuestro raton varían
Cancel = True
End If
End Sub

Recordemos que esta macro de evento BeforeRightClick solo tiene lugar cuando hacemos clic con el
botón derecho del ratón estando dentro del rango definido como: Range("RangoCeldas") ya que no
queremos perder la funcionalidad del botón derecho del ratón en otros rangos.

3.9.3. Mostrar y ocultar

Del mismo modo que podemos crear y borrar un BH, también podemos ocultar y desocultar tantas
BH como querramos. Para ello utilizamos:

Sub OcultarDesocultarBH()
Dim X As Integer
Application.ScreenUpdating = False
' Para permitir la ejecución de la macro.
CommandBars("Toolbar List").Enabled = True
On Error Resume Next
For X = 1 To Application.CommandBars.Count
With CommandBars(X)
.Visible = Not .Visible
End With
Next X
On Error GoTo 0
End Sub

La macro anterior ocultaría todas las BH visibles y desocultaría todas las BH no visibles.

3.9.4. Deshabilitar controles

No son pocas las veces que queremos deshabilitar ciertos controles dentro de un libro Excel dado. A
veces no queremos que nadie imprima la hoja activa, o bien queremos que nadie copie una celdas
determinadas. Para realizar esto con acierto deberemos saber:

1. Qué es una Barra de Menú


2. Personalizar una Barra de Herramientas (BH)

Volvemos a estos temas por el siguiente motivo. Si no queremos tener los controles de copiar, cortar
y pegar en ninguna de nuestras BHs...¿para que tenerlos desde el botón derecho del ratón?. Con
193
www.todoexcel.com

esto queremos decir que si queremos deshabilitar los controles de copiar, cortar y pegar, deberíamos
también deshailitarlos del botón derecho del ratón y no solo los de la barra estándar. No obstante
también podríamos ir al menú Edición > Copiar con lo que aún deshabilitando los controles de las
BH, los controles del menú bar seguirían activos, como así también CONTROL+C que es la
combinación de teclas para copiar y CONTROL+V que es la combinación de teclas para pegar.

En definitiva, para deshabilitar todos los controles de copiar deberíamos:

1) Saber si existe alguna combinación de teclas que ejecuten la acción que queremos evitar y
deshabilitarla. Luego al cerrar el libro esto se hace tal que:

Application.OnKey "^C", "" ' Con esto deshabilitaríamos las teclas Control + C
Application.OnKey "^C" ' Con esto re-habilitaríamos las teclas Control + C

2) Deshabilitar los contoles de copiar en cada una de las BH disponibles en Excel. Esto se hace dela
siguiente forma:

Sub DeshabilitaCiertosControles()
Dim CBControl As CommandBarControl
Dim CBar As Integer
Dim MyArray
Dim X As Byte
Application.ScreenUpdating = False
MyArray = Array(19, 21, 22)
On Error Resume Next
' Para Deshabilitar los controles definidos en el array MyArray
For CBar = 1 To Application.CommandBars.Count
For Each CBControl In CommandBars(CBar).Controls
For X = LBound(MyArray) To UBound(MyArray)
Application.CommandBars(CBar).FindControl(ID:=MyArray(X), Recursive:=True).Enabled =
False
Next X
Next CBControl
Next CBar
Application.CommandBars("PLY").Enabled = False
CommandBars("Toolbar List").Enabled = False
On Error GoTo 0
End Sub

Hemos utilizado un array de los identificadores de los comandos que queremos deshabilitar que son
19,21,22 es decir, Copiar, Cortar y Pegar respectivamente. Una vez que hemos deshabilitado todos
los controles con estos ID, necesitamos a su vez realizar el siguiente paso...

3) Evitar la personalización:

CommandBars("Toolbar List").Enabled = False

Ya que de lo contrario podríamos volver a personalizar nuestras BH e incluir los controles 19, 21 y 22
en cualquier BH bien sea personalizada o de las que trae Excel, por ej Estándar.

194
www.todoexcel.com

4) Deshabilitar copiado de hoja:

Application.CommandBars("PLY").Enabled = False

Deberemos deshabilitar al mismo tiempo la copia de la hoja desde el botón derecho del ratón en los
tabuladores (etiquetas) de hoja, pues de lo contrario lo realizado hasta ahora sería inservible.

5) Deshabilitar opciones del botón derecho del reatón:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)


Cancel = True
End Sub

Como hemos mencionado en repetidas ocasiones el botón derecho del ratón siempre tiene las
opciones de copiar, cortar y pegar con lo que es más sencillo directamente deshabilitar por completo
la opción de botón derecho del ratón.

Sin embargo, todo lo realizado sigue sin ser óptimo, ya que desde el menú Edición tenemos la
posibilidad de mover o copiar la hoja. Es decir que necesitaríamos saber todos los controles que
sirven para realizar lo mismo, o que pueden servir para de alguna manera llegar a evitar el fin
pretendido. E incluso, si conociéramos todos los ID's, luego quedaría la posibilidad de acceder al
editor de VBA y desde aquí habilitar los comandos deshabilitados. Puede que lleguemos a la
conclusión que finalmente es imposible, pero no lo es, tan solo lleva tiempo, y ademas el 99,9% de
lo usuarios no emplearán el tiempo requerido para volver a habilitar algo, que el creador haya
querido deshabilitar. De hecho muchos programadores nunca protegen su código teniendo en cuenta
que existen herramientas con las que se podría crackear fácilmente las claves e protección.

Como alternativa recurrente podriamos crear un menú bar carente de funcionalidad y evitar el
acceso a VBA, deshabilitar el botón derecho del ratón también en los tabuladores de hoja tal que:

Public Sub MakeMenuBar()


Dim X As Byte
Dim ABC As String
ABC = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"
Dim CBar As CommandBar
Call DeleteMenuBar
For Each CBar In CommandBars ' Borramos las barras visibles
If CBar.Type = msoBarTypeNormal Then CBar.Visible = False
Next CBar
Set CBar = CommandBars.Add(MenuBar:=True)
With CBar
.Name = "MenuPARIA"
.Visible = True
End With
Application.VBE.MainWindow.Visible = False
Application.CommandBars("PLY").Enabled = False
' Para deshabilitar los comandos tales como 'CONTROL+P' es decir PRINT
' Nos faltarían todavía algunos pero...
For X = 1 To Len(ABC)
Application.OnKey "^" & Mid(ABC, X, 1), ""
Application.OnKey "^" & LCase(Mid(ABC, X, 1)), ""
Application.OnKey "%" & Mid(ABC, X, 1), ""
195
www.todoexcel.com

Application.OnKey "%" & LCase(Mid(ABC, X, 1)), ""


Next X
' Tampoco hemos deshabilitado los ALT+F1, F2,...
' Application.SendKeys ('%q')
CommandBars("Toolbar List").Enabled = False
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)


' Utilizamos este código porque si el commandbar PLY esta activo no merece la pena deshabilitar el
botón derecho.
If Application.CommandBars("PLY").Enabled = True Then Exit Sub
Cancel = True
End Sub

Recordemos nuevamente que cualquier ExcelManíaco podría sin gran dificultad habilitar cualquier
comando y/o control previamente deshabilitado.

196
www.todoexcel.com

3.10. MENUS

Podemos personalizar o adaptar nuestros propios menús y barras de herramientas dentro de Excel.
En este capítulo veremos como hacerlo.

3.10.1. Crear Menú

La creación de un menú no varía con respecto a la creación de una barra de herramientas (BH).
Ahora bien, siempre debe haber una barra de menú visible, mientras que las BH pueden estar todas
ocultas. Se puede crear una barra de menú totalmente nueva, o bien utilizando la existente, la que
excel agrega y muestra por defecto, añadir nuevos menús y o submenus, o bien podemos añadir
nuevos controles a un menu existente.

Como norma general, aunque no escrita, si quisiéramos agregar un nuevo menú a nuestra barra de
menús (por ej. el menú "TodoEXCEL"), los menus agregados se colocan antes del menu ayuda de
excel llamado "?" (el menú que viene después del menú "Ventana").

El siguiente ejemplo muestra como podemos crear un menú "TodoEXCEL" en Excel.


Al igual que cuando creamos las BH, para crear un menú deberemos borrarlo previamente, para
evitar el error de compilación derivado de crear un menú que ya existe.

Sub BorrarMenu()
On Error Resume Next
Application.CommandBars("Worksheet Menu Bar").Controls("TodoEXCEL").Delete
End Sub

Sub CrearMenu()
Dim HelpMenu As CommandBarControl
Dim MenuNuevo As CommandBarPopup
Dim MenuItem As CommandBarControl
Dim SubmenuItem As CommandBarButton

' Borra el Menu 'TodoEXCEL' llamando a otra macro


Call BorrarMenu

' Busca por el menú Ayuda, esto es simplemente un convenio no firmado entre programadores
' para los cuales cualquier menu creado y añadido debe ir antes que el menu llamado Ayuda y/o Help,
el cual tiene como ID =30010
Set HelpMenu = Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30010)
If HelpMenu Is Nothing Then
' Añade el menu 'TodoEXCEL' al final
Set MenuNuevo = Application.CommandBars("Worksheet Menu
Bar").Controls.Add(Type:=msoControlPopup, Temporary:=True)
Else
' Si Ayuda existe, entonces antes que el menu '?' es decir ID=30010
Set MenuNuevo = Application.CommandBars("Worksheet Menu
Bar").Controls.Add(Type:=msoControlPopup, Before:=HelpMenu.Index, Temporary:=True)
End If

' Llamamos al nuevo Menu creado... 'E&xceluciones'

197
www.todoexcel.com

' hemos colocado un & antes que la 'x' para que la 'x' esté subrayada y podamos acceder al menú
no solamente con el ratón sino desde el teclado con la combinacion de teclas 'ALT + X'
MenuNuevo.Caption = "E&xceluciones"

' Y vamos añadiéndole diferentes botones y/o controles tal que...


'1)
Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlButton)
With MenuItem
.Caption = "&Informe Ventas..."
.FaceId = 176
.OnAction = "MacroEjemplo" ' esta será la macro que ejecutaremos al hacer clic sobre el
botón '&Informe Ventas...', o cuando utilicemos la combinación de teclas 'ALT +X...ALT+I'

End With
'2)
Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlButton)
With MenuItem
.Caption = "&Plan Contable..."
.FaceId = 36
.OnAction = "MacroEjemplo"
End With
'3)
Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlPopup)
With MenuItem
.Caption = "Países"
.BeginGroup = True
End With
'3.A) Del mismo modo que añadimos controles, podemos añadir subcontroles
' y dentro de estos podríamos añadir a su vez más subcontroles, aunque no es aconsejable
Set SubmenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
With SubmenuItem
.Caption = "Francia"
.FaceId = 71
.OnAction = "MacroEjemplo" 'Estamos utilizando la misma macro, pero lógicamente, se
suelen colocar tantos botones como macros querramos utilizar,
End With
'3.B)
Set SubmenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
With SubmenuItem
.Caption = "España"
.FaceId = 72
.OnAction = "MacroEjemplo"
End With
'3.C)
Set SubmenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
With SubmenuItem
.Caption = "Portugal"
.FaceId = 73
.OnAction = "MacroEjemplo"
End With
Sheets("Crear MenuTodoEXCEL").Shapes("ImgMenu").Visible = True

End Sub

Esta es la macro que hemos creado para que sea ejecutada al hacer clic sobre cualquier control del
menú creado:

198
www.todoexcel.com

Private Sub MacroEjemplo()


MsgBox "en lugar de un mensaje hubieramos podido...", vbInformation, "LOGICAMENTE..."
End Sub

Haber decidido colocar el menu "TodoEXCEL" antes que el menú y/o control Ayuda "?" no significa
que debamos hacerlo siempre asi. Pero debemos de saber el ID del menú para poder maniobrar
sobre el y/o con el.

30002 =&Archivo
30003 =&Edición
30004 =&Ver
30005 =&Insertar
30006 =&Formato
30007 =&Herramientas
30011 =Da&tos
30083 =A&cción
30009 =Ve&ntana
30010 =&?

3.10.2. Agregar controles

Ahora agregaremos controles a un menú Excel predeterminado, ya que agregar controles a un menu
personal, es decir un menu nuevo, ya lo hemos realizado en el la sección anterior.

Debemos de saber el ID del menú sobre el que vamos a trabajar y/o en su defecto su nombre y/o
caption:

30002 =&Archivo
30003 =&Edición
30004 =&Ver
30005 =&Insertar
30006 =&Formato
30007 =&Herramientas
30011 =Da&tos
30083 =A&cción
30009 =Ve&ntana
30010 =&?

En el siguiente ejemplo insertamos un nuevo control en el Menu Insertar, y le adjuntamos una


macro sencillita para cuando el control creado sea ejecutado y/o clicado a través del ratón o a través
de teclado con el metodo abreviado de teclas "Conbinación de teclas":

Sub AñadirControl_al_MenuXX()
Dim MenuXX As CommandBarPopup

199
www.todoexcel.com

Dim nuevoControl As CommandBarButton


' Elimina el Control si existiera:
Call DeleteMenuControl
' Encontrar el Menu Insertar:
Set MenuXX = Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30005)
' Buscamos por el Menu Insertar y en caso de que no existiera, EXIT
' Lógicamente el menu 'Insertar' debería estar siempre, pero nos aseguramos...
If MenuXX Is Nothing Then
MsgBox "Parece que su Barra de Menu, no Contiene el Control Insertar", vbInformation,
"ATENCION"
Exit Sub
End If
Set nuevoControl = MenuXX.Controls.Add( _
Type:=msoControlButton)
' before:= en caso de que quisiéramos colocarlo no en el final, sino
' antes que el control llamado 'Com&entario'
' Set nuevoControl = MenuXX.Controls.Add( _
Type:=msoControlButton, _
Before:=Application.CommandBars("Insert").Controls("Com&entario").Index)

With nuevoControl
.Caption = "Insertar Mensaje E&xceLuciones"
.BeginGroup = True
.FaceId = 1589
.OnAction = "MsgBox_Hola"
End With
End Sub

Sub DeleteMenuControl()
On Error Resume Next
Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30005).Controls("Insertar
Mensaje E&xceLuciones").Delete
End Sub

Sub MsgBox_Hola()
MsgBox Chr(10) & "Un Feliz AÑO Nuevo!!!", _
vbInformation, _
"TodoEXCEL le desea:"
End Sub

Conviene recordar que si ejecutáramos esta macro y no borráramos el control creado al cerrar el
libro, luego si fuéramos al menú Insertar e hiciéramos clic sobre el control "Insertar Mensaje
E&xceLuciones", Excel automáticamente abriría el libro que contiene la macro que hemos ordenado
que se ejecute. Es por ello que los menús nuevos y/o personalizados se aportan como complementos
o bien se borran cuando el libro que los creó se cierra.

También debemos recordar que podemos hacer eferencia a un menú por su nombre y/o por su
identificativo (es decir su ID). Los ID no variarán de país a país (versiones de Excel en distintos
idiomas) mientras que los nombres puede que si !.

200
www.todoexcel.com

3.11. COMANDOS

En este capítulo se explicarán algunos comandos útiles que suelen utilizarse con frecuencia en las
macros.

3.11.1. Mensajes de alerta

Los mensajes de alerta son avisos que dispara Excel antes de realizar determinadas acciones. Por
ejemplo, al intentar borrar una Hoja, nos aparece una aviso de confirmación. A nivel de macros, es
importante tenerlos presentes, tal como vemos a continuación:

Sub BorrarHoja()

' Borramos una hoja


ActiveSheet.Delete
' Pero esto requiere la confirmacion por parte del usuario...
' Para evitar el mensaje de alerta, ya que Excel siempre nos pedirá confirmación,
' bastará con utilizar la siguiente instrucción:
Application.DisplayAlerts = False
' Con lo cual ahora sí podremos borrar la hoja dada sin necesidad de confirmación
ActiveSheet.Delete
' Finalmente dejamos a Excel en su estado original de mostrar los mensajes
Application.DisplayAlerts = True
End Sub

Es importante recordar que el Application.DisplayAlerts=False siempre debe ir antes de la acción que


requiere confirmación. Al final de la macro conviene volver a asignarle la propiedad True.

3.11.2. Barra de estado

La barra de estado de Excel es la que figura en la parte inferior y suele mostrar distintos mensajes.
Esta barra se puede mostrar u ocultar desde el menú Ver > Barra de estado.

Usualmente la Barra de estado muestra la palabra Listo, tal como se ve a continuación:

En otros casos, la misma cambia el mensaje mostrado, según la operación que estemos por realizar.
Por ejemplo, si seleccionamos un rango y lo copiamos, la barra de estado daría una instrucción como
la que se ve a continuación:

201
www.todoexcel.com

Es posible cambiar el mensaje de la Barra de estado mediante código VBA. Esto permite mostrar
mensajes personalizados ya sea mientras se ejecutan las macros o al finalizar las mismas.

A continuación se exponen algunas instrucciones para saber como manipularla y modificarla:

Sub BarraEstado()

' Si queremos ver la barra de estado original


Application.DisplayStatusBar = True

' Si NO queremos verla bastará con:


Application.DisplayStatusBar = False

' Por defecto la Barra de estado siempre estará Visible, es decir:


Application.DisplayStatusBar = True

' Si queremos que la barra de estado muestre un mensage diferente bastará con:
Application.DisplayStatusBar = "Procesando mi reporte..."

' Si queremos que la Barra de Estado este limpia, es decir sin mensaje alguno:
Application.DisplayStatusBar = ""

End Sub

3.11.3. Msgbox

Un Msgbox es simplemente una ventana que muestra un mensaje. Por ej., con la siguiente
instrucción mostraríamos un saludo:

Sub Saludo()
' Escribimos el mensaje entre comillas
Msgbox "Hola, Excel te saluda!"
End Sub
202
www.todoexcel.com

El mesaje anterior se vería así en la hoja Excel:

En este otro ejemplo, el mensaje lo tomamos de una celda Excel:

Sub Saludo()
' El mensaje mostrará el contenido de la celda A1
Dim M As Variant
M = range("A1").value
Msgbox M
End Sub

También es posible dar formato y aplicar otras propiedades al Msgbox, tal como se ve explica
continuación:

Sub MacroMensajes()
' Los mensajes que excel puede lanzar se rigen por:
' Prompt:='Me llamo Pedro.' Enseñaria el mensaje...
' Buttons:= VbInformation, O bien
' Buttons:= 64
' con lo cual Buttons ----> Muestra el icono de mensaje de información.
' Title:='TodoEXCEL:', el título que adjuntaríamos al mensaje
MsgBox Prompt:="Me llamo Pedro.", Buttons:=vbInformation, Title:="TodoEXCEL:"
End Sub

La macro anterior mostraría un mensaje como el siguiente:

Por defecto, un Msgbox siempre incluye el botón "Aceptar", el cual haría desaparecer el mensaje y
continuaría ejecutando el código restante si lo hubiera. También podemos configurar para que en
lugar del botón "Aceptar" aparezca un botón de "Ok" y "Cancelar" y de acuerdo al que elija el
usuario, la macro continuaría con un código u otro código. Esto lo realizamos agregando la
instrucción vbOKCancel, tal como vemos a continuación:

203
www.todoexcel.com

Sub Mensaje()
Dim Respuesta As Integer
Respuesta = MsgBox("Seleccione Aceptar o Cancelar", vbOKCancel)
' verificamos si se presionó 'Cancelar'
If Respuesta = vbCancel Then
MsgBox "Macro caso Cancelar" ' Aquí continuaría la macro en caso de Cancelar
End If
' si se presionó 'Aceptar'
If Respuesta = vbOK Then
MsgBox "Macro caso Aceptar" ' Aquí continuaría la macro en caso de Aceptar
End If
End Sub

El Msgbox anterior se vería así:

y al presionar "Aceptar" o "Cancelar" veríamos otro Msgbox.

Si quisiéramos separar en varias líneas el mensaje, deberíamos hacerlo con la instrucción &Chr(13):

Sub Mensaje()
MsgBox "Este es un mensaje " & Chr(13) _
& "escrito en 2 líneas"
End Sub

El mensaje anterior se vería así:

3.11.4. InputBox

Un InputBox se utiliza cuando requerimos un input del Usuario (es decir, cuando esperamos que el
usuario introduzca un dato). Básicamente lo que hacemos es asignarle un valor a una variable, pero
le damos el control al usuario para que asigne dicho valor o dato a gusto.

204
www.todoexcel.com

Dentro del InputBox utilizamos las siguientes instrucciones:


Prompt: mensaje del InputBox
Title: título del InputBox
Default: valor por defecto al abrir el InputBox (si omitimos no aparecerá nada)
Type: indica el tipo de dato a introducir (1 Número, 2 Texto, 4 True o False, 5 Rangos)

Vamos ahora como queda el InputBox:

Sub Nombre()
' el dato que proporcionará el usuario quedará registrado por la Variable Respuesta. Como no sabemos
que tipo de dato es lo definimos como una variable de tipo Variant.
Dim Nombre As Variant
Nombre = Application.InputBox(prompt:="Escriba su nombre", Title:="Colegio de Abogados",
Default:="Pedro", Type:=2)
Msgbox Nombre ' En lugar de este Msgbox continuaría el resto de la macro...
End Sub

El InputBox anterior se verá así:

205
www.todoexcel.com

4. LIBRERIA

Una "librería" es una colección de macros. En la medida que vamos haciendo nuestras macros,
conviene ir guardándolas en una librería. De este modo las tendremos disponibles para cuando
necesitemos usarlas nuevamente y evitaremos tener que reprogramar las macros en cada momento.
En esta sección veremos nuestra librería de macros (aquellas que utilizamos frecuentemente).

Borrar filas: macros para borrar filas.

Búsquedas: macros para realizar búsquedas.

Cálculos: macros para operar y realizar cálculos.

ComboBox: macros para crear listas desplegables.

CommandBars: macros para manipular barras de comando.

Copiar Pegar: macros para copiar y pegar.

Demos: macros para hacer demos.

Eventos: macros relacionadas con eventos.

Versiones de Excel: macros para determinar la versión de Excel.

LayOut: macros para mostrar u ocultar diversas partes de Excel.

Filtros: macros relacionadas con filtros.

FTP: macros relacionadas con File Transfer Protocol.

Funciones: macros relacionadas con funciones.

Guardar: macros para guardar libros.

Hojas: macros para manipular hojas.

Imágenes: macros para manipular imágenes.

Imprimir: macros para imprimir.

Msgbox: macros de mensajes.

Ordenar: macros para ordenar.

Proteger: macros para proteger y desproteger hojas y libros.


206
www.todoexcel.com

Rangos: macros para manipular rangos.

Resolución de Pantalla: macros para determinar la resolución de pantalla.

Selección: macros relacionadas con selección.

Tablas: macros relacionadas con tablas.

Tablas dinámicas: macros para operar con tablas dinámicas.

Varios: otras macros de interés.

4.1. Borrar Filas

Para borrar filas debemos posicionarnos en una celda y utilizar la instrucción EntireRow.Delete
Veamos un ejemplo:

'En esta macro recorremos la columna 2 (la B) desde la fila 2000 hasta la 1
'Si la celda tiene el valor "q" entonces borramos la fila

Sub BorrarFilas()
Dim r As Long
For r = 2000 To 1 Step -1 'Debemos ir desde abajo hacia arriba
If Cells(r, 2).Value = "q" Then Cells(r, 2).EntireRow.Delete
Next r
End Sub

4.2. Búsquedas

Para hacer búsquedas (el equivalente a la función "buscarv" de Excel) utilizamos la instrucción
lookupvalue.
Veamos un ejemplo:

Sub BuscarCodigo()
'Definimos variables
Dim lookupvalue As Variant, value As Variant, lookupRange As Range

value = Range("A1").value 'celda con el valor buscado

Set lookupRange = Range("A10:A100") 'rango donde buscar

lookupvalue = Application.VLookup(value, lookupRange, 3, False) 'Queremos la columna 3

'Si no encuentra valor terminamos la macro


If IsError(lookupvalue) Then exit sub

207
www.todoexcel.com

'Si lo encuentra lo devuelve


Else
Msgbox lookupvalue
End If
End Sub

4.3. Cálculos

Muchas veces, cuando ejecutamos macros, nos interesará poner el modo de cálculo manual. Para
esto utilizamos la instrucción Calculation.
Veamos un ejemplo:
'Poner modo de cálculo manual
Application.Calculation = xlManual

'Poner mode de cálculo automático


Application.Calculation = xlAutomatic

4.4. ComboBox

Cuando trabajamos con un combobox, podemos crear un evento que se dispare luego de presionar
intro.
Veamos un ejemplo:

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)


If KeyCode = 13 Then 'Cuando apreto enter dentro del combo box entonces
Range("I6").value = ComboBox1.Text 'Pasamos el valor del combo a la celda I6
End If
End Sub

'Para rellenar con lista un combobox q está en una hoja


ActiveSheet.OLEObjects("CBoxTipo").ListFillRange = "ConfTipos"
'Se completa con lo que tengamos en el rango nombrado "ConfTipos"

4.5. CommandBars

Aquí jugamos un poco con las barras de comando. Cambiando los "True" por "False" y viceversa
veremos como afecta.

'RESTITUYE LOS COMMAND BARS Y BORRA EL DE REFRESH !


Sub CmdBarsOn()
Application.CommandBars("Worksheet Menu Bar").Reset
'Activa menu boton derecho en menus
CommandBars("Refresh").Enabled = True
'Para volver a ver el menu de clic derecho en celda
Application.CommandBars("Cell").Enabled = True
End Sub
208
www.todoexcel.com

4.6. CopiarPegar

Un ejemplo sencillito sobre copiar una celda y pegarla como valor.

Sub CopiarPegar()
Range("A104").Copy
Range("A105").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
End Sub

4.7. Demos

Esta es una macro sumamente interesante. Esta macro sirve para crear versiones "demo" de
nuestros libros.
1) Primero se ejecuta una macro "Auto_Open" (se ejecuta automáticamente al abrir el libro)
2) Dicha macro pedirá al usuario una clave de desactivación
3) Si la clave de desactivación es correcta, el usuario podrá usar el libro normalmente
4) Si la clave es incorrecta, se ejecutará la macro "Demo"
5) La macro "Demo" hace que se pueda ejecutar el libro una cantidad de veces o hasta una fecha
dada
6) Si se ha superado la cantidad de usos o la fecha, el libro se cerrará automáticamente

Veamos como funciona:

Sub Auto_Open()

Dim V As String

'Defino una palabra clave de activación (ponerla en una celda oculta o con texto y fondo blanco)
If Hoja6.Range("B1").value = "españa" Then
Exit Sub

Else

V = Application.InputBox("Introduzca la clave de activación. Si todavía no la conoce presione


'Aceptar'")

If V = "españa" Then
Hoja6.Range("B1").value = "españa"
MsgBox "Activación exitosa, presione 'Ok' para guardar los cambios."
ThisWorkbook.Save
Exit Sub
End If

'Si no puso la clave correcta llama macro demo


Call Demo

End If
End Sub

209
www.todoexcel.com

Sub Demo()

Dim V As String, FechaFin As Date, Usos As Range

FechaFin = #7/15/2007# 'm-d-aaaa... CAMBIAR ESTA FECHA !!!

Set Usos = Hoja6.Range("A1") 'CAMBIAR CELDA DONDE PEGAR USOS !!!

'Incremento el contador
Usos.value = Usos.value + 1

MsgBox "Esta es una versión DEMO que expirará el " & FechaFin & " o luego de 20 usos."
MsgBox "Usted ha consumido " & Usos & " de 20 usos disponibles."

If Date > FechaFin Or Usos > 20 Then 'Aquí se puede cambiar el Nº de usos
MsgBox "Demo expirada, contacte con el autor"
ThisWorkbook.Close SaveChanges:=True
End If
End Sub

Esta es otra macro más simple que la anterior:

'MACRO DEMO PARA CERRAR LIBRO EN DETERMINADA FECHA


Sub Auto_Open()
Dim FechaFin As Date
FechaFin = #2/27/2007# 'm-dd-aaa
MsgBox "Esta es una versión DEMO que expirará el " & FechaFin
If Date > FechaFin Then
MsgBox "Demo expirada, contacte con TodoEXCEL"
ThisWorkbook.Close SaveChanges:=True
End If
End Sub

4.8. Eventos

En este ejemplo vemos un ejemplo sobre cómo llamar macros cuando cambia algún valor de una
columna determinada.
'Esta declaracion de variables va al inicio de la hoja o modulo porq luego las uso en cada caso
Dim LCR As Long, LCC As Long

'Esta macro se ejecuta cuando cambia algo en la hoja


Private Sub Worksheet_Change(ByVal Target As Range)
LCR = Target.Row 'Definmos variable LCR (por Last Changed Row)
LCC = Target.Column 'Definimos variable LCC (por Last Changed Column)
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
If LCR > 10 Then 'Solo ejecutamos la macro cuando estamos en fila 11 o mayor.
210
www.todoexcel.com

Select Case LCC


Case Is = 2: Call Fecha 'Si cambia columna 2 se ejecuta macro "Fecha"
Case Is = 3: Call Concepto 'Si cambia columna 3 se ejecuta macro "Concepto"
Case Is = 4: Call Grupo
Case Is = 5: Call Tipo
Case Is = 7: Call Importe
Case Is = 8: Call Cuenta
Case Is = 9: Call GrupoCta
End Select
End If
Application.EnableEvents = True
End Sub

Otras macros relacionadas:

'MACRO Q SE DISPARA CUANDO CAMBIA UNA CELDA NOMBRADA


'La macro se dispara cuando cambia la celda nombrada como "AhorroCliente"
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Isect As Range
Set Isect = Application.Intersect(Target, Range("AhorroCliente"))
If Not Isect Is Nothing Then MsgBox "Hola"
End Sub

'MACRO Q CIERRA EL LIBRO PASADA UNA FECHA (ponerla es this workbook)


Private Sub Workbook_Open()
Dim FechaFin As Date
Dim FechaHoy As Date
FechaFin = DateSerial(6, 8, 3)
FechaHoy = Date
If FechaHoy >= FechaFin Then
MsgBox "Ha caducado la demo y el libro se cerrará, contacte con TodoEXCEL"
ThisWorkbook.Close
End If
End Sub

'MAcro q se dipara cuando se selecciona una celda determinada (en este caso la de fila 1, columna 1)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row = 1 And Target.Column = 1 Then MsgBox "QQQ"
End Sub

'Macro para determinar ultima celda modificada


Private Sub Worksheet_Change(ByVal Target As Excel.Range)
'En este caso, si el color de la ultima celda modificada es 35 o 6 entonces
'genera una variable celda q corresponde a la última modificada
If Target.Interior.ColorIndex = 35 Or _
Target.Interior.ColorIndex = 6 Then
Set Celda = Target
End If
End Sub

211
www.todoexcel.com

4.9. ExcelVersions

Para saber con que versión de Excel nos encontramos utilizamos la instrucción Application.Version

Sub ExcelVersionControl()
''CONTROLA LA VERSION DE EXCEL
Dim xlVer As Variant
xlVer = Val(Application.Version)
MSgbox XlVer
If xlVer < 10 Then MsgBox "Version no soportada" 'Para avisar que no funciona para Excel inferior a
2.002
End Sub

La macro devuelve:
08 Para Excel 97
09 Para Excel 2.000
10 para Excel 2.002
11 para Excel 2.003
12 Para Excel 2.007

4.10. LayOut

Con estas macros jugaremos a ocultar y mostrar barras de herramientas o desactivar menús.
Recordar que podemos cambiar las propiedades "True" por "False" y viceversa para lograr el efecto
contrario.

Option Explicit

Sub OcultaMenus()
'Ocultar menus
Application.CommandBars("Worksheet Menu Bar").Enabled = False
'Ocultar barras de herramientas
Application.DisplayFullScreen = True
End Sub

Sub HideToolBars() 'Ocultar barras


Dim CurrTB As Toolbar, Counter As Integer
With Worksheets("List")
For Each CurrTB In Application.Toolbars
If CurrTB.Visible = True Then
Counter = Counter + 1
.Cells(Counter, 1).value = CurrTB.Name
.Cells(Counter, 2).value = CurrTB.Top
.Cells(Counter, 3).value = CurrTB.Left
End If
Next
For Each CurrTB In Application.Toolbars
If CurrTB.Visible = True Then CurrTB.Visible = False
Next
If Counter > 0 Then
212
www.todoexcel.com

.Range("A1").CurrentRegion.Sort Key1:=.Range("B1"), Order1:=xlAscending,


Key2:=.Range("C1"), Order2:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom
End If
End With
End Sub

Sub RestoreToolBars() 'Reestableces barras


Dim TBRg As Range, CurrTBCell As Range
Set TBRg = Worksheets("List").Cells(1, 1).CurrentRegion.Columns(1)
If Not IsEmpty(TBRg) Then
For Each CurrTBCell In TBRg.Cells
With Toolbars(CurrTBCell.value)
.Visible = True
.Top = CurrTBCell.Offset(0, 1).value
.Left = CurrTBCell.Offset(0, 2).value
End With
Next
End If
End Sub

Sub CmdBarsOff()
Dim ctl As CommandBarControl

For Each ctl In Application.CommandBars("Worksheet Menu Bar").Controls


'Debug.Print ctl.Caption
If ctl.BuiltIn = True Then
ctl.Enabled = False
End If
Next ctl

'Desactiva menu boton derecho en menus


CommandBars("Toolbar List").Enabled = False
'No ver el menu de clic derecho en celda
Application.CommandBars("Cell").Enabled = False

With CommandBars("Worksheet Menu Bar")


.Enabled = True
With .Controls(1)
.Enabled = True
.Visible = True
End With
End With
End Sub

Sub CmdBarsOn()
Application.CommandBars("Worksheet Menu Bar").Reset
'Activa menu boton derecho en menus
CommandBars("Toolbar List").Enabled = True
'Para volver a ver el menu de clic derecho en celda
Application.CommandBars("Cell").Enabled = True
End Sub

213
www.todoexcel.com

4.11. Filtros

Algunos códigos interesantes relacionados con filtros.

Option Explicit

'Extraer unicos con filtro avanzado


Sheets("aaa").Select
Range("E6:E18").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("AC7"), Unique:=True
El rango q filtro debe contener el encabezado, el copytorange no.
*** Esta macro conviene ponerla en 1 módulo (si la pongo en hojas da muchos problemas)

'Poner autofiltro
Range("B6:M6").AutoFilter

'DETERMINAR SI ESTA PUESTO EL AUTOFILTRO


If ActiveSheet.AutoFilterMode = True Then

'FILTRAR CON CONDICION


Range("A1").AutoFilter Field:=8, Criteria1:="<=" & Range("M5").value, Operator:=xlAnd
* En A1 está en encabezado de columna. Luego filtro por <= a valor de M5

'QUITAR FILTROS
If Range("InHuurData").AutoFilter = xlOn Then
Range("InHuurData").AutoFilter
End If

'PINTAR CELDA CON FILTRO


'Requiere q en alguna celda este la formula =hoy()
'dado q al filtrar se recalcula y dispara el evento calculate

Private Sub Worksheet_Calculate()


Dim af As AutoFilter
Dim fFilter As Filter
Dim iFilterCount As Integer

If ActiveSheet.AutoFilterMode Then
Set af = ActiveSheet.AutoFilter
iFilterCount = 1
For Each fFilter In af.Filters
If fFilter.On Then
af.Range.Cells(1, iFilterCount) _
.Interior.ColorIndex = 6
Else
af.Range.Cells(1, iFilterCount) _
.Interior.ColorIndex = 40
End If
iFilterCount = iFilterCount + 1
Next fFilter
Else
Rows(1).EntireRow.Interior.ColorIndex = xlNone
End If
End Sub

'FILTROS AVANZADOS

214
www.todoexcel.com

'el 1º rango indica la tabla


'el 2º rango indica los criterios
'el 3º rango indica la tabla con los encabezados q quiero de resultados

Range("E7:CL23").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Sheets("Filtros").Range("D3:G10"), _
CopyToRange:=Range("G26:O26"), Unique:=False

'Función Mostrar criterios filtrados


Function FilterCriteria(Rng As Range) As String
By Stephen Bullen
Dim Filter As String
Filter = ""
On Error GoTo Finish
With Rng.Parent.AutoFilter
If Intersect(Rng, .Range) Is Nothing Then GoTo Finish
With .Filters(Rng.Column - .Range.Column + 1)
If Not .On Then GoTo Finish
Filter = .Criteria1
Select Case .Operator
Case xlAnd
Filter = Filter & " AND " & .Criteria2
Case xlOr
Filter = Filter & " OR " & .Criteria2
End Select
End With
End With
Finish:
FilterCriteria = Filter
End Function

'Luego usar esto para q actualice al autofiltrar:


=FilterCriteria(B5)&left(Subtotal(9,B5:B200),0)

4.12. FTP
Algunos códigos de interés relacionados con FTP desde Excel.

'GUARDAR LIBRO ACTIVO EN FTP (requiere ftp configurado en SaveAs, si no pedirá user y pass)
ActiveWorkbook.SaveAs Filename:= _
"ftp://ftp.MiWeb.com/public_html/prueba/Libro123.xls", FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False

'ABRIR LIBRO DESDE FTP (requiere ftp configurado en SaveAs, si no pedirá user y pass)
Workbooks.Open Filename:= _
"ftp://ftp.MiWeb.com/public_html/prueba/Libro88.xls"
Range("D11").Select

'ABRIR LIBRO DESDE FTP (***No requiere ftp configurado en SaveAs, lo configuramos desde vba)
Sub Abrir()
Workbooks.Open Filename:= _
"ftp://miusarioaqui:miclaveaqui@ftp.miweb.com/public_html/prueba/Libro88.xls"
End Sub

215
www.todoexcel.com

4.13. Funciones

Aplicando funciones desde VBA

'Ejemplo de SUMA
If Application.Sum(Range("D7:D65536")) = 0 Then MsgBox "nada"

'Ejemplo de SUMARSI
myVal = Application.SumIf(Range("A1:A10"), "a", Range("b1:b10"))

'Ejemplo de CONTARSI
n = Application.CountIf(Range("K:K"), "Check Record")

'Ejemplo de LARGO
Dim L As Long
L = Len(Sheets("Menu").Range("B1"))

4.14. Guardar

Para forzar el directorio de guardado

'Forzar directorio de guardado igual al del archivo


Dim MyDirectory As String
MyDirectory = ActiveWorkbook.Path
ChDir MyDirectory

4.15. Hojas

Macros relacionadas con Hojas

'Función definida por el usuario para determinar si existe la hoja


Function SheetExists(SheetName As String) As Boolean
On Error Resume Next
SheetExists = CBool(Len(ThisWorkbook.Worksheets(SheetName).Name))
End Function

'Luego podemos usar nuestra función desde nuestras macros así


If SheetExists("Sheet1") = True Then
' hago esto
Else
' hago lo otro
End If

216
www.todoexcel.com

4.16. Imágenes

Veamos algunas operaciones que podemos realizar con imágenes.

'INSERTAR UNA IMAGEN


Public Sub InsertaLogo()

Dim vFullName As Variant


vFullName = Application.GetOpenFilename("Image Files,*.jpg;*.gif")
If vFullName <> False Then
Hoja6.Pictures.Insert CStr(vFullName)
End If

End Sub

'BORRAR IMAGEN DE UN RANGO


Sub BorrarImagen()
Dim Rng As Range
Dim SH As Shape
Dim TLC As Range
Set Rng = Range("F4:AJ23")
For Each SH In ActiveSheet.Shapes
If Not Application.Intersect(Rng, SH.TopLeftCell) Is Nothing Then
SH.Delete
End If
Next SH
End Sub

'OCULTAR IMAGEN
'Boton para q si esta oculta la muestre y si esta visible la oculte
Private Sub ToggleButton1_Click()
Worksheets("Sheet1").Shapes("Rectangle 3").Visible = Not (Shapes("Rectangle3").Visible)
End Sub

4.17. Imprimir
Algunas macros relacionadas con impresión:

'Esta macro establece el rango de impresión a la ultima fila ocupada


Private Sub PrintArea()
Dim LngLastRow As Long

LngLastRow = ActiveSheet.Range("G65536").End(xlUp).Row
ActiveSheet.Range("A1:G" & LngLastRow).Select

With ActiveSheet.PageSetup
.PrintArea = ("A1:G" & LngLastRow)
.FitToPagesWide = 1
.FitToPagesTall = False

End With
End Sub

217
www.todoexcel.com

4.18. Msgbox

Macros relacionadas con mensajes

'Msgbox con varias líneas


MsgBox " Equipment No. " & EquipNum & Chr(13) _
& " Description - " & Description & Chr(13) _
& " Internal Due - " & Format(partDate,"mmm-dd"

'INPUT BOX es un tipo especial de Msgbox que solicita al usuario una entrada de un valor o texto
Sub Entrada()
Dim V As String
V = Application.InputBox("Introduzca la clave del administrador")
End Sub

'INPUT BOX (solo número entero)


Sub EntradaNumerica()
Dim V As String
V = Application.InputBox("Introduzca número entero", , , , , , , 1)
'el 1 es para forzar número entero

'COMILLAS DENTRO DE UN MSGBOX


MsgBox "Esto no está dentro de comillas " & Chr(34) & "Y esto si!" & Chr(34)

4.19. Ordenar

Macros utilizadas para ordenar

'Con esto ordeno una columna ascendentemente

Range("A38:G65536").Sort Key1:=Range("F39"), Order1:=xlDescending, Header:=xlYes, _


OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

'En A38:G38 esta el encabezado. El Key1 es F39 (una fila mas abajo, osea el primer registro)

4.20. Proteger

Macros para proteger

'FORMATO DE CELDA PROTEGIDA


Selection.Locked = True
Selection.FormulaHidden = False

'PROTEGER Y PERMITIR FILTROS


ActiveSheet.Protect AllowFiltering:=True
218
www.todoexcel.com

PROTEGER/DESPROTEGER CON CLAVE


ActiveSheet.Protect Password:="anystring", AllowFiltering:=True, AllowSorting:=True,
userinterfaceonly:=True
ActiveSheet.Unprotect Password:="anystring", AllowSorting:=True

'Cuando protejo agregando "userinterfaceonly:=True" no es necesario desproteger para que funcione


la macro !

'PROTEGER CON UNA CLAVE VARIABLE


'1º DEFINO LA FUNCION
Function pswd() As String
pswd = "iñakiphone" 'si cambio este texto cambio todas las pass de una
End Function
'LUEGO PROTEJO USANDO
ActiveSheet.Protect Password:=pswd

'DESPROTEGER OPTION BUTTON EN HOJA PROTEGIDA


ActiveSheet.Shapes("Option Button 10").OLEFormat.Object.value = xlOff
'También tengo q desproteger la celda vinculada !

4.21. Rangos

Macros relacionadas con rangos

'UN RANGO VARIABLE


Range(Cells(LR, 1), Cells(LR, 11))

'NOMBRAR RANGOS
Dim LR As Long
LR = 100
ActiveWorkbook.Names.Add Name:="LasRow", RefersToR1C1:=LR

ActiveWorkbook.Names.Add Name:="Max", RefersToR1C1:="=100"

'INOVILIZAR PANELES
ActiveWindow.FreezePanes = False
Range("B105").Select
ActiveWindow.FreezePanes = True

'REDIMENSIONAR UN RANGO
Selecciona una tabla menos la 1º fila de encabezado
Range("PerPrimero").CurrentRegion.Offset(1, 0).Select

'PINTAR RANGOS
Si es Ingreso pinto verde
If Cells(LCR, 2).value = "Ingreso" Then
Range(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 10
End If
Si es Gasto pinto Rojo
If Cells(LCR, 2).value = "Gasto" Then
Range(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 3
219
www.todoexcel.com

End If
Si es vacío (cuando borra) pinto negro
If Cells(LCR, 2).value = "" Then
Range(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 1
End If

4.22. Resolución de Pantalla

Cómo obtener la resolución de pantalla

'OBTENER LA RESOLUCION DE PANTALLA


Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Private Const SM_CXSCREEN = 0
Private Const SM_CYSCREEN = 1
Public Function GSR() As String
GSR = CStr(GetSystemMetrics(SM_CXSCREEN)) & "x" & CStr(GetSystemMetrics(SM_CYSCREEN))
End Function

Sub Reso()
Range("G3") = CStr(GetSystemMetrics(SM_CXSCREEN))
Range("G4") = CStr(GetSystemMetrics(SM_CYSCREEN))
End Sub

4.23. Selección

Macros de selección

'Selecciona todo un rango activo menos la primera fila


Sub Rango()
Dim Rg As Range
Set Rg = Range("FiltrosConIni").CurrentRegion
Rg.Offset(1).Resize(Rg.Rows.Count - 1).Select
End Sub

4.24. Tablas

Cómo determinar la última fila de una tabla

'Determinar última fila de una tabla


UsedRange.Rows.Count

4.25. Tablas Dinámicas

Algunas macros de interés relacionadas con tablas dinámicas (TD).

220
www.todoexcel.com

'La siguiente macro actualiza una TD automáticamente al entrar a la hoja


'Esta macro debe estar colocada en la misma hoja que contiene la TD
Private Sub Worksheet_Activate()
ActiveSheet.PivotTables(1).PivotCache.Refresh
End Sub

4.26. Varios

Otras macros de interés

' ULTIMA FILA VACIA


LR = Range("a65536").End(xlUp).Row + 1

' COPIAR VALORES


Range("CuentasIngreso").Copy
Range(Cells(LR, 1), Cells(LR, 11)).PasteSpecial xlPasteValues

'SCROLLING
ActiveWindow.ScrollRow = 1
ActiveWindow.ScrollColumn = 1

'BORRAR FILAS (hay q borrar desde abajo para arriba)


Sub Borrar()
Dim R As Long
For R = 210 To 1 Step -1
If Cells(R, 3).value = "" Then Cells(R, 3).EntireRow.Delete
Next R
End Sub

'SCROLL AREA
ActiveSheet.ScrollArea = "A1:S50"

'CAMBIAR DIRECCCION DE MOVIMIENTO DEL CURSOR


Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.MoveAfterReturnDirection = xlDown
End Sub

Private Sub Workbook_Deactivate()


Application.MoveAfterReturnDirection = xlDown
End Sub

Private Sub Workbook_Open()


Application.MoveAfterReturnDirection = xlToRight
End Sub

Private Sub Workbook_Activate()


Application.MoveAfterReturnDirection = xlToRight
End Sub

'OCULTAR BARRA FORMATO, ESTANDAR y FORMULA BAR


Application.CommandBars("Formatting").Visible = False
221
www.todoexcel.com

Application.CommandBars("Standard").Visible = False
Application.DisplayFormulaBar = False

'Pone un tilde en la celda (ideal para usar en lugar de checkboxes)


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then
Target.Font.Name = "Marlett"
If Target = vbNullString Then
Target = "a"
Else
Target = vbNullString
End If
End If
End Sub

222
www.todoexcel.com

5. EXTRAS

Hemos preparado una buena cosecha de recursos más que interesantes para tus macros.

Puedes descargar todos estos desde el siguiente enlace:


http://www.todoexcel.com/descargas/EXTRAS.zip

AndrewsUtils: nuevas funcionalidades y opciones para tu Excel (200)

Nuevas funcionalidades y opciones para tu Excel 2 (71)

PivotPower: opciones adicionales para las tablas dinámicas (40)

Glosario: 800 funciones y comandos VBA en 12 idiomas (30)

Estructuras: ejemplos y explicaciones de estructuras VBA (9)

Arrays: ejemplos de armado y uso de Arrays (8)

Progress Bars: barras de progreso para macros (8)

xlActivexl: administra tus controles ActiveX (8)

Comandos: crear nuevos menús y barras de herramientas (7)

MenuMaker: crea nuevos menús de opciones fácilmente (1)

ListFiles: listar los archivos de un directorio (1)

Envío automático de emails desde Excel (1)

Gauges: indicadores tipo velocímetro (1)

TranslateIt: traductor automático de funciones (1)

Lista VBA: 1.921 términos VBA en español e inglés ! (1)

Variant: 1.000.000 de cálculos en 5 segundos ! (1)

Turbofiltro:- nuevas opciones para filtrar listas (1)

Pausar Macros: (1)


223
www.todoexcel.com

Menú Generator: crear nuevos menús fácilmente (1)

Blink: hacer titilar celdas con distintos colores (1)

CellSpotter: indicador automático de fila y columna actual (1)

ListBoxSort: agrega elementos únicos y ordenados a un Listbox (1)

FaceIds: iconos para usar en las barras y menús (1)

EnableMacros: obligar la habilitación de Macros (1)

FindLinks: encuentra, administra y destruye vínculos externos

DatosUF: ejemplo paso paso de un formulario / userform (1)

SamRadDatePicker: calendario despleglabe en celdas ! (1)

Puedes descargar todos estos desde el siguiente enlace:


http://www.todoexcel.com/descargas/EXTRAS.zip

224
www.todoexcel.com

6. TodoEXCEL

VISITA NUESTRA WEB !


Visita nuestra web! Ofrecemos toda la gama de productos y servicios para hojas de cálculo Microsoft Excel.

VIDEO CLASES EXCEL


Aprenda rápidamente con nuestras originales video clases.

CURSOS EXCEL
Capacítese con los mejores cursos Excel, preparados por nuestros expertos.

PRODUCTOS EXCEL
Complementos, plantillas y programas Excel de utilidad para usuarios.

DESARROLLOS EXCEL
Soluciones a medida para empresas y profesionales con macros vba Excel.

COMUNIDAD EXCEL
El lugar de encuentro de usuarios y expertos en hojas Excel.

www.todoexcel.com

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

225

También podría gustarte