159

Click here to load reader

Manual de Excel VBA

Embed Size (px)

DESCRIPTION

Manual de Excel VBA

Citation preview

Page 1: Manual de Excel VBA

Navigation: »No topics above this level«

Inicio

Bienvenido a nuestro Curso de Macros VBA Exce

Presentación:unas palabras iniciales del autor.

Teoría: introducción teórica a programación deUtilidad y aplicación, conceptos y términos principales técnicas.

Macros: diversas macros para manipulación de loExcel (libros, hojas, rangos, celdas, gráficos, tablas,

Librería: nuestras macros favoritas, las más Actualización semanal.

Extras: complementos y códigos vba de intedescargar.

TodoEXCEL

Preguntas frecuentes, sugerencias, consultas.Contáctanos aquí

Copyright

Todos los nombres propios de programas, sistemas operativos, equipos de hardware, etc. que aparecen en este curso son marcas regisrespectivas 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 decorrespondientes indemnizaciones por daños y perjuicios, para quienes reprodujeren, plagiaren, distribuyeren o comunicasen públicameparte, 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 otravé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.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

1

Navigation: Inicio >

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ísimacalidad.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 cursoEste curso se compone de 4 partes:

TEORIA: si eres principiante debes comenzar por aquí. En esta sección te explicaremos lo básico y elementalpara poder comenzar a entender el mundo de las macros. La sección está debidamente ilustrada con fotos atodo 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 seexplican las principales macros o rutinas que debes conocer. Hemos hecho un "barrido" por todos los temas onecesidades 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 unaforma de ir guardando todas aquellas macros de interés que vas creando en tus desarrollos. Muchas de ellaslas necesitarás nuevamente así que para no tener que empezar de cero, lo ideal es ir guardándolas en unalibrería de fácil acceso. Nuestra librería pretende ir creciendo día a día, tanto con nuestros propios aportescomo con los tuyos !

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

Otras secciones del curso, no menos importantes, son:

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

2

Page 2: Manual de Excel VBA

dejamos de sorprendernos con las maravillas que permite hacer.

Nuestra experiencia proviene de haber trabajado de forma intensiva con Excel, construyendo todo tipo demodelos, 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, macrosvba, 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.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

3

Navigation: »No topics above this level«

TeoriaEn la primera parte de este curso veremos la teoría respecto a la programación de macros. Dominar la teoría essumamente 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.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

4

Page 3: Manual de Excel VBA

Navigation: Teoria >

IntroducciónBienvenido al Curso de Macros de TodoEXCEL. Estás por comenzar una de las experiencias más fascinantes yatractivas de la Hoja de Cálculos Excel.

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

5

Navigation: Teoria > Introducción >

Excel y macrosLa Hoja de Cálculos Excel es una de las herramientas más poderosas para el tratamiento de datos y suanálisis. Una de las mayores ventajas que posee es la flexibilidad que ofrece y la rapidez con la que podemosconstruir 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 susmayores 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ápidamenteen todo un experto. Y si eres un usuario avanzado de Excel y ya tienes conocimientos previos de macros, estecurso te servirá para refrescar algunos conceptos pero también te sorprenderás con nuevos códigos ysecciones especiales que hemos preparado para ti.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

6

Page 4: Manual de Excel VBA

Navigation: Teoria > Introducción >

Una definición simpleUna 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 tareadeterminada como así también expandir e incrementar las prestaciones de Excel. Las macros se escriben enlenguaje de programación VBA (Visual Basic for Applications). El Excel ya trae incorporado un editor de VBApor 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 debespreocuparte. Hace unos años nosotros mismos no teníamos la más mínima idea de programación Excel. Perola 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!

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

7

Navigation: Teoria > Introducción >

Utilidad de una macroAnteriormente definimos a las macros como algo que nos permite expandir e incrementar las prestaciones de lahoja 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:

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

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

3. Creación de nuevos comandos, complementos y menúsExcel trae una gran cantidad de comandos y menús predefinidos que nos asisten para las operaciones máshabituales. Las macros nos permiten crear nuestros propios comandos y menús personalizados, e incorporarlosal Excel. La utilidad de los mismos depende tan solo de nuestras necesidades. Los complementos Exceltambién están creados con macros. Si ves en el menú Herramientas > Complementos verás una lista de losque 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 medidaExcel es utilizado en diversos campos y por una gran cantidad de usuarios. Las macros te permitirán construircomplejas y elegantes aplicaciones para cualquier uso que quieras darles. El límite solo es tu imaginación. Unaaplicación Excel consiste en algo más que una simple plantilla con datos y fórmulas. Una aplicación Excel es unverdadero programa de software con una serie de características que lo hacen utilizable por cualquier usuariosin que el mismo tenga que entender la lógica "exceliana" que hay por detrás.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

8

Page 5: Manual de Excel VBA

Navigation: Teoria > Introducción >

Objetos, propiedades y métodosCuando hablamos de macros hablamos de Objetos, Propiedades y Métodos (OPM). Estos son los 3 conceptosgenerales más importantes que debes conocer a la hora de programar las macros. De momentos solo tedaremos 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,…).

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, unahoja, un rango, una celda, un menú, un gráfico, una tabla dinámica, un cuadro de diálogo, las etiquetas dehojas, las columnas, las filas, etc. En fin, cada partecita de Excel es un objeto. Un objeto es algo que puedesver 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 conuna fórmula, etc. Por ejemplo para el objeto "hoja" algunas de sus propiedades serían: visible u oculta, con o sinlí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. Porejemplo sobre el objeto "hoja" podemos: activar, mover, copiar o borrar.De momento estas definiciones son suficientes para empezar a entender algunos conceptos. Recuérdalas bienporque las usaremos en todo el curso. En la medida que adquieras mayores conocimientos sobre comoprogramar macros iras manejando y conociendo cada vez más objetos, con sus propiedades y sus métodos. Endefinitiva, de eso se trata programar una macro: conocer el nombre del objeto, conocer el nombre de algunapropiedad del mismo que quieras modificar y también conocer el nombre de algún método que desees aplicarle.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

9

Navigation: Teoria > Introducción >

Lenguaje VBARecuerda 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 propiosobjetos. Esto se relaciona con lo que te comentábamos en la sección anterior sobre Objetos, Propiedades yMétodos.

Macros = VBA = OPMEl lenguaje VBA es muy fácil de entender y siempre gira en torno a seleccionar los objetos, cambiar suspropiedades y/o ejecutarles distintos métodos. La única particularidad es que el lenguaje VBA solo está eninglés. Sin embargo, y para que no te desalientes, conocemos muchísimos programadores de macros queprá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, elidioma utilizado por las macros:

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

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

Ejemplos de Métodos VBA(entre paréntesis su significado en español)Copy (copiar)Protect (proteger)Delete (borrar)

En la medida que avances con la lectura de este curso te irás familizarizando con la denominación de losdistintos objetos, propiedades y métodos. El lenguaje VBA tiene miles de OPM, y existe una forma muy prácticade 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 querequieren un conocimiento muy avanzado. Pero es un lenguaje fácil y muy intuitivo. Además Excel posee unagrabadora de macros que las escribe de forma automática. Luego nosotros podemos retocarlas a gusto. Te

10

Page 6: Manual de Excel VBA

aseguramos que en cuanto termines este curso estarás escribiendo tus propias macros y te sorprenderás lofácil que es seguir aprendiendo y profundizando tus conocimientos. Nosotros te daremos las herramientas paraque lo consigas!

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

11

Navigation: Teoria >

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

12

Page 7: Manual de Excel VBA

Navigation: Teoria > Cómo comenzar >

Barra de herramientasLa barra de herramientas de macros es considerablemente diferente entre Excel 2.003 e inferior y Excel 2.007.

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

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

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

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

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

13

Si no tienes visible la ficha Programador, puedes activarla de la siguiente forma1. 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 Excel3. En la lista de opciones Mas Frecuentes, selecciona la casilla de Mostrar ficha programador en la cinta de opcione

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

14

Page 8: Manual de Excel VBA

Navigation: Teoria > Cómo comenzar >

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

Excel 2.003 o inferior1. Desde el menú Herramientas > Macros > Editor de Visual Basic2. 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.0071. Desde la ficha Programador > botón Visual Basic2. 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 siestrictamente similar, eso dependerá de las ventanas que tengas visibles y ocultas). Puedes mostrar u ocultar estadesde el menú Ver.

15

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. Uverás nombres del tipo "VBAProject" y entre paréntesis el nombre del archivo o complemento excel. Veamos VBAProject (Libro1). Simplemente significa que tienes abierto un libro Excel llamado Libro 1. Luego cuelgan 3 carHoja1 (Hoja1), ThisWorkbook y Modulo (no importa si ves todos estos elementos ahora, luego te enseñareactivarlos). Estas carpetas es donde habitan las macros. Haciendo doble clic en ellas activarás la ventana donde slas macros.

16

Page 9: Manual de Excel VBA

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

Como verás el Editor de VB tiene muchas ventanas. Pero de momento solo nos interesan las dos ventanas que teanteriormente: la Ventana Proyecto – VBA Project y la Ventana de Código donde se escribe el código de las 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 altemantener presionada la tecla ALT y presionar F11 repetidas veces, verás como pasas de Excel al editor y viceversa

17

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

18

Page 10: Manual de Excel VBA

Navigation: Teoria >

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

1. Escribirla manualmente2. Utilizar la grabadora de macros3. 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 escribirmanualmente porque tienen pocas líneas y ya las conoces. En otros casos la podrás crear con la grabadora demacros y olvidarte del código VBA. Sin embargo, en la medida que progreses con las macros verás que elmétodo más utilizado suele ser el número 3 mediante el cual primero grabarás y luego harás ajustes manualesen 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)

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

19

Navigation: Teoria > Escribir una macro >

Mi primera macroVamos a escribir manualmente nuestra primera macro ahora!. Es una macro muy sencilla, pero te servirá paraorientarte 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 queaparece el valor 1.500 en la celda A1. El valor lo pondrá automáticamente la macro cuando nosotros se loindiquemos.Suena demasiado simple, cierto? Sin embargo es suficiente como para comenzar y que aprendasgeneralidades que luego aplicarás en todas tus macros. Como es una macro sencilla vamos a escribirlamanualmente para que comiences a empaparte del editor de macros y sus partes.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

20

Page 11: Manual de Excel VBA

Navigation: Teoria > Escribir una macro >

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

1. Prepara el Editor de Visual Basic1.1 Crea un nuevo libro Excel y guárdalo con el nombre Libro 1.1.2 Abre el editor de Visual Basic con las teclas ALT+F11.1.3 Doble clic en VBAProject (Libro1) para ver las carpetas.1.4 Doble clic en Hoja1 (Hoja1) para empezar a escribir el código de la macro.

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

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

Range("A1").Value=1500End 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 enazul. Estos colores los asigna automáticamente el editor y te lo explicaremos más adelante. Así es como debequedar todo:

21

*Nota: si la ventana de tu editor tiene una instrucción "Option Explicit" escrita en la parte superior, no le presetesatenció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 yatienes la macro escrita pasemos a la siguiente sección para ver como ejecutarla.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

22

Page 12: Manual de Excel VBA

Navigation: Teoria > Escribir una macro >

Ejecutar la macroSi utilizas Excel 2.003 o inferior continúa aquí...Si utilizas Excel 2.007 continúa aquí...

Excel 2.003 o inferiorSi ya tienes escrita la macro en el editor, ahora podrás que ejecutarla, o sea hacer que funcione. Tienes 2 formaesto:

A. Ejecutar la macro desde el mismo EditorSi te posicionas en cualquiera de las líneas de código de la macro y luego presionas la tecla F5 la macro se ejecver el resultado puedes volver a la hoja excel con ALT+F11).

B. Ejecutar la macro desde ExcelOtra forma de ejecutar la macro es desde el mismo Excel. Puedes hacerlo desde el menú Herramientas > Macros >

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

23

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

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

A. Ejecutar la macro desde el mismo EditorSi te posicionas en cualquiera de las líneas de código de la macro y luego presionas la tecla F5 la macro se ejecver el resultado puedes volver a la hoja excel con ALT+F11).

B. Ejecutar la macro desde ExcelOtra 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.

24

Page 13: Manual de Excel VBA

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

25

Navigation: Teoria > Escribir una macro >

Comprender la macroRecuerda que el propósito de nuestra primera macro fue escribir el valor 1500 en la celda A1 de Excel. Lamacro ya fue escrita y ejecutada en los pasos anteriores. Ahora vamos a analizar cada una de las líneas de sucó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 escribirmacros de cientos o quizás miles de líneas de código!). Veamos que significa cada línea. Las explicaciones quevienen 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 C10Sub MiPrimeraMacro()Range("A1").Value = 1500End Sub

- La primera línea de una macro suele ser un comentario que hacemos sobre la misma, donde podemos ponerlo 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 propiareferencia.- Un comentario siempre comienza por un signo '. Si tipeamos dicho signo seguido de un texto y luego damos alEnter, 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 conel signo '. Si has puesto bien dicho signo al comienzo de la línea, el editor detecta automáticamente que es uncomentario 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 C10Sub MiPrimeraMacro()Range("A1").Value = 1500

26

Page 14: Manual de Excel VBA

End Sub

- Aquí es donde comienza realmente la macro.- Toda macro siempre comienza con la palabra Sub, luego un espacio, luego un nombre (sin espaciosintermedios) 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á lapalabra 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 nombreque 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 C10Sub MiPrimeraMacro()Range("A1").Value = 1500End Sub

- Esta es la instrucción principal de nuestra macro (el corazón de la macro). Con este código logramos nuestroobjetivo (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 siempreconsiste en lo mismo: primero hacer referencia al objeto y luego asignarle una propiedad o método. En nuestroejemplo:Range("A1").Value = 1500

Range("A1"). es el objetoValue 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 C10Sub MiPrimeraMacro()Range("A1").Value = 1500End 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 deforma automática.

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

27

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

28

Page 15: Manual de Excel VBA

Navigation: Teoria > Escribir una macro >

ResumenNuestro objetivo fue crear una macro que escribiera el valor 1500 en la celda A1 de la Hoja1 de Excel. Como erasencilla 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+F113. 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 A1Sub MiPrimeraMacro()Range("A1").Value = 1500End 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 presionamos Ejecutar.

29

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

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

30

Page 16: Manual de Excel VBA

Navigation: Teoria > Escribir una macro >

OPM de la macroRecordemos nuevamente el código de nuestra primera macro:

' Esta macro escribe el valor 1500 en la celda A1Sub MiPrimeraMacro()Range("A1").Value = 1500End 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 macro4ª línea: es el fin de la macro (siempre termina con End Sub)

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

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

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 sequiera 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 decódigo más importantes y donde debemos usar nuestros conocimientos de objetos, propiedades y métodos sonlas que se encuentran entre las instrucciones Sub y End Sub. Es allí donde realmente "se cocina" todo. Ese esel verdadero corazón de la macro.

Al comienzo del curso te mencionábamos que las macros consisten en operar sobre un Objeto, ya seaalterando 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étodosde 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

31

- 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étodoEs 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 excelsobre el que vamos a operar. En este caso usamos el objeto Range (Rango). El objeto Range es el que seutiliza para hacer referencia a una celda o rango Excel. Luego se escribe la referencia de la celda Excel (letrade columna y número de fila) entre comillas y paréntesis. Ya le hemos indicado a la macro que deberá ocuparsede 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 luegoasignarle una propiedad o método. En este caso usamos la propiedad Value (Valor) que nos permite asignar unvalor 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 quevayas avanzando con la lectura de este curso irás aprendiendo nuevos objetos, propiedades y métodos.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

32

Page 17: Manual de Excel VBA

Navigation: Teoria >

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

A. Escribirla manualmenteB. Utilizar la grabadora de macrosC. 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 escribirmanualmente porque tienen pocas líneas y ya las conoces. En otros casos la podrás crear con la grabadora demacros y olvidarte del código VBA. Sin embargo, en la medida que progreses con las macros verás que elmétodo más utilizado suele ser el número 3 mediante el cual primero grabarás y luego harás ajustes manualesen 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 lagrabadora de macros. Como te mencionábamos antes, la ventaja de la grabadora es que prácticamente norequiere conocimientos de programación y código VBA. Simplemente encendemos la grabadora, ejecutamoslas acciones y listo. La grabadora genera el código automáticamente !

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

33

Navigation: Teoria > Grabar una macro >

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

Objetivo de nuestra macroEscribir 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 queaparece el valor 1.500 en la celda A1. El valor lo pondrá automáticamente la macro cuando nosotros se loindiquemos.

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

34

Page 18: Manual de Excel VBA

Navigation: Teoria > Grabar una macro >

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

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

Si utilizas Excel 2.003 o inferior clic aquí...Si utilizas Excel 2.007 clic aquí

Excel 2.003 o inferior1. Vamos a grabar la macro1.1 Vé al menú Herramientas > Macros1.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 macro1.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.

35

2. Barra para frenar la grabaciónCuando comienza a grabar la macro activa una nueva barra de macros como la que se muestra en la foto. El botóde la izquierda te permitirá parar la 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. Hpara detener la grabación.

3. Veamos como quedó la macro grabada3.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 s

36

Page 19: Manual de Excel VBA

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

4. Vamos a probar la macro4.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 > Macros4.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.

Excel 2.0071. Vamos a grabar la macro1.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 macro1.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ónPara terminar de grabar, debemos presionar el botón de detener grabación

37

3. Veamos como quedó la macro grabada3.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 s

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

4. Vamos a probar la macro4.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+F84.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.

38

Page 20: Manual de Excel VBA

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

39

Navigation: Teoria > Grabar una macro >

ResumenNuestro objetivo fue grabar una macro que escribiera el valor 1500 en la celda A1 de la Hoja1 de Excel. Lospasos 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ó agrabar.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 listaMiPrimeraMacro 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 conla macro.

Recuerda: al utilizar la grabadora no accedemos en ningún momento al editor de macros ni tenemos queescribir código. Todo lo hace automáticamente la grabadora.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

40

Page 21: Manual de Excel VBA

Navigation: Teoria > Grabar una macro >

Escrita vs. grabadaLlegados a este punto, interesa ver las diferencias entre la macro escrita manualmente y la grabadaautomá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 manualmenteB. 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 alejecutarlas 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 nospermitirá revisar el proceso y obtener unas valiosas conclusiones. Las diferencias son analizadas acontinuación:

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

Excel 2.003

MACRO ESCRITA MACRO GRABADA

1. Como la hicimos

1.1 Creamos un Libro Excel llamado Libro1.1.2 Abrimos el editor de macros con ALT+F11.1.3 En VBAProject (Libro1) hicimos doble clic enHoja1 (Hoja1)1.4 Escribimos el código de la macro.

1. Como la hicimos

1.1 Utilizamos el mismo Libro1.xls1.2 Encendimos la grabadora de macros desde el menúHerramientas > Macro > Grabar nueva macro1.3 Nos posicionamos en la celda A1 de la Hoja1 yescribimos el valor 1500.1.4 Detuvimos la grabación de la macro desde el menúHerramientas > Macro > Detener grabación.

2. El código de la macroEl código que escribimos fue:

' Esta macro escribe el valor 1500 en lacelda A1Sub MiPrimeraMacro() Range("A1").Value=1500End Sub

2. El código de la macro

2.1 Con ALT+F11 accedemos al editor de macros.

2.2 El código que se grabó automáticamente fue elsiguiente:

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

Range("A1").Select

41

ActiveCell.FormulaR1C1 = "1500" Range("A2").SelectEnd Sub

Recuerda que este código quedó en VBAProject(Libro1) > Módulo1

3. Ejecución de la macroPosicionados sobre cualquier línea del códigoanterior presionamos F5. Luego con ALT+F11volvimos a la hoja de Excel y comprobamos queen la celda A1 de la Hoja1 se escribió el valor1500.

3. Ejecución de la macroPara comprobar que funciona, primero borramos el valor1500 de la celda A1, Hoja1 (lo habíamos escrito paragrabar la macro). Luego ejecutamos la macro desde elmenú Herramientas > Macro > Macros. Seleccionamosde la lista MiPrimeraMacro y luego Aceptar. De estaforma se volvió a escribir el valor 1500 en la celda A1 dela Hoja1.

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

Excel 2.007

MACRO ESCRITA MACRO GRABADA

1. Como la hicimos

1.1 Creamos un Libro Excel llamado Libro1.1.2 Abrimos el editor de macros con ALT+F11.1.3 En VBAProject (Libro1) hicimos doble clic enHoja1 (Hoja1)1.4 Escribimos el código de la macro.

1. Como la hicimos

1.1 Utilizamos el mismo Libro1.xls1.2 Encendimos la grabadora de macros desde la fichaProgramador > Grabar macro1.3 Nos posicionamos en la celda A1 de la Hoja1 yescribimos el valor 1500.1.4 Detuvimos la grabación desde la ficha Programador> Detener grabación

2. El código de la macroEl código que escribimos fue:

' Esta macro escribe el valor 1500 en lacelda A1Sub MiPrimeraMacro() Range("A1").Value=1500End Sub

2. El código de la macro

2.1 Con ALT+F11 accedemos al editor de macros.

2.2 El código que se grabó automáticamente fue elsiguiente:

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

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

42

Page 22: Manual de Excel VBA

Recuerda que este código quedó en VBAProject(Libro1) > Módulo1

3. Ejecución de la macroPosicionados sobre cualquier línea del códigoanterior presionamos F5. Luego con ALT+F11volvimos a la hoja de Excel y comprobamos queen la celda A1 de la Hoja1 se escribió el valor1500.

3. Ejecución de la macroPara comprobar que funcionamiento, primero borramosel valor 1500 de la celda A1, Hoja1 (lo habíamos escritopara grabar la macro). Luego ejecutamos la macrodesde la ficha Programador > Macros. Seleccionamosde la lista MiPrimeraMacro y luego Aceptar. De estaforma se volvió a escribir el valor 1500 en la celda A1 dela Hoja1.

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

43

Navigation: Teoria > Grabar una macro >

DiferenciasEn nuestro ejemplo, tanto la Macro Escrita como la Macro Grabada logran la misma función de escribir el valor1500 en la celda A1 de la Hoja1. Sin embargo, si te has fijado bien en los 3 puntos de la tabla de la secciónanterior verás que hay algunas diferencias. El análisis de las mismas nos permitirá ver las ventajas ydesventajas 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

Desventaja: escribir una macro manualmenteimplica conocer los objetos y propiedades deexcel. En este caso teníamos que saberpreviamente que existía un objeto Range y unapropiedad Value, y también debíamos sabercomo era la sintaxis de los mismos >Range("A1").Value=1500. Para un principianteesto puede ser difícil de saber.

1. Como la hicimos

Ventaja: no es necesario conocer código deprogramación. La grabadora lo escribeautomáticamente.

2. El código de la macro

Ventaja: nuestra macro escrita quedó con 1sola instrucción principal, la que indica poner elvalor 1500 en la celda A1.

' Esta macro escribe el valor 1500 en lacelda A1Sub MiPrimeraMacro() Range("A1").Value=1500End Sub

2. El código de la macro

Desventaja: generalmente, cuando utilizamos lagrabadora, el código que se escribe automáticamentesuele ser reduntante y excesivo. Recordemos el códigoque grabó la macro:

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

La macro grabó nuestras acciones pero utilizó 3 líneasde código (solo contamos las que están entre Sub yEnd Sub). Vemos que el código es más largo y queaparecen nuevos objetos, propiedades y métodos. Lamacro se interpreta así:

Primero seleccionar el rango A1. Luego en la celdaactiva introducir una fórmula con el valor 1500.Finalmente, como presionamos Enter, se posiciona enla celda siguiente, la A2.

El objetivo fue logrado, pero la macro generó máscódigo del necesario.

El método de la macro grabada parece el preferible, porque lo hace todo de forma automática y nos evita tenerque escribir un código que en esta etapa nos resulta desconocido. Sin embargo, en la seeción siguienteveremos que el método a utilizar dependerá de cada situación particular. Además, hay muchas cosas que la

44

Page 23: Manual de Excel VBA

grabadora de macros no puede hacer.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

45

Navigation: Teoria > Grabar una macro >

ConclusiónEn las 2 secciones anteriores vimos dos tablas comparativas de los 2 métodos que tenemos para crear unamacro:

1. El método de escribir manualmente la macro2. 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 lasdiferencias, con sus ventajas y desventajas.

A modo de conclusión podemos decir que la diferencia fundamental está en el código generado. Aunque lasmacros grabadas son más sencillas porque no requieren conocer el código necesario (objetos, propiedades ymé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 uncó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 lalarga 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 loque nos interesa son las líneas entre Sub y End Sub. Ambas macros logran su cometido de escribir el valor1500 en la celda A1. Sin embargo fíjate que en la macro escrita solo utilizamos una línea de código mientrasque 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=1500End Sub

Como conocíamos el objeto y la propiedad fuimos directamente al grano. Al objeto Rango A1 le aplicamos lapropiedad Valor 1500. Solo una línea de código. Rápido y certero.

Macro grabada

Sub MiPrimeraMacro()Range("A1").SelectActiveCell.FormulaR1C1 = "1500"Range("A2").SelectEnd Sub

La macro grabada grabó todas nuestras acciones en 3 líneas de código. Cuando seleccionamos el rango A1 segeneró 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,

46

Page 24: Manual de Excel VBA

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 niidea 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 ellenguaje VBA, con sus distintos objetos, propiedades y métodos ya te irás animando a escribir tus propiasmacros. 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 preparadoeste curso para hacerte la vida lo más fácil posible. La buena noticia es que este curso tiene una 2º parte conuna 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 unpar 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 yutilizar en tus desarrollos Excel.

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

47

Navigation: Teoria >

Ejemplos de macros¿Recuerdas el código que habíamos escrito para nuestra primera macro? El objetivo que perseguíamos eraescribir el valor 1500 en la celda A1 de la hoja1. Repasemos rápidamente todo lo que habíamos hecho paraescribir 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 A1Sub MiPrimeraMacro()Range("A1").Value = 1500End Sub

5. Finalmente ejecutamos la macro desde el menú de Excel Herramientas > Macros > Macro y luegoseleccionando 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 nuestrareferencia. 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 querramosponerle 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áscompleja. 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í:

48

Page 25: Manual de Excel VBA

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 quepreferimos 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 ylistas 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.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

49

Navigation: Teoria > Ejemplos de macros >

Macro 1Escribamos 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+F113. Inserta un nuevo Módulo desde el menú Insertar > Módulo4. Dentro del módulo escribe textualmente el siguiente código:

' Esta macro muestra un texto en una ventana emergenteSub 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 luegopresionando 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 leindiquemos. Más adelante verás como puedes mostrar en esa ventana información de celdas Excel u otrosresultados. 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 quepodrás necesitar, escritas, comentadas y listas para que las puedas copiar, pegar y adaptar en tus propiosdesarrollos.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

50

Page 26: Manual de Excel VBA

Navigation: Teoria > Ejemplos de macros >

Macro 2Escribamos 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+F113. Puedes utilizar el mismo Módulo de la macro anterior4. Dentro del módulo escribe textualmente el siguiente código

' Esta macro oculta las líneas de división de las celdasSub OcultarLineas()ActiveWindow.DisplayGridlines = FalseEnd Sub

5. Puedes ejecutar esta macro rápidamente posicionándote en cualquiera de sus líneas de código y luegopresionando 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 puedeshacer 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 quepodrás necesitar, escritas, comentadas y listas para que puedas copiar, pegar y adaptar en tus propiosdesarrollos.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

51

Navigation: Teoria > Ejemplos de macros >

Macro 3Escribamos 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+F113. 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 activaSub CopiaRango()Range("A1:A5").Copy Destination:=ActiveCellEnd Sub

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

5.1 Posiciónate en la celda C15.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 lamacro.

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)

52

Page 27: Manual de Excel VBA

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 quepodrás necesitar, escritas, comentadas y listas para que puedas copiar, pegar y adaptar en tus propiosdesarrollos.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

53

Navigation: Teoria >

El editor de macrosEs importante reconocer bien las principales opciones y secciones que tiene el editor de macros (tambiénconocido 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.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

54

Page 28: Manual de Excel VBA

Navigation: Teoria > El editor de macros >

Cómo accederEl Editor de Visual Basic es la aplicación que trae Excel desde donde se escriben y guardan las macros. Tienes 3acceder 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 BasicExcel 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)Código (abajo a la derecha)

55

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

56

Page 29: Manual de Excel VBA

Navigation: Teoria > El editor de macros >

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

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

ProyectosEn un primer nivel tenemos los proyectos. Por regla general, cada libro excel tiene asociado un proyecto. Porejemplo, 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 tulibro excel y lo de VBAProject podrás cambiarlo luego.

En resumen VBAProject(Libro1) es la carpeta principal, asociada a un libro Excel determinado, dondeinsertaremos todo lo referido a las macros para dicho libro.

CarpetasEn un segundo nivel tenemos 3 carpetas:- Microsoft Excel Objetos- Formularios- Módulos.

Veamos cada una de ellas:

1. Microsoft Excel ObjetosEn esta carpeta vemos que cuelgan dos elementos:

57

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 unamacro aquí la misma solo afectará a la hoja en cuestión.

2. FormulariosLos 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ódulosLos módulos sirven para escribir macros a nivel genérico, sin estar relacionadas a la hoja o libro en particular. Sino 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 tantosmódulos como necesitemos. En los módulos podemos escribir macros que operan de forma genérica, sindistinguir entre hojas o libros.

Haciendo doble clic izquierdo en cualquiera de estos objetos verás que se habilita la Ventana de Código de laizquierda (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 nombrede Hoja correspondiente.2. Si la macro debe afectar a todo un libro en particular escríbela en el objeto ThisWorkbook. Estas suelen sermacros 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.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

58

Page 30: Manual de Excel VBA

Navigation: Teoria > El editor de macros >

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

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

Algunos objetos tienen muchas propiedades (por ej. los Userforms) así que tenemos la opción de ordenar lsomismos de forma alfabética o por categoría. El objeto Módulo1 solo tiene la propiedad (Name)Módulo1. Siquisié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 nuevosmó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 enla 2º parte de este curso.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

59

Navigation: Teoria > El editor de macros >

Ventana CódigoVeamos una foto para ver como se ve la Ventana de Código. Cada vez que hagas doble clic izquierdo en algúnObjeto de la Ventana Proyecto se activará a la derecha la Ventana de Código. Si no la puedes visualizarpuedes 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 hemosescrito 3 macros:

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 clicen cualquiera de ellas el editor nos posicionará rápidamente en la misma.

60

Page 31: Manual de Excel VBA

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

61

Navigation: Teoria > El editor de macros >

Ventana InmediatoVeamos 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 armartoda 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 siguientemacro en un módulo y ejecutarla:

Sub ContarHojas()Dim N As LongN= thisworkbook.Sheets.CountMsgbox NEnd Sub

De momento no importa los objetos, propiedades o métodos que hemos utilizado. Solo te queremos mostrarque 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 ventanainmediato podemos escribir:?thisworkbook.Sheets.Count y al presionar Enter en la fila siguiente nos mostrará el número de hojas que poseeel libro. El signo ? al comienzo significa que estamos buscando conocer el resultado de algo. El resultado finalse 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. Alpresionar Enter, en la fila siguiente se mostrará la ruta del libro, por lo que en la Ventana Inmediato veremosalgo así, suponiendo que el libro se encuentra guardado en ese directorio:

62

Page 32: Manual de Excel VBA

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 lotanto escribimos la macro sin el signo ?. Por ejemplo, si queremos que en la celda A1 aparezca el valor 100 lopodemos 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 loindica. Pero dichas macros solo se ejecutan 1 vez al presiona enter y no quedan disponibles en la lista demacros ni las puedes utilizar en tus desarrollos (asignándolas a botones o formularios).

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

63

Navigation: Teoria > El editor de macros >

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

Para proteger tus macros sigue estos pasos:1. Tilda la casilla Bloquear proyecto para su visualización2. Escribe una Contraseña3. 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 objetosdonde quedan escritas las macros (módulos, hojas y userforms). Si hace doble clic en el Proyecto apareceráuna ventana solicitando la clave.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

64

Page 33: Manual de Excel VBA

Navigation: Teoria >

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

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

65

Navigation: Teoria > Ejecución de macros >

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

66

Page 34: Manual de Excel VBA

Navigation: Teoria > Ejecución de macros >

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

Para ejecutar la macro:1. Elige el Nombre de la macro de la lista2. Clic en Ejecutar

En la parte inferior figura una lista desplegable donde puedes elegir si quieres listar las macros de Todos loslibros 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 libropermanece oculto desde Excel, pero es posible verlo desde el editor de macros. Todas las macros que escribasen PERSONAL.XLS siempre estarán disponibles cada vez que habras tus libros Excel. Es una opción muy útilpor si tienes macros que quieres utilizar en todos tus libros Excel (solo estárán disponibles en tu PC).

67

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

68

Page 35: Manual de Excel VBA

Navigation: Teoria > Ejecución de macros >

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

1. Ir al menú de macros presionando ALT+F82. Elegir el nombre de la macro de la lista y luego hacer clic en el botón Opciones.

3. Donde dice Tecla de método abreviado presiona la tecla MAYUSC y luego una letra. En nuestro ejemplo lamacro 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,

69

hay muchas combinaciones de Ctrl+Letra que ya están ocupadas por Excel (Ctrl+C copiar, Ctrl+V pegar, Ctrl+Xpegar, etc) y no se aconsejamos que utilices dichas combinaciones. Por eso lo que se hace es presionarMayúsc antes de la letra de tal forma que la macro se ejecutará con Ctrl+Mayús+Letra y de esta forma noalterar las teclas de método abreviado por defecto de Excel.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

70

Page 36: Manual de Excel VBA

Navigation: Teoria > Ejecución de macros >

Desde objetosMuchas veces, y sobre todo cuando desarrolles aplicaciones en Excel, te interesará asignar macros a objetosgráficos insertados en la hoja. Excel posee una gran cantidad de figuras y dibujos que puedes insertar en lahoja.

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

71

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

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

72

Page 37: Manual de Excel VBA

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

73

Navigation: Teoria > Ejecución de macros >

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 losmismos. 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 luegoarrastar y soltar ese botón a la barra de botones de Excel.

2. Es importante que mantengas abierto el cuadro de Personalizar, porque si no no podrás editar el botón. Sihacemos clic izquierdo sobre el botón se desplegará el menú de opciones. Las opciones más importantes son lasde Cambiar imagen del botón y la de Asignar macro. Esta última opción nos permitirá abrir el cuadro de diáogocon la lista de macros creadas para asignarle una macro determinada (visto en la sección anterior).

74

Page 38: Manual de Excel VBA

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

75

Navigation: Teoria > Ejecución de macros >

AutomáticamenteLas macros también se pueden ejecutar automáticamente. Por ejemplo, se pueden hacer macros que seejecuten 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.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

76

Page 39: Manual de Excel VBA

Navigation: Teoria >

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

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

77

Navigation: Teoria > Macros de eventos >

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

Instrucciones para insertar una macro de evento a nivel libro:

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

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

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

78

Page 40: Manual de Excel VBA

4. Por ejemplo, si haces clic en la opción Activate, verás que en la ventana de macros se escribeautomá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 (nodebes modificar esto). Luego podrás escribir tu código macro entre esas líneas. En este caso, la macro queescribas se ejecutará cada vez que actives el libro excel en cuestión. Por ejemplo, puedes hacer una macro quemuestre un mensaje de saludo cada vez que abres el libro:

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

79

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

Existen más de 20 macros de evento a nivel libro. Puedes insertarlas siguiendo las instrucciones dadas alcomienzo. 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 libroEnd Sub

Private Sub Workbook_BeforePrint(Cancel As Boolean)' El código que escribas aquí se ejecutará automáticamente al imprimir el libroEnd 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 libroEnd Sub

Private Sub Workbook_Open()'El código que escribas aquí se ejecutará automáticamente al abrir el libroEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

80

Page 41: Manual de Excel VBA

Navigation: Teoria > Macros de eventos >

Eventos de hojasLos eventos de hojas permiten disparar automáticamente una macro cuando suceden determinadas acciones a nive

Instrucciones para insertar una macro de evento a nivel hoja:

1. Las macros de eventos se deben escribir en la carpeta Hoja1(Nombre) del editor de macros. Fíjate que Hoja1 iPor 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

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 d

81

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 deescribas se ejecutará cada vez que actives la hoja excel en cuestión. Por ejemplo, puedes hacer una macro que mu

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ásque se ejecuta automáticamente cuando ocurre el evento, en este caso cuando se activa la hoja excel en cuestión.

Existen unas 9 macros de evento a nivel hoja. Puedes insertarlas siguiendo las instrucciones dadas al comienzo. La

82

Page 42: Manual de Excel VBA

Private Sub Worksheet_Activate()' El código que escribas aquí se ejecutará automáticamente al activar la hojaEnd Sub

Private Sub Worksheet_Calculate()' El código que escribas aquí se ejecutará automáticamente al calcular la hojaEnd Sub

Private Sub Worksheet_Deactivate()' El código que escribas aquí se ejecutará automáticamente al desactivar la hojaEnd 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 (caEnd 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 ejEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

83

Navigation: Teoria >

FormulariosUn Formulario (o su denominación en inglés Userform) se utiliza para crear un Cuadro de Diálogo donde elusuario 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 formulariocomo 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 contildes), casillas de opciones (círculos con un punto dentro) y listas desplegables (lista con una flechita quedespliega distintas opciones).

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

84

Page 43: Manual de Excel VBA

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

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

85

Navigation: Teoria > Formularios >

Crear un formularioPara 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 > Userform2.3 Como se ve en la fotografía, veremos que aparece un objeto Userform1 que cuelga de la carpetaFormularios

3. En la ventana de Código de la derecha, veremos que aparece un Userform en blanco, sin controles. Paraabrir su Cuadro de Herramientas puedes hacerlo desde el menú Ver > Cuadro de Herramientas. Ahí figuran loscontroles que podremos agregar dentro del Userform. Para añdir uno, simplemente hacemos clic izquierdo en elcontrol deseado y luego clic izquierdo dentro del Userform, en el sitio donde querramos agregar el control.

86

Page 44: Manual de Excel VBA

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

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

87

Navigation: Teoria > Formularios >

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

Ahora explicaremos brevemente la utilidad de cada control. Los controles se explican en el mismo orden queaparecen 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 sitiodel Userform. También podemos agregar títulos o descripciones al resto de comandos que agregemos en elUserform.

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 deExcel).

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.

88

Page 45: Manual de Excel VBA

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 variasposibilidades.Ejemplo: queremos que el usuario indique si es de sexo Masculino o Femenino. De todas las opciones solo sepuede seleccionar una de ellas.

ToggleButton (botón de alternar): sirve para activar o desactivar alguna funcionalidad. Este botón adopta elmodo "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 delFrame).Ejemplo: tenemos varias grupos de OptionButton y para distinguirlos los agrupamos con un Frame. Si tenemosun grupo de opciones tipo masculino/femenino los agrupamos dentro de un frame. Si luego tenemos otro gurpode opciones del tipo Mayor de Edad / Menor de Edad los agrupamos dentro de otro Frame.

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 ubicardistintos 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 ubicardistintos controles o distintas secciones.

89

ScrollBar (barra de desplazamiento): si tenemos una lista con muchos elementos el scrollbar nos permitenavegarlos.Ejemplo: tenemos una lista con 150 países. Con el ScrollBar podemos subir y bajar por la lista de los mismosutilizando 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 encantidades 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 lasección siguiente veremos un ejemplo simple sobre como crear un Userform paso a paso.

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

90

Page 46: Manual de Excel VBA

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

91

Navigation: Teoria > Formularios >

Ejemplo paso a pasoAntes de crear un Userform debemos pensar bien cual será su objetivo y cuáles son los controles queutilizaremos.

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

Los controles que utilizaremos son:Textbox: para que el usuario ingrese los datosLabel: para darle el nombre e los TextboxCommandButton: para proceder con el ingreso de datos o cancelar

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

2. Creamos un Userform (UF)

Los UF se crean desde el editor de visual basic.2.1 Abrimos el editor con ALT+F112.2 Seleccionamos Ver > Explorador de Proyectos para ver la lista de proyectos disponibles (los mismos severá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 > Userform2.5 Aparecerá un nuevo Userform vacío junto con el Cuadro de Herramientas (si el mismo no aparece se puedeabrir desde el menú Ver > Cuadro de Herramientas)

92

Page 47: Manual de Excel VBA

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, luegoEnter (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 enCaption, escribimos Datos Personales (encima de Userform1) y luego Enter. Ahora, la barra de título delUserform es más apropiada para nuestro propósito y para darle mejor información al usuario.

93

4. Agregamos un Cuadro de Texto

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

94

Page 48: Manual de Excel VBA

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 luegoreferirnos 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 deTexto del Paso anterior. Podemos agregar una etiqueta de texto que describa la información que se debeintroducir.

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.

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

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

95

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 paraEdad 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.

Si los textbox no quedan alineados se pueden alinear de la siguiente forma:

1. Clic en el primer TextBox2. Mantieniendo pulsada la tecla MAYUS, selecciona los otros TextBox3. Vamos al menú Formato > Alinear > Izquierda4. Hacemos clic en alguna parte vacía del Userform para seleccionarlo y mostrar el cuadro de herramientas.

96

Page 49: Manual de Excel VBA

7. Agregamos los Botones

Para permitir que el usuario ejecute una acción, se pueden agregar un Botón de comando. Nuestro Userformtendrá 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 dePropiedades, tipeamos UFAgregar y luego enter.7.4 Con el nuevo botón seleccionado hacemos doble clic en su propiedad Caption en la Ventana dePropiedades, 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 macrodará error. Esto se explica en el paso 7.3 y luego deberás repetirlo para el otro botón, tal cual se indica en elpaso 7.6.

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

8.1 Seleccionamos nuestro botón de comando Agregar8.2 Desde el menú superior elegimos la opción Ver > Código. Esto abrirá una ventana donde podremos escribircódigo macro para dicho objeto.8.3 Donde titila el cursor escribimos lo siguiente:

Private Sub UFAgregar_Click()Dim iFila As LongDim ws As WorksheetSet ws = Worksheets(1)

97

'encuenta la siguiente fila vacíaiFila = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

'Verifica que se ingrese un nombreIf Trim(Me.UFNombre.Value) = "" Then Me.UFNombre.SetFocus MsgBox "Debe ingresar un nombre"Exit Sub

End If

'copy the data to the databasews.Cells(iFila, 1).Value = Me.UFNombre.Valuews.Cells(iFila, 2).Value = Me.UFEdad.Valuews.Cells(iFila, 3).Value = Me.UFFecha.Value

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

End Sub

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

No te preocupes si no comprendes el código. Hay muchos objetos, propiedades y métodos nuevos. Todos ellosse 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 Cerrar9.2 En el menú superior elegimos Ver > Código9.3 Donde titila el cursor escribimos el siguiente código:

Private Sub UFCerrar_Click()Unload MeEnd 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 Cerrar10.2 En la Ventana Propiedades cambiamos la propiedad Cancel a True.

98

Page 50: Manual de Excel VBA

Probar el UserformYa 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/Userform3. 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 secompletará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 delmovimiento no es el correcto, es posible camabiarlo:

1. Clic derecho en una parte vacía del USerform2. Elegimos Orden de Tabulación.3. Seleccionamos el control de la lista y con los botones de Mover Arriba o Mover Abajo ajustamos el orden.4. Hacemos clic en OK

Asignar un botón para ejecutar el Userform

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

1. Activamos Excel, libro Datos.xls, Hoja 12. En la Barra de Dibujo, en el menú Ver > Barras de Herramientas > Dibujo hacemos clic en una figura, porejemplo el cuadrado, y lo insertamos en la hoja.3. Seleccionamos dicha figura y con clic derecho en su borde elegimos Asignar Macro4. Hacemos clic en el botón Nuevo5. Donde titila el cursor escribimos: DatosUF.Show6. Cada vez que hagamos clic en la figura se ejecutará el Userform.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

99

Navigation: Teoria >

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

100

Page 51: Manual de Excel VBA

Navigation: Teoria > Varios >

Ejecutar macro desde macroMuchas veces nos interesa ejecutar o llamar una macro desde otra macro. Esto es muy útil porque si tenemosun desarrollo muy grande, para mantener ordenado el código conviene dividir la tarea en distintas macros yluego 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 delcódigo de la macro principal. Por ejemplo, si ejecutamos la Macro1 y queremos que desde la misma se ejecutela Macro2 lo haríamos así:

Sub Macro1()'El código de mi Macro1Macro2End Sub

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

Sub Macro1()'El código de mi Macro1Call Macro2End Sub

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

Sobre el rango seleccionado:1. Asigna un formato numérico2. Asigna bordes3. Asigna color de relleno

El código de la SuperMacro es el siguiente:

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

With Selection.Borders .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic

End With'Asigna Color de Relleno

With Selection.Interior .ColorIndex = 36 .Pattern = xlSolid .PatternColorIndex = xlAutomatic

End WithEnd Sub

101

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

Sub SuperMacro()Call FormatoNCall BordesCall RellenoEnd Sub

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

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

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

End WithEnd Sub

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

End WithEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

102

Page 52: Manual de Excel VBA

Navigation: Teoria > Varios >

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

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

'Esta macro selecciona la celda A2Sub Macro()Range("A2").SelectEnd Sub

Si las instrucciones están bien escritas el editor convierte automáticamente las mayúsculas y asigna los coloresazules a las estrucutras reconocidas y verde a los comentarios. Las estructuras reconocidas son aquellas quesiempre 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, comose ve a continuación.

Sub Macro()Range("A2).SelectEnd Sub

Cuando sucede esto aparece un aviso que nos indica el error cometido. Si vemos que la línea está roja esseñal que debemos corregir algo (usualmente falta o sobra algún caracter). En nuestro caso, hemos olvidadoponer 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 noaparecerá ningún mensaje de error, vemos que el editor no ha pintado de azul la palabra "Sab".

Sab Macro()Range("A2").SelectEnd Sub

Al intentar ejecutar esta macro no sucederá nada, porque no se ha respetado la estructura de Sub() - End Subcon 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 lasiguiente macro. Al escribirla no ha generado error y ninguna línea se ha pintado de rojo. Sin embargo, alejecutarla sí aparece un error.

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

103

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 nose podrán ejecutar nuevas macros (el modo de interrupción se identifica porque el nombre de la macro quedaresaltado en amarillo). Lo que debemos hacer en esta instancia es salir de modo interrupción desde el mismoeditor, menú Ejecutar > Reestablecer. Luego procedemos a corregir la macro. En este caso el mensaje fueclaro: la esctructura estaba incompleta, nos faltó el End If (existe una estructura If - End If que se explica mejoren 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 luegopresionar la tecla F8. De esta forma se irá resaltando con amarillo y ejecutando cada fila, hasta que llegues a laque produce el error. También puedes hacerlo desde la opción del menú Depuración > Paso a paso porinstrucciones.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

104

Page 53: Manual de Excel VBA

Navigation: Teoria > Varios >

Complementos (Add Ins)Una vez que tenemos nuestras macros, es posible "empaquetarlas" bajo la forma de un Complemento, también coAdd-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 ma

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

Excel 2.003 o inferiorPara acceder a los complementos puedes hacerlo desde el menú Herramientas > Complementos de la hoja Exccuadro similar al que se muestra a continuación:

A la izquierda se ve la lista de complementos disponibles siendo posible activarlos o desactivarlos (seldeseleccionando la casilla a la izquierda de su nombre).

Cuando queremos instalar nuevos complementos debemos hacerlo con el botón Examinar. Dicho botón nos permdirectorio donde se encuentra el complemento que deseamos instalar. La extensión de los archivos de complement

La utilidad de un complemento es que podemos crear nuestras macros y luego guardarlas como complemento. Ddichas macros estarán disponibles en todas las hojas Excel que abramos, dado que el complemento

105

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 macros2. 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 comolista 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áticextensión XLA.

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

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

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

106

Page 54: Manual de Excel VBA

Y se abrirá el cuadro de complementos

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

107

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 permdirectorio donde se encuentra el complemento que deseamos instalar. La extensión de los archivos de complement

La utilidad de un complemento es que podemos crear nuestras macros y luego guardarlas como complemento. Ddichas macros estarán disponibles en todas las hojas Excel que abramos, dado que el complementoautomá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 macros2. 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 comolista 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áticextensión XLA.

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

108

Page 55: Manual de Excel VBA

Navigation: Teoria > Varios >

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

Si utilizas Excel 2.003 o inferior, continuar aquí...Si utilizas Excel 2.007 o inferior, continuar aquí...

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

Lo recomendable es tener el nivel de seguridad en Medio. De esta forma cada vez que abramos un archivo tendrede habilitar o deshabilitar las macros, mediante un mensaje automático de aviso que aparece. Si el archivo profuente segura las podremos habilitar sin problemas.

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

109

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

110

Page 56: Manual de Excel VBA

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 archivo que esté guardado en esas carpetas, se habilitarán automáticamente las macros (nos evitaremos el moles"Habilitar macros"). Para configurar esto vamos al Centro de Confianza, seleccionamos Ubicaciones de confindicamos una carpeta desde el botón de Agregar nueva ubicación...

111

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

112

Page 57: Manual de Excel VBA

Navigation: Teoria > Varios >

Firma digital

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

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

Para crear una firma digital hay que ejecutar un archivo llamado Selfcert.exe (en mi caso particular se encuentraubicado en C:\Archivos de programa\Microsoft Office\Office\). Si no lo tienes allí, puedes buscarlo en tu PC conla 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 yluego aceptar.

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

113

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

114

Page 58: Manual de Excel VBA

Navigation: Teoria > Varios >

Macros privadasRecuerda que puedes visualizar las macros de tu libro presionando ALT+F8. Verás que se abre un cuadrocomo el siguiente:

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

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

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

Si tienes muchas macros en el módulo y quieres ocultarlas todas, en lugar de escribir la palabra Private en cadauna 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.

115

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

116

Page 59: Manual de Excel VBA

Navigation: Teoria > Varios >

Acelerar el códigoEn la medida que la cantidad de código contenido en las macros se incrementa, es posible que la velocidad deejecución de las mismas disminuya. Sin embargo, existen algunas recomendaciones para mantener las macrosrá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 demacros que activan o desactivan hojas, seleccionan rangos, etc. Esto hace que la macro se ejecute un pocomás lento. Si solo queremos ver el resultado final y ganar velocidad, debemos utilizar la instrucciónApplication.ScreenUpdating=False. En general se recomienda incluir siempre esta línea al comienzo de cadamacro, por ejemplo:

Sub SuperMacro()Application.ScreenUpdating=False'El código de la macro aquíApplication.ScreenUpdating=TrueEnd 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 librotuviera muchas fórmulas y la macro cambiara muchas celdas, esto haría que se ejecute muy lento, porque seestaría recalculando la hoja repetidas veces. Lo recomendable es deshabilitar el cálculo, ejecutar la macro yluego volver a activar el modo de cálculo automático. Por ejemplo:

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

3. Utilizar la instrucción With

Cuando tenemos que definir muchas propiedades de un único objeto, no es necesario hacer mención al objetocada vez, porque esto le quita velocidad de ejecución a la macro. Para ganar velocidad y mantener el códigomá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

117

.Interior.ColorIndex = 5End WithEnd 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 conCopiar 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 celda4.2 Vamos al menú Herramientas > Macros > Grabar nueva macro4.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 quefuncione 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á elsiguiente:

Sub CopiaRango() Range("C10:C12").Select Selection.Copy Range("E10").Select ActiveSheet.PasteEnd 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

118

Page 60: Manual de Excel VBA

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

119

Navigation: »No topics above this level«

MacrosEn 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.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

120

Page 61: Manual de Excel VBA

Navigation: Macros >

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

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

Dudas adicionales sobre macrosTodas las dudas y consultas sobre Excel las respondemos desde nuestra web.

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

Mosaico vertical y revisión de macros con F8Un buen método para entender el funcionamiento de las macros consiste en cerrar y minimizar todas lasaplicaciones que tenemos abiertas en nuestro ordenador. Luego maximizar Excel al igual que el editor de VBA ycrear un mosaico vertical con las aplicaciones abiertas y maximizadas, es decir con Excel y VBA. Esto lohacemos con el botón derecho del ratón en la parte inferior de la pantalla (encima de la hora) y seleccionando laopció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.WaitMuchas 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 apenasunas 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 queestuviese a continuación.

121

Escritura de las macrosEn muchos ejemplos las macros no tienen su línea de comienzo (Sub) ni su línea de final (End Sub), como porejemplo: 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 eleditor, por ejemplo:Sub AAA()ActiveSheet.PageSetup.PrintArea = "$A$1:$G$22"End Sub

Utilización de los MsgboxEs común que hagamos uso de los Msgbox para indicar que puedes continuar con tu código. Esto quiere decirque 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 tucódigo.

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

122

Page 62: Manual de Excel VBA

Navigation: Macros >

VariablesComo prácticamente todas las macros utilizan variables, es importante comenzar a entenderlas. Una variablees 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 variableNombreVariable: escribimos el nombre de nuestra variable a gusto (sin espacios)as: necesario para definir el tipo de variableTipoVariable: 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 mensajeMsgbox NombreEnd Sub

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

123

Navigation: Macros > Variables >

DefiniciónUna variable es un lugar de almacenamiento con nombre que puede contener cierto tipo de datos que puede semodificado durante la ejecución del programa. Cada variable tiene un nombre único que la identifica dentro de snivel de ámbito. Puede especificar un tipo de datos o no. Los nombres de variable deben comenzar con un caráctealfabético, deben ser únicos dentro del mismo ámbito, no deben contener más de 255 caracteres y no puedecontener 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 ndeben exceder en longitud de 255 caracteresSe 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 variablepropias, algunas de estas palabras son: Sub, End, with, do, loop etc, ya que son nombres que tienen un significadpropio dentro de VBA.

Cuando declaramos una variable, por ej:

Dim SALUDOS as String

a medida que utilicemos la variable saludos aún cuando la escribamos en minúsculas VBA nos la corregirautomá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 squeremos.

Podemos declarar todo tipo evariables, por ello conviene también adquirir la costumbre de hacer que el propinombre 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 libDim TipoCambio As Double ' Variable definida como valor con 2 decimalesTipoCambio = 1.45' Esta macro multiplica el valor de la celda activa por el valor de la variable anterior ActiveCell.Value = TipoCambio * ActiveCell.ValueEnd Sub

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

Sub Macro()Dim valor As Doublevalor = 1.45 ActiveCell.Value = valor * ActiveCell.ValueEnd Sub

En el caso anterior, si la macro creció mucho, llegaría un punto donde no recordaríamos que había en valor, porques 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 n

124

Page 63: Manual de Excel VBA

declararamos las variables VBA manipularia todas las variablescomo Variant siendo el consumo de memoria bastante mayor.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

125

Navigation: Macros > Variables >

DeclaraciónAntes 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 ennuestros 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ñadidoincluirá automáticamente la instrucción Option Explicit al comienzo de todo, como se ve a continuación:

¿qué significa la instrucción Option Explicit?

Se usa en el nivel de módulo para forzar declaraciones explícitas de todas las variables en dicho módulo, debeaparecer en un módulo antes de cualquier procedimiento.Cuando Option Explicit aparece en un módulo, debemos declarar explícitamente todas las variables mediantelas 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 obien 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 tomarcualquier valor) a menos que el tipo predeterminado esté especificado de otra manera con una instrucciónDeftipo (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 existenteo 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 lasvariables. 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

126

Page 64: Manual de Excel VBA

Sub MacroMensaje()

' Declaramos la variable saludo como variable tipo textoDim saludo As String

' Damos un valor a la variable declaradasaludo = "Hola que tal"

' Damos un valor a esta otra variable, que NO ha sido declaradadespedida = "Adios"

MsgBox saludoMsgBox despedida

End Sub

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

Sub MacroMensaje()

' Declaramos la variable saludo como variable tipo textoDim saludo As String

' Aquí declaramos la variable que habíamos olvidado antesDim despedida As String

' Damos un valor a la variable declaradasaludo = "Hola que tal"

' Damos un valor a la variable declaradadespedida = "Adios"

MsgBox saludoMsgBox despedida

End Sub

La declaración de variables es primordial, totalmente necesaria, pues ayuda a saber el código que estamosmanipulando 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).

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

127 128

Page 65: Manual de Excel VBA

Navigation: Macros > Variables >

TiposLa 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 usarEn la 2º columna (Tamaño) se define cuanto espacio ocupa en memoriaEn la 3º columna (Intervalo) se definen los valores que puede adquirir la variable

Tipo de datos Tamaño IntervaloByte 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ónsimple)

bytes -3,402823E38 a -1,401298E-45 para valo45 a 3,402823E38 para valores positivos

Double (coma flotante/ precisióndoble)

bytes -1.79769313486231E308 a -4,940656458negativos; 4,94065645841247E-324 a 1,7valores positivos

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

Decimal bytes +/-79.228.162.514.264.337.593.543.950.37,9228162514264337593543950335 con del signo decimal; el número más pequeñ0,0000000000000000000000000001

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

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 tip

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

Definido por el usuario (utilizandoType)

número requerido por los elementos intervalo de cada elemento es el mismo qde datos.

129

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

Option ExplicitSub Macro()Dim X As Byte

For X = 1 To 25 Cells(X, 1) = X

Next XEnd Sub

La macro anterior utiliza bastantes menos recursos que esta próxima que no fuerza la declaración de la variconsiderada como Variant):

Sub Macro()For X = 1 To 25

Cells(X, 1) = XNext X

End Sub

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

Option ExplicitSub Macro()Dim X As Long ' Aunque sería recomendable Dim X As Byte

For X = 1 To 25 Cells(X, 1) = X

Next XEnd Sub

Una solución momentánea para saber que tipo de variable deberíamos utilizar podría ser de la siguiente foreliminado 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 ExplicitSub Macro()' Decimos que es variant, que es lo mismo que no decir nada pero definiendo esa nada y luego…Dim X

For X = 1 To 65536 Cells(X, 1) = X

Next X MsgBox TypeName(X)End Sub

130

Page 66: Manual de Excel VBA

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

Option ExplicitSub 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 ExplicitSub Macro()Dim X

For X = 1 To 25 Cells(X, 1) = X

Next X MsgBox TypeName(X)End Sub

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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

131

Navigation: Macros > Variables >

LocalesLas variables locales se declaran dentro de cada macro, y solo pueden ser utilizadas dentro de la macro en laque han sido creadas, cuando la macro termina de ejecutarse, la variable desaparece y Excel libera la memoriaque 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 SingleDim Y As SingleDim Z As Single X = 5 Y = 10 Z = 50 ActiveCell = X * Y * ZEnd Sub

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

Option ExplicitSub 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 = ResultadoEnd 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 = AutorEnd Sub

Sub Macro2()Dim Autor As String Autor = "Pedro" ActiveCell = AutorEnd Sub

Sub Macro3()Dim Autor As String Autor = "Jose" ActiveCell = AutorEnd Sub

132

Page 67: Manual de Excel VBA

Sub Macro4()Dim Autor As String Autor = "Salvador" ActiveCell = AutorEnd Sub

Se recomienda la utilización de variables locales antes que la de variables públicas (las veremos en la secciónsiguiente), ya que una vez que la macro termina de ejecutarse, VBA ya no las reconoce de nuevo y liberamemoria, mientras que si son públicas aún cuando la macro termina, el valor al que hacen referencia lasvariables sigue vigente y ocupando espacio en memoria.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

133

Navigation: Macros > Variables >

PúblicasLas variables declaradas mediante la instrucción Public están disponibles para todos los procedimientos entodos 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 nosahorran 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 siguientedeclara 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 siguientedeclara 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 objetodebe asignarse a un objeto existente mediante la instrucción Set antes de que se pueda usar. Hasta que se leasigne un objeto, la variable de objeto declarada tiene el valor especial Nothing, el cual indica que no se refierea ninguna instancia en particular de un objeto.

También podemos utilizar una instrucción Public con paréntesis vacíos para declarar matrices dinámicas.Después de declarar una matriz dinámica, usamos la instrucción ReDim dentro de un procedimiento para definirel número de dimensiones y elementos de la matriz. Si intentamos volver a declarar un dimensión para unamatriz cuyo tamaño se ha especificado explícitamente en una instrucción Private, Public o Dim, ocurrirá unerror. 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 seinicializa a una cadena de longitud cero ("") y una cadena de longitud fija se rellena con ceros. Las variablesVariant 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 paradeclarar variables como públicas; es decir, disponibles para todos los procedimientos en todos los módulos detodas 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 porcualquier macro, mientras que si fuera una variable no pública deberíamos definir su nombre cada vez que lanecesitemos en cada macro, por ejemplo:

Option Explicit

134

Page 68: Manual de Excel VBA

Public X As Byte

Sub Macro()For X = 1 To 25

Call Macro2Next X

End Sub

Sub Macro2() Cells(X, 1) = XEnd 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 XEnd Sub

Con el ejemplo anterior tan solo pretendemos hacer referencia a que a veces conviene utilizar variablespú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 necesariodefinirla en cada macro y que mientras no le asignemos otro valor conserva el que tenía.

En el siguiente ejemplo hemos decidido no definir dos veces la variable Rg, no obstante hemos querido que encada macro haga referencia a diferentes rangos:

Public Rg As Range

Sub Macro()Dim x As Byte

For x = 1 To 25Set Rg = Cells(x, 1)

Rg.Value = xNext x

End Sub

Sub Macro2()Set Rg = Range("A1:A25") Rg.Interior.ColorIndex = 3End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

135 136

Page 69: Manual de Excel VBA

Navigation: Macros > Variables >

EstáticasLas 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 Staticconservan su valor hasta que se reinicie o restablezca el módulo. En los módulos de clase, las variablesdeclaradas con la instrucción Static conservan su valor en cada instancia de clase hasta que se destruye lainstancia. 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 visiblessólo dentro de un procedimiento, pero cuya vida es la misma que la del módulo en la que se definió elprocedimiento.

Usamos una instrucción Static dentro de un procedimiento para declarar el tipo de datos de una variable queconserva su valor entre llamadas a procedimiento. Se declaran dentro de cada macro, pero retienen el valorque 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 RangeUtilizaremos 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 mismavariable, tan solo se llaman igual, de hecho a medida que la macro1 vaya ejecutándose x en el primera macroira desde 1 hasta 25 mientras que en la macro2 desde 10 hasta ¿?, dependiendo de cuantas veces utilicemosesta macro. Pero en principio si es utilizada solo a través de la macro1 desde 10 hasta 250.

Option Explicit

Public Rg As Range

Sub Macro1()Dim x As Byte

For x = 1 To 25Set Rg = Cells(x, 1)Call Macro2

Next xEnd Sub

Sub Macro2()Static x As Byte x = x + 5 Rg.Select Rg = xEnd 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 unerror de recompilación, ya que habría un desbordamiento.

137

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 efectosdiferentes. Si declara un procedimiento con la palabra clave Static (como en Static Sub ContarVentas()), elespacio de almacenamiento correspondiente a todas las variables locales dentro del procedimiento se asignauna única vez y el valor de las variables se conserva durante todo el tiempo que se esté ejecutando elprograma. Para procedimientos no estáticos, el espacio de almacenamiento para las variables se asigna cadavez que se llama al procedimiento y se libera cuando se sale del procedimiento. La instrucción Static se usapara declarar variables específicas dentro de procedimientos no estáticos para conservar su valor mientras elprograma se esté ejecutando.

En este ejemplo se utiliza la instrucción Static para conservar el valor de una variable mientras el código delmó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 = AcumuladoEnd 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 = MitadEnd 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 serellena con ceros. Las variables Variant se inicializan a Empty. Cada elemento de una variable de un tipodefinido por el usuario se inicializa como si fuera una variable distinta.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

138

Page 70: Manual de Excel VBA

Navigation: Macros > Variables >

ConstantesPor lo general las variables hacen referencia a valores que acostumbran a cambiar tal que, por ej:Sub Macro()Dim Rng As RangeDim x As Byte

For x = 1 To 25Set Rng = Cells(x, 1)

Rng.Select Rng = x

Next xEnd 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 comoconstante si éstas no son públicas.

Para declarar una variable como constante utilizamos la instrucción Const, por ej:

Option ExplicitConst nPaises As Byte = 53Const UKrate = 1.43, USrate = 0.78Const 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 locual se consideraran as variant.La 3º linea de código declara autorLibro como una constante de tipo string y le da el valor TodoEXCEL.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

139

Navigation: Macros > Variables >

ConversiónEs posible convertir variables de un tipo a otro. Existen distintas funciones que que permiten hacer estasconversiones, por ej:

CBool(expresión), CByte(expresión), CCur(expresión), CDate(expresión), CDbl(expresión), CDec(expresión),CInt(expresión), CLng(expresión), CSng(expresión), CStr(expresión), CVar(expresión)

El argumento obligatorio expresión es cualquier expresión de cadena o expresión numérica.

Tipos devueltos: el nombre de la función determina el tipo devuelto, como se muestra a continuación:

Función Tipo devuelto Intervalo del argumento expresiónCBool Boolean expresión de cadena o numérica

válida.CByte Byte 0 a 255CCur Currency .337.203.685.477,5808 a

922.337.203.685.477,5807.CDate Date expresión de fechaCDbl Double .79769313486231E308 a -

4,94065645841247E-324 para valoresnegativos; 4,94065645841247E-324 a1,79769313486232E308 para valorespositivos.

Cdec +/-79.228.162.514.264.337.593.543.950.335para números basados en cero, es decir,números sin decimales. Para númeroscon 28 decimales, el intervalo es +/-7,9228162514264337593543950335. Lamenor posición para un número que nosea cero es0,0000000000000000000000000001.

Cint .768 a 32.767; las fracciones seredondean.

Clong .147.483.648 a 2.147.483.647; lasfracciones se redondean.

CSng ,402823E38 a -1,401298E-45 paravalores negativos; 1,401298E-45 a3,402823E38 para valores positivos.

Cstr mismo intervalo que Double paravalores numéricos. El mismo intervaloque String para valores no numéricos.

CVar valor de retorno de CStr depende delargumento 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 quese va a convertir, se produce un error. En general, el código se puede documentar utilizando las funciones de

140

Page 71: Manual de Excel VBA

conversión de tipos de datos para indicar que el resultado de alguna de las operaciones se debería expresarcomo un tipo de datos en particular, no como el tipo de datos predeterminado.

Cuando la parte fraccionaria es exactamente 0,5, CInt y CLng siempre redondean al número par más cercano.Por ejemplo, 0,5 redondea a 0, y 1,5 redondea a 2. CInt y CLng se diferencian de las funciones Fix e Int en quetruncan, en lugar de redondear, la parte fraccionaria de un número. Además, Fix e Int siempre devuelven unvalor 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éramosuna 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 IfEnd Sub

CDate reconoce literales de fecha y literales de hora además de números comprendidos dentro del intervalo defechas 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 nose determine el orden correcto del día, mes y año si se proporciona en un formato diferente del que reconoce laconfiguración de fecha. Además, no se puede reconocer un formato de fecha largo si contiene la cadena del díade la semana.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

141

Navigation: Macros > Variables >

EjemplosRecordar 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 inm MsgBox QAZEnd 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 QAZEnd Sub

Pero en este caso si ActiveCell.Value=255, QAZ haría referencia a 255 como si de un nombre se tratara y no cocifra.

Para utilizar este valor 255 guardado como QAZ deberíamos previamente convertirlo a alguna variable qumanipulació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 ceventana inmediata y en un mensaje tal que:

Sub ejString()Dim QAZ As String QAZ = ActiveCell.ValueDim WSX As String WSX = "TodoEXCEL"Dim EDC As String Debug.Print QAZ & WSX MsgBox QAZ & WSX

142

Page 72: Manual de Excel VBA

EDC = QAZ & WSX [A1] = EDCEnd Sub

La fechas se pueden guardar como string pero no pueden ser utilizads en operaciones como fechas salvo que lasa Date:

Sub EjByte()Dim X As Byte

For X = 1 To 25 Cells(X, 1) = X

Next XEnd Sub

Sub EjInteger()Dim X As Integer, Y As Integer

For X = 1 To 1000 Y = Y + 20 Cells(X, 1) = X + Y

Next XEnd Sub

Sub EjLong()Dim X As Integer, Y As Long

' de haber definido Y as Integer' obtendríamos un desbordamientoFor X = 1 To 2000

Y = Y + 20 Cells(X, 1) = X + Y

Next XEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

143

Navigation: Macros >

LibrosMediante macros VBA podemos manipular de distintas formas tanto libros Excel como archivos con otrasextensiones. En este capítulo veremos como hacerlo.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

144

Page 73: Manual de Excel VBA

Navigation: Macros > Libros >

Abrir LibrosPara abrir un libro excel utilizamos la instrucción Open. Si queremos abrir un libro determinado podemos utilizar lamacro:

Sub AbrirLibro()Dim Nombre As StringNombre = "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 IfEnd 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 WorkbookSet Libro = Workbooks.Open(Filename:="C:\Directorio\Libro.xls", Password:="qaz", WriteResPasswoEnd Sub

Para abrir un libro cuando tiene vínculos deberíamos especificar si queremos actualizar los vínculos o no, tal coa continuación:

Sub Abrir()Application.EnableEvents = True Workbooks.Open Filename:="c:\Directorio\MiLibro.xls", UpdateLinks:=FalseEnd Sub

Para obtener información de un libro:

Sub Informacion ()ActiveWorkbook.Name 'Obtendríamos su nombre, por ej. Libro4.xlsActiveWorkbook.Path ' Obtendríamos la ruta del libro activo, por ej. C:\WindowsActiveWorkbook.FullName ' Obtendríamos ruta+nombre, por ej. C:\Windows\Libro4.xlsEnd Sub

Para abrir todos los libros de un directorio:

Sub AbrirLibros()Dim X As LongDim Libro As WorkbookDim Directory As String Directory = ActiveWorkbook.Path

On Error Resume Next Application.EnableEvents = False ' Para evitar macros de evento en los libros abiertos

145

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.CountSet Libro = Workbooks.Open(Filename:=.FoundFiles(X))

Next XEnd With

Application.EnableEvents = True ' Para volverlo a su estado naturalEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

146

Page 74: Manual de Excel VBA

Navigation: Macros > Libros >

Cerrar LibrosPara cerrar un libro utilizamos la instrucción Close:

Sub Cerrar() ActiveWorkbook.CloseEnd Sub

Si queremos cerrarlo sin que nos pregunte si queremos guardar los posibles cambios realizados, debemosindicar que no queremos que se muestren los mensajes de alerta:

Sub Cerrar() Application.DisplayAlerts = False ActiveWorkbook.CloseEnd Sub

Para cerrar todos los libros abiertos sin que nos pregunte si queremos guardar los posibles cambios registradosen cada libro si los hubiese:

Sub Cerrar() Application.DisplayAlerts = False Application.Workbooks.CloseEnd Sub

Y dejando que nos pregunte:

Sub Cerrar() Application.Workbooks.CloseEnd Sub

Con lo cual si tubiéramos 5 libros abiertos y en cuatro de estos libros hubiéramos cambiado algo obtendríamos4 mensajes con la pregunta:

microsoft Excel:Desea guardar los cambios efectuados en...?

Si quisieramos cerrar Excel:

Sub CierraExcel()Application.QuitEnd Sub

147

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

148

Page 75: Manual de Excel VBA

Navigation: Macros > Libros >

Guardar LibrosPara guardar un libro utilizamos la instrucción SaveAs. Si queremos guardarlo con un nombre que figura en una"QAZ"):

Sub Macro()On Error Resume Next' Ponemos On Error Resume Next, para evitar el error derivado de una celda vacía y/o con un caracte 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 dejemplo 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 nombreEnd Sub

Del mismo modo que podemos guardar y abrir un documento desde y donde querramos, también podemos guarguardamos un libro y no especificamos su extensión Excel lo hace como un .XLS, es decir un libro de Excel. Pero de otra propiedad se tratara:

Sub Macro()Dim Carpeta As String

On Error Resume Next Carpeta = "F:\"

ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlTemplate' Lo 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

149

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

150

Page 76: Manual de Excel VBA

Navigation: Macros > Libros >

Borrar LibrosPara borrar un libro utilizamos la instrucción Delete:

Sub BorraLibro ()Workbooks("C:\TuLibro.xls").DeleteEnd Sub

Conviene recordar que excel nos pedira confirmación antes de borrarlo.

Ejemplo de la instrucción KillEn 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 actualKill "*.TXT"

End Sub

Para eliminar el libro activo, en caso de que estuviera abierto, primero deberiamos cerrarlo, tal que:

Sub Eliminar() Dim strFile As String

strFile = ActiveWorkbook.FullName ActiveWorkbook.Close SaveChanges:=False Kill strFile End Sub

o bien:

Kill "C:\Hola.xls"

o bien:

Sub BorrarLibros()Dim X As LongDim Libro As WorkbookDim Directory As String Directory = ActiveWorkbook.Path

On Error Resume Next Application.EnableEvents = False ' Para avitar macros de evento en los libros abiertos

With Application.FileSearch .NewSearch .LookIn = Directory

151

.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 XEnd With

Application.EnableEvents = True ' Para volverlo a su estado naturalEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

152

Page 77: Manual de Excel VBA

Navigation: Macros > Libros >

Crear LibrosPara crear 1 nuevo libro utilizamos la instrucción Add, por ejemplo:

Sub NuevoLibro()Workbooks.AddEnd Sub

Si quisiéramos crear 2 nuevos libros:

Sub NuevoLibro()Workbooks.AddWorkbooks.AddEnd Sub

Abrir un libro en blanco o crear un libro es lo mismo, pero también podemos crear libros basados en plantillas oen otras hojas de cálculo, es decir en otros libros tal que:

Sub Macro()Dim Libro1 As WorkbookDim Libro2 As Workbook

Set Libro1 = Workbooks.Add Debug.Print Libro1.Name ' Utilizamos la ventana Inmediata del editor de VBA

Set Libro2 = Workbooks.Add Libro1.ActivateEnd Sub

Podemos crear 2 nuevos libros y activar el primero de ellos creado, pero la palabra Add permite crear un nuevolibro y el libro creado no tiene por que estar guardado como una plantilla es decir con la extension xla, puedeser un libro xls:

Sub Macro()Dim OtroLibro As WorkbookDim X As Byte

For X = 1 To 10Set OtroLibro = Workbooks.Add(template:="C:\QAZ.xls")

Debug.Print OtroLibro.NameNext 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'QAZ11End Sub

153

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

154

Page 78: Manual de Excel VBA

Navigation: Macros > Libros >

Imprimir LibrosPara imprimir libros u hojas utilizamos la instrucción PrintOut, por ejemplo:

Sub Imprimir ()' Imprime el libro activoActiveWorkbook.PrintoutEnd Sub

Si queremos imprimir un libro y hoja determinada:

Sub Imprimir ()' Imprime el libro y hoja indicadosWorkbooks("MiLibro.Xls").Sheets("Hoja1").PrintoutEnd Sub

Si queremos imprimir un rango determinado, por ejemplo A4:H100

Sub ImprimirRango ()' Imprime el rango indicadoSheets("Hoja1").PageSetup.PrintArea = "$A$4:$H$100"Workbooks("MiLibro.Xls").Sheets("Hoja1").PrintoutEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

155

Navigation: Macros > Libros >

Calcular LibrosLos 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()CalculateEnd Sub

Calcular hoja: calcula la hoja de cálculo activa, así como los gráficos y las hojas de gráfico vinculados a estahoja de cálculo:

Sub CalculaHoja()ActiveSheet.CalculateEnd Sub

También podemos especificar las opciones de cálculo para indicarle a Excel como realizar los cálculos. Laconfiguració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 unnombre.

Sub CalculoAutomatico ()Application.Calculation = xlAutomaticEnd Sub

Automático excepto tablas: calcula todas las fórmulas dependientes, salvo las tablas de datos (para calcular lastablas de datos podemos hacer clic en "Calcular ahora" en la ficha Cálculo del menú Herramientas, Opciones):

Sub CalculoAutomaticoSinTablas ()Application.Calculation = xlSemiautomaticEnd Sub

Manual: sólo calcula los libros abiertos cuando se presiona la tecla F9

Sub CalculoAutomatico ()Application.Calculation = xlManualEnd Sub

156

Page 79: Manual de Excel VBA

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

157

Navigation: Macros > Libros >

Proteger/Desproteger LibrosLa 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.Protect Structure:=True, Windows:=True' Desprotegemos con clave 'Excel'.Unprotect ("Excel")' Protegemos con clave 'Excel'.Protect ("Excel")End WithEnd Sub

Para proteger un libro primero se debe desproteger con Unprotect y luego protegemos con Protect. La clave se pocomillas 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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

158

Page 80: Manual de Excel VBA

Navigation: Macros > Libros >

Listar LibrosPara 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 LongDim Libro As WorkbookDim 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.CountSet Libro = Workbooks.Open(Filename:=.FoundFiles(X))

Next XEnd With

Application.EnableEvents = True ' Para volverlo a su estado naturalEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

159

Navigation: Macros >

HojasMediante macros VBA podemos manipular de distintas formas las hojas de los libros Excel. En este capítuloveremos como hacerlo.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

160

Page 81: Manual de Excel VBA

Navigation: Macros > Hojas >

AgregarPara agregar una nueva hoja al libro utilizamos la instrucción Add. Si queremos agregar una nueva hora al libroactivo utilizamos el siguiente código:

Sub AgregarHoja()ActiveWorkbook.Worksheets.AddEnd Sub

Otra forma de hacerlo es:

Sub AgregarHoja()Dim Hoja As WorksheetSet Hoja = Worksheets.AddEnd Sub

Utilizando los códigos anteriores la nueva hoja creada se colocará justo delante de la hoja activa de nuestrolibro activo.

Si quisiéramos crear una nueva hoja en nuestro libro, y que fuera colocada a la derecha de todas las demashojas, 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 casoWorksheets.

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 enuna plantilla existente, especifica la ruta de acceso a dicha plantilla. El valor predeterminado es xlWorksheet.

Teniendo en cuenta lo anterior, podríamos hacer:

Sub Agregar()Dim Hoja As WorksheetSet 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)".

161

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 WorksheetSet 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 WorksheetSet 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 alcomienzo de la macro:

Sub Agregar()On Error Resume NextDim Hoja As WorksheetSet 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 WorksheetSet Hoja = Worksheets.Add(before:=Sheets(3), Count:=10)End Sub

y si esta 3º hoja se llamara "Ventas":

Sub Agregar()Dim Hoja As WorksheetSet Hoja = Worksheets.Add(before:=Sheets("Ventas"), Count:=10)End Sub

162

Page 82: Manual de Excel VBA

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

163

Navigation: Macros > Hojas >

SelecionarDentro de los libros de excel, podemos encontrar hojas y gráficos. Para referirnos a una hoja dentro de un librotenemos distintas posibilidades. Podemos utilizar las instrucciones Select o Activate (en la sección siguienteveremos 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 activoActiveWorkbook.Sheets(1).Select' para seleccionar la segunda hoja del libro activoActiveWorkbook.Sheets(2).Select' para seleccionar la tercera hoja del libro activoActiveWorkbook.Sheets(3).SelectEnd Sub

Ahora bien, si una hoja esta oculta no podremos seleccionarla ni activarla. Esto lo solucionamos de la siguienteforma:

Sub Seleccionar()With ActiveWorkbook.Sheets(1) .Visible = True .SelectEnd WithEnd Sub

o bien:

Sub Seleccionar()With Sheets(1) .Visible = True .ActivateEnd WithEnd 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 activoActiveWorkbook.Sheets("Hoja2").SelectEnd Sub

o lo que es lo mismo en caso de que una hoja este oculta:

Sub Seleccionar()With ActiveWorkbook.Sheets("Hoja2") .Visible = True

164

Page 83: Manual de Excel VBA

.SelectEnd WithEnd Sub

Para selecionar todas las hojas de un libro utilizaremos la siguiente instruccion:

Sub SeleccionarTodas()Activeworkbook.Sheets.SelectEnd Sub

La instrucción anterior a su vez activará una hoja...cual? La primera del libro. La manera de comprobarlo essencilla, 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)).SelectEnd 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)).SelectEnd 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")).SelectEnd Sub

Con esta otra instrucción selecionaríamos las hojas cuyos nombres son: "ventas","compras", "resultado" yactivaría la hoja "ventas".

Sub Seleccionar ()ActiveWorkbook.Sheets(Array("ventas","compras", "resultado")).SelectEnd Sub

También podemos al mismo tiempo mezclar ambos métodos comentados antes (seleccionar por nombre o pornúmero de hoja):

165

Sub Seleccionar ()ActiveWorkbook.Sheets(Array(1, 2, "ventas")).SelectEnd Sub

En el ejemplo anterior la hoja activa sería la primera de nuestro libro y las hojas selecionadas serían las 2primeras y la llamada "ventas".

Recordar que la hoja activa siempre es la que figura como primer miembro del array.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

166

Page 84: Manual de Excel VBA

Navigation: Macros > Hojas >

Selecionar vs. ActivarConviene recordar la diferencia entre selecionar y activar una hoja (la diferencia es la misma entre seleccionar yactivar 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 enlas columnas B y C y las filas 2 y 15, ambas inclusive, pero entre todas estas celdas seleccionadas tan solo unade ellas es la Activa, es decir aquella sobre la que observaríamos como escribimos algo cuando tecleamos ennuestro teclado. Del mismo modo podemos tener tres hojas seleccionadas al mismo tiempo, pero tan solo unade 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 libroSheets(1).Select'activa la 3 hoja del libroSheets(3).ActivateEnd Sub

Para seleccionar una hoja debemos tener en cuenta si está oculta o no, pues de lo contrario no podemosselecionarla, por ej:

With ActiveWorkbook.Sheets(1) .Visible = True .SelectEnd With

Para selecionar todas las hojas de un libro utilizaremos la siguiente instruccion:

Sub SeleccionarTodasactiveworkbook.Sheets.selectEnd 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.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

167

Navigation: Macros > Hojas >

Mover HojasPara mover hojas de un lugar del libro a otro debemos utilizar la instrucción Move, la cual desplaza la hoja decá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 especificarBefore si se especifica After.After Variant (opcional): la hoja de cálculo después de la cual se situará la desplazada. No se puede especificarAfter 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, tansolo 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 macroanterior 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 2delante de la hoja 1, y después moveria la hoja 2 al final de todo hacia la derecha.

Sub moverHoja()Dim Hoja As Worksheet

Set Hoja = ActiveSheet Hoja.Move before:=Sheets(1)

Set Hoja = Sheets(1) Hoja.Move after:=Sheets(Sheets.Count)End Sub

La siguiente macro realizaría la misma función en un libro con 3 hojas:

Sub moverHoja()Dim Hoja As Worksheet

Set Hoja = Sheets(2) Hoja.Move before:=Sheets(1)

Set Hoja = Sheets(1) Hoja.Move after:=Sheets(Sheets.Count)End Sub

168

Page 85: Manual de Excel VBA

La siguiente macro contiene 2 líneas absurdas ya que al ser en principio, Hoja1 la primera hoja cuando abrimosun 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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

169

Navigation: Macros > Hojas >

Borrar HojasCuando se elimina una hoja o un libro, excel siempre nos pide confirmación, del mismo modo que cuandoeliminamos 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 pideconfirmar la eliminación. Este cuadro de diálogo se muestra de manera predeterminada. Al llamar a estemé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 dediá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 observaremoscuando se ejecute el código:

Sub BorrarHoja() Sheets("Hoja1").DeleteEnd 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 = FalseSheets("Hoja1").DeleteApplication.DisplayAlerts = TrueEnd Sub

En este otro ejemplo se elimina la hoja situada en primer lugar del libro activo sin mostrar el cuadro de diálogode confirmación:

Sub borrarHoja()Application.DisplayAlerts = FalseSheets(1).DeleteApplication.DisplayAlerts = TrueEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

170

Page 86: Manual de Excel VBA

Navigation: Macros > Hojas >

Copiar HojasPara 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 sise especifica After.After Variant (opcional): la hoja de cálculo después de la cual se copiará ésta. No se puede especificar After sise especifica Before.

Veamos un ejemplo de cómo copiar una hoja:

Sub Copiar()' Copiamos la Hoja1 después de la Hoja3Worksheets("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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

171

Navigation: Macros > Hojas >

Copiar HojasPara 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 sise especifica After.After Variant (opcional): la hoja de cálculo después de la cual se copiará ésta. No se puede especificar After sise especifica Before.

Veamos un ejemplo de cómo copiar una hoja:

Sub Copiar()' Copiamos la Hoja1 después de la Hoja3Worksheets("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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

172

Page 87: Manual de Excel VBA

Navigation: Macros > Hojas >

Ocultar/Mostrar HojasLa propiedad para mostrar u ocultar es Visible y debemos asignarle True o False en caso de querer mostrar uocultar, respectivamente. Todo libro debe tener al menos una hoja visible. Esto implica que si el libro tiene 10hojas 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=FalseEnd Sub

Y para volver a mostrar la hoja oculta simplemente cambiamos el False por True:

Sub Mostrar ()ActiveWorkbook.Sheets(1).Visible=TrueEnd Sub

También podemos ocultar varias hojas utilizando la instrucción Array:

Sub OcultarActiveWorkbook.Sheets(Array(1, 2, "ventas")).Visible = FalseEnd Sub

La instrucción anterior oculta las dos primeras hojas como así también la hoja llamada "ventas". Ahora bien, laintrucción no funcionaría para volver a mostrar, ya que esto debe ser realizado de una en una.

Sub Mostrar()Sheets(1).Visible = TrueSheets(2).Visible = TrueSheets("ventas").Visible = TrueEnd Sub

Esta manera de ocultar las hojas no evitaría poder saber que existen hojas ocultas. Podríamos saber si hayhojas ocultas desde el menú Formato > Hojas > Mostrar de Excel y podríamos observar el nombre de las hojasocultas, aún cuando estas estuvieran ocultas con una contraseña que nos impidiera mostrarlas. Que nopodamos 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 cuandoestas hojas no contengan contraseña para ser desprotegidas) deberíamos hacer:

Sub SuperOcultas()ActiveWorkbook.Sheets("ventas").Visible = xlSheetVeryHiddenEnd Sub

173

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

174

Page 88: Manual de Excel VBA

Navigation: Macros > Hojas >

NombrarPara 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 enminúsculas, ya que:

Sheets("Ventas").selectSheets("VenTAs").selectSheets("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) yfinalmente 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 ellibro.

Ante el caso de que otra de nuestras hojas se llamara "ventas" nos encontraríamos ante un error decompilación, ya que no es posible llamar dos hojas con el mismo nombre. Entonces, primero deberíamosrenombrar previamente.

175

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

176

Page 89: Manual de Excel VBA

Navigation: Macros > Hojas >

Proteger / Desproteger HojasPara proteger y desproteger una hoja sin contraseña, utilizamos las intrucciones Protect y Unprotect, tal comose ve a continuación:

' Para proteger la primera hojaSub Proteger ()Sheets(1).ProtectEnd Sub

' Para desproteger la primera hojaSub Desproteger()Sheets(1).UnprotectEnd Sub

Para realizar lo anterior, pero utilizando como contraseña la palabra "hola", debemos agregar la propiedadPassword, tal que:

' Para proteger la primera hoja con la palabra 'hola'Sub Proteger ()Sheets(1).Protect Password:="hola"End Sub

' Para desproteger la primera hoja con la palabra 'hola'Sub Desproteger()Sheets(1).Unprotect Password:="hola"End Sub

Desde Excel no podemos proteger varias hojas en simultáneo, nos obliga proteger una a una. Sin embargodesde una macro sí podemos proteger las hojas que querramos de forma simultánea. La siguiente macroprotegería todas las hojas del libro activo, excepto las hojas que son gráficos. Además las protegería con lacontraseñ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 IfEnd With

Next ShtEnd Sub

Ahora bien, existen gran cantidad de datos y elementos dentro de las hojas que queremos proteger (y otra grancantidad 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 aplicarla protección a algún elemento en particular):

177

Sub ProtegerTodo()With ActiveSheet

.Protect DrawingObjects:=True' Protegemos objetos

.Protect Contents:=True' Protegemos contenidos

.Protect Scenarios:=True' Protegemos escenarios

.Protect AllowFormattingCells:=True' Protegemos formato de celdas

.Protect AllowFormattingColumns:=True' Protegemos formato de columnas

.Protect AllowFormattingRows:=True' Protegemos formato de filas

.Protect AllowInsertingColumns:=True' Protegemos la posibilidad que se inserten columnas

.Protect AllowInsertingRows:=True' Protegemos la posibilidad que se inserten filas

.Protect AllowInsertingHyperlinks:=True' Protegemos la posibilidad que se inserten hipervícnulos

.Protect AllowDeletingColumns:=True' Protegemos la posibilidad que se borren columnas

.Protect AllowDeletingRows:=True' Protegemos la posibilidad que se borren filas

.Protect AllowSorting:=True' Protegemos la posibilidad que se utilice la opción de Ordenar

.Protect AllowFiltering:=True' Protegemos la posibilidad que se utilice la opción de Filtrar

.Protect AllowUsingPivotTables:=True' Protegemos la posibilidad que se utilicen Tablas Dinámicas

.Protect Password:="WW"' Asignamos la clave de protección 'WW'

End WithEnd Sub

En la macro anterior protegemos todo dentro de la hoja, y lo hacemos con la contraseña "WW" la cual SI quedistingue entre mayúsculas y minúsculas. Recuerda que si no quisiéramos proteger alguna de esaspropiedades bastaría con poner:=False.

178

Page 90: Manual de Excel VBA

No obstante conviene entender que hay propiedades que al ser aplicadas impiden que otras que no han sidoaplicadas puedan ser utilizadas (en este sentido es como si yo te dejara ver un partido en el estadio de fútboldel Real Madrid, pero te impidiera estar en Madrid). Lógicamente no podrías llegar a ver el partido, pues una delas restricciones impide otro de los permisos. Lo mismo ocurre en Excel, por lo que debemos tener cuidado yrecordar esto.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

179

Navigation: Macros > Hojas >

Vista Previa de HojasLa Vista previa no es una opción muy utilizada, salvo en las macros de evento, las cuales son ejecutadascuando 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 dellibro.

Si quisiéramos evitar que alguien utilizara la vista preliminar, haríamos:

Private Sub Workbook_BeforePrint(Cancel As Boolean)Cancel = TrueEnd Sub

La macro anterior anularía la utilidad del botón de vista preliminar, pues el mismo quedaría inutilizado deinmediato.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

180

Page 91: Manual de Excel VBA

Navigation: Macros > Hojas >

Imprimir HojasPara imprimir la hoja actual hacemos la instrucción PrintOut, tal que:

Sub ImprimeHoja ()ActiveSheet.PrintOutEnd 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.PrintOutEnd Sub

En la macro anterior, cuando queremos imprimir un rango, es necesario agregar la instrucción Address, casocontrario no funcionará.

Si deseamos poner un encabezado a la izquierda de cada hoja, con la frase "Reporte Trimestral" (o cualquierotro mensaje):

Private Sub Workbook_BeforePrint(Cancel As Boolean)Dim Sht As Worksheet

For Each Sht In ThisWorkbook.SheetsWith Sht.PageSetup

.LeftHeader = "Reporte Trimestral" ' O cualquier otro mensaje...End With

Next ShtEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

181

Navigation: Macros > Hojas >

Color de HojasEs posible cambiar el color de las etiquetas (las que figuran en la parte inferior y muestran el nombre de lahoja). La etiqueta es el objeto Tab y con su propiedad ColorIndex podemos cambiar su color. Esto solo sepuede hacer en Excel 2.002 o superior (en versiones anteriores de Excel NO es posible cambiar el color deetiquetas de hojas).

También podrías cambiar el color de etiqueta de hoja con clic derecho sobre la misma y eligiendo la opción"Color de Etiquetas".

Para cambiar el color de etiqueta con una macro (Excel 2.002 o superior) podemos hacer:

Sub ColorEtiqueta()ActiveWorkbook.Sheets("Hoja1").Tab.ColorIndex = 5End Sub

El número que se le asigna a ColorIndex indica el color. Si quieres averiguar el número correspondiente para undeterminado color, puedes hacer lo siguiente:

1. Clic derecho sobre una etiqueta de hoja2. Elige la opción "Color de Etiquetas"3. Elige un color de la paleta4. Aceptar5. En la ventana Inmediato del editor VBA escribe: ?Activesheet.Tab.ColorIndex6. Enter

Verás que aparece un número que representa el color de la etiqueta. Podrás utilizar dicho número en la macro.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

182

Page 92: Manual de Excel VBA

Navigation: Macros > Hojas >

Ordenar HojasPara ordenar las hojas se suele utilizar la instrucción Move. Una forma rápida de ordenar las hojas de un libroalfabéticamente en el orden ascendente y/o descendente es:

Sub OrdenarAscendentemente()Dim X As Integer, Y As Integer

For X = 1 To Sheets.CountFor Y = X To Sheets.CountIf UCase(Worksheets(Y).Name) < UCase(Worksheets(X).Name) Then

Worksheets(Y).Move Before:=Worksheets(X)End If

Next YNext X

End Sub

Sub OrdenarDescendentemente()Dim X As Integer, Y As Integer

For X = 1 To Sheets.CountFor Y = X To Sheets.CountIf UCase(Worksheets(Y).Name) > UCase(Worksheets(X).Name) Then

Worksheets(Y).Move Before:=Worksheets(X)End If

Next YNext X

End Sub

También se podrían ordenar las hojas de un libro utilizando un array con los nombres de las hojas, ordenandoeste 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 elorden necesario.

Otras maneras de ordenar podrían ser:

Sub OrdenarAscendentemente()Dim X As Long, Y As Long

For X = 1 To Worksheets.Count Y = X

Do While Y > 1If Worksheets(Y).Name < Worksheets(Y - 1).Name Then

Worksheets(Y).Move Before:=Worksheets(Y - 1)End If

Y = Y - 1Loop

NextEnd Sub

183

Sub OrdenarDescendentemente()Dim X As Long, Y As Long

For X = 1 To Worksheets.Count Y = X

Do While Y > 1If Worksheets(Y).Name > Worksheets(Y - 1).Name Then

Worksheets(Y).Move Before:=Worksheets(Y - 1)End If

Y = Y - 1Loop

NextEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

184

Page 93: Manual de Excel VBA

Navigation: Macros >

RangosMediante macros VBA podemos manipular de distintas formas los rangos y celdas de las hojas Excel. En estecapítulo veremos como hacerlo.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

185

Navigation: Macros > Rangos >

Selección de celdasExisten 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 seleccionarSub Seleccionar ()Range("C4").SelectEnd Sub

' Esta es otra terminología válida para seleccionarSub Seleccionar ()[C4].SelectEnd Sub

' Finalmente podemos seleccionar de esta otra forma' El primer Nº equivale a fila y el segundo a columna.Sub Seleccionar ()Cells(4, 3).SelectEnd Sub

En los 3 casos anteriores se selecciona la celda C4. En el primer caso utilizamos el objeto Range y en el tercercaso el objeto Cells.También podemos seleccionar determinadas celdas (con datos, con fórmulas, etc). En la siguiente macroiremos seleccionando distintos tipos de celdas:

Sub Seleccionando ()On Error Resume Next' Colocamos On Error Resume Next' para evitar el error re compilación derivado de no poder selecionar un rango que no existe' por ej., si la hoja activa no tuviera comentarios, no podríamos selecionarla con el código

' Para seleccionar todas la celdas que contienen comentarios.Cells.SpecialCells(xlCellTypeComments).Select

'Para seleccionar todas la celdas cuyo valor es una constante.Cells.SpecialCells(xlCellTypeConstants, 23).Select

' Para seleccionar todas la celdas que contienen fórmulas.Cells.SpecialCells(xlCellTypeFormulas, 23).Select

' Para seleccionar todas la celdas vacías, dentro de la región usada. Cells.SpecialCells(xlCellTypeBlanks).Select

' Para seleccionar todas la celdas visibles en nuestra hoja.Cells.SpecialCells(xlCellTypeVisible).Select

End Sub

Conviene deducir que si quisiéramos seleccionar las celdas que contienen comentarios en un rango concreto y

186

Page 94: Manual de Excel VBA

no en toda la hoja deberíamos utilizar:

Sub Seleccion ()On Error Resume Next

' Método 1Range("A1:G10").SpecialCells(xlCellTypeComments).Select

' Método 2[A1:G10].SpecialCells(xlCellTypeComments).Select

' Método 3Range(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 aunas coordenadas indicadas. Esta instrucción requiere que le indiquemos un origen y una cantidad de filas ycolumnas desde el origen (es muy útil para seleccionar rangos variables).

La sintaxis es: Origen.Offset.(filas, columnas).select.

Las filas y números se indican como números. Si estos son positivos el desplazamiento es hacia abajo -derecha respectivamente. Si son negativos el desplazamiento es hacia arriba - izquierda respectivamente.

Veamos los siguiente ejemplos para entender mejor la selección con Offset:

Sub Selecciona ()On Error Resume Next

187

' 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+4End Sub

Con la macro anterior iriamos desde la celda F7 hasta la última celda no vacía hacia abajo. Luego nosdesplazaríamos 4 celdas desde esta nueva posición hacia abajo.

188

Page 95: Manual de Excel VBA

Luego iríamos hasta la última celda no vacía hacia la derecha desde esta nueva posición. Finalmente de nuevohacia 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)).selectEnd 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)).SelectEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

189

Navigation: Macros > Rangos >

Selección de rangosVeamos ahora distintas formas equivalentes de seleccionar un rango:

' Método clásico para seleccionar el rango de celdas B6:B10Sub Seleccionar ()Range("B6:B10").SelectEnd Sub

Sub Seleccionar ()'Otro método para seleccionar el rango de celdas B6:B10[B6:B10].SelectEnd Sub

Supongamos que queremos seleccionar un rango, pero no conocemos su dimensión, por ejemplo porque lamisma va cambiando. Un ejemplo puede ser una tabla donde se van agregando nuevos registros. Con lainstrucción CurrentRegion Excel seleccionará todo el rango utilizado automáticamente, aunque no conozcamossu tamaño de antemano:

' Selecciona la región actualSub Seleccionar ()Selection.CurrentRegion.SelectEnd Sub

Con la macro anterior se seleciona el cuadrante, rectángulo y/o cuadrado de celdas adyacentes a nuestra celdaactiva. 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 celdadeterminada, por ejemplo:

' Selecciona el rectángulo adyacente a C2.Sub Seleccionar ()[C2].CurrentRegion.SelectEnd Sub

o también podemos hacer:

' Selecciona el rectángulo adyacente a C2.Sub Seleccionar ()Range("C2").CurrentRegion.SelectEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

190

Page 96: Manual de Excel VBA

191

Navigation: Macros > Rangos >

Selección de filasPara 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").SelectEnd Sub

' Selecciona la fila 4.Sub SeleccionaFila ()Rows("4:4").SelectEnd Sub

' Selecciona desde la fila 4 hasta la 11, ambas inclusiveSub SeleccionaFilas ()Rows("4:11").SelectEnd Sub

' Selecciona las siguientes filas a la vez: 4,8,15 y 22.Sub SeleccionaFilas ()Range("4:4,8:8,15:15,22:22").SelectEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

192

Page 97: Manual de Excel VBA

Navigation: Macros > Rangos >

Selección de columnasPara seleccionar columnas podemos utilizar la instrucción Columns.Select, tal como vemos en las siguientesmacros:

Sub SeleccionaColumna ()' Selecciona la Columna BColumns("B:B").Select

' Selecciona la Columna HColumns("H:H").Select

' Selecciona des de la Columna C hasta la FColumns("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").SelectEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

193

Navigation: Macros > Rangos >

Otras seleccionesPara seleccionar todas las celdas que contengan cierto color:

Sub SeleccionarPorColor()On Error Resume Next

Dim Columna As Single, Fila As LongDim 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 activ' 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 c

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 = ActiveCellFor Each Rg In miRango

If Rg.Interior.ColorIndex = ActiveCell.Interior.ColorIndex ThenSet RgColores = Union(RgColores, Rg)

End IfNext Rg

RgColores.SelectEnd 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 LongDim Rg As Range, miRango As Range, RgValores As Range'vamos a selecionar todas las celdas del UsedRange que contengan el valor que introduzcamos:

Dim MiValor As String MiValor = InputBox("Introduce el valor que deseas selecionar!", "Por Favor:")

With ActiveSheet Fila = Range([A1], .UsedRange).Rows.Count Columna = Range([A1], .UsedRange).Columns.Count

Set miRango = Range([A1], Cells(Fila, Columna))End With

For Each Rg In miRangoIf LCase(Rg.Value) = LCase(MiValor) Then

If X = 0 Then X = 1: Set RgValores = Rg

ElseSet RgValores = Union(RgValores, Rg)

End IfEnd If

Next Rg RgValores.SelectEnd Sub

194

Page 98: Manual de Excel VBA

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 LongDim 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 miRangoIf Application.CountIf(miRango, Rg.Value) = 1 Then

If X = 0 Then X = 1: Set RgValores = Rg

ElseSet RgValores = Union(RgValores, Rg)

End IfEnd If

Next Rg RgValores.SelectEnd 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 LongDim 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 miRangoIf Application.CountIf(miRango, Rg.Value) > 1 Then

If X = 0 Then X = 1: Set RgValores = Rg

ElseSet RgValores = Union(RgValores, Rg)

End IfEnd If

Next Rg RgValores.SelectEnd Sub

Excel considera que pese a que tengamos 65.536 filas y 256 columnas, prácticamente siempre utilizamos una ícantidad de estas filas y columnas.

195

Para saber el rango de celdas que utilizamos basta con utilizar el siguiente código:

Sub Rango()ActiveSheet.UsedRange.SelectEnd Sub

Para selecionar desde la celda A1 hasta la última celda del rango utilizado:

Sub Rango()Range([a1], ActiveSheet.UsedRange).SelectEnd Sub

Para selecionar la última celda con datos del rango utilizado (suponemos que tenemos seleccionado B4:D4):

Sub Seleccion ()

' Esto daría como resultado 5R = Range([a1], ActiveSheet.UsedRange).Rows.Count

' Esto daría como resultado 4C = Range([a1], ActiveSheet.UsedRange).Columns.Count

' Selecionaría la celda D5Cells(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 1Sub Seleccionar ()' Definimos las variablesDim R As Long, C As Single

' Utilizamos R que indicaría la última fila que contiene datosR = Range([A1], ActiveSheet.UsedRange).Rows.Count

' Utilizamos C que indicaría la última columna que contiene datosC = Range([A1], ActiveSheet.UsedRange).Columns.Count

'Selecionamos la última celda del rango UsedRangeCells(R, C).SelectEnd Sub

' Método 2Sub Seleccionar ()

196

Page 99: Manual de Excel VBA

' Definimos las variablesDim R As Long, C As SingleWith [A1].SpecialCells(xlCellTypeLastCell) R = .Row C = .ColumnEnd WithCells(R, C).SelectEnd Sub

' Método 3Sub Seleccionar ()' El código on error evita el error debido a que no haya celdas con valorOn Error Resume Next' Definimos las variablesDim R As Long, C As SingleR = Cells.Find("*", Range("A1"), xlFormulas, , xlByRows, xlPrevious).RowC = Cells.Find("*", Range("A1"), xlFormulas, , xlByColumns, xlPrevious).ColumnCells(R, C).SelectEnd Sub

' Método 4Sub Seleccionar ()With Selection.CurrentRegion.Cells(.Cells.Count).SelectEnd WithEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

197

Navigation: Macros > Rangos >

Insertar rangosComo es lógico de suponer, existen numerosas maneras de insertar rangos, para lo cual utilizamos lainstrucció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 AColumns("A:A").Insert

' También inserta una nueva columna a la izquierda de la columna A[A1].EntireColumn.Insert

' Inserta una nueva fila sobre la fila 1[A1].EntireRow.Insert

End Sub

También podemos insertar tantas nuevas filas o columnas como tenga el rango:

Sub Inserta ()

' Inserta 3 nuevas columnas a la izquierda de la columna BRange("B1:D10").EntireColumn.Insert

' Inserta 5 nuevas filas sobre la fila 10.Rows("10:15").Insert

End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

198

Page 100: Manual de Excel VBA

Navigation: Macros > Rangos >

Borrar rangosPodemos borrar comentarios, contenidos, formatos, etc. En general utilizamos la instrucción Clear seguida de loque queremos borrar. A continuación vemos como hacerlo:

' Borra los comentarios sobre la celda A1Sub Borrar ()Range("A1").ClearCommentsEnd Sub

' Limpia la celda A1 de cualquier formato que tenga, por ej. colorSub Borrar ()[A1].ClearFormatsEnd Sub

' Borra el contenido de la celda A1, no el formatoSub Borrar ()Cells(1,1)..ClearContentsEnd 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 anteriorEnd WithEnd 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).ClearContentsEnd Sub

También podemos realizar borrados sobre filas y columnas enteras:

Sub Borrar ()On Error Resume Next

' Borra toda informacion de la Fila 1.

199

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 inclusivesRows("10:15").Clear

' Borra toda la información del rango actual utilizado, comenzando desde A1Rango("A1").CurrentRegion.Clear

End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

200

Page 101: Manual de Excel VBA

Navigation: Macros > Rangos >

Copiar y pegar rangosPara copiar rangos utilizamos el método Copy. Algunos ejemplos sobre cómo copiar son:

Sub Copiar()

' Copia la celda C4Range("C4").Copy

' Copia la celda C4, esta es otra terminología también válida.[C4].Copy

' Copia la celda C2 (la primera posición equivale a fila y la segunda a columna).Cells(2, 4).Copy

' Copia el rango de celdas B6:B10Range("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 quSelection.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 BColumns("B:B").Copy

' Copia desde la Columna C hasta la F, ambas inclusiveColumns("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

201

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 pegadaRange("B1").Copy Destination:=Range("C1")

A la hora de pegar podemos elegir que es lo que queremos pegar: valores, formatos, todo, etc. La opción másvalores. La lista de las cosas que podemos pegar es:

Valores con formatos: xlPasteValuesAndNumberFormatsValores: xlPasteValuesValidación xlPasteValidationFórmulas y números: xlPasteFormulasAndNumberFormatsFórmulas: xlPasteFormulasFormatos: xlPasteFormatsComentarios: xlPasteCommentsAncho de columna: xlPasteColumnWidthsTodo excepto bordes: xlPasteAllExceptBordersTodo: xlPasteAll

Veamos ejemplos sobre como pegar distintas cosas:

Sub Copiar()

' Copia la celda A1 y la pega en B1Range("A1").CopyRange("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 B1Range("A1").CopyCells(1, 2).PasteSpecial(xlPasteAll)

' Copia la celda A1 pero solo pega el valor en B1, no el formatoRange("A1").Copy[B1].PasteSpecial(xlPasteValues)

' Copia la celda A1 y pega solo la fórmula en B1, ni el valor ni el formatoRange("A1").CopyRange("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

202

Page 102: Manual de Excel VBA

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

203

Navigation: Macros > Rangos >

Nombrar rangosExisten varias maneras de nombrar un rango. Cuando hacemos esto desde Excel, sin macros, primeseleccionamos 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 esrango con el nombre que le hayamos dado).

Otra forma de nombrar un rango es seleccionándolo y luego encima de la columna A, existe un espacio que nos dinformació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 constanteNames.Add Name:="Euro", RefersTo:=166.67

' En el caso de que quisieramos crear un nombre para refererirnos al rango A1:B4 con el nombre VenRange("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 duna Tabla Dinámica. En lugar de tener que cambiar el rango utilizado en la TD, cada vez que añadimos un nuevregistro 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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

204

Page 103: Manual de Excel VBA

Navigation: Macros > Rangos >

Combinar rangosPara combinar celdas utilizamos la instrucción MergeCells. Solo podemos combinar celdas que estén contiguasy 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:D4Sub Combinar ()Application.DisplayAlerts = FalseRange("B4:D4").MergeCells = TrueEnd 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íamosmodificar la macro anterior agregando una nueva línea al comienzo:

' Combinar las celdas del rango B4:D4 y evitar confirmaciónSub Combinar ()Application.DisplayAlerts = FalseRange("B4:D4").MergeCells = TrueEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

205

Navigation: Macros > Rangos >

Ocultar y mostrar rangosPara ocultar o mostrar filas debemos utilizas la instrucción Hidden y luego le asignamos True o False paraocultar o mostrar respectivamente. Por ej.:

Sub Ocultar ()

' Ocultar la fila 3Rows("3:3").EntireRow.Hidden = True

' Ocultar varias filas contiguas, aún cuando no es necesario selecionar un rango para operar con élRows("7:14").SelectSelection.EntireRow.Hidden = True

' Ocultar varias filas no contiguasRange("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 3Rows("3:3").EntireRow.Hidden = FalseEnd Sub

Para ocultar columnas es exactamente igual:

Sub Ocultar ()

' Ocultar la columna B, sin selecionarla primeroColumns("B:B").EntireColumn.Hidden = True

' Ocultar las columnas contiguas D,E,F y G selecionándolas primeroColumns("D:G").SelectSelection.EntireColumn.Hidden = True

' Ocultar varias columnas discontínuas, sin necesidad de selecionarlasRange("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.

206

Page 104: Manual de Excel VBA

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

207

Navigation: Macros > Rangos >

Proteger y desproteger rangosPara proteger utilizamos la instrucción Locked, y luego le asignamos True o False para proteger o desprotegerrespectivamente. La protección de rangos es útil cuando queremos proteger el libro o la hoja ya que de locontrario carece de sentido, de hecho por defecto todas las celdas de un libro y/o una hoja estan protegidasinicialmente.

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 macrospara proteger rangos:

Sub Proteger ()

' Protege el rango seleccionadoSelection.Locked = True

' Protege el rango indicadoRange("T7:T16").Locked = True

' Protege la celda indicadaRange("T11").Locked = True

' Desprotege el rango indicadoRange("T7:T16").Locked = False

End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

208

Page 105: Manual de Excel VBA

Navigation: Macros > Rangos >

Transponer rangosLa operación de transponer se realiza cuando queremos que los valores de una fila se copien como unacolumna 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 columnaRange("A1:A15").CopyRange("D4").PasteSpecial Paste:=xlPasteAll, Transpose:=True

' Convertir columna en filaRange("A1:B10").CopyRange("D4").PasteSpecial Paste:=xlPasteAll, Transpose:=True

End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

209

Navigation: Macros > Rangos >

Ordenar rangosLa ventaja de ordenar rangos desde macros es que podemos ordenar siguiendo más de 3 criterios, que es elmá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. Paraordenar 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:=xlGuessEnd With

End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

210

Page 106: Manual de Excel VBA

Navigation: Macros > Rangos >

Borrar rangosPara borrar utilizamos la instrucción Clear. Existen distintas cosas que podemos borrar: borrar todo, soloformatos, solo contenidos, etc.

El borrado es sencillo:

Sub Borrar ()With Range("A1").CurrentRegion' Borra comentarios .ClearComments' Borra contenidos .ClearContents' Borra formatos .ClearFormats' Borra notas .ClearNotes' Borra todo .ClearEnd WithEnd Sub

En la macro anterior hemos ido realizando un borrado escalonado, para al final resumir todo en un únicoborrado que realizaría todo lo anterior de una vez (instrucción Clear), es decir, que si queremos borrar todojunto directamente utilizamos Clear.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

211

Navigation: Macros > Rangos >

Imprimir rangosPara definir el rango a imprimir utilizamos la instrucción PrintArea. Es conveniente que definamos y guardemosel 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.PrintOutEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

212

Page 107: Manual de Excel VBA

Navigation: Macros > Rangos >

Eliminar filas vacíasExisten muchas formas de eliminar las filas vacías. Supongamos que tenemos una base de datos o tabla definida 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ónDim FilaBorrable As RangeSet FilaBorrable = Range("B:B").Find(what:="")

Do Until FilaBorrable Is Nothing FilaBorrable.Select FilaBorrable.EntireRow.Delete

Set FilaBorrable = Range("B:B").FindNextLoop

End Sub

El método anterior tiene el inconveniente que si el rango es muy grande y hay muchas filas vacías, el looping seApplication.ScreenUpdating = False

Segundo método para borrar filas vacías

Sub BorrarFilasVacias1()Dim X As LongDim R As Long

' Para aumentar la velocidad de ejecuciónWith 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 IfNext X

End WithEnd 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 RangeDim R As Single

' Para aumentar la velocidad de ejecución Application.ScreenUpdating = False

213

' insertamos una nueva fila para después aplicar un criterio de búsqueda y borrar los valores obtenidoWith ActiveSheet .Rows(1).Insert .Cells(1, 2) = "Valores a borrar" R = Range(.Range("B2"), .UsedRange).Rows.CountSet FilaBorrable = Range("B1", Cells(R, 2)) FilaBorrable.AutoFilter Field:=1, Criteria1:=""'Borra solo las celdas visibles FilaBorrable.SpecialCells(xlCellTypeVisible).EntireRow.Delete .UsedRangeEnd WithEnd Sub

El anterior es el método más rápido.

Recuerda que para desocultar todas las filas y columnas ocultas debes hacer:

Sub Desocultar()With Cells

.EntireColumn.Hidden = False .EntireRow.Hidden = False

End WithEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

214

Page 108: Manual de Excel VBA

Navigation: Macros > Rangos >

Restringir movimientoCon la instrucción ScrollArea podremos hacer que un usuario solo pueda moverse dentro de un rangodeterminado de la hoja Excel. Veamos un ejemplo sencillo:

' Limitamos el movimiento al rango A1:G15 de la Hoja1Sub LimitarMov()ActiveWorkbook.Worksheets("Hoja1").ScrollArea = "A1:G15"End Sub

' Eliminamos la limitación anteriorSub QuitarLimitacion()ActiveWorkbook.Worksheets("Sheet1").ScrollArea = ""End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

215

Navigation: Macros > Rangos >

Scroll BarsCada hoja Excel tiene una barra vertical y horizontal que al moverla nos permite desplazarnos por la hoja haciaabajo 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 dedó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 1ActiveWindow.ScrollRow = 1' Movemos el ScrollBar horizontal a la columna 1ActiveWindow.ScrollColumn = 1Range("A1").SelectEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

216

Page 109: Manual de Excel VBA

Navigation: Macros >

ArraysLos Arrays son conjuntos de elementos y son muy útiles a la hora de manipular varios objetos de formasimultá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 Extrasque se envían junto con el Manual.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

217

Navigation: Macros > Arrays >

DefiniciónUn Array es un grupo de elementos secuencialmente puestos con un índice, que tienen el mismo nombre y tipode 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 lainstrucción Dim.

En resumen, un array es un grupo de elementos del mismo tipo, cada elemento en un grupo array es único ypuede 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 3Dicho 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 elprimer elemento.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

218

Page 110: Manual de Excel VBA

Navigation: Macros > Arrays >

FijosUna array con los días de la semana (número fijo de elementos)

Sub EjArrays()Dim DiaSemana(0 To 6) As String' Tambien podríamos poner:' Dim DiaSemana(6) As String, es decir un array de 7 elementos DiaSemana(0) = "Lunes" DiaSemana(1) = "Martes" DiaSemana(2) = "Miércoles" DiaSemana(3) = "Jueves" DiaSemana(4) = "Viernes" DiaSemana(5) = "Sábado" DiaSemana(6) = "Domingo" Debug.Print DiaSemana(0) ' Esto nos permite visualizar 'Lunes' en la Ventana InmediatoEnd Sub

Recuerda que el primer elemento del array es el equivalente a DiaSemana(0). Esta terminología es unpréstamo de otros lenguajes de programación, ahora bien si quieres refererirte al primer elemento de un arraycomo miarray(1) la solución es introducir la instrucción Option Base 1 al comienzo de la macro, tal que:

Option Base 1Sub 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 InmediatoEnd Sub

La mayoría de las veces los elementos de los arrays quedan definidos desde un rango o bien desde una únicalínea tal que:

Option Base 1Sub 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 InmediatoEnd Sub

219

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

220

Page 111: Manual de Excel VBA

Navigation: Macros > Arrays >

VariablesUn array no tiene por qué tener un número fijo de elementos, es decir un array puede contener un númerovariable de elementos en cualquier momento.

Los arrays se utilizan para aumentar la velocidad de las macros pues permiten la manipulación de gran cantidadde 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 ocasioneses obligatoria.

Por ej. supongamos que queremos obtener el número de directorios existentes en en el dicos C. Deberíamosutilizar un array como el siguiente:

Sub ArrayDirectorios()Dim X As SingleDim NXls() As StringDim MiRuta As String, MiNombre As StringCells.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 ThenX = X + 1 ReDim Preserve NXls(1 To X)NXls(X) = MiNombreDebug.Print MiNombre ' Muestra la entradaEnd If ' solamente si representa un directorio. End IfMiNombre = Dir ' Obtiene siguiente entrada.LoopIf X = 0 Then MsgBox "No hay directorios en C:\": Exit SubFor X = LBound(NXls) To UBound(NXls)Cells(X, 1) = NXls(X)Next XColumns.AutoFitEnd 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.

221

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

222

Page 112: Manual de Excel VBA

Navigation: Macros > Arrays >

BidimensionalesLos 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 lasegunda 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.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

223

Navigation: Macros > Arrays >

EjemploA continuación observaremos diferentes ejemplos que utilizan arrays. Supongamos que tenemos diferentescontroles en una hoja y queremos colocarlos en determinados lugares:

Sub EjArrays()Dim X As ByteDim Rg As RangeDim MyShapesArray() As VariantDim MyShapesRgArrayDim 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 ActiveSheeMyShapesArray = Array("IShape", "SB_H", "SB_V", "BPlay", "SB_Bombs")' MyShapesRgArray en un array que contiene el lugar donde pondremos los controlesMyShapesRgArray = 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.SelectWith MyShape

'.Select'.Visible = True 'True

.Height = Rg.Height .Width = Rg.Width .Left = Rg.Left: .Top = Rg.Top

End WithEnd With

Next XEnd Sub

Este código lo utilizamos para colocar los controles en el lugar deseado. Es posible ver esta macro enfuncionamiento en los juegos:

Buscaminas.xls y MinesWeeper.xls

la macro se llama GameSetup, dentro del modulo GameSetup.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

224

Page 113: Manual de Excel VBA

225

Navigation: Macros > Arrays >

REdimCuando utilizamos el comando Redim redimensionamos el Array y al hacerlo perdemos todos los valores quehabíamos creado inicialmente, por ej:

Sub EjArrays()Dim DiaSemana() As Variant DiaSemana = Array("Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sábado", "Domingo") Debug.Print DiaSemana(1)

ReDim DiaSemana(2)' Al redimensionar el array para con 3 elementos perdemos los valores previamente asignados en:' DiaSemana = Array('Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo')' con lo que:

Debug.Print DiaSemana(1)' no devuelve valor alguno!

End Sub

La macro anterior no devuelve ningún valor porque hemos perdido los mismos al no utilizar la instrucciónREDIM PRESERVE, que la veremos en la sección siguiente.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

226

Page 114: Manual de Excel VBA

Navigation: Macros > Arrays >

PreserveLa instrucción Preserve se utiliza para conservar los valores de cada elemento, aún cuando redimensionamosel array:

Sub EjArrays()Dim NAleatorios() As VariantNAleatorios = 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).SelectEnd 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 columnaA), para referirnos a cualquier elemento de este array deberemos especificar no solo la fila sino también lacolumna.

Hemos asignado los valores de un rango a un array con lo que para referirnos a lo elementos del arraydeberemos hacerlo como si de un array bidemensional se tratara, aún cuando todas las celdas del rango esténen la misma columna como en el caso siguiente:

Private Sub RgArray_Click()Dim X As SingleDim Rango() As VariantDim miarray As Variant Rango = Range("Col1")

For X = LBound(Rango,1) To UBound(Rango,1)' Aunque podemos simplificar como: For X = LBound(Rango) To UBound(Rango)

Range("col1").Cells(X).Select Debug.Print Rango(X, 1)

Next XEnd Sub

227

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

228

Page 115: Manual de Excel VBA

Navigation: Macros >

EstructurasLas estructuras son conjuntos de instrucciones VBA que deben respetar una sintáxis determinada y que nospermiten 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 400Extras que se envían junto con el Manual.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

229

Navigation: Macros > Estructuras >

Do LoopLa instrucción Do Loop es utilizada para repetir las mismas instrucciones una y otra vez hasta que unacondició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 algunosejemplos:

Si la celda contiene datos coloreamos toda la fila:

Sub Colorea()[A1].EntireRow.Select ' Comenzamos desde la fila 1Do ' 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 siguienteLoop ' Comenzamos nuevamente 'el rulo' desde el DoEnd Sub

Podemos retocar lo anterior y poner la condición no de inicio dentro del Looping tal que:

Sub Colorea()[A1].EntireRow.SelectDo While ActiveCell.Value <> "" Selection.EntireRow.Interior.ColorIndex = 15 Selection.Offset(2).SelectLoopEnd Sub

Donde obviamente hemos tenido que cambiar la condición de = "" a <>"", es decir distinta de vacía. De haberquerido poner una condición no de inicio sino de salida, es decir que el looping se ejecute por lo menos unavez:

Sub Colorea()[A1].EntireRow.SelectDo Selection.EntireRow.Interior.ColorIndex = 15 Selection.Offset(2).SelectLoop While ActiveCell.Value <> ""End Sub

En el caso anterior, aún cuando la celda A1 estuviera vacía el looping se ejecutaría por lo menos una vez.También hubiéramos podido jugar tal que:

Sub Colorea()[A1].EntireRow.SelectDo Selection.EntireRow.Interior.ColorIndex = 15 Selection.Offset(2).SelectLoop Until ActiveCell.Value = ""End Sub

230

Page 116: Manual de Excel VBA

O bien:

Sub Colorea()[A1].EntireRow.SelectDo Until ActiveCell.Value = "" Selection.EntireRow.Interior.ColorIndex = 15 Selection.Offset(2).SelectLoopEnd 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éramosque el looping ejecutara las instrucciones internas al menos una vez.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

231

Navigation: Macros > Estructuras >

For NextLa 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 serBooleana ni un elemento de matriz.

-Principio (requerido): valor inicial del contador.

-Fin (requerido): valor final del contador.

-Incremento (opcional): cantidad en la que cambia el contador cada vez que se ejecuta el bucle. Si no seespecifica, 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 deveces.

El argumento incremento puede ser positivo o negativo. El valor del argumento incremento determina la maneraen 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 buclemediante la palabra Step tal que:

Sub For_Next()Dim X As Integer

232

Page 117: Manual de Excel VBA

' Establece 10 repeticiones, con incremento negativo de 2For X = 10 To 1 Step -2

Cells(X, 1) = XNext 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 XEnd 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 salirdel mismo. La instrucción Exit For, que se utiliza a menudo en la evaluación de alguna condición (por ejemplo,If...Then), transfiere el control a la instrucción que sigue inmediatamente a la instrucción Next. ej:

Sub For_Next()Dim X As Integer' Establece 10 repeticiones.

For X = 1 To 10If Cells(X, 1) = "" Then Exit Sub

Cells(X, 1) = XNext 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 10If Cells(X, 1) = "" Then

X=1 Cells(X, 1) = X + Cells(X, 1)

End If Cells(X, 1) = X + Cells(X, 1)

Next XEnd 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 ledaríamos a la celda (X,1) el valor igual a = X + Cells(X, 1)

233

Este otro ejemplo muestra que cambiar el valor del contador mientras está dentro de un bucle puede acarrearun 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 10If Cells(X, 1) = "" ThenX = 1ElseCells(X, 1) = XEnd IfNext XEnd Sub

En el ejemplo anterior, si el valor de la celda (1,1) estuviera vacío tendríamos un bucle repetitivo infinito ya que xsiempre sería = a 1.

Se pueden anidar bucles For...Next, colocando un bucle For...Next dentro de otro. Para ello, proporcionamos acada bucle un nombre de variable único como su contador. La siguiente construcción sería la correcta:

For I = 1 To 10For J = 1 To 10

For K = 1 To 10 ...

Next KNext J

Next I

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

234

Page 118: Manual de Excel VBA

Navigation: Macros > Estructuras >

For Each NextLa 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 lossiguientes 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 HojaEnd Sub

' Queremos borrar todo el contenido de cada hoja antes de cerrar un libroPrivate Sub Workbook_BeforeClose(Cancel As Boolean)Dim Hoja As Worksheet

For Each Hoja In ThisWorkbook.Sheets Hoja.Cells.Clear

Next HojaEnd Sub

La entrada al bloque For Each se produce si hay al menos un elemento en grupo. Una vez que se ha entradoen 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 cadaelemento. Cuando no hay más elementos en el grupo, se sale del bucle y la ejecución continúa con lainstrucció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 amenudo en la evaluación de alguna condición (por ejemplo, If...Then) y transfiere el control a la instrucción quesigue inmediatamente a la instrucción Next.

Podemos anidar bucles For Each...Next, colocando un bucle For Each...Next dentro de otro. Sin embargo, cadaelemento del bucle debe ser único.

Nota: si omitimos un elemento en una instrucción Next, la ejecución continúa como si se hubiera incluído, esdecir tanto:

For Each Cell In Range("Rg")

235

' 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 untipo Variant no puede contener un tipo definido por el usuario.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

236

Page 119: Manual de Excel VBA

Navigation: Macros > Estructuras >

While WendLa instrucción While Wend ejecuta una serie de instrucciones mientras una condición dada sea True, es decirverdadera, 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 esNull, 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 repiteel 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 sirvepara lo mismo.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

237

Navigation: Macros > Estructuras >

GoToLa instrucción GoTo es un método bastante rudo de variar el sentido que debería tomar una macro, ya quecuando una macro llega a una línea que contiene dicha instrucción "salta" al lugar especificado en GoTo (esdecir, 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). Esdecir 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").SelectAdios:End Sub

La macro anterior no realiza ninguna operación, ya que nada más empezar saltamos a la línea "Adios:" ydespués no hay más código.

Nota: en principio nunca deberíamos utilizar GoTo, pues siempre, o prácticamente siempre deberíamos sercapaces de encontrar una alternativa a través de instrucciones de control estructuradas tales como: Do...Loop,For...Next, If...Then...Else, Select Case.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

238

Page 120: Manual de Excel VBA

Navigation: Macros > Estructuras >

With End WithLa instrucción With End With ejecuta una serie de instrucciones sobre un único objeto o sobre un tipo definidopor el usuario. Permite realizar múltiples operaciones sobre el mismo objeto. La sintaxis que emplea es:

With objeto[instrucciones]

End With

Objeto (requerido): nombre de un objeto o de un tipo definido por el usuario.Instrucciones (opcional): una o más instrucciones que se van a ejecutar sobre objeto.

Veamos un ejemplo sencillo con el cual asignamos un formato a la celda A1:

' La siguiente macro NO utiliza WithSub Macro() Range("A1").Font.Bold = True Range("A1").Font.Size = 50 Range("A1").Font.ColorIndex = 3End Sub

' Repetimos lo anterior pero con WithSub Macro()With Range("A1") .Font.Bold = True .Font.Size = 50 .Font.ColorIndex = 3End WithEnd Sub

En el ejemplo anterior se ve que al utilizar el With, no es necesario volver a repetir el objeto Range("A1"). Todolo 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 aplicamosel With en dos niveles:

' La siguiente macro NO utiliza WithSub Macro() Range("A1").Font.Bold = True Range("A1").Font.Size = 50 Range("A1").Font.ColorIndex = 3 Range("A1").Interior.ColorIndex = 5 Range("A1").SelectEnd Sub

' La siguiente macro realiza las mismas operaciones utilizando WithSub Macro_With()

239

With Range("A1")With .Font

.Bold = True .Size = 50 .ColorIndex = 3

End With .interior.ColorIndex = 5 .Select

End WithEnd Sub

Nota: una vez que se ha entrado en un bloque With no es posible cambiar el objeto. Por tanto, no podemosutilizar una única instrucción With para varios objetos diferentes, pero si podemos utilizar otro bloque que utiliceel 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 utilizarestructuras With pues aumentan la velocidad de ejecución de las macros, siendo más fáciles de manipular amedida que nos acostumbramos a ellas.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

240

Page 121: Manual de Excel VBA

Navigation: Macros > Estructuras >

If ThenLa instrucción If Then permite escoger entre 2 o más posibilidades, para decidir sobre que es lo que queremos,una serie de alternativas.

La instrucción ejecuta condicionalmente un grupo de instrucciones, dependiendo del valor de una expresión. Su sies:

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 expresicadena 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). igua-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 condiccondició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 cejecuta 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 ejecprimera opción, en caso de que no sea TRUE (es decir en caso de que sea FALSE) ejecutamos la segunda instruen 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

241

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... sTRUE:

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 Fconviene 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 mensdespué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 WithEnd 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 IfEnd Sub

Un boloque If puede tener así mismo varias secciones ElseIf, que vendrían a decir "de lo contrario", "o". La instru

242

Page 122: Manual de Excel VBA

ElseIf impide que el código continúe verificándose cuando una de las condiciones se a presentado como True. Veun ejemplo:

Si el valor de la celda A1 fuera 500 al confirmarse como verdadera la primera condición (>15) ejecutaríamos lainstrucciones tal que, (MsgBox "La celda A1> 15"), ([A1].Interior.ColorIndex = 10), y ([A1].Font.Bold = Truecontinuació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 IfEnd Sub

En el caso anterior, si el valor de A1 fuera 3, aún cuando las tres condiciones devolverían True por separado, soejecutarí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 TardeIf 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 TElse: 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

243

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 TElse: 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 IfEnd If

End Sub

Como se ve hay muchísimas maneras de escribir la misma Macro. Ahora depende de cada uno decidir cual se pref

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

244

Page 123: Manual de Excel VBA

Navigation: Macros > Estructuras >

Select CaseLa instrucción Select Case se utiliza cuando las alternativas en una estructura de If Then son muchas. En tal caSelect 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 textoNúmero = [A1] ' Inicializa variable.

Select Case Número ' Evalúa Número.Case 1 To 5: MsgBox "Entre 1 y 5" ' Para Nºs entre 1 y 5, inclusiveCase 6, 7, 8: MsgBox "Entre 6 y 8" ' Para Nºs entre 1 y 5, inclusiveCase 9 To 10: MsgBox "Mayor que 8" ' Para Nºs entre 9 y 10, inclusiveCase 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 hasta la siguiente cláusula Case o, para la última cláusula, hasta la instrucción End Select. El control pasa despuexpresión_prueba coincide con una expresión de lista_expresión en más de una cláusula Case, sólo se ejecutcoincidencia.

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 obtend

245

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 lista_expresión en cualquiera de las otras selecciones de Case. Aunque no es necesario, es buena idea tener uCase para controlar valores imprevistos de expresión_prueba. Cuando no hay una instrucción Case Else y ninguncoincide con la expresión de prueba, la ejecución continúa en la instrucción que sigue a End Select, es decir la inhay valor que devuelva TRUE.

Lógicamente Select Case ayuda bastante como se ve en el siguiente ejemplo conocido, pues ya lo hemos utilizado

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 SelectEnd 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 s

Sub Select_Case()Select Case Weekday(Now, vbMonday) ' o bien: Weekday(Now, 2)

Case 1: MsgBox "Hoy es Lunes"Case 2: MsgBox "Hoy es Martes "Case 3: MsgBox "Hoy es 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 SelectEnd Sub

En la macro anterior utilizamos la opción Weekday(Now, vbMonday) o Weekday(Now, 2), porque la fórmula Weekdel día por el que querramos comenzar la semana. La semana que empieza por el día se pone tal que:

Weekday(Now, vbMonday)

246

Page 124: Manual de Excel VBA

o bien:

Weekday(Now, 2)

VBA permite realizar la misma operación de cientos de maneras distintas, como ya se ha demostrado antes. De hque:

Sub Macro()Dim ArrayDiaSemana ArrayDiaSemana = Array("", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domin MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday))End Sub

En la macro anterior hemos utilizado un array que contiene los días de la semana, pero cuyo primer elemento esta vcon 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

Option Base 1Sub Macro()Dim ArrayDiaSemana ArrayDiaSemana = Array("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday))End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

247

Navigation: Macros > Estructuras >

DoEventsLa instrucción DoEvents cede el control de la ejecución al sistema operativo, para que éste pueda procesar otros ev

Su Sintaxis es:

DoEvents( )

La función DoEvents pasa el control al sistema operativo. El control no se devuelve hasta que el sistema operaterminado de procesar los eventos en cola y se hayan enviado todas las teclas de la cola SendKeys.

Advertencia: siempre que demos preferencia al procesador temporalmente dentro de un procedimiento de evento,asegurarnos que el procedimiento no se ejecute de nuevo desde una parte diferente del código antes de que deprimera llamada. Esto podría causar resultados impredecibles. Además, no debemos utilizar la función DoEvents sposibilidad de que otras aplicaciones interactúen con el procedimiento, de manera imprevista, durante el tiempo enha cedido el control.

DoEvents suele utilizarse muchas veces para que a medida que una instrucción Looping o For Next se está ejecpresionamos 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 AEnd Sub

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel AsEnd 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 DoEvents().

Si quisiéramos que una macro realizara cierta cantidad de operaciones siguiendo un looping, y supiéramos que noseleccionar ninguna celda mientras tanto, podríamos utilizar la siguiente macro "DoEventsMacro" en conjuncimacro de evento.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

248

Page 125: Manual de Excel VBA

Navigation: Macros > Estructuras >

On Error GoToLa instrucción On Error GoTo se utiliza para controlar un error de macro en caso de haberlo. Lo ideal es que elusuario final de la aplicación con macros pueda ver un mensaje más comprensible. Entonces podemos indicarlea 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, YOn 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 conFor X = 1 To 50

Cells(X, 1) = XNext 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 unaletra. Como la macro no puede realizar dicha operación habría un error de VBA. Pero con el On Error GoTopodemos controlar dicho error y mostrar un mensaje personalizado, tal como lo hemos armado en la líneaCasoError.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

249

Navigation: Macros > Estructuras >

On Error Resume NextOtra 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 laintrucció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ódigoOn Error Resume Next' Aquí iría el resto del códigoEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

250

Page 126: Manual de Excel VBA

Navigation: Macros >

Cuadros de diálogoLos Built In Dialogs son Cuadros de Diálogo predeterminados que permiten realizar diversas operacionesfácilmente, sin tener que recurrir a una macro. En este capítulo los veremos más en detalle.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

251

Navigation: Macros > Cuadros de diálogo >

EjemplosComo se suele decir en programación, cuando queremos realizar algo, antes que inventarlo conviene descubrirsi ya esta inventado!

Para que crear algo que ya ha sido creado con anterioridad, desde VBA tenemos acceso a la mayoría de loBuilt 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 lasiguiente figura:

Los built-in dialogs son funcionalidades que permiten interactuar con la voluntad del usuario en la ejecución dela macro. Para tener acceso a todos los built-in dialogs, lo podemos hacer desde el editor de VBA:

1. Presionamos la tecla F2 para abrir el Examinador de objetos.2. En la lista Clases elegimos XLBuiltInDialog3. En la lista Miembros de la derecha veremos todos los disponibles.

252

Page 127: Manual de Excel VBA

En el siguiente ejemplo abrimos un archivo mediante el Built In Dialog GetOpenFilename pero solo listamos losarchivos 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 StringNombre_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_FicheroEnd Sub

Si quisiéramos abrir más de un libro de excel:

Sub Ejemplo2()Dim Nombre_del_Fichero As Variant 'o bien: As StringNombre_del_Fichero = Application.GetOpenFilename( _ FileFilter:="Hojas de cálculo (*.xl*),*.xl*", _ Filterindex:=1, _ Title:="¿Sobre que Libro deseas operar?", MultiSelect:=True)

On Error Resume NextIf Nombre_del_Fichero <> False Then

NumFiles = UBound(Nombre_del_Fichero) - LBound(Nombre_del_Fichero) + 1If 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 = FalseFor X = LBound(Nombre_del_Fichero) To UBound(Nombre_del_Fichero)

Workbooks.Open Nombre_del_Fichero(X)Next X

Application.EnableEvents = TrueElse

Exit SubEnd If

End Sub

253

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 deExcel "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:=1El cuadro de diálogo abierto mostraría Archivos de texto como el tipo de archivo.

Filterindex:=2El cuadro de diálogo abierto mostraría Hojas de Cálculo Excel como el tipo de archivo.

Filterindex:=3El 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 VariantDim NumFiles As Integer, X As IntegerOn Error Resume Next

FileList = Application.GetOpenFilename( _ "Archivos de texto (*.txt),*.TXT," & _ "Todos los archivos de Microsoft Excel (*.Xls),*.Xls," & _ "Todos los archivos (*.*),*.*", _

254

Page 128: Manual de Excel VBA

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 XElse

Application.EnableEvents = TrueExit Sub

End If

End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

255

Navigation: Macros >

Barras de herramientasPodemos personalizar o adaptar nuestros propios menús y barras de herramientas dentro de Excel. En estecapítulo veremos como hacerlo. Las barras de herramientas también se conocen como Toolbars.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

256

Page 129: Manual de Excel VBA

Navigation: Macros > Barras de herramientas >

Crear ToolbarExcel no deja de ser otra aplicación de las muchas que conocemos como MS Word, MS PowerPoint, MS Access, WordPad etc. Y al igual que todas las demás aplicaciones contiene una serie de funcionalidades y/o disposicionescomo:

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 conizquierda el logotipo de la aplicación, después el nombre de la aplicación y el nombre del documento contenaplicación, después el botón minimizar, seguido del de maximizar y/o restaurar y finalmente el de cerrar. Sabemoaplicacion esta activa porque el color de su barra de título está de color Azul, mientras que cuando no esta activa sun color gris.

La barra de menú: también es común en todas las aplicaciones existentes, ahora bien las palabras que contiene varían en función de la funcionalidad que tenga la aplicacion en si. En este sentido la barra de menu de MS Wordla barra de menú de MS Excel. Independientemente de cual sea la aplicación en si tendremos los siguientes mende la barra de menus: (Archivo, Edición y Ayuda, aunque este último término en Excel venga expresado con el carPuesto que Excel es una hoja de cálculos, Word un procesador de textos y access una base de datos, estas apdiferirán en cuanto a las palabras que contengan su barra de menú, así como en cuanto a los controles que contenuna 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 essobre cualquier punto de la horizontal que representa la barra de menú hacemos clic con el botón derechocualquier aplicación nos permitiría ver el número de barras de herramientas disponibles para la aplicación en si,cuales de ellas están visibles y cuales no o cuales podemos personalizar.

257

Si abriéramos un documento de texto desde el escritorio, obervaríamos que un documento de texto posee unatítulos idéntica a la de Excel pero una barra de menú que solo tendría 4 menus (Archivo, Edición, Formato y Ahiciéramos clic derecho en la misma, observaríamos que un documento de texto "bloc de notas" no contieneherramientas.

Si abrimos Internet Explorer, observaremos que la barra de títulos estará siempre, con la misma disposición que al principio de este capítulo (Logotipo, Nombre del documento contenido en la aplicación, nombre de la aplicación, mmaximizar o restaurar y cerrar). Despues la barra de menús ( Ver, Favoritos y Herramientas). Si hiciéramos clic drela barra de menús, observaríamos que contiene entre otras la siguientes barras de herramientas (Barra de dibotones estándar, vínculos, personalizar, etc.), es decir la barra de herramientas de MS Internet Explorer ppersonalizadas, pero hasta cierto punto y/o límite ya que solo podemos variar los vínculos, la disoposición de la barras de herramientas y la disposición y presencia de los botones dentro de la barra de heraamientas llamadaestandar".

También conviene recordar que Excel, Word, y el resto de aplicaciones Office siempre mantienen la última conutilizada. En este sentido si ocultáramos todas la barras de herramientas y cerráramos la aplicación la siguient

258

Page 130: Manual de Excel VBA

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 dentendiendo como todo es posible:

1. Crear una nueva barra de herramientas personalizada2. Modificar cualquiera de la existentes añadiendo nuevos comandos y/ menús3. Deshabilitar controles y/o funciones4. 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 barras de herramientas salvo que las eliminemos al cerrar el libro que las creó. Est sería innecesario ya que encrear barras de herramientas nos podemos limitar a añadir controles en la misma hoja o bien añadir barras de herPOPUP.

La dinámica y el el proceso de creación de una barra de herraminta y un menú, submenú o control dentro de un suel mismo.

Cualquier menú, submenú y/o control tiene un identificador "ID" al cual podremos hacer referencia al crearlo y/o bor

La siguiente instruccion evita que podamos personalizar y/o modificar las barras de herramientas de Excel, en 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 elTrue. En ambos casos, la función es evitar que el usuario final añada y/o modifique las Barras de Herramientas (herramientas).

A la hora de crear una Barras de herramientas, conviene borrarla previamente, para evitar el problema derivado deBarras 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").DeleteEnd Sub

Es decir si quisiéramos crear una Barras de herramientas llamada "TodoEXCEL", sería conveniente llamar aanterior primero tal que:

Sub CrearToolbar()Dim X As ByteOn Error Resume Next

Call BorrarToolbar ' Llamamos a la macro BorrarToolbar, para evitar problemas en código

259

' Creamos la barra deHerramientasWith CommandBars.Add(Name:="TodoEXCEL")

.Visible = True' esta Barras de herramientas tendrá 3 controles, o mejor dicho 2 controles de botón y un DropdoWith .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 WithWith .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 necesarioEnd WithWith .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 WithEnd With

End Sub

Conviene recordar que al ejecutar esta macro crearemos una Barras de herramientas llamada "TodoEXCEL", y alibro, esta Barras de herramientas seguirá como una de las Barras de herramientas de Excel, ya que no la hemoantes de cerrar el libro. Es por ello que preferimos no utilizar Barras de herramientas creadas con VBA, ya que torealizamos a través de ellas puede ser realizado mediante simples comandos adjuntos en las hojas. Cómopodrí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.

Application.CommandBars("TodoEXCEL").Delete ' Borraríamos la Barras de herramientas 'TodoEXEnd Sub

260

Page 131: Manual de Excel VBA

Finalmente, si lo que queremos es utilizar una Barras de herramientas y no queremos utilizar eventos, también utilizar PopUps, que son Barras de herramientas que solo aparecen cuando una característica dada tiene lugaveremos en la próxima sección.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

261

Navigation: Macros > Barras de herramientas >

PopUpSi lo que queremos es utilizar una BH solo cuando, por ejemplo, hacemos clic con el botón derecho del ratón enuna hoja determinada, podemos utilizar una macro de evento que cree una BH temporal o PopUp, tal que:

Sub CrearPOPUP()Dim CBarPOPUP As CommandBarDim POPUPControl As CommandBarControlDim SubPOPUPControl As CommandBarButton

' Borrar la PreviaCall BorrarPOPUPSet 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"

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)

262

Page 132: Manual de Excel VBA

With SubPOPUPControl .Caption = "Portugal" .FaceId = 73 .OnAction = "MacroEg"

End WithEnd 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").DeleteEnd Sub

Al ser una BH PopUp, no necesitamos crearla cada vez que hacemos clic con el botón derecho del ratón, talque:

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 IfEnd Sub

Pero para ello si necesitaremos crearla al abrir el libro tal que:

Private Sub Workbook_Open() Call CrearPOPUPEnd Sub

y una vez creada, podremos visualizarla cuando lo querramos tal que:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Range("RangoCeldas"), Target) Is Nothing Then Application.CommandBars("TodoEXCELPOPUP").ShowPopup ' Pues queremos observar como los comandos del botón derecho ' de nuestro raton varían

263

Cancel = True End IfEnd Sub

Recordemos que esta macro de evento BeforeRightClick solo tiene lugar cuando hacemos clic con el botónderecho del ratón estando dentro del rango definido como: Range("RangoCeldas") ya que no queremos perderla funcionalidad del botón derecho del ratón en otros rangos.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

264

Page 133: Manual de Excel VBA

Navigation: Macros > Barras de herramientas >

Mostrar y ocultarDel mismo modo que podemos crear y borrar un BH, también podemos ocultar y desocultar tantas BH comoquerramos. 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 NextFor X = 1 To Application.CommandBars.Count

With CommandBars(X) .Visible = Not .Visible

End WithNext X

On Error GoTo 0End Sub

La macro anterior ocultaría todas las BH visibles y desocultaría todas las BH no visibles.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

265

Navigation: Macros > Barras de herramientas >

Deshabilitar controlesNo son pocas las veces que queremos deshabilitar ciertos controles dentro de un libro Excel dado. A veces nonadie imprima la hoja activa, o bien queremos que nadie copie una celdas determinadas. Para realizar esto con acsaber:

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 pegarnuestras BHs...¿para que tenerlos desde el botón derecho del ratón?. Con esto queremos decir que si queremoscontroles de copiar, cortar y pegar, deberíamos también deshailitarlos del botón derecho del ratón y no solo estándar. No obstante también podríamos ir al menú Edición > Copiar con lo que aún deshabilitando los controlecontroles del menú bar seguirían activos, como así también CONTROL+C que es la combinación de teclasCONTROL+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. Lulibro esto se hace tal que:

Application.OnKey "^C", "" ' Con esto deshabilitaríamos las teclas Control + CApplication.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 form

Sub DeshabilitaCiertosControles()Dim CBControl As CommandBarControlDim CBar As IntegerDim MyArrayDim X As Byte Application.ScreenUpdating = False MyArray = Array(19, 21, 22)

On Error Resume Next' Para Deshabilitar los controles definidos en el array MyArrayFor CBar = 1 To Application.CommandBars.Count

For Each CBControl In CommandBars(CBar).ControlsFor X = LBound(MyArray) To UBound(MyArray)

Application.CommandBars(CBar).FindControl(ID:=MyArray(X), Recursive:=True).EnabledNext X

Next CBControlNext CBar

Application.CommandBars("PLY").Enabled = False CommandBars("Toolbar List").Enabled = False

On Error GoTo 0End Sub

Hemos utilizado un array de los identificadores de los comandos que queremos deshabilitar que son 19,21,22 esCortar y Pegar respectivamente. Una vez que hemos deshabilitado todos los controles con estos ID, necesitamos a

266

Page 134: Manual de Excel VBA

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 cualqupersonalizada o de las que trae Excel, por ej Estándar.

4) Deshabilitar copiado de hoja:

Application.CommandBars("PLY").Enabled = False

Deberemos deshabilitar al mismo tiempo la copia de la hoja desde el botón derecho del ratón en los tabuladorehoja, 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 = TrueEnd Sub

Como hemos mencionado en repetidas ocasiones el botón derecho del ratón siempre tiene las opciones de copiacon 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 mhoja. Es decir que necesitaríamos saber todos los controles que sirven para realizar lo mismo, o que pueden servirmanera llegar a evitar el fin pretendido. E incluso, si conociéramos todos los ID's, luego quedaría la posibilidad de ade VBA y desde aquí habilitar los comandos deshabilitados. Puede que lleguemos a la conclusión que finalmenpero no lo es, tan solo lleva tiempo, y ademas el 99,9% de lo usuarios no emplearán el tiempo requerido para valgo, que el creador haya querido deshabilitar. De hecho muchos programadores nunca protegen su código tenique 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, deshderecho del ratón también en los tabuladores de hoja tal que:

Public Sub MakeMenuBar()Dim X As ByteDim ABC As String ABC = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"Dim CBar As CommandBar

Call DeleteMenuBarFor Each CBar In CommandBars ' Borramos las barras visibles

If CBar.Type = msoBarTypeNormal Then CBar.Visible = FalseNext CBar

Set CBar = CommandBars.Add(MenuBar:=True)With CBar

267

.Name = "MenuPARIA" .Visible = True

End With Application.VBE.MainWindow.Visible = False Application.CommandBars("PLY").Enabled = False

' Para deshabilitar los comandos tales como 'CONTROL+P' es decir PRINT' Nos faltarían todavía algunos pero...For X = 1 To Len(ABC)

Application.OnKey "^" & Mid(ABC, X, 1), "" Application.OnKey "^" & LCase(Mid(ABC, X, 1)), "" Application.OnKey "%" & Mid(ABC, X, 1), "" Application.OnKey "%" & LCase(Mid(ABC, X, 1)), ""

Next X' Tampoco hemos deshabilitado los ALT+F1, F2,...

' Application.SendKeys ('%q') CommandBars("Toolbar List").Enabled = FalseEnd 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 eIf Application.CommandBars("PLY").Enabled = True Then Exit Sub

Cancel = TrueEnd Sub

Recordemos nuevamente que cualquier ExcelManíaco podría sin gran dificultad habilitar cualquier comanpreviamente deshabilitado.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

268

Page 135: Manual de Excel VBA

Navigation: Macros >

MenusPodemos personalizar o adaptar nuestros propios menús y barras de herramientas dentro de Excel. En estecapítulo veremos como hacerlo.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

269

Navigation: Macros > Menus >

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, siepuede crear una barra de menú totalmente nueva, o bien utilizando la existente, la que excel agrega y muestra poexistente.

Como norma general, aunque no escrita, si quisiéramos agregar un nuevo menú a nuestra barra de menús (por ej"?" (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 co

Sub BorrarMenu()On Error Resume Next Application.CommandBars("Worksheet Menu Bar").Controls("TodoEXCEL").DeleteEnd Sub

Sub CrearMenu()Dim HelpMenu As CommandBarControlDim MenuNuevo As CommandBarPopupDim MenuItem As CommandBarControlDim SubmenuItem As CommandBarButton

' Borra el Menu 'TodoEXCEL' llamando a otra macroCall 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

Set HelpMenu = Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30010)If HelpMenu Is Nothing Then' Añade el menu 'TodoEXCEL' al finalSet MenuNuevo = Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoC

Else' Si Ayuda existe, entonces antes que el menu '?' es decir ID=30010Set MenuNuevo = Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoC

End If

' Llamamos al nuevo Menu creado... 'E&xceluciones' ' hemos colocado un & antes que la 'x' para que la 'x' esté subrayada y podamos acceder al menú

MenuNuevo.Caption = "E&xceluciones"

' Y vamos 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 b

End With'2)Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlButton)

With MenuItem

270

Page 136: Manual de Excel VBA

.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 aconsejableSet SubmenuItem = MenuItem.Controls.Add(Type:=msoControlButton)

With SubmenuItem .Caption = "Francia" .FaceId = 71 .OnAction = "MacroEjemplo" 'Estamos utilizando la misma macro, pero lógicamente, se

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:

Private Sub MacroEjemplo()MsgBox "en lugar de un mensaje hubieramos podido...", vbInformation, "LOGICAMENTE..."End Sub

Haber decidido colocar el menu "TodoEXCEL" antes que el menú y/o control Ayuda "?" no significa que debamos el.

30002 =&Archivo30003 =&Edición30004 =&Ver30005 =&Insertar30006 =&Formato30007 =&Herramientas30011 =Da&tos

271

30083 =A&cción30009 =Ve&ntana30010 =&?

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

272

Page 137: Manual de Excel VBA

Navigation: Macros > Menus >

Agregar controlesAhora agregaremos controles a un menú Excel predeterminado, ya que agregar controles a un menu personal, ehemos 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 =&Archivo30003 =&Edición30004 =&Ver30005 =&Insertar30006 =&Formato30007 =&Herramientas30011 =Da&tos30083 =A&cción30009 =Ve&ntana30010 =&?

En el siguiente ejemplo insertamos un nuevo control en el Menu Insertar, y le adjuntamos una macro sencillita paraejecutado y/o clicado a través del ratón o a través de teclado con el metodo abreviado de teclas "Conbinación de te

Sub AñadirControl_al_MenuXX()Dim MenuXX As CommandBarPopup

Dim nuevoControl As CommandBarButton' Elimina el Control si existiera:Call DeleteMenuControl' Encontrar el Menu Insertar:Set MenuXX = Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30005)' Buscamos por el Menu Insertar y en caso de que no existiera, EXIT' Lógicamente el menu 'Insertar' debería estar siempre, pero nos aseguramos...

If MenuXX Is Nothing Then MsgBox "Parece que su Barra de Menu, no Contiene el Control Insertar", vbInformation, "ATE

Exit SubEnd 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

273

End Sub

Sub DeleteMenuControl()On Error Resume Next

Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30005).Controls("Insertar MenEnd 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 shiciéramos clic sobre el control "Insertar Mensaje E&xceLuciones", Excel automáticamente abriría el libro que ordenado que se ejecute. Es por ello que los menús nuevos y/o personalizados se aportan como complementos oque los creó se cierra.

También debemos recordar que podemos hacer eferencia a un menú por su nombre y/o por su identificativo (es dde país a país (versiones de Excel en distintos idiomas) mientras que los nombres puede que si !.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

274

Page 138: Manual de Excel VBA

Navigation: Macros >

ComandosEn este capítulo se explicarán algunos comandos útiles que suelen utilizarse con frecuencia en las macros.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

275

Navigation: Macros > Comandos >

Mensajes de alertaLos mensajes de alerta son avisos que dispara Excel antes de realizar determinadas acciones. Por ejemplo, alintentar borrar una Hoja, nos aparece una aviso de confirmación. A nivel de macros, es importante tenerlospresentes, tal como vemos a continuación:

Sub BorrarHoja()

' Borramos una hojaActiveSheet.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 mensajesApplication.DisplayAlerts = TrueEnd Sub

Es importante recordar que el Application.DisplayAlerts=False siempre debe ir antes de la acción que requiereconfirmación. Al final de la macro conviene volver a asignarle la propiedad True.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

276

Page 139: Manual de Excel VBA

Navigation: Macros > Comandos >

Barra de estadoLa barra de estado de Excel es la que figura en la parte inferior y suele mostrar distintos mensajes. Esta barrase 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. Porejemplo, si seleccionamos un rango y lo copiamos, la barra de estado daría una instrucción como la que se ve acontinuación:

Es posible cambiar el mensaje de la Barra de estado mediante código VBA. Esto permite mostrar mensajespersonalizados 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 originalApplication.DisplayStatusBar = True

' Si NO queremos verla bastará con:Application.DisplayStatusBar = False

277

' 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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

278

Page 140: Manual de Excel VBA

Navigation: Macros > Comandos >

MsgboxUn Msgbox es simplemente una ventana que muestra un mensaje. Por ej., con la siguiente instrucciónmostraríamos un saludo:

Sub Saludo()' Escribimos el mensaje entre comillasMsgbox "Hola, Excel te saluda!"End Sub

El mesaje anterior se vería así en la hoja Excel:

En este otro ejemplo, el mensaje lo tomamos de una celda Excel:

Sub Saludo()' El mensaje mostrará el contenido de la celda A1Dim M As VariantM = range("A1").valueMsgbox MEnd 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:

279

Por defecto, un Msgbox siempre incluye el botón "Aceptar", el cual haría desaparecer el mensaje y continuaríaejecutando 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ódigou otro código. Esto lo realizamos agregando la instrucción vbOKCancel, tal como vemos a continuación:

Sub Mensaje()Dim Respuesta As Integer

Respuesta = MsgBox("Seleccione Aceptar o Cancelar", vbOKCancel)' verificamos si se presionó 'Cancelar'

If Respuesta = vbCancel Then MsgBox "Macro caso Cancelar" ' Aquí continuaría la macro en caso de Cancelar

End If' si se presionó 'Aceptar'

If Respuesta = vbOK Then MsgBox "Macro caso Aceptar" ' Aquí continuaría la macro en caso de Aceptar

End IfEnd 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í:

280

Page 141: Manual de Excel VBA

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

281

Navigation: Macros > Comandos >

InputBoxUn InputBox se utiliza cuando requerimos un input del Usuario (es decir, cuando esperamos que el usuario intrvariable, pero le damos el control al usuario para que asigne dicho valor o dato a gusto.

Dentro del InputBox utilizamos las siguientes instrucciones:Prompt: mensaje del InputBoxTitle: título del InputBoxDefault: 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 sabemoDim Nombre As VariantNombre = Application.InputBox(prompt:="Escriba su nombre", Title:="Colegio de Abogados", DefaultMsgbox Nombre ' En lugar de este Msgbox continuaría el resto de la macro...End Sub

El InputBox anterior se verá así:

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

282

Page 142: Manual de Excel VBA

Navigation: »No topics above this level«

LibreríaUna "librería" es una colección de macros. En la medida que vamos haciendo nuestras macros, conviene irguardándolas en una librería. De este modo las tendremos disponibles para cuando necesitemos usarlasnuevamente y evitaremos tener que reprogramar las macros en cada momento. En esta sección veremosnuestra 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.

283

Proteger: macros para proteger y desproteger hojas y libros.

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.

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

284

Page 143: Manual de Excel VBA

Navigation: Librería >

Borrar FilasPara borrar filas debemos posicionarnos en una celda y utilizar la instrucción EntireRow.DeleteVeamos 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 LongFor r = 2000 To 1 Step -1 'Debemos ir desde abajo hacia arribaIf Cells(r, 2).Value = "q" Then Cells(r, 2).EntireRow.DeleteNext rEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

285

Navigation: Librería >

BúsquedasPara hacer búsquedas (el equivalente a la función "buscarv" de Excel) utilizamos la instrucción lookupvalue.Veamos un ejemplo:

Sub BuscarCodigo()'Definimos variablesDim 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 macroIf IsError(lookupvalue) Then exit sub

'Si lo encuentra lo devuelveElseMsgbox lookupvalueEnd IfEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

286

Page 144: Manual de Excel VBA

Navigation: Librería >

CálculosMuchas veces, cuando ejecutamos macros, nos interesará poner el modo de cálculo manual. Para estoutilizamos la instrucción Calculation.Veamos un ejemplo:'Poner modo de cálculo manualApplication.Calculation = xlManual

'Poner mode de cálculo automáticoApplication.Calculation = xlAutomatic

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

287

Navigation: Librería >

ComboBoxCuando 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 IntegeIf KeyCode = 13 Then 'Cuando apreto enter dentro del combo box entoncesRange("I6").value = ComboBox1.Text 'Pasamos el valor del combo a la celda I6End IfEnd Sub

'Para rellenar con lista un combobox q está en una hojaActiveSheet.OLEObjects("CBoxTipo").ListFillRange = "ConfTipos"'Se completa con lo que tengamos en el rango nombrado "ConfTipos"

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

288

Page 145: Manual de Excel VBA

Navigation: Librería >

CommandBarsAquí jugamos un poco con las barras de comando. Cambiando los "True" por "False" y viceversa veremoscomo afecta.

'RESTITUYE LOS COMMAND BARS Y BORRA EL DE REFRESH !Sub CmdBarsOn()Application.CommandBars("Worksheet Menu Bar").Reset'Activa menu boton derecho en menusCommandBars("Refresh").Enabled = True'Para volver a ver el menu de clic derecho en celdaApplication.CommandBars("Cell").Enabled = TrueEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

289

Navigation: Librería >

CopiarPegarUn 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 = FalseEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

290

Page 146: Manual de Excel VBA

Navigation: Librería >

DemosEsta 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ón3) Si la clave de desactivación es correcta, el usuario podrá usar el libro normalmente4) 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 dada6) 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" ThenExit Sub

Else

V = Application.InputBox("Introduzca la clave de activación. Si todavía no la conoce presione 'Acepta

If V = "españa" ThenHoja6.Range("B1").value = "españa"MsgBox "Activación exitosa, presione 'Ok' para guardar los cambios."ThisWorkbook.SaveExit SubEnd If

'Si no puso la clave correcta llama macro demoCall Demo

End IfEnd Sub

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."

291

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 IfEnd Sub

Esta es otra macro más simple que la anterior:

'MACRO DEMO PARA CERRAR LIBRO EN DETERMINADA FECHASub 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:=TrueEnd If

End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

292

Page 147: Manual de Excel VBA

Navigation: Librería >

EventosEn este ejemplo vemos un ejemplo sobre cómo llamar macros cuando cambia algún valor de una columnadeterminada.'Esta declaracion de variables va al inicio de la hoja o modulo porq luego las uso en cada casoDim LCR As Long, LCC As Long

'Esta macro se ejecuta cuando cambia algo en la hojaPrivate 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 = FalseEnd WithIf LCR > 10 Then 'Solo ejecutamos la macro cuando estamos en fila 11 o mayor.Select Case LCCCase 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 GrupoCase Is = 5: Call TipoCase Is = 7: Call ImporteCase Is = 8: Call CuentaCase Is = 9: Call GrupoCta

End SelectEnd If

Application.EnableEvents = TrueEnd 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 RangeSet 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 DateDim FechaHoy As DateFechaFin = DateSerial(6, 8, 3)FechaHoy = DateIf FechaHoy >= FechaFin ThenMsgBox "Ha caducado la demo y el libro se cerrará, contacte con TodoEXCEL"ThisWorkbook.CloseEnd IfEnd Sub

'MAcro q se dipara cuando se selecciona una celda determinada (en este caso la de fila 1, columna 1)

293

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 modificadaPrivate 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 = TargetEnd If

End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

294

Page 148: Manual de Excel VBA

Navigation: Librería >

ExcelVersionsPara saber con que versión de Excel nos encontramos utilizamos la instrucción Application.Version

Sub ExcelVersionControl()''CONTROLA LA VERSION DE EXCELDim xlVer As VariantxlVer = Val(Application.Version)MSgbox XlVerIf xlVer < 10 Then MsgBox "Version no soportada" 'Para avisar que no funciona para Excel inferior a 2End Sub

La macro devuelve:08 Para Excel 9709 Para Excel 2.00010 para Excel 2.00211 para Excel 2.00312 Para Excel 2.007

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

295

Navigation: Librería >

LayOutCon estas macros jugaremos a ocultar y mostrar barras de herramientas o desactivar menús. Recordar que podemo

Option Explicit

Sub OcultaMenus()'Ocultar menusApplication.CommandBars("Worksheet Menu Bar").Enabled = False'Ocultar barras de herramientasApplication.DisplayFullScreen = TrueEnd Sub

Sub HideToolBars() 'Ocultar barrasDim CurrTB As Toolbar, Counter As IntegerWith Worksheets("List")For Each CurrTB In Application.ToolbarsIf 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 IfNextFor Each CurrTB In Application.Toolbars If CurrTB.Visible = True Then CurrTB.Visible = False

NextIf Counter > 0 Then

.Range("A1").CurrentRegion.Sort Key1:=.Range("B1"), Order1:=xlAscending, Key2:=.Range("C1End If

End WithEnd Sub

Sub RestoreToolBars() 'Reestableces barrasDim TBRg As Range, CurrTBCell As RangeSet TBRg = Worksheets("List").Cells(1, 1).CurrentRegion.Columns(1)If Not IsEmpty(TBRg) ThenFor Each CurrTBCell In TBRg.CellsWith Toolbars(CurrTBCell.value)

.Visible = True .Top = CurrTBCell.Offset(0, 1).value .Left = CurrTBCell.Offset(0, 2).value

End WithNextEnd If

End Sub

Sub CmdBarsOff()Dim ctl As CommandBarControl

For Each ctl In Application.CommandBars("Worksheet Menu Bar").Controls

296

Page 149: Manual de Excel VBA

'Debug.Print ctl.CaptionIf ctl.BuiltIn = True Then

ctl.Enabled = FalseEnd If

Next ctl

'Desactiva menu boton derecho en menusCommandBars("Toolbar List").Enabled = False'No ver el menu de clic derecho en celdaApplication.CommandBars("Cell").Enabled = False

With CommandBars("Worksheet Menu Bar").Enabled = True

With .Controls(1) .Enabled = True .Visible = True

End WithEnd WithEnd Sub

Sub CmdBarsOn()Application.CommandBars("Worksheet Menu Bar").Reset'Activa menu boton derecho en menusCommandBars("Toolbar List").Enabled = True'Para volver a ver el menu de clic derecho en celdaApplication.CommandBars("Cell").Enabled = TrueEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

297

Navigation: Librería >

FiltrosAlgunos códigos interesantes relacionados con filtros.

Option Explicit

'Extraer unicos con filtro avanzadoSheets("aaa").SelectRange("E6:E18").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("AC7"), Unique:=TrueEl 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 autofiltroRange("B6:M6").AutoFilter

'DETERMINAR SI ESTA PUESTO EL AUTOFILTROIf ActiveSheet.AutoFilterMode = True Then

'FILTRAR CON CONDICIONRange("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 FILTROSIf Range("InHuurData").AutoFilter = xlOn ThenRange("InHuurData").AutoFilterEnd 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 AutoFilterDim fFilter As FilterDim iFilterCount As Integer

If ActiveSheet.AutoFilterMode ThenSet af = ActiveSheet.AutoFilter

iFilterCount = 1For Each fFilter In af.FiltersIf 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 fFilterElse

Rows(1).EntireRow.Interior.ColorIndex = xlNoneEnd If

End Sub

298

Page 150: Manual de Excel VBA

'FILTROS AVANZADOS'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 filtradosFunction FilterCriteria(Rng As Range) As String By Stephen Bullen

Dim Filter As String Filter = ""

On Error GoTo FinishWith Rng.Parent.AutoFilter

If Intersect(Rng, .Range) Is Nothing Then GoTo FinishWith .Filters(Rng.Column - .Range.Column + 1)

If Not .On Then GoTo Finish Filter = .Criteria1

Select Case .OperatorCase xlAnd

Filter = Filter & " AND " & .Criteria2Case xlOr

Filter = Filter & " OR " & .Criteria2End Select

End WithEnd With

Finish: FilterCriteria = FilterEnd Function

'Luego usar esto para q actualice al autofiltrar:=FilterCriteria(B5)&left(Subtotal(9,B5:B200),0)

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

299

Navigation: Librería >

FTPAlgunos 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:[email protected]/public_html/prueba/Libro88.xls"End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

300

Page 151: Manual de Excel VBA

Navigation: Librería >

FuncionesAplicando funciones desde VBA

'Ejemplo de SUMAIf Application.Sum(Range("D7:D65536")) = 0 Then MsgBox "nada"

'Ejemplo de SUMARSImyVal = Application.SumIf(Range("A1:A10"), "a", Range("b1:b10"))

'Ejemplo de CONTARSIn = Application.CountIf(Range("K:K"), "Check Record")

'Ejemplo de LARGODim L As LongL = Len(Sheets("Menu").Range("B1"))

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

301

Navigation: Librería >

GuardarPara forzar el directorio de guardado

'Forzar directorio de guardado igual al del archivoDim MyDirectory As StringMyDirectory = ActiveWorkbook.PathChDir MyDirectory

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

302

Page 152: Manual de Excel VBA

Navigation: Librería >

HojasMacros relacionadas con Hojas

'Función definida por el usuario para determinar si existe la hojaFunction 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 estoElse

' hago lo otroEnd If

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

303

Navigation: Librería >

ImágenesVeamos algunas operaciones que podemos realizar con imágenes.

'INSERTAR UNA IMAGENPublic 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 RANGOSub BorrarImagen()Dim Rng As RangeDim SH As ShapeDim TLC As RangeSet Rng = Range("F4:AJ23")For Each SH In ActiveSheet.Shapes

If Not Application.Intersect(Rng, SH.TopLeftCell) Is Nothing Then SH.Delete

End IfNext SHEnd Sub

'OCULTAR IMAGEN'Boton para q si esta oculta la muestre y si esta visible la ocultePrivate Sub ToggleButton1_Click()Worksheets("Sheet1").Shapes("Rectangle 3").Visible = Not (Shapes("Rectangle3").Visible)End Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

304

Page 153: Manual de Excel VBA

Navigation: Librería >

ImprimirAlgunas macros relacionadas con impresión:

'Esta macro establece el rango de impresión a la ultima fila ocupadaPrivate Sub PrintArea()Dim LngLastRow As Long

LngLastRow = ActiveSheet.Range("G65536").End(xlUp).RowActiveSheet.Range("A1:G" & LngLastRow).Select

With ActiveSheet.PageSetup.PrintArea = ("A1:G" & LngLastRow).FitToPagesWide = 1.FitToPagesTall = False

End WithEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

305

Navigation: Librería >

MsgboxMacros relacionadas con mensajes

'Msgbox con varias líneasMsgBox " 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 textoSub Entrada()Dim V As StringV = Application.InputBox("Introduzca la clave del administrador")End Sub

'INPUT BOX (solo número entero)Sub EntradaNumerica()Dim V As StringV = Application.InputBox("Introduzca número entero", , , , , , , 1)'el 1 es para forzar número entero

'COMILLAS DENTRO DE UN MSGBOXMsgBox "Esto no está dentro de comillas " & Chr(34) & "Y esto si!" & Chr(34)

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

306

Page 154: Manual de Excel VBA

Navigation: Librería >

OrdenarMacros 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)

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

307

Navigation: Librería >

ProtegerMacros para proteger

'FORMATO DE CELDA PROTEGIDASelection.Locked = TrueSelection.FormulaHidden = False

'PROTEGER Y PERMITIR FILTROSActiveSheet.Protect AllowFiltering:=TruePROTEGER/DESPROTEGER CON CLAVEActiveSheet.Protect Password:="anystring", AllowFiltering:=True, AllowSorting:=True, userinterfaceoActiveSheet.Unprotect Password:="anystring", AllowSorting:=True

'Cuando protejo agregando "userinterfaceonly:=True" no es necesario desproteger para que funcione

'PROTEGER CON UNA CLAVE VARIABLE'1º DEFINO LA FUNCIONFunction pswd() As String pswd = "iñakiphone" 'si cambio este texto cambio todas las pass de unaEnd Function'LUEGO PROTEJO USANDOActiveSheet.Protect Password:=pswd

'DESPROTEGER OPTION BUTTON EN HOJA PROTEGIDAActiveSheet.Shapes("Option Button 10").OLEFormat.Object.value = xlOff'También tengo q desproteger la celda vinculada !

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

308

Page 155: Manual de Excel VBA

Navigation: Librería >

RangosMacros relacionadas con rangos

'UN RANGO VARIABLERange(Cells(LR, 1), Cells(LR, 11))

'NOMBRAR RANGOSDim LR As LongLR = 100ActiveWorkbook.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 RANGOSelecciona una tabla menos la 1º fila de encabezadoRange("PerPrimero").CurrentRegion.Offset(1, 0).Select

'PINTAR RANGOSSi es Ingreso pinto verdeIf Cells(LCR, 2).value = "Ingreso" ThenRange(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 10End IfSi es Gasto pinto RojoIf Cells(LCR, 2).value = "Gasto" ThenRange(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 3End IfSi es vacío (cuando borra) pinto negroIf Cells(LCR, 2).value = "" ThenRange(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 1End If

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

309

Navigation: Librería >

Resolución de PantallaCómo obtener la resolución de pantalla

'OBTENER LA RESOLUCION DE PANTALLAPrivate Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As LongPrivate Const SM_CXSCREEN = 0Private Const SM_CYSCREEN = 1Public Function GSR() As StringGSR = 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

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

310

Page 156: Manual de Excel VBA

Navigation: Librería >

SelecciónMacros de selección

'Selecciona todo un rango activo menos la primera filaSub Rango()Dim Rg As RangeSet Rg = Range("FiltrosConIni").CurrentRegionRg.Offset(1).Resize(Rg.Rows.Count - 1).SelectEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

311

Navigation: Librería >

TablasCómo determinar la última fila de una tabla

'Determinar última fila de una tablaUsedRange.Rows.Count

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

312

Page 157: Manual de Excel VBA

Navigation: Librería >

Tablas DinámicasAlgunas macros de interés relacionadas con tablas dinámicas (TD).

'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 TDPrivate Sub Worksheet_Activate()ActiveSheet.PivotTables(1).PivotCache.RefreshEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

313

Navigation: Librería >

VariosOtras macros de interés

' ULTIMA FILA VACIALR = Range("a65536").End(xlUp).Row + 1

' COPIAR VALORESRange("CuentasIngreso").CopyRange(Cells(LR, 1), Cells(LR, 11)).PasteSpecial xlPasteValues

'SCROLLINGActiveWindow.ScrollRow = 1ActiveWindow.ScrollColumn = 1

'BORRAR FILAS (hay q borrar desde abajo para arriba)Sub Borrar()Dim R As LongFor R = 210 To 1 Step -1If Cells(R, 3).value = "" Then Cells(R, 3).EntireRow.DeleteNext REnd Sub

'SCROLL AREAActiveSheet.ScrollArea = "A1:S50"

'CAMBIAR DIRECCCION DE MOVIMIENTO DEL CURSORPrivate Sub Workbook_BeforeClose(Cancel As Boolean)Application.MoveAfterReturnDirection = xlDownEnd Sub

Private Sub Workbook_Deactivate()Application.MoveAfterReturnDirection = xlDownEnd Sub

Private Sub Workbook_Open()Application.MoveAfterReturnDirection = xlToRightEnd Sub

Private Sub Workbook_Activate()Application.MoveAfterReturnDirection = xlToRightEnd Sub

'OCULTAR BARRA FORMATO, ESTANDAR y FORMULA BARApplication.CommandBars("Formatting").Visible = FalseApplication.CommandBars("Standard").Visible = FalseApplication.DisplayFormulaBar = False

'Pone un tilde en la celda (ideal para usar en lugar de checkboxes)Private Sub Worksheet_SelectionChange(ByVal Target As Range)

314

Page 158: Manual de Excel VBA

If Target.Cells.Count > 1 Then Exit SubIf Not Intersect(Target, Range("A1:A100")) Is Nothing Then

Target.Font.Name = "Marlett"If Target = vbNullString Then

Target = "a"Else

Target = vbNullStringEnd If

End IfEnd Sub

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

315

Navigation: »No topics above this level«

EXTRASHemos preparado una buena cosecha de recursos más que interesantes para tus macros.

Haciendo clic aquí podrás descargar todos estos extras !(si el enlace te solicita clave utiliza la misma con la que accedes al curso)

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)

316

Page 159: Manual de Excel VBA

Turbofiltro:- nuevas opciones para filtrar listas (1)

Pausar Macros: (1)

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)

Haciendo clic aquí podrás descargar todos estos extras !(si el enlace te solicita clave utiliza la misma con la que accedes al curso)

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

317

Navigation: »No topics above this level«

Otros

VISITA NUESTRA WEB !

Visita nuestra web! Ofrecemos toda la gama de productos y servicios para hojas de cálculo Microsoft Excel.

VIDEO CLASES EXCELAprenda rápidamente con nuestras originales video clases.

CURSOS EXCELCapacítese con los mejores cursos Excel, preparados por nuestros expertos.

PRODUCTOS EXCELComplementos, plantillas y programas Excel de utilidad para usuarios.

DESARROLLOS EXCELSoluciones a medida para empresas y profesionales con macros vba Excel.

COMUNIDAD EXCELEl lugar de encuentro de usuarios y expertos en hojas Excel.

www.todoexcel.com

Todos los contenidos de este curso Copyright ©2.008 por TodoEXCEL.

318