com
Copyright Todos los nombres propios de programas, sistemas operativos, equipos de hardware, etc. que aparecen en este curso son marcas registradas de sus respectivas compaas. Reservados todos los derechos. El contenido de esta obra est protegido por ley, que establece penas de prisin y/o multas, adems de las correspondientes indemnizaciones por daos y perjuicios, para quienes reprodujeren, plagiaren, distribuyeren o comunicasen p blicamente, en todo o en parte, una obra literaria, artstica o cientfica, o su transformacin, interpretacin o ejecucin artstica fijada en cualquier tipo de soporte o comunicada a travs de cualquier medio, sin la preceptiva autorizacin. Microsoft y Microsoft Excel son marcas registradas por Microsoft Corporation. Todos los contenidos del Curso de Macros VBA Excel Copyright 2.008 por TodoEXCEL.
www.todoexcel.com
Contenido
1. INICIO ..................................................................................................................................................................... 9 1.1. Presentacin .................................................................................................................................................... 9 2. TEORIA .................................................................................................................................................................. 11 2.1. INTRODUCCION.................................................................................................................................................. 12 2.1.1. Excel y macros ......................................................................................................................................... 12 2.1.2. Una definicin simple .............................................................................................................................. 12 2.1.3. Utilidad de una macro ............................................................................................................................. 12 2.1.4. Objetos, propiedades y mtodos ............................................................................................................. 13 2.1.5. Lenguaje VBA........................................................................................................................................... 14 2.2. COMO COMENZAR ............................................................................................................................................. 16 2.2.1. Barra de herramientas ............................................................................................................................. 16 2.2.2. Editor VBA ............................................................................................................................................... 17 2.3. ESCRIBIR UNA MACRO........................................................................................................................................ 21 2.3.1. Mi primera macro .................................................................................................................................... 21 2.3.2. Escribir la macro ...................................................................................................................................... 21 2.3.3. Ejecutar la macro ..................................................................................................................................... 23 2.3.4. Comprender la macro .............................................................................................................................. 25 2.3.5. Resumen ................................................................................................................................................. 27 2.3.6. OPM de la macro ..................................................................................................................................... 28 2.4. GRABAR UNA MACRO ........................................................................................................................................ 31 2.4.1. Mi primera macro .................................................................................................................................... 31 2.4.2. Grabando la macro .................................................................................................................................. 31 2.4.3. Resumen ................................................................................................................................................. 35 2.4.4. Escrita vs. grabada ................................................................................................................................... 36 2
www.todoexcel.com 2.4.5. Diferencias .............................................................................................................................................. 39 2.4.6. Conclusin ............................................................................................................................................... 40 2.5. EJEMPLOS DE MACROS ...................................................................................................................................... 42 2.5.1. Macro 1 ................................................................................................................................................... 43 2.5.2. Macro 2 ................................................................................................................................................... 44 2.5.3. Macro 3 ................................................................................................................................................... 44 2.6. EL EDITOR DE MACROS ....................................................................................................................................... 46 2.6.1. Cmo acceder.......................................................................................................................................... 46 2.6.2. Ventana Proyecto .................................................................................................................................... 47 2.6.3. Ventana Propiedades............................................................................................................................... 48 2.6.4. Ventana Cdigo ....................................................................................................................................... 49 2.6.5. Ventana Inmediato .................................................................................................................................. 51 2.6.6. Proteger el cdigo ................................................................................................................................... 52 2.7. EJECUCION DE MACROS ..................................................................................................................................... 54 2.7.1. Desde el cdigo ....................................................................................................................................... 54 2.7.2. Desde el men......................................................................................................................................... 54 2.7.3. Desde el teclado ...................................................................................................................................... 55 2.7.4. Desde objetos .......................................................................................................................................... 56 2.7.5. Desde botones......................................................................................................................................... 58 2.7.6. Automticamente .................................................................................................................................... 60 2.8. MACROS DE EVENTOS ........................................................................................................................................ 61 2.8.1. Eventos de libros ..................................................................................................................................... 61 2.8.2. Eventos de hojas ...................................................................................................................................... 64 2.9. FORMULARIOS ................................................................................................................................................... 67 2.9.1. Crear un formulario ................................................................................................................................. 68 2.9.2. Controles del formulario .......................................................................................................................... 70 2.9.3. Ejemplo paso a paso ................................................................................................................................ 73 2.10. VARIOS ............................................................................................................................................................. 82 3
www.todoexcel.com 2.10.1. Ejecutar macro desde macro.................................................................................................................. 82 2.10.2. Depuracin y errores ............................................................................................................................. 83 2.10.3. Complementos (Add Ins)........................................................................................................................ 85 2.10.4. Seguridad de macros ............................................................................................................................. 88 2.10.5. Firma digital........................................................................................................................................... 91 2.10.6. Macros privadas .................................................................................................................................... 93 2.10.7. Acelerar el cdigo .................................................................................................................................. 94 3. MACROS ............................................................................................................................................................... 97 3.1. Importante ......................................................................................................................................................... 98 3.2. VARIABLES ....................................................................................................................................................... 100 3.2.1. Definicin .............................................................................................................................................. 100 3.2.2. Declaracin............................................................................................................................................ 101 3.2.3. Tipos...................................................................................................................................................... 103 3.2.4. Locales .................................................................................................................................................. 106 3.2.5. Pblicas ................................................................................................................................................. 107 3.2.6. Estticas ................................................................................................................................................ 109 3.2.7. Constantes ............................................................................................................................................ 111 3.2.8. Conversin ............................................................................................................................................ 111 3.2.9. Ejemplos................................................................................................................................................ 113 3.3. LIBROS ............................................................................................................................................................. 116 3.3.1. Abrir Libros ............................................................................................................................................ 116 3.3.2. Cerrar Libros .......................................................................................................................................... 117 3.3.3. Guardar Libros ....................................................................................................................................... 118 3.3.4. Borrar Libros .......................................................................................................................................... 119 3.3.5. Crear Libros ........................................................................................................................................... 120 3.3.6. Imprimir Libros ...................................................................................................................................... 121 3.3.7. Calcular Libros ....................................................................................................................................... 122 3.3.8. Proteger/Desproteger Libros ................................................................................................................. 123 4
www.todoexcel.com 3.3.9. Listar Libros ........................................................................................................................................... 124 3.4. HOJAS .............................................................................................................................................................. 125 3.4.1. Agregar.................................................................................................................................................. 125 3.4.2. Selecionar.............................................................................................................................................. 127 3.4.3. Selecionar vs. Activar ............................................................................................................................. 129 3.4.4. Mover Hojas .......................................................................................................................................... 130 3.4.5. Borrar Hojas .......................................................................................................................................... 131 3.4.6. Copiar Hojas .......................................................................................................................................... 132 3.4.7. Ocultar/Mostrar Hojas ........................................................................................................................... 132 3.4.8. Nombrar ................................................................................................................................................ 133 3.4.9. Proteger / Desproteger Hojas ................................................................................................................ 134 3.4.10. Vista Previa de Hojas ........................................................................................................................... 136 3.4.11. Imprimir Hojas ..................................................................................................................................... 137 3.4.12. Color de Hojas ..................................................................................................................................... 137 3.4.13. Ordenar Hojas ..................................................................................................................................... 138 3.5. RANGOS ........................................................................................................................................................... 140 3.5.1. Seleccin de celdas ................................................................................................................................ 140 3.5.2. Seleccin de rangos ............................................................................................................................... 143 3.5.3. Seleccin de filas ................................................................................................................................... 144 3.5.4. Seleccin de columnas ........................................................................................................................... 144 3.5.5. Otras selecciones ................................................................................................................................... 145 3.5.6. Insertar rangos ...................................................................................................................................... 148 3.5.7. Borrar rangos......................................................................................................................................... 149 3.5.8. Copiar y pegar rangos ............................................................................................................................ 150 3.5.9. Nombrar rangos .................................................................................................................................... 152 3.5.10. Combinar rangos ................................................................................................................................. 153 3.5.11. Ocultar y mostrar rangos ..................................................................................................................... 154 3.5.12. Proteger y desproteger rangos............................................................................................................. 155 5
www.todoexcel.com 3.5.13. Transponer rangos ............................................................................................................................... 155 3.5.14. Ordenar rangos.................................................................................................................................... 156 3.5.15. Borrar rangos....................................................................................................................................... 156 3.5.16. Imprimir rangos ................................................................................................................................... 157 3.5.17. Eliminar filas vacas .............................................................................................................................. 157 3.5.18. Restringir movimiento ......................................................................................................................... 159 3.5.19. Scroll Bars ............................................................................................................................................ 159 3.6. ARRAYS ............................................................................................................................................................ 160 3.6.1. Definicin .............................................................................................................................................. 160 3.6.2. Fijos ....................................................................................................................................................... 160 3.6.3. Variables................................................................................................................................................ 161 3.6.4. Bidimensionales..................................................................................................................................... 162 3.6.5. Ejemplo ................................................................................................................................................. 163 3.6.6. Redim .................................................................................................................................................... 163 3.6.7. Preserve ................................................................................................................................................ 164 3.7. ESTRUCTURAS .................................................................................................................................................. 166 3.7.1. Do Loop ................................................................................................................................................. 166 3.7.2. For Next................................................................................................................................................. 167 3.7.3. For Each Next ........................................................................................................................................ 170 3.7.4. While Wend........................................................................................................................................... 171 3.7.5. GoTo...................................................................................................................................................... 172 3.7.6. With End With ....................................................................................................................................... 172 3.7.7. If Then ................................................................................................................................................... 174 3.7.8. Select Case ............................................................................................................................................ 177 3.7.9. DoEvents ............................................................................................................................................... 180 3.7.10. On Error GoTo ..................................................................................................................................... 181 3.7.11. On Error Resume Next ......................................................................................................................... 182 3.8. CUADROS DE DIALOGO .................................................................................................................................... 183 6
www.todoexcel.com 3.8.1. Ejemplos................................................................................................................................................ 183 3.9. BARRAS DE HERRAMIENTAS ............................................................................................................................. 187 3.9.1. Crear Toolbar......................................................................................................................................... 187 3.9.2. PopUp ................................................................................................................................................... 191 3.9.3. Mostrar y ocultar ................................................................................................................................... 193 3.9.4. Deshabilitar controles ............................................................................................................................ 193 3.10. MENUS........................................................................................................................................................... 197 3.10.1. Crear Men ......................................................................................................................................... 197 3.10.2. Agregar controles ................................................................................................................................ 199 3.11. COMANDOS ................................................................................................................................................... 201 3.11.1. Mensajes de alerta .............................................................................................................................. 201 3.11.2. Barra de estado ................................................................................................................................... 201 3.11.3. Msgbox................................................................................................................................................ 202 3.11.4. InputBox .............................................................................................................................................. 204 4. LIBRERIA ............................................................................................................................................................. 206 4.1. Borrar Filas ................................................................................................................................................... 207 4.2. Bsquedas .................................................................................................................................................... 207 4.3. Clculos ........................................................................................................................................................ 208 4.4. ComboBox .................................................................................................................................................... 208 4.5. CommandBars .............................................................................................................................................. 208 4.6. CopiarPegar.................................................................................................................................................. 209 4.7. Demos .......................................................................................................................................................... 209 4.8. Eventos ........................................................................................................................................................ 210 4.9. ExcelVersions ............................................................................................................................................... 212 4.10. LayOut ........................................................................................................................................................ 212 4.11. Filtros ......................................................................................................................................................... 214 4.12. FTP ............................................................................................................................................................. 215 4.13. Funciones ................................................................................................................................................... 216 7
www.todoexcel.com 4.14. Guardar ...................................................................................................................................................... 216 4.15. Hojas .......................................................................................................................................................... 216 4.16. Imgenes.................................................................................................................................................... 217 4.17. Imprimir ..................................................................................................................................................... 217 4.18. Msgbox ...................................................................................................................................................... 218 4.19. Ordenar ...................................................................................................................................................... 218 4.20. Proteger ..................................................................................................................................................... 218 4.21. Rangos ....................................................................................................................................................... 219 4.22. Resolucin de Pantalla................................................................................................................................ 220 4.23. Seleccin .................................................................................................................................................... 220 4.24. Tablas ......................................................................................................................................................... 220 4.25. Tablas Dinmicas ........................................................................................................................................ 220 4.26. Varios ......................................................................................................................................................... 221 5. EXTRAS................................................................................................................................................................ 223 6. TodoEXCEL .......................................................................................................................................................... 225
www.todoexcel.com
1. INICIO
1.1. Presentacin
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 altsima calidad. Las ventajas de hacer nuestro curso en formato de libro electrnico 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 ms fcilmente
www.todoexcel.com
Sobre el autor
"TodoExcel" est formado por un grupo de expertos en hojas de clculo Excel. Somos unos "enamorados" de Excel y las posibilidades que ofrece. Hemos trabajado muchsimos aos con este programa y todava no dejamos de sorprendernos con las maravillas que permite hacer. Nuestra experiencia proviene de haber trabajado de forma intensiva con Excel, construyendo todo tipo de modelos, plantillas y soluciones a medida. Nuestra misin es ser "los ms entendidos en hojas de clculo Excel" para lo cual nos esforzamos da a da 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 frmulas, macros vba, tablas y datos y todas las herramientas y opciones en general que ofrece Excel. Si deseas conocer mejor a nuestro equipo, puedes visitar nuestra web para mayor informacin.
10
www.todoexcel.com
2. TEORIA
En la primera parte de este curso veremos la teora respecto a la programacin de macros. Dominar la teora es sumamente importante para luego poder entrar a la parte prctica y comprender las macros ms rpido y mejor. Introduccin: qu son las macros y para que se utilizan. Cmo comenzar: las principales herramientas del editor de macros. 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. Ejecucin de macros: diversas formas para ejecutar las macros. Macros de eventos: ejecucin automtica de macros. Formularios: cmo armar formularios de todo tipo. Varios: temas diversos de importancia.
11
www.todoexcel.com
2.1. INTRODUCCION
Bienvenido al Curso de Macros de TodoEXCEL. Ests por comenzar una de las experiencias ms fascinantes y atractivas de la Hoja de Clculos Excel. Con las macros podrs sorprender y sorprenderte porque incrementars las prestaciones y el potencial de Excel de forma ilimitada. El nico lmite que tendrs ser tu imaginacin.
12
www.todoexcel.com
1. Automatizacin de procesos
Supongamos que todos los das debemos trabajar en nuestro libro Excel en el cual debemos seleccionar un rango, centrarlo, cambiarle la fuente, poner la fuente en cursiva, aplicarle negrita y finalmente aplicarle bordes a toda la seleccin. Estas 6 acciones las hacemos manualmente y no parecen muchas, pero que tal si hay que hacer esto en repetidas ocasiones y todos los das? Una macro nos permite ejecutar los 6 pasos automticamente, tan solo presionando un botn o una tecla. Las tareas ideales para automatizar son aquellas que se hacen de forma repetida e involucran muchos pasos, por ejemplo: imprimir informes, configurar la vista de la hoja, actualizar datos de tablas dinmicas, etc...
13
www.todoexcel.com
14
www.todoexcel.com
15
www.todoexcel.com
Tambin tienes la opcin de dejar siempre visible dicha barra de herramientas. Puedes hacer esto desde el men Ver > Barras de Herramientas > Visual Basic. Veras como aparece una nueva barra de herramientas de macros. Puedes ubicar esta barra de herramientas donde te sea ms cmodo.
16
www.todoexcel.com
Excel 2.007
En la nueva versin de Excel, las opciones del men de macros se encuentran en la ficha programador,.
Si no tienes visible la ficha Programador, puedes activarla de la siguiente forma 1. Presiona el botn de Office (botn redondo en la parte superior izquierda de la pantalla) 2. En la parte inferior del men que se despliega, presiona el botn Opciones de Excel 3. En la lista de opciones Mas Frecuentes, selecciona la casilla de Mostrar ficha programador en la cinta de opciones.
Excel 2.007
1. Desde la ficha Programador > botn Visual Basic 2. Desde el teclado (Teclas de Mtodo Abreviado): ALT+F11 (el acceso a la ficha programador lo explicamos en la seccin anterior) Nuestra forma preferida de acceder al editor de macros es con las teclas ALT + F11 Una vez que hayas accedido al editor de visual basic vers algo similar a la figura siguiente (no importa si no lo ves estrictamente similar, eso depender de las ventanas que tengas visibles y ocultas). Puedes mostrar u ocultar estas ventanas desde el men Ver.
17
www.todoexcel.com
El la la la la
editor contiene 4 ventanas principales: Ventana Proyecto (parte izquierda superior) Ventana de Cdigo (parte derecha) Ventana Propiedades (parte izquierda inferior) Ventana Inmediato (parte inferior derecha)
Ventana Proyecto - VBA Project: esta ventana muestra los libros excel (xls) o los complementos (xla) abiertos. Usualmente vers nombres del tipo "VBAProject" y entre parntesis el nombre del archivo o complemento excel. Veamos el caso de VBAProject (Libro1). Simplemente significa que tienes abierto un libro Excel llamado Libro 1. Luego cuelgan 3 carpetas ms: Hoja1 (Hoja1), ThisWorkbook y Modulo (no importa si ves todos estos elementos ahora, luego te ensearemos como activarlos). Estas carpetas es donde habitan las macros. Haciendo doble clic en ellas activars la ventana donde se escriben las macros.
18
www.todoexcel.com
Ventana de Cdigo: esta es el lugar donde escribiremos el cdigo propiamente dicho de las macros. Como no hemos escrito ninguna macro todava veremos la hoja en blanco. Recuerda bien estas dos ventanas, ya que las usaremos a continuacin para escribir nuestra primera macro.
Como vers el Editor de VB tiene muchas ventanas. Pero de momento solo nos interesan las dos ventanas que te indicamos anteriormente: la Ventana Proyecto VBA Project y la Ventana de Cdigo donde se escribe el cdigo de las macros. La Ventana de Propiedades e Inmediato las dejaremos para ms adelante. Recuerda: presionando las teclas ALT+F11 puedes ir desde Excel al Editor o desde el Editor al Excel de forma alterna (debes mantener presionada la tecla ALT y presionar F11 repetidas veces, vers como pasas de Excel al editor y viceversa).
19
www.todoexcel.com
Si estas en el editor y quieres regresar a la hoja Excel tambin puedes utilizar el cono de Excel que se encuentra en el men superior del editor (primer cono de la izquierda, con la X de Excel).
20
www.todoexcel.com
21
www.todoexcel.com
1.4 Doble clic en Hoja1 (Hoja1) para empezar a escribir el cdigo de la macro.
2. Escribimos la macro
2.1 En la ventana de macros escribe textualmente el siguiente cdigo: ' Esta macro escribe el valor 1500 en la celda A1 Sub MiPrimeraMacro() Range("A1").Value=1500 End Sub 2.2 Si la macro est bien copiada vers que la primera lnea queda en color verde y la segunda y cuarta en azul. Estos colores los asigna automticamente el editor y te lo explicaremos ms adelante. As es como debe quedar todo:
*Nota: si la ventana de tu editor tiene una instruccin "Option Explicit" escrita en la parte superior, no le presetes atencin, puedes dejarla. Ms adelante te explicaremos que significa. De momento no te preocupes por el cdigo escrito. Ms adelante te ensearemos a interpretarlo. Ahora que ya tienes la macro escrita pasemos a la siguiente seccin para ver como ejecutarla.
22
www.todoexcel.com
Se abrir un cuadro que contiene una lista con los nombres de las macros creadas. Selecciona MiPrimeraMacro y haz clic en Ejecutar.
Si has seguido cualquiera de los 2 pasos anteriores ya podrs ver el resultado de la macro. Qu hizo la Macro? Si te fijas en el Libro 1, Hoja 1, Celda A1 vers que se escribi el valor 1.500. Eso es exctamente lo que queramos hacer con nuestra macro, as que tarea cumplida. Hemos escrito un valor en una celda excel desde una macro !
23
www.todoexcel.com
Excel 2.007
Si ya tienes escrita la macro en el editor, ahora podrs que ejecutarla, o sea hacer que funcione. Tienes 2 formas de hacer esto: A. Ejecutar la macro desde el mismo Editor Si te posicionas en cualquiera de las lneas de cdigo de la macro y luego presionas la tecla F5 la macro se ejecutar (para ver el resultado puedes volver a la hoja excel con ALT+F11). B. Ejecutar la macro desde Excel Otra forma de ejecutar la macro es desde el mismo Excel. Esto se hace desde la ficha Programador > Macros
Se abrir un cuadro que contiene una lista con los nombres de las macros creadas. Selecciona MiPrimeraMacro y haz clic en Ejecutar.
Si has seguido cualquiera de los 2 pasos anteriores ya podrs ver el resultado de la macro. Qu hizo la Macro? Si te fijas en el Libro 1, Hoja 1, Celda A1 veras que se escribi el valor 1.500. Eso es exactamente lo que queramos hacer con nuestra macro, as que tarea cumplida. Hemos escrito un valor en una celda excel desde una macro !
24
www.todoexcel.com
* los colores del cdigo los asign automticamente el editor * la primera lnea que dice Option Explicit la explicaremos luego Esta macro tiene 4 lneas de cdigo, por eso es tan sencilla (cuando termines este curso seguro podrs escribir macros de cientos o quizs miles de lneas de cdigo!). Veamos que significa cada lnea. Las explicaciones que vienen a continuacin suelen aplicarse a todas las macros, as que es importante que las comprendas.
25
www.todoexcel.com
- Aqu es donde comienza realmente la macro. - Toda macro siempre comienza con la palabra Sub, luego un espacio, luego un nombre (sin espacios intermedios) y finalmente los parntesis (). Ms adelante veremos algunas excepciones a esto. - Este nombre luego lo utilizaremos para ejecutar la macro. - Luego de escribir esta lnea y darle a Enter el Editor detectar que es el nombre de la macro y pondr la palabra Sub en color azul de forma automtica. Recuerda: el nombre de la macro siempre comienza con la palabra Sub, luego un espacio, luego el nombre que quieras ponerle a tu macro (SIN espacios intermedios) y finalmente los parntesis.
26
www.todoexcel.com
2.3.5. Resumen
Nuestro objetivo fue crear una macro que escribiera el valor 1500 en la celda A1 de la Hoja1 de Excel. Como era una macro sencilla decidimos escribir el cdigo manualmente. Vamos a resumir todos los pasos que hicimos hasta aqu: 1. 2. 3. 4. Creamos un nuevo libro Excel y lo guardamos con el nombre Libro1. Accedimos el Editor de Visual Basic con las teclas ALT+F11 En la Ventana Proyecto, en VBAProject (Libro1), hicimos doble clic en Hoja1 (Hoja1). En la Ventana de Cdigo escribimos textualmente el siguiente cdigo: ' Esta macro escribe el 1500 en la celda A1 Sub MiPrimeraMacro() Range("A1").Value = 1500 End Sub Todo qued como se aprecia en la foto...
5. Finalmente abrimos el men de macros con ALT+F8, seleccionamos MiPrimeraMacro desde la lista de nombres y presionamos Ejecutar.
27
www.todoexcel.com
6. El resultado es que en la celda A1 se vuelve a escribir el valor 1500, que fue justamente lo que le indicamos a la macro que haga.
Recuerda: en estos 5 pasos hemos visto rpidamente como escribir una macro sencilla y ejecutarla. En las secciones siguientes iremos profundizando ms estos temas, sobre todo el referente el cdigo de la macro.
28
www.todoexcel.com
La mayora de las macros llevan una estructura similar, aunque hay algunas excepciones. El comentario que aparece al comienzo lo ponemos a gusto y sirve para recordarnos lo que queremos hacer con esa macro. El comentario siempre comienza con el signo ' y no afecta para nada a la macro. Es un simple texto. El nombre lo pondremos a gusto, anteponiendo la palabra Sub los parntesis de apertura y cierre al final. Conviene dar un nombre que nos indique que hace la macro. La instruccin principal la veremos un par de prrafos ms abajo. Este cdigo siempre vara segn lo que se quiera hacer con la macro en cuestin. El fin siempre es igual, con la frase End Sub. As que solo nos queda explicar con ms detalle la instruccin principal de la macro. En general, las lneas de cdigo ms importantes y donde debemos usar nuestros conocimientos de objetos, propiedades y mtodos son las que se encuentran entre las instrucciones Sub y End Sub. Es all donde realmente "se cocina" todo. Ese es el verdadero corazn de la macro. Al comienzo del curso te mencionbamos que las macros consisten en operar sobre un Objeto, ya sea alterando una de sus Propiedades o ejecutando un Mtodo sobre el mismo. Recuerda: para aprender a programar macros debes aprender cuales son los objetos, propiedades y mtodos de Excel. No olvides la definicin de los mismos:
Objeto
- Es una parte de Excel - Por ej. una celda de Excel, una hoja, un grfico.
Propiedad
- Es una caracterstica del objeto - Por ej. el valor de la celda, el nombre de una hoja, el color de un grfico.
Mtodo
Es una accin sobre el objeto > por ej. copiar la celda, borrar la hoja, agrandar el grfico. Como te comentbamos al comienzo, la lnea de cdigo ms importante de nuestra macros es: Range("A1").Value = 1500 Ahora ya estamos en condiciones de identificar mejor los objetos, propiedades y mtodos de la misma. Range("A1") es el objeto, recuerda que siempre que hacemos macros primero debemos indicar el objeto excel sobre el que vamos a operar. En este caso usamos el objeto Range (Rango). El objeto Range es el que se utiliza para hacer referencia a una celda o rango Excel. Luego se escribe la
29
www.todoexcel.com
referencia de la celda Excel (letra de columna y nmero de fila) entre comillas y parntesis. Ya le hemos indicado a la macro que deber ocuparse de la celda A1 (objeto). Ahora debemos indicarle que hacer con ella (propiedad o mtodo). Value = 1500 es la propiedad, que le asignaremos al objeto. Siempre empezamos por el objeto para luego asignarle una propiedad o mtodo. En este caso usamos la propiedad Value (Valor) que nos permite asignar un valor al objeto range, anteponiendo un signo igual y luego el valor que deseamos. Esta macro es muy sencilla y no posee ningn mtodo. Hasta aqu es suficiente. Hemos visto el ejemplo de un objeto y una de sus propiedades. En la medida que vayas avanzando con la lectura de este curso irs aprendiendo nuevos objetos, propiedades y mtodos.
30
www.todoexcel.com
31
www.todoexcel.com
1.4 Donde dice Nombre de la macro escribe MiPrimeraMacro. Ese ser el nombre que le daremos a nuestra macro. 1.5 Presiona Aceptar y la macro comenzar a grabar todo lo que hagas. 1.6 Posicinate en la celda A1 y escribe el valor 1500. 2. Barra para frenar la grabacin Cuando comienza a grabar la macro activa una nueva barra de macros como la que se muestra en la foto. El botn cuadrado de la izquierda te permitir parar la grabacin y finalizar la macro.
Otra forma de detener la grabacin de la macro es desde el men Herramientas > Macros > Detener grabacin. Hazlo ahora para detener la grabacin.
32
www.todoexcel.com
3. Veamos como qued la macro grabada 3.1 Accede al editor de visual basic con ALT+F11. 3.2 Debes hacer clic en Mdulo1 para visualizar el cdigo de la nueva macro grabada. Vers una pantalla como la siguiente:
* Podrs obsevar que el cdigo que se grab es distinto que el cdigo que habamos escrito cuando hicimos la macro manualmente. Ms adelante en este mismo captulo analizaremos y explicaremos las diferencias. 4. Vamos a probar la macro 4.1 Vuelve a Excel con ALT+F11. 4.2 Vers que la celda A1 tiene el valor 1500 porque lo escribimos mientras grabbamos la macro. 4.3 Para ver como opera la macro borra dicho valor. 4.4 Abre el men de macros desde el men Herramientas > Macro > Macros 4.5 Selecciona MiPrimeraMacro (no te confundas con Hoja1.MiPrimeraMacro que es la que hicimos primero). 4.6 Presiona Aceptar y vers como se escribe nuevamente el valor 1500 en la celda A1.
33
www.todoexcel.com
Excel 2.007
1. Vamos a grabar la macro 1.1 V a la ficha Programador > Grabar macro
1.4 Donde dice Nombre de la macro escribe MiPrimeraMacro. Ese ser el nombre que le daremos a nuestra macro. 1.5 Presiona Aceptar y la macro comenzar a grabar todo lo que hagas. 1.6 Posicinate en la celda A1 y escribe el valor 1500. 2. Detener la grabacin Para terminar de grabar, debemos presionar el botn de detener grabacin
3. Veamos como qued la macro grabada 3.1 Accede al editor de visual basic con ALT+F11. 3.2 Debes hacer clic en Mdulo1 para visualizar el cdigo de la nueva macro grabada. Vers una pantalla como la siguiente:
34
www.todoexcel.com
* Podrs observar que el cdigo que se grab es distinto que el cdigo que habamos escrito cuando hicimos la macro manualmente. Ms adelante en este mismo captulo analizaremos y explicaremos las diferencias. 4. Vamos a probar la macro 4.1 4.2 4.3 4.4 Vuelve a Excel con ALT+F11. Vers que la celda A1 tiene el valor 1500 porque lo escribimos mientras grabbamos la macro. Para ver como opera la macro borra dicho valor. Abre el men de macros presionando ALT+F8
4.5 Selecciona MiPrimeraMacro (no te confundas con Hoja1.MiPrimeraMacro que es la que hicimos primero). 4.6 Presiona Aceptar y vers como se escribe nuevamente el valor 1500 en la celda A1.
2.4.3. Resumen
Nuestro objetivo fue grabar una macro que escribiera el valor 1500 en la celda A1 de la Hoja1 de Excel. Los pasos que seguimos para utilizar la grabadora de macros fueron: 1. Creamos un nuevo libro Excel y lo guardamos con el nombre Libro1. 2. Desde el men Herramientas > Macros seleccionamos la opcin Grabar nueva macro y la macro comenz a grabar. 3. En la celda A1 del Libro 1 escribimos el valor 1500. 4. Detuvimos la grabacin desde el men Herramientas > Macros > Detener grabacin. 5. Borramos la celda A1 (qued con el valor 1500 cuando grabamos la macro). 6. Ejecutamos la macro desde el men Herramientas > Macro > Macros. Seleccionamos de la lista MiPrimeraMacro y luego Aceptar. 7. El resultado es que en la celda A1 se vuelve a escribir el valor 1500, que fue justamente lo que grabamos con la macro.
35
www.todoexcel.com
Recuerda: al utilizar la grabadora no accedemos en ningn momento al editor de macros ni tenemos que escribir cdigo. Todo lo hace automticamente la grabadora.
36
www.todoexcel.com
Excel 2.003
MACRO ESCRITA 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 en Hoja1 (Hoja1) 1.4 Escribimos el cdigo de la macro. MACRO GRABADA 1. Como la hicimos 1.1 Utilizamos el mismo Libro1.xls 1.2 Encendimos la grabadora de macros desde el men Herramientas > Macro > Grabar nueva macro 1.3 Nos posicionamos en la celda A1 de la Hoja1 y escribimos el valor 1500. 1.4 Detuvimos la grabacin de la macro desde el men Herramientas > Macro > Detener grabacin. 2. El cdigo de la macro 2.1 Con ALT+F11 accedemos al editor de macros. 2.2 El cdigo que se grab automticamente fue el siguiente: Sub MiPrimeraMacro() ' ' MiPrimeraMacro Macro ' Esta macro escribe el valor 1500 en A1 Range("A1").Select ActiveCell.FormulaR1C1 = "1500" Range("A2").Select End Sub
2. El cdigo de la macro El cdigo que escribimos fue: ' Esta macro escribe el valor 1500 en la celda A1 Sub MiPrimeraMacro() Range("A1").Value=1500 End Sub
Recuerda que este cdigo qued en VBAProject (Libro1) > Mdulo1 3. Ejecucin de la macro Posicionados sobre cualquier lnea del cdigo anterior presionamos F5. Luego con ALT+F11 volvimos a la hoja de Excel y comprobamos que en la celda A1 de la Hoja1 se escribi el valor 1500. 3. Ejecucin de la macro Para comprobar que funciona, primero borramos el valor 1500 de la celda A1, Hoja1 (lo habamos escrito para grabar la macro). Luego ejecutamos la macro desde el men Herramientas > Macro > Macros. Seleccionamos de la lista MiPrimeraMacro y luego Aceptar. De esta forma se volvi a escribir el valor 1500 en la celda A1 de la Hoja1.
37
www.todoexcel.com
Excel 2.007
MACRO ESCRITA 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 en Hoja1 (Hoja1) 1.4 Escribimos el cdigo de la macro. MACRO GRABADA 1. Como la hicimos 1.1 Utilizamos el mismo Libro1.xls 1.2 Encendimos la grabadora de macros desde la ficha Programador > Grabar macro 1.3 Nos posicionamos en la celda A1 de la Hoja1 y escribimos el valor 1500. 1.4 Detuvimos la grabacin desde la ficha Programador > Detener grabacin
2. El cdigo de la macro El cdigo que escribimos fue: ' Esta macro escribe el valor 1500 en la celda A1 Sub MiPrimeraMacro() Range("A1").Value=1500 End Sub
2. El cdigo de la macro 2.1 Con ALT+F11 accedemos al editor de macros. 2.2 El cdigo que se grab automticamente fue el siguiente: Sub MiPrimeraMacro() ' ' MiPrimeraMacro Macro ' Esta macro escribe el valor 1500 en A1 Range("A1").Select ActiveCell.FormulaR1C1 = "1500" Range("A2").Select End Sub
Recuerda que este cdigo qued en VBAProject (Libro1) > Mdulo1 3. Ejecucin de la macro Posicionados sobre cualquier lnea del cdigo anterior presionamos F5. Luego con ALT+F11 volvimos a la hoja de Excel y comprobamos que en la celda A1 de la Hoja1 se escribi el valor 1500. 3. Ejecucin de la macro Para comprobar que funcionamiento, primero borramos el valor 1500 de la celda A1, Hoja1 (lo habamos escrito para grabar la macro). Luego ejecutamos la macro desde la ficha Programador > Macros. Seleccionamos de la lista MiPrimeraMacro y luego Aceptar. De esta forma se volvi a escribir el valor 1500 en la celda A1 de la Hoja1.
38
www.todoexcel.com
2.4.5. Diferencias
En nuestro ejemplo, tanto la Macro Escrita como la Macro Grabada logran la misma funcin de escribir el valor 1500 en la celda A1 de la Hoja1. Sin embargo, si te has fijado bien en los 3 puntos de la tabla de la seccin anterior vers que hay algunas diferencias. El anlisis de las mismas nos permitir ver las ventajas y desventajas de escribir una macro de forma manual o de grabarla con la grabadora de macros. Volvamos a poner las tablas comparativas, pero esta vez comentando las diferencias: MACRO ESCRITA 1. Como la hicimos Desventaja: escribir una macro manualmente implica conocer los objetos y propiedades de excel. En este caso tenamos que saber previamente que exista un objeto Range y una propiedad Value, y tambin debamos saber como era la sintaxis de los mismos > Range("A1").Value=1500. Para un principiante esto puede ser difcil de saber. 2. El cdigo de la macro Ventaja: nuestra macro escrita qued con 1 sola instruccin principal, la que indica poner el valor 1500 en la celda A1. ' Esta macro escribe el valor 1500 en la celda A1 Sub MiPrimeraMacro() Range("A1").Value=1500 End Sub MACRO GRABADA 1. Como la hicimos Ventaja: no es necesario conocer cdigo de programacin. La grabadora lo escribe automticamente.
2. El cdigo de la macro Desventaja: generalmente, cuando utilizamos la grabadora, el cdigo que se escribe automticamente suele ser reduntante y excesivo. Recordemos el cdigo que grab la macro: Sub MiPrimeraMacro() ' Esta macro escribe 1500 en A1 Range("A1").Select ActiveCell.FormulaR1C1 = "1500" Range("A2").Select End Sub La macro grab nuestras acciones pero utiliz 3 lneas de cdigo (solo contamos las que estn entre Sub y End Sub). Vemos que el cdigo es ms largo y que aparecen nuevos objetos, propiedades y mtodos. La macro se interpreta as: Primero seleccionar el rango A1. Luego en la celda activa introducir una frmula con el valor 1500. Finalmente, como presionamos Enter, se posiciona en la celda siguiente, la A2. El objetivo fue logrado, pero la macro gener ms cdigo del necesario.
El mtodo de la macro grabada parece el preferible, porque lo hace todo de forma automtica y nos evita tener que escribir un cdigo que en esta etapa nos resulta desconocido. Sin embargo, en la
39
www.todoexcel.com
seecin siguiente veremos que el mtodo a utilizar depender de cada situacin particular. Adems, hay muchas cosas que la grabadora de macros no puede hacer.
2.4.6. Conclusin
En las 2 secciones anteriores vimos dos tablas comparativas de los 2 mtodos que tenemos para crear una macro: 1. El mtodo de escribir manualmente la macro 2. El mtodo de grabar la macro automticamente. En la primera tabla se mostr el proceso de elaborar cada una y en la segunda tabla se mostraron las diferencias, con sus ventajas y desventajas. A modo de conclusin podemos decir que la diferencia fundamental est en el cdigo generado. Aunque las macros grabadas son ms sencillas porque no requieren conocer el cdigo necesario (objetos, propiedades y mtodos) sin embargo la cantidad de cdigo que generan suele ser ms largo (ms lneas). A pesar que el resultado final es el mismo, un cdigo con ms lneas siempre es menos deseable que un cdigo con menos lneas. Esto es as porque un cdigo largo es ms difcil de controlar y de comprender y a la larga puede ser ms propenso a que genere errores o disminuya la velocidad de ejecucin de la macro. Recordemos los dos cdigos generados (omitimos los comentarios del comienzo del cdigo). Recuerda que lo que nos interesa son las lneas entre Sub y End Sub. Ambas macros logran su cometido de escribir el valor 1500 en la celda A1. Sin embargo fjate que en la macro escrita solo utilizamos una lnea de cdigo mientras que la macro grabada gener 3 lneas de cdigo (solo consideramos las lneas entre Sub y End Sub).
Macro escrita
Sub MiPrimeraMacro() Range("A1").Value=1500 End Sub Como conocamos el objeto y la propiedad fuimos directamente al grano. Al objeto Rango A1 le aplicamos la propiedad Valor 1500. Solo una lnea de cdigo. Rpido y certero.
Macro grabada
Sub MiPrimeraMacro() Range("A1").Select ActiveCell.FormulaR1C1 = "1500" Range("A2").Select End Sub
40
www.todoexcel.com
La macro grabada grab todas nuestras acciones en 3 lneas de cdigo. Cuando seleccionamos el rango A1 se gener la 1 lnea de cdigo, cuando escribimos el valor 1500 se gener la 2 lnea de cdigo y cuando dimos al "enter" luego de escribir el valor 1500 se gener la 3 lnea de cdigo. En la macro grabada vers un nuevo objeto, ActiveCell (celda activa) y una nueva propiedad del mismo, FormulaR1C1 (frmula de la celda). Nuestra recomendacin respecto a las macros escritas y grabadas ya te la dimos al comienzo del captulo. Lo mejor es escribir las macros manualmente y utilizar la grabadora en aquellos casos donde no tenemos ni idea sobre cul es el cdigo que necesitamos o como es el nombre del objeto, propiedad o mtodo. Lo usual es que si ests comenzando solo utilizars la grabadora, y en la medida que vas conociendo el lenguaje VBA, con sus distintos objetos, propiedades y mtodos ya te irs animando a escribir tus propias macros. Sin embargo, como los OPM son tantos, siempre se requiere de la grabadora para descubrirlos. A esta altura tu puedes pensar que todava no tienes idea de ningn cdigo. Sin embargo hemos preparado este curso para hacerte la vida lo ms fcil posible. La buena noticia es que este curso tiene una 2 parte con una gran cantidad de macros ya escritas. As que nuestra recomendacin final es que primero leas la 1 parte de este curso (la teora), por lo menos un par de veces, hasta que te encuentres cmodo con los conceptos. Luego ya podrs leer la 2 parte del curso, que tiene innumerable cantidad de macros ya escritas, comentadas y listas para que puedas copiar, pegar y utilizar en tus desarrollos Excel. Como instancia final, esperamos que con lo que has aprendido aqu junto con la ayuda de la grabadora de macros, ya puedas crear tus propios cdigos, aparte de los que nosotros te facilitamos en la 2 parte del curso.
41
www.todoexcel.com
' Esta macro escribe el 1500 en la celda A1 Sub MiPrimeraMacro() Range("A1").Value = 1500 End Sub
5. Finalmente ejecutamos la macro desde el men de Excel Herramientas > Macros > Macro y luego seleccionando MiPrimeraMacro desde la lista de nombres y dando clic a Aceptar.
Recordemos nuevamente las reglas de escritura de la mayora de las macros: 1. La 1 lnea de la macro es un comentario que no tiene efecto sobre la misma y que usamos para nuestra referencia. Siempre comienza con el signo '. En nuestra macro: ' Esta macro escribe el 1500 en la celda A1 2. La 2 lnea de la macro es el nombre, que comienza con la palabra Sub, seguida del nombre que querramos ponerle sin espacios intermedios y finalizando con 2 parntesis de apertura y cierre (). En nuestra macro: Sub MiPrimeraMacro()
3. La 3 lnea era la instruccin principal que es donde nos referimos a los objetos, propiedades y mtodos. Todo esto va escrito entre Sub y End Sub y podramos tener muchas lneas de cdigo si la macro fuera ms compleja. Siempre se hace referencia al objeto y luego se le asignan propiedades o mtodos. En nuestro caso el objeto es el rango A1 > Range("A1") y la propiedad que le asignamos fue el valor 1500 > Value=1500 La lnea de la macro qued as:
42
www.todoexcel.com
Range("A1").Value = 1500
4. La 4 lnea representaba el final de la macro. Todas las macros se finalizan con la instruccin End Sub.
Tambin vimos que la macro se puede grabar automticamente, con la grabadora de macros, pero que preferimos escribirla para utilizar menos lneas de cdigo y de paso aprender mejor los fundamentos del cdigo. En la 2 parte de este curso estn las macros ms importantes que podrs necesitar, escritas, comentadas y listas para que puedas copiar, pegar y adaptar en tus propios desarrollos. De todas formas, como adelanto, veremos algunas macros nuevas aqu como para ir calentado motores.
2.5.1. Macro 1
Escribamos manualmente una nueva macro ahora: 1. Crea un nuevo libro Excel y gurdalo con el nombre Libro1. 2. Accede al Editor de visual basic con las teclas ALT+F11 3. Inserta un nuevo Mdulo desde el men Insertar > Mdulo 4. Dentro del mdulo escribe textualmente el siguiente cdigo: ' Esta macro muestra un texto en una ventana emergente Sub MostrarTexto() Msgbox "Manual de Macros TodoExcel" End Sub 5. Puedes ejecutar esta macro rpidamente posicionndote en cualquiera de sus lneas de cdigo y luego presionando la tecla F5 para ver lo que sucede. Tambin 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 instruccin Msgbox que sirve para abrir una ventana con la informacin que le indiquemos. Ms adelante vers como puedes mostrar en esa ventana informacin de celdas Excel u otros resultados. De momento solo hacemos que muestre el texto que indicamos entre comillas. Recuerda que esto es tan solo un adelanto. En la 2 parte de este curso estn las macros ms importantes que podrs necesitar, escritas, comentadas y listas para que las puedas copiar, pegar y adaptar en tus propios desarrollos.
43
www.todoexcel.com
2.5.2. Macro 2
Escribamos manualmente otra nueva macro ahora: 1. Puedes utilizar el mismo Libro1 de la macro anterior. 2. Accede al Editor de visual basic con las teclas ALT+F11 3. Puedes utilizar el mismo Mdulo de la macro anterior 4. Dentro del mdulo escribe textualmente el siguiente cdigo ' Esta macro oculta las lneas de divisin de las celdas Sub OcultarLineas() ActiveWindow.DisplayGridlines = False End Sub 5. Puedes ejecutar esta macro rpidamente posicionndote en cualquiera de sus lneas de cdigo y luego presionando la tecla F5 para ver lo que sucede. Tambin puedes ejecutarla volviendo a Excel con ALT+F11 y desde el men Herramientas > Macros > Macro, eligiendo de la lista la macro OcultarLineas y luego Aceptar. 6. Vers que la macro elimina las lneas de divisin de las celdas de la hoja activa (algo que tambin puedes hacer desde Excel, men Herramientas > Opciones > pestaa Ver > casilla Lneas de divisin). Esta macro utiliza el objeto ActiveWindow (ventana activa). Luego le asigna la propiedad DisplayGridlines=False (mostrar lneas de divisin=falso) Si quisieras volver a ver las lneas de divisin puedes cambiar la propiedad False por True, tal que: ActiveWindow.DisplayGridlines = True Recuerda que esto es tan solo un adelanto. En la 2 parte de este curso estn las macros ms importantes que podrs necesitar, escritas, comentadas y listas para que puedas copiar, pegar y adaptar en tus propios desarrollos.
2.5.3. Macro 3
Escribamos manualmente otra nueva macro ahora: 1. Puedes utilizar el mismo Libro1 de la macro anterior. 2. Accede al Editor de visual basic con las teclas ALT+F11 3. La escribiremos en un objeto hoja, as que has doble clic en Hoja1(Hoja1) 4. Escribe textualmente el siguiente cdigo: ' Esta macro copia un rango a la celda activa Sub CopiaRango() Range("A1:A5").Copy Destination:=ActiveCell End Sub
44
www.todoexcel.com
5. Para probar esta macro vuelve a Excel con ALT+F11 y escribe algunos nmeros o palabras a gusto en el rango A1:A5. Por ejemplo:
5.1 Posicinate en la celda C1 5.2 Desde el men Herramientas > Macros > Macro, elige de la lista la macro CopiaRango y luego Aceptar. 5.3 El resultado ser que el rango A1:A5 se copiar a partir de la celda C1 que era la celda activa al ejecutar la macro.
6. Esta macro utiliza algunas OPM (objetos, propiedades y mtodos) nuevos: Range("A1:A5") El objeto Range ya lo conocamos... Copy Este es un mtodo (una accin) Destination:=ActiveCell Este es otro objeto. Destination se suele utilizar luego de un Copy y ActiveCell hace referencia a la celda activa. Recuerda que esto es tan solo un adelanto. En la 2 parte de este curso estn las macros ms importantes que podrs necesitar, escritas, comentadas y listas para que puedas copiar, pegar y adaptar en tus propios desarrollos.
45
www.todoexcel.com
Las principales ventanas de editor son: Proyecto (arriba a la izquierda) Propiedades (abajo a la izquierda) Inmediato (arriba a la derecha)
46
www.todoexcel.com
Cdigo (abajo a la derecha) No importa si no ves todas las ventanas (se pueden mostrar u ocultar desde el men "Ver"). En las secciones siguientes te explicaremos la utilidad de cada una de estas ventanas.
Proyectos
En un primer nivel tenemos los proyectos. Por regla general, cada libro excel tiene asociado un proyecto. Por ejemplo, si creas un nuevo libro Excel desde el men de Excel Archivo > Nuevo y vuelves al editor de macros (ALT+F11), vers que aparece el proyecto VBAProject(Libro1). Dentro del parntesis aparece el nombre de tu libro excel y lo de VBAProject podrs cambiarlo luego. En resumen VBAProject(Libro1) es la carpeta principal, asociada a un libro Excel determinado, donde insertaremos todo lo referido a las macros para dicho libro.
Carpetas
En un segundo nivel tenemos 3 carpetas: - Microsoft Excel Objetos - Formularios
47
www.todoexcel.com
- Mdulos. Veamos cada una de ellas: 1. Microsoft Excel Objetos En esta carpeta vemos que cuelgan dos elementos: 1.1 ThisWorkbook siempre est presente. Si escribimos una macro aqu la misma afectar a todo el libro. 1.2 Hoja1(Hoja1) hace referencia las hojas de Excel (habr 1 por cada hoja de nuestro libro). Si escribimos una macro aqu la misma solo afectar a la hoja en cuestin.
2. Formularios Los formularios son ms conocidos como UserForms. Si no lo visualizas puedes agregarlos desde el men Insertar > Userform. 2.1 Dentro de la carpeta de Formularios vemos un elemento llamado Userform1. Todo el tema de formularios lo veremos con ms en detalle en el captulo "Formularios".
3. Mdulos Los mdulos sirven para escribir macros a nivel genrico, sin estar relacionadas a la hoja o libro en particular. Si no visualizas ninguno puedes agregarlos desde el men Insertar > Mdulo. 3.1 Dentro de la carpeta de Mdulos vemos que hay un elemento llamado Mdulo1. Podemos insertar tantos mdulos como necesitemos. En los mdulos podemos escribir macros que operan de forma genrica, sin distinguir entre hojas o libros. Haciendo doble clic izquierdo en cualquiera de estos objetos vers que se habilita la Ventana de Cdigo de la izquierda (una hoja en blanco grande). En la misma es donde se escriben las macros. Recuerda: antes de escribir una macro debes evaluar donde hacerlo. 1. Si es una macro que solo debe afectar una hoja en particular escrbela en los objetos de Hoja, en el nombre de Hoja correspondiente. 2. Si la macro debe afectar a todo un libro en particular escrbela en el objeto ThisWorkbook. Estas suelen ser macros que se ejecutan al abrir, cerrar o guardar el libro. 3. Si la macro es de tipo genrica escrbela en un Mdulo. 4. Si quieres hacer un formulario utiliza el objeto Userform.
48
www.todoexcel.com
Cada objeto tiene sus propiedades. Por ejemplo, si hacemos doble clic en el objeto Mdulo1 que vimos en la seccin anterior, podremos ver sus propiedades:
Algunos objetos tienen muchas propiedades (por ej. los Userforms) as que tenemos la opcin de ordenar lso mismos de forma alfabtica o por categora. El objeto Mdulo1 solo tiene la propiedad (Name)Mdulo1. Si quisiramos podramos reemplazar el nombre de Mdulo1 y asignar otro nombre a gusto. Consejo: en la medida que vamos insertando muchas macros en nuestro proyecto, conviene ir creando nuevos mdulos con nombres apropiados para mantener ordenadas nuestras macros. El resto de las propiedades de los otros objetos escapa al alcance de esta seccin, pero podrs ver algunas en la 2 parte de este curso.
49
www.todoexcel.com
Esta ventana no tiene mayores complicaciones. Lo que interesa es ms bin el cdigo que escribamos aqu. Puedes escribir todas las macros que quieras en esta ventana. Recuerda que el mismo editor asignar automticamente los colores al cdigo y adems separar con una lnea contnua cada macro. En la medida que empecemos a escribir muchas macros, existe una forma rpida de movernos entre ellas. Desde la lista desplegable de la parte superior derecha podremos ver la lista de macros escritas. Haciendo clic en cualquiera de ellas el editor nos posicionar rpidamente en la misma.
50
www.todoexcel.com
La ventana inmediato sirve para escribir, ejecutar y probar un cdigo macro rpidamente, sin tener que armar toda la macro con la estrucuta que comentamos en secciones anteriores. Por ejemplo, si quisiramos averiguar la cantidad de hojas que tiene un Libro podramos escribir la siguiente macro en un mdulo y ejecutarla: Sub ContarHojas() Dim N As Long N= thisworkbook.Sheets.Count Msgbox N End Sub De momento no importa los objetos, propiedades o mtodos que hemos utilizado. Solo te queremos mostrar que es una macro de 5 lneas. Ahora supongamos que solo nos interesa saber el nmero de hojas del libro, pero no queremos armar toda la macro, solo nos interesa obtener el resultado. Entonces, en la ventana inmediato podemos escribir: ?thisworkbook.Sheets.Count y al presionar Enter en la fila siguiente nos mostrar el nmero de hojas que posee el libro. El signo ? al comienzo significa que estamos buscando conocer el resultado de algo. El resultado final se vera as, suponiendo que el libro tiene 1 hoja:
Veamos otro ejemplo. Si el libro fue guardado, podramos querer averiguar el directorio donde se encuentra. Podramos averiguarlo desde la Ventana Inmediato, escribiendo ?thisworkbook.Path y presionando Enter. Al presionar Enter, en la fila siguiente se mostrar la ruta del libro, por lo que en la Ventana Inmediato veremos algo as, suponiendo que el libro se encuentra guardado en ese directorio:
51
www.todoexcel.com
En los 3 ejemplos anteriores buscbamos un resultado y anteponamos el signo ? al comienzo de la instruccin (buscbamos un nombre o un nmero). En otros casos podemos ejecutar una accin directamente y por lo tanto escribimos la macro sin el signo ?. Por ejemplo, si queremos que en la celda A1 aparezca el valor 100 lo podemos ejecutar desde la Ventana Inmediato como se ve a continuacin:
En la celda A1 de la Hoja activa de Excel aparecer el valor 100. Recuerda: desde la Ventana Inmediato puedes ejecutar macros de forma inmediata, como su nombre lo indica. Pero dichas macros solo se ejecutan 1 vez al presiona enter y no quedan disponibles en la lista de macros ni las puedes utilizar en tus desarrollos (asignndolas a botones o formularios).
52
www.todoexcel.com
Para proteger tus macros sigue estos pasos: 1. Tilda la casilla Bloquear proyecto para su visualizacin 2. Escribe una Contrasea 3. Vuelve e escribir tu contrasea en Confirmar contrasea De esta forma, cuando alguien acceda al editor, ver la ventana proyecto del libro pero no podr ver los objetos donde quedan escritas las macros (mdulos, hojas y userforms). Si hace doble clic en el Proyecto aparecer una ventana solicitando la clave.
53
www.todoexcel.com
54
www.todoexcel.com
2. Clic en Ejecutar En la parte inferior figura una lista desplegable donde puedes elegir si quieres listar las macros de Todos los libros abiertos, solo las de Este libro o las de PERSONAL.XLS PERSONAL.XLS es un libro excel que se abre automticamente cada vez que abres Excel. Este libro permanece oculto desde Excel, pero es posible verlo desde el editor de macros. Todas las macros que escribas en PERSONAL.XLS siempre estarn disponibles cada vez que habras tus libros Excel. Es una opcin muy til por si tienes macros que quieres utilizar en todos tus libros Excel (solo estrn disponibles en tu PC).
55
www.todoexcel.com
3. Donde dice Tecla de mtodo abreviado presiona la tecla MAYUSC y luego una letra. En nuestro ejemplo la macro se ejecutar con Ctrl+Maysc+Q
Recuerda: la macro siempre se ejecuta con la tecla Ctrl+ la letra que tu escribas en la casilla. Sin embargo, hay muchas combinaciones de Ctrl+Letra que ya estn ocupadas por Excel (Ctrl+C copiar, Ctrl+V pegar, Ctrl+X pegar, etc) y no se aconsejamos que utilices dichas combinaciones. Por eso lo que se hace es presionar Maysc antes de la letra de tal forma que la macro se ejecutar con Ctrl+Mays+Letra y de esta forma no alterar las teclas de mtodo abreviado por defecto de Excel.
56
www.todoexcel.com
Excel 2.003: desde el men Ver > Barra de Herramientas > Dibujo. Esto muestra un men como el siguiente:
Excel 2.007: desde la ficha Insertar > Formas. Esto muestra un men como el siguiente:
Si ya has insertado una figura en tu hoja Excel, podrs asociarle una macro siguiendo estos pasos: 1. Haz clic izquierdo en la figura para desplegar su men de opciones. 2. Elige la opcin Asignar macro
3. Al elegir la opcin de Asignar macro abrirs el el men de macros. Selecciona de la lista la macro de tu inters luego Aceptar.
57
www.todoexcel.com
4. Finalmente la figura quedar con la macro asignada, de tal forma que cada vez que hagas un clic encima de la figura, se ejecutar la macro.
58
www.todoexcel.com
2. Es importante que mantengas abierto el cuadro de Personalizar, porque si no no podrs editar el botn. Si hacemos clic izquierdo sobre el botn se desplegar el men de opciones. Las opciones ms importantes son las de Cambiar imagen del botn y la de Asignar macro. Esta ltima opcin nos permitir abrir el cuadro de diogo con la lista de macros creadas para asignarle una macro determinada (visto en la seccin anterior).
59
www.todoexcel.com
2.7.6. Automticamente
Las macros tambin se pueden ejecutar automticamente. Por ejemplo, se pueden hacer macros que se ejecuten cada cierto tiempo o que se ejecuten solas cada vez que el usuario hace algo como abrir, cerrar, guardar un libro, activar o desactivar una hoja, etc. Este tema se trata con ms detalle en el siguiente captulo Macros de Eventos.
60
www.todoexcel.com
61
www.todoexcel.com
3. Finalmente, en la lista desplegable de la derecha veremos todos los eventos de libro que podemos utilizar para disparar nuestra macro.
4. Por ejemplo, si haces clic en la opcin Activate, vers que en la ventana de macros se escribe automticamente el siguiente cdigo: Private Sub Workbook_Activate() End Sub Al seleccionar una macro de vento el editor escribe automticamente la primera y tlima lnea de su cdigo (no debes modificar esto). Luego podrs escribir tu cdigo macro entre esas lneas. En este caso, la macro que escribas se ejecutar cada vez que actives el libro excel en cuestin. Por ejemplo, puedes hacer una macro que muestre un mensaje de saludo cada vez que abres el libro:
62
www.todoexcel.com
Entonces, cada vez que abras el libro, la macro se ejecutar automticamente y vers el saludo:
En el caso de las macros de evento, siempre aparece la palabra Private. Eso significa que esa macro no la podrs ver en la lista del men de macros. Esto es as porque la macro no se puede ejecutar manualmente, si no que se ejecuta automticamente cuando ocurre el evento, en este caso cuando se activa el libro excel en cuestin. Existen ms de 20 macros de evento a nivel libro. Puedes insertarlas siguiendo las instrucciones dadas al comienzo. Las ms importantes son: Private Sub Workbook_BeforeClose(Cancel As Boolean) ' El cdigo que escribas aqu se ejecutar automticamente al cerrar el libro End Sub Private Sub Workbook_BeforePrint(Cancel As Boolean) ' El cdigo que escribas aqu se ejecutar automticamente al imprimir el libro End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) ' El cdigo que escribas aqu se ejecutar automticamente al guardar el libro End Sub Private Sub Workbook_Open() 'El cdigo que escribas aqu se ejecutar automticamente al abrir el libro End Sub
63
www.todoexcel.com
3. Finalmente, en la lista desplegable de la derecha veremos todos los eventos de hoja que podemos utilizar para disparar nuestra macro automticamente.
64
www.todoexcel.com
4. Por ejemplo, si haces clic en la opcin Activate, vers que en la ventana de macros se escribe el siguiente cdigo: Private Sub Worksheet_Activate() End Sub Al seleccionar una macro de evento el editor escribe automticamente la primera y tlima lnea de su cdigo (no debes modificar esto). Luego podrs escribir tu cdigo macro entre esas lneas. En este caso, la macro que escribas se ejecutar cada vez que actives la hoja excel en cuestin. Por ejemplo, puedes hacer una macro que muestre un mensaje de saludo cada vez que activas la hoja:
Entonces, cada vez que actives la hoja, la macro se ejecutar automticamente y vers el saludo:
En el caso de las macros de evento, siempre aparece la palabra Private. Eso significa que esa macro no la podrs ver en la lista del men de macros. Esto es as porque la macro no se puede ejecutar manualmente, si no que se ejecuta automticamente cuando ocurre el evento, en este caso cuando se activa la hoja excel en cuestin.
65
www.todoexcel.com
Existen unas 9 macros de evento a nivel hoja. Puedes insertarlas siguiendo las instrucciones dadas al comienzo. Las ms importantes son:
Private Sub Worksheet_Activate() ' El cdigo que escribas aqu se ejecutar automticamente al activar la hoja End Sub Private Sub Worksheet_Calculate() ' El cdigo que escribas aqu se ejecutar automticamente al calcular la hoja End Sub Private Sub Worksheet_Deactivate() ' El cdigo que escribas aqu se ejecutar automticamente al desactivar la hoja End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' El cdigo que escribas aqu se ejecutar automticamente al moverte entre las celdas de la hoja (cada vez que seleccionas y te posicionas en una nueva celda) End Sub Private Sub Worksheet_Change(ByVal Target As Range) ' El cdigo que escribas aqu se ejecutar automticamente al producirse un cambio en la hoja (por ejemplo al introducir un dato en una celda, seleccionar una opcin de una lista desplegable, etc.) End Sub
66
www.todoexcel.com
2.9. FORMULARIOS
Un Formulario (o su denominacin en ingls Userform) se utiliza para crear un Cuadro de Dilogo donde el usuario puede introducir informacin, o realizar otras operaciones. Al ejecutar muchas de las opciones del men de Excel se abren formularios. Por ejemplo, desde el men Herramientas > Opciones se abre un formulario como el siguiente, desde donde se pueden activar o desactivar distintas opciones de Excel.
Este formulario es muy completo y posee pestaas en la parte superior, casillas de seleccin (cuadraditos con tildes), casillas de opciones (crculos con un punto dentro) y listas desplegables (lista con una flechita que despliega distintas opciones). Tambin podemos crear nuestros propios formularios como se ve a continuacin.
67
www.todoexcel.com
Los Userforms se utilizan mucho para crear aplicaciones Excel que luzcan de forma profesional y permitan al usuario introducir datos o elegir opciones de una forma guiada y ms intuitiva. En este captulo aprenderemos como construir nuestros propios Userforms !
68
www.todoexcel.com
3. En la ventana de Cdigo de la derecha, veremos que aparece un Userform en blanco, sin controles. Para abrir su Cuadro de Herramientas puedes hacerlo desde el men Ver > Cuadro de Herramientas. Ah figuran los controles que podremos agregar dentro del Userform. Para adir uno, simplemente hacemos clic izquierdo en el control deseado y luego clic izquierdo dentro del Userform, en el sitio donde querramos agregar el control.
La idea es que mediante estos controles podremos tanto capturar como enviar informacin o datos desde o hacia las celdas de Excel respectivamente. Tambin podemos asociar macros a los controles que agreguemos al Userform (todo esto lo veremos en secciones siguientes). Si te posicionas sobre los Controles del Cuadro de herramientas, vers que aparece su nombre. Simplemente hacemos clic izquierdo en el control deseado y luego clic izquierdo en el Userform, en el sitio donde querramos agregar el control. En nuestro caso hemos agregado algunos controles de forma desordenada dentro del Userform.
69
www.todoexcel.com
Ahora explicaremos brevemente la utilidad de cada control. Los controles se explican en el mismo orden que aparecen en el Cuadro de Herramientas y en la figura anterior (de izquierda a derecha y de arriba hacia abajo).
Seleccionar objetos: sirve para seleccionar controles que hayamos insertado en el Userform.
Label (etiqueta): sirve para poner un ttulo o un texto. Ejemplo: podemos poner un texto del tipo "Complete las opciones a continuacin" y ubicarlo en cualquier sitio del Userform. Tambin podemos agregar ttulos o descripciones al resto de comandos que agregemos en el Userform.
70
www.todoexcel.com
Textbox (cuadro de texto): sirve para que un usuario introduzca datos. Ejemplo: queremos que el usuario introduzca una fecha o un nombre (que luego llevaremos a alguna celda de Excel).
ComboBox (cuadro combinado): sirve para que un usuario elija una opcin de una lista. Ejemplo: creamos una lista con los meses de Enero a Diciembre para que el usuario elija uno de ellos.
ListBox (cuadro de lista): sirve para que un usuario rellene o elija varias opciones de una lista. Ejemplo: creamos una lista con Regiones o Ciudades y el usario deber elegir una o varias de ellas.
CheckBox (casilla de verificacin): sirve para que un usuario active una determinada funcin. Ejemplo: podemos hacer que al cerrar el Userform se imprima un reporte solo si la casilla de seleccin est tildada.
OptionButton (botn de opcin): sirve para que un usuario seleccione una opcin determinada entre varias posibilidades. Ejemplo: queremos que el usuario indique si es de sexo Masculino o Femenino. De todas las opciones solo se puede seleccionar una de ellas.
ToggleButton (botn de alternar): sirve para activar o desactivar alguna funcionalidad. Este botn adopta el modo "Encendido" / "Apagado". Ejemplo: queremos que el usuario defina su idioma, en modo encendido espaol y en modo apagado ingls.
Frame (marco): sirve para agrupar elementos de un Userform (los elementos se deben ubicar dentro del Frame). Ejemplo: tenemos varias grupos de OptionButton y para distinguirlos los agrupamos con un Frame. Si tenemos un grupo de opciones tipo masculino/femenino los agrupamos dentro de un frame. Si luego tenemos otro gurpo de opciones del tipo Mayor de Edad / Menor de Edad los agrupamos dentro de otro Frame.
71
www.todoexcel.com
CommandButton (botn de comando): es un simple botn que nos permite ejecutar acciones. Ejemplo: un botn de Ayuda que ejecuta otro Userform con ayuda para el usuario.
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 seccin podemos ubicar distintos controles.
MultiPage (pgina mltiple): en un mismo Userform se pueden crear distintas pginas. Ejemplo: un userform con 2 pginas: Espaa y Resto del Mundo. Dentro de cada pgina podemos ubicar distintos controles o distintas secciones.
ScrollBar (barra de desplazamiento): si tenemos una lista con muchos elementos el scrollbar nos permite navegarlos. Ejemplo: tenemos una lista con 150 pases. Con el ScrollBar podemos subir y bajar por la lista de los mismos utilizando las flechas de desplazamiento.
SpinButton (botn de nmero): permite aumentar o disminuir valores. Ejemplo: tenemos una lista con tipos de inters y queremos que sean incrementados o disminudos en cantidades predeterminadas desde el SpinButton.
Image (imagen): permite introducir imgenes en el Userform. Ejemplo: queremos introducir una fotografa como fondo del Userform para darle un aspecto ms profesional.
RefEdit (referencia): permite hacer referencia a una celda de Excel. Ejemplo: queremos que el usuario seleccione un dato que fue introducido previamente en una celda Excel. Haciendo doble clic en cada control se abrir una venta donde podremos escribir y asociarle una macro. En la seccin siguiente veremos un ejemplo simple sobre como crear un Userform paso a paso.
72
www.todoexcel.com
Para ver como se veran estos controles dentro del Userform, vamos a crear un Userform que contiene los 15 controles que se pueden agregar. Los hemos agregado en el mismo orden en que aparecen en el Cuadro de Herramientas.
73
www.todoexcel.com
74
www.todoexcel.com
3. Nombramos el Userform
3.1 Abrimos las propiedades desde el men Ver > Ventana Propiedades. 3.2 Hacemos doble clic en donde dice (Name) UserForm1, en la parte superior y tipeamos DatosUF, luego Enter (este es el nombre con el que nos referiremos al Userform desde las macros). 3.3 El nombre del Userform cambi en la Ventana de Proyecto, pero el Userform mismo sigue mostrando "Userform1" en su barra de su ttulo. Para cambiarlo vamos a la Ventana Propiedades, hacemos doble clic en Caption, escribimos Datos Personales (encima de Userform1) y luego Enter. Ahora, la barra de ttulo del Userform es ms apropiada para nuestro propsito y para darle mejor informacin al usuario.
75
www.todoexcel.com
4.2 Con el nuevo TextBox seleccionado hacemos doble clic en la Ventana de Propiedades, propiedad (Name), tipeamos la palabra UFNombre y luego enter (este es el nombre que le asignamos al objeto para luego referirnos a l desde las macros).
4.3 Hacemos clic en una parte vaca del Userform, para volver a seleccionar todo el Userform.
5. Agregamos un Texto
Para ayudar al usuario a ingresar sus datos, debemos indicarle que es lo que debe introducir en el Cuadro de Texto del Paso anterior. Podemos agregar una etiqueta de texto que describa la informacin que se debe introducir. 5.1 En el Cuadro de Herramientas hacemos clic en el botn Label o Etiqueta 5.2 En el Userform hacemos clic a la izquierda del TextBox, para agregar la Etiqueta de texto.
76
www.todoexcel.com
5.3 Si fuera necesario podemos cambiar el tamao de la etiqueta de texto o del Cuadro de Texto para que no se superpongan. Se puede hacer clic en sus bordes (pequeos cuadraditos) y arrastrar para cambiar su tamao. 5.4. Seleccionamos la nueva etiqueta, hacemos doble clic en la propiedad Caption de la ventana de propiedades, tipeamos Nombre y luego Enter.
5.5 Hacemos clic en alguna parte vaca del Userform para seleccionarlo y mostrar el cuadro de herramientas.
77
www.todoexcel.com
Si los textbox no quedan alineados se pueden alinear de la siguiente forma: 1. Clic en el primer TextBox 2. Mantieniendo pulsada la tecla MAYUS, selecciona los otros TextBox 3. Vamos al men Formato > Alinear > Izquierda 4. Hacemos clic en alguna parte vaca del Userform para seleccionarlo y mostrar el cuadro de herramientas.
78
www.todoexcel.com
8.4 En el men superior elegimos Ver > Objeto para regresar al Userform.
79
www.todoexcel.com
No te preocupes si no comprendes el cdigo. Hay muchos objetos, propiedades y mtodos nuevos. Todos ellos se explican mejor en la 2 parte de este curso.
Probar el Userform
Ya podemos probar el funcionamiento del Userform ! 1. Hacemos clic en alguna parte vaca del Userform para seleccionarlo y mostrar el cuadro de herramientas. 2. En el men superior elegimos Ejecutar > Ejecutar Sub/Userform 3. Ahora podemos comenzar a completar el primer cuadro del Userform y escribimos un nombre, por ej. Juan. 4. Presionamos la tecla TAB para movernos al siguiente cuadro de texto. 5. Cuando hemos completado todos los cuadros de texto, hacemos clic en el botn de Agregar y los datos se completarn en la Tabla de Excel. 6. Podemos repetir los pasos anteriores e ir agregando distintos nombres con sus respectivos datos. 7. Hacemos clic en Cerrar para volver al editor de macros. La tecla TAB sirve para moverse entre los distintos controles de un Userform. Si al presionar TAB el orden del movimiento no es el correcto, es posible camabiarlo: 1. Clic derecho en una parte vaca del USerform 2. Elegimos Orden de Tabulacin. 3. Seleccionamos el control de la lista y con los botones de Mover Arriba o Mover Abajo ajustamos el orden. 4. Hacemos clic en OK
80
www.todoexcel.com
81
www.todoexcel.com
2.10. VARIOS
En este captulo se comentan temas diversos pero que no dejan de ser importantes sobre macros.
82
www.todoexcel.com
.Pattern = xlSolid .PatternColorIndex = xlAutomatic End With End Sub Esta SuperMacro podramos simplificarla de tal forma que ejecute 3 MiniMacros: Sub SuperMacro() Call FormatoN Call Bordes Call Relleno End Sub La palabra Call se puede omitir pero recomendamos utilizarla para identificar mejor que estamos llamando otras macros. Como se v en el cdigo, la SuperMacro ejecuta 3 macros. Estas 3 macros deben estar ubicadas en el mismo mdulo y las escribimos a continuacin: Sub FormatoN() 'Asigna Formato Numrico Selection.NumberFormat = "#,##0;[Red]#,##0" End Sub Sub Bordes() 'Asigna Bordes With Selection.Borders .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With End Sub Sub Relleno() 'Asigna Color de Relleno With Selection.Interior .ColorIndex = 36 .Pattern = xlSolid .PatternColorIndex = xlAutomatic End With End Sub
83
www.todoexcel.com
Sub Macro() Range("A2").Select End Sub Si las instrucciones estn bien escritas el editor convierte automticamente las maysculas y asigna los colores azules a las estrucutras reconocidas y verde a los comentarios. Las estructuras reconocidas son aquellas que siempre se deben respetar y se explican mejor en la 2 parte del curso, captulo "Estrucuturas". Si cometiramos un error al referirnos al objeto "Range" y por ejemplo olvidramos poner la comilla luego del 2, al dar enter a dicha lnea aparecera un mensaje de error y la lnea se pintara automticamente de rojo, como se ve a continuacin. Sub Macro() Range("A2).Select End Sub Cuando sucede esto aparece un aviso que nos indica el error cometido. Si vemos que la lnea est roja es seal que debemos corregir algo (usualmente falta o sobra algn caracter). En nuestro caso, hemos olvidado poner la comilla (el objeto Range siempre requiere que la celda est entre comillas y luego entre parntesis). Veamos otro error de tipeo. En ese caso escribimos errneamente "Sab", en lugar de "Sub". A pesar que no aparecer ningn mensaje de error, vemos que el editor no ha pintado de azul la palabra "Sab". Sab Macro() Range("A2").Select End Sub Al intentar ejecutar esta macro no suceder nada, porque no se ha respetado la estructura de Sub() - End Sub con la que debe comenzar y finalizar una macro respectivamente. En otras ocasiones, la macro arrastra un error pero el mismo no aparece hasta ejecutarla. Veamos el caso de la siguiente macro. Al escribirla no ha generado error y ninguna lnea se ha pintado de rojo. Sin embargo, al ejecutarla s aparece un error. Sub Macro() If Range("a2").value = 2 Then MsgBox "Mal" End Sub El error que aparece al ejecutarla es un aviso que indica: "Error de compilacin: Bloque If sin End If" Al hacer clic en aceptar la macro queda en "Modo Interrupcin", lo que significa que todo queda en pausa y no se podrn ejecutar nuevas macros (el modo de interrupcin se identifica porque el nombre de la macro queda resaltado en amarillo). Lo que debemos hacer en esta instancia es salir de modo interrupcin desde el mismo editor, men Ejecutar > Reestablecer. Luego procedemos a corregir la macro. En este caso el mensaje fue claro: la esctructura estaba incompleta, nos falt el
84
www.todoexcel.com
End If (existe una estructura If - End If que se explica mejor en la 2 parte del curso, captulo "Estructuras"). Una vez que se ha interrumpido la macro, tenemos la opcin de ejecutarla paso a paso (o lnea por lnea) y as determinar en qu lnea est el error. Este lo puedes hacer posicionndote en la primera fila de la macro y luego presionar la tecla F8. De esta forma se ir resaltando con amarillo y ejecutando cada fila, hasta que llegues a la que produce el error. Tambin puedes hacerlo desde la opcin del men Depuracin > Paso a paso por instrucciones.
85
www.todoexcel.com
A la izquierda se ve la lista de complementos disponibles siendo posible activarlos o desactivarlos (seleccionando o deseleccionando la casilla a la izquierda de su nombre). Cuando queremos instalar nuevos complementos debemos hacerlo con el botn Examinar. Dicho botn nos permitir buscar el directorio donde se encuentra el complemento que deseamos instalar. La extensin de los archivos de complementos es XLA. La utilidad de un complemento es que podemos crear nuestras macros y luego guardarlas como complemento. De esta forma, dichas macros estarn disponibles en todas las hojas Excel que abramos, dado que el complemento se cargar automticamente (Excel carga automticamente todos los complementos que estn seleccionados al abrirse). El proceso de creacin de un complemento es sencillo: 1. Primero debes crear tus macros normalmente, desde el editor de macros 2. Luego debes guardar dicho archivo excel desde el men Archivo > Guardar como... 3. Se abrir el Cuadro de dilogo de guardar y en la parte inferior hay una lista desplegable llamada Guardar como tipo. En dicha lista debes elegir la opcin Complemento de Microsoft Excel, que suele ser la ltima de las opciones.
4. Debers elegir un nombre para tu complemento y guardarlo normalmente. Dicho archivo se guardar automticamente con la extensin XLA. 5. Para instalar el complemento debes hacerlo desde el men Herramientas > Complementos y luego la opcin Examinar, tal como te sealbamos al comienzo. Debers buscar el directorio donde guardaste el archivo XLA y seleccionarlo. De este modo, cada vez que abras el Excel, el complemento estar activo.
Excel 2.007
Para visualizar los complementos instalados, puedes hacerlo desde la ficha Complementos, y vers un cuadro similar al que se muestra a continuacin (los complementos visibles dependen de los que tengas activados, en nuestro caso solo tenemos activado un complemento llamado "ASAP Utilities").
86
www.todoexcel.com
Si quieres instalar nuevos complementos, debers hacerlo desde el men Office > Opciones de Excel > Complementos. Con el botn Ir podrs abrir el cuadro de complementos.
87
www.todoexcel.com
A la izquierda se ve la lista de complementos disponibles siendo posible activarlos o desactivarlos (seleccionando o deseleccionando la casilla a la izquierda de su nombre). Cuando queremos instalar nuevos complementos debemos hacerlo con el botn Examinar. Dicho botn nos permitir buscar el directorio donde se encuentra el complemento que deseamos instalar. La extensin de los archivos de complementos es XLA. La utilidad de un complemento es que podemos crear nuestras macros y luego guardarlas como complemento. De esta forma, dichas macros estarn disponibles en todas las hojas Excel que abramos, dado que el complemento se cargar automticamente (Excel carga automticamente todos los complementos que estn seleccionados al abrirse). El proceso de creacin de un complemento es sencillo: 1. Primero debes crear tus macros normalmente, desde el editor de macros 2. Luego debes guardar dicho archivo excel desde el men Archivo > Guardar como... 3. Se abrir el Cuadro de dilogo de guardar y en la parte inferior hay una lista desplegable llamada Guardar como tipo. En dicha lista debes elegir la opcin Complemento de Microsoft Excel, que suele ser la ltima de las opciones.
4. Debers elegir un nombre para tu complemento y guardarlo normalmente. Dicho archivo se guardar automticamente con la extensin XLA. 5. Para instalar el complemento debes hacerlo desde el men Herramientas > Complementos y luego la opcin Examinar, tal como te sealbamos al comienzo. Debers buscar el directorio donde guardaste el archivo XLA y seleccionarlo. De este modo, cada vez que abras el Excel, el complemento estar activo.
Excel 2.003
Excel posee 3 niveles de seguridad de macros. Los mismos se pueden definir desde el men Herramientas > Opciones > pestaa Seguridad > botn Seguridad de macros. El cuadro de dilogo que se abre se ve as:
88
www.todoexcel.com
Lo recomendable es tener el nivel de seguridad en Medio. De esta forma cada vez que abramos un archivo tendremos la opcin de habilitar o deshabilitar las macros, mediante un mensaje automtico de aviso que aparece. Si el archivo proviene de una fuente segura las podremos habilitar sin problemas.
Excel 2.007
Esta versin de Excel posee gran cantidad de novedades respecto a temas de seguridad. En primer lugar, las opciones de niveles de seguridad de macros las encontramos en el men Office > Opciones de Excel > Centro de confianza > Configuracin del Centro de confianza tal cual se ve a continuacin:
89
www.todoexcel.com
Al presionar el botn de Configuracin del Centro de confianza aparece una nueva ventana en la cual debemos elegir de Configuracin de macros (parte izquierda) y luego seleccionar la opcin Deshabilitar todas las macros con notificacin. Esto har que cada vez que se abra un libro con macros, aparezca un mensaje notificando de las mismas y dando la opcin de habilitarlas o deshabilitarlas.
90
www.todoexcel.com
No mostrar el mensaje de "Habilitar Macros" Otra opcin muy interesante que ofrece Excel 2.007 es la de generar "Carpetas de confianza", de tal modo que para cualquier archivo que est guardado en esas carpetas, se habilitarn automticamente las macros (nos evitaremos el molesto mensaje de "Habilitar macros"). Para configurar esto vamos al Centro de Confianza, seleccionamos Ubicaciones de confianza y luego indicamos una carpeta desde el botn de Agregar nueva ubicacin...
91
www.todoexcel.com
Si quieres ejecutar las macros y que no vuelva a aparecer dicho mensaje, debers crear una Firma Digital. Para crear una firma digital hay que ejecutar un archivo llamado Selfcert.exe (en mi caso particular se encuentra ubicado en C:\Archivos de programa\Microsoft Office\Office\). Si no lo tienes all, puedes buscarlo en tu PC con la opcin de buscar archivos.
Al ejecutar Selfcert.exe se abre una pequea ventana donde se pide el ingreso del texto de la firma digital y luego aceptar. Ahora lo que debemos hacer es asociar dicha firma a nuestro archivo xls con macros. Para esto abrimos nuestro xls con macros, pasamos al editor de macros y elegimos las opciones del men Herramientas > Firma Digital. Luego hacemos click en el botn Elegir, escogemos la firma creada, aceptamos y todo listo, macros firmadas.
Cuando abramos el xls con macros nuevamente, Excel indicar que posee macros firmadas por XXXX (nombre de la persona que creo la firma). Si marcamos la casilla de confiar de esta fuente, ya nunca ms aparecer el mensaje de macros al abrir dicho archivo. Todos los xls que lleven esa firma se abrirn con sus macros habilitadas.
92
www.todoexcel.com
En el mismo figuran los nombres de las macros creadas, as que solo tienes que seleccionar la macro y luego hacer clic en el botn de Ejecutar. Si deseas ocultar las macros del libro en dicho cuadro puedes hacerlo utilizando la instruccin Private cuando escribas tu macro. Debes utilizar dicha instruccin delante de la palabra Sub. De este modo solo ocultars la macro en cuestin. Ejemplo:
93
www.todoexcel.com
Private Sub MiMacro() 'Esta macro no aparecer en la lista de macros 'Cdigo de tu macro aqu End Sub Si tienes muchas macros en el mdulo y quieres ocultarlas todas, en lugar de escribir la palabra Private en cada una de ellas, puedes colocar la siguiente instruccin al comienzo de tu mdulo: Option Private Module De esta forma todas las macros de dicho mdulo quedarn ocultas.
94
www.todoexcel.com
Application.Calculation = xlCalculationAutomatic End Sub
95
www.todoexcel.com
Selection.Copy Range("E10").Select ActiveSheet.Paste End Sub Sin embargo hay una forma ms directa donde evitamos el Select, el Selection y el Paste: Sub CopiaRango() Range("C10:C12").Copy Range("E10") End Sub
96
www.todoexcel.com
3. MACROS
En esta parte del curso veremos casos prcticos de macros, listas para utilizar o adaptar. Variables: qu son las variables y cmo se utilizan. Libros: macros para manipular libros. Hojas: macros para manipular hojas. Rangos: macros para manipular rangos. Arrays: que son los arrays y cmo se utilizan. Estructuras: las estructuras y macros ms comunes. Cuadros de dilogo: utilizacin y funciones de los cuadros de dilogo. Barras de herramientas: como crear y manipular barras de herramientas. Mens: como crear y manipular mens. Comandos: diversos comandos tiles muy utilizados.
97
www.todoexcel.com
3.1. Importante
Antes de comenzar con esta 2 parte del curso, es importante que tengas en cuenta lo siguiente:
Dificultad
Esta 2 parte del Manual de Macros est pensada para usuarios Excel con conocimientos intermedios y avanzados de macros. Por eso te recomendamos previamente tener un buen dominio de la 1 parte de este curso, que contiene la teora para principiantes.
Utilizando el Application.Wait
Muchas de las macros adjuntas en los libros, muestran la siguiente lnea de cdigo: Application.Wait Now + TimeValue("00:00:01") Esto produce que la macro se ejecute de forma ms lenta, para poder observar mejor el cometido que est realizando, pues de lo contrario, y sobre todo en las macros con poco cdigo, la macro finalizara en apenas unas dcimas de segundo. Por ejemplo,con Application.Wait Now + TimeValue("00:00:02") obligamos a Excel a esperar 2 segundos ms que el tiempo actual para continuar con la lnea del cdigo que estuviese a continuacin.
98
www.todoexcel.com
99
www.todoexcel.com
3.2. VARIABLES
Como prcticamente todas las macros utilizan variables, es importante comenzar a entenderlas. Una variable es sencillamente un dato o valor que VBA guarda en memoria. Para definir una variable utilizamos una sintaxis del tipo: Dim NombreVariable As TipoVariable Dim: indica que estamos creando una variable NombreVariable: escribimos el nombre de nuestra variable a gusto (sin espacios) as: necesario para definir el tipo de variable TipoVariable: debemos indicar si es una variable texto, fecha, valor, etc. Veamos un ejemplo sencillo: Sub MiNombre () ' Indicamos que 'Nombre' es una variable 'String' (texto) Dim Nombre As String ' Le asignamos un valor a la variable (tambin podramos indicarle una celda Excel) Nombre = "Pedro" ' Mostramos el valor de la variable en un mensaje Msgbox Nombre End Sub La idea es que Excel recordar que la variable "Nombre" tiene asignado el valor "Pedro". Podremos utilizar dicha variable ms adelante en nuestro cdigo.
3.2.1. Definicin
Una variable es un lugar de almacenamiento con nombre que puede contener cierto tipo de datos que puede ser modificado durante la ejecucin del programa. Cada variable tiene un nombre nico que la identifica dentro de su nivel de mbito. Puede especificar un tipo de datos o no. Los nombres de variable deben comenzar con un carcter alfabtico, deben ser nicos dentro del mismo mbito, no deben contener ms de 255 caracteres y no pueden contener un punto o carcter de declaracin de tipo. Es decir las variables pueden contener caracteres alfanumricos, pero siempre deben empezar por una letra y no deben exceder en longitud de 255 caracteres Se recomienda evitar el uso de caracteres no presentes en nuestro alfabeto para evitar problemas. A su vez VBA tiene reservados algunos nombres, los cuales ovbiamante no pueden ser utilizados como variables propias, algunas de estas palabras son: Sub, End, with, do, loop etc, ya que son nombres que tienen un significado propio dentro de VBA. Cuando declaramos una variable, por ej: Dim SALUDOS as String
100
www.todoexcel.com
a medida que utilicemos la variable saludos an cuando la escribamos en minsculas VBA nos la corregir automticamente, ya que ha sido creada en maysculas. Es decir no debemos preocuparnos entre maysculas o minsculas salvo en la declaracin de variables y solo si queremos. Podemos declarar todo tipo evariables, por ello conviene tambin adquirir la costumbre de hacer que el propio nombre de nuestras variable resulte descriptivo de la funcin que cumplir, por ejemplo: Sub Macro() ' Definimos una variable numrica TipoCambio, que es el factor de conversin entre el euro y la libra Dim TipoCambio As Double ' Variable definida como valor con 2 decimales TipoCambio = 1.45 ' Esta macro multiplica el valor de la celda activa por el valor de la variable anterior ActiveCell.Value = TipoCambio * ActiveCell.Value End Sub Si el cdigo de nuestra macro crece mucho, al haber dado un nombre apropiado a la variable nos permitir reconocerla fcilmente, mucho mejor que haber hecho: Sub Macro() Dim valor As Double valor = 1.45 ActiveCell.Value = valor * ActiveCell.Value End Sub En el caso anterior, si la macro creci mucho, llegara un punto donde no recordaramos que haba en valor, porque es un nombre que no nos dice mucho. La declaracin de variables agiliza el consumo de memoria y hace que el cdigo se ejecute mas rpido. Si no declararamos las variables VBA manipularia todas las variables como Variant siendo el consumo de memoria bastante mayor.
3.2.2. Declaracin
Antes de seguir avanzando con las variables, su uso y sus tipos, conviene preparar nuestro editor de macros, para que siempre nos veamos en la obligacin de declarar todas las variables que podamos ir utilizando en nuestros mdulos (es decir obligarnos a definir nuestras variables de entrada). Esto lo podemos realizar desde el editor de VBA, a traves del men Herramientas > Opciones > pestaa Editor > y seleccionar la casilla Requerir declaracin de variables Con esta accin cada vez que insertamos un nuevo mdulo en el editor de Visual Basic, el mdulo aadido incluir automticamente la instruccin Option Explicit al comienzo de todo, como se ve a continuacin:
101
www.todoexcel.com
qu significa la instruccin Option Explicit? Se usa en el nivel de mdulo para forzar declaraciones explcitas de todas las variables en dicho mdulo, debe aparecer en un mdulo antes de cualquier procedimiento. Cuando Option Explicit aparece en un mdulo, debemos declarar explcitamente todas las variables mediante las instrucciones Dim, Private, Public, ReDim o Static. De hecho si intentamos usar un nombre de variable no declarado, ocurrir un error en tiempo de compilacin o bien en el momento en el que el cdigo de origen se traduce a cdigo de ejecucin. Cuando no usamos la instruccin Option Explicit todas las variables no declaradas son Variant (pueden tomar cualquier valor) a menos que el tipo predeterminado est especificado de otra manera con una instruccin Deftipo (es decir salvo que luego vayamos definiendo la variables). La declaracin Option Explicit se utiliza para evitar escribir incorrectamente el nombre de una variable existente o para evitar confusiones en el cdigo, donde el alcance de la variable no est claro. Ejemplo de la instruccin Option Explicit: En este ejemplo se utiliza la instruccin Option Explicit para forzar la declaracin explcita de todas las variables. Si se intenta utilizar una variable no declarada se obtiene un error en el tiempo de compilacin. Recordar que la instruccin Option Explicit slo se utiliza en el nivel de mdulo.
' Fuerza la declaracin explcita de variables. Option Explicit Sub MacroMensaje() ' Declaramos la variable saludo como variable tipo texto Dim saludo As String ' Damos un valor a la variable declarada saludo = "Hola que tal" ' Damos un valor a esta otra variable, que NO ha sido declarada despedida = "Adios" MsgBox saludo MsgBox despedida End Sub
102
www.todoexcel.com
Cuando ejecutamos esta macro obtenemos un error de compilacin , en el que se nos dice que la palabra seleccionada, no ha sido declarada, y VBA selecciona la palabra "despedida", es decir requiere de nosotros la necesidad de declarar esta variable antes de ser usada. Si corregimos la macro anterior y declaramos ambas variables, tendramos: Sub MacroMensaje() ' Declaramos la variable saludo como variable tipo texto Dim saludo As String ' Aqu declaramos la variable que habamos olvidado antes Dim despedida As String ' Damos un valor a la variable declarada saludo = "Hola que tal" ' Damos un valor a la variable declarada despedida = "Adios" MsgBox saludo MsgBox despedida End Sub La declaracin de variables es primordial, totalmente necesaria, pues ayuda a saber el cdigo que estamos manipulando y utilizar menos memoria, es por ello una buena accin forzar la declaracin de variables siempre (por eso recomendamos seguir los pasos indicados al comienzo de esta seccin).
3.2.3. Tipos
La tabla siguiente muestra los tipos de datos compatibles, incluyendo el tamao de almacenamiento y el intervalo. En la 1 columna (Tipo de datos) se define el tipo variables que podemos usar En la 2 columna (Tamao) se define cuanto espacio ocupa en memoria En la 3 columna (Intervalo) se definen los valores que puede adquirir la variable
Tipo de datos Byte Boolean Integer Long (entero largo) Single (coma flotante/ precisin simple) byte bytes bytes bytes bytes
Tamao 0 a 255
Intervalo
True o False -32,768 a 32,767 -2,147,483,648 a 2,147,483,647 -3,402823E38 a -1,401298E-45 para valores negativos; 1,401298E-45 a 3,402823E38 para valores positivos
103
www.todoexcel.com
bytes
-1.79769313486231E308 a 4,94065645841247E-324 para valores negativos; 4,94065645841247E-324 a 1,79769313486232E308 para valores positivos -922.337.203.685.477,5808 a 922.337.203.685.477,5807 +/-79.228.162.514.264.337.593.543.950.335 sin punto decimal; +/7,9228162514264337593543950335 con 28 posiciones a la derecha del signo decimal; el nmero ms pequeo distinto de cero es +/0,0000000000000000000000000001 1 de enero de 100 a 31 de diciembre de 9999 Referencia a tipo Object 0 a 2.000 millones
bytes
Decimal
bytes
1 a 65.400 aproximadamente valor numrico hasta el intervalo de un tipo Double mismo intervalo que para un tipo String de longitud variable intervalo de cada elemento es el mismo que el intervalo de su tipo de datos.
el
usuario
Lgicamente si sabemos que una variable va a utilizar valores numricos sin decimales y entre 1 y 25, conviene que lo declaremos como Byte, como se ve en este ejemplo: Option Explicit Sub Macro() Dim X As Byte For X = 1 To 25 Cells(X, 1) = X Next X End Sub La macro anterior utiliza bastantes menos recursos que esta prxima que no fuerza la declaracin de la variable X (y por lo tanto es considerada como Variant): Sub Macro() For X = 1 To 25 Cells(X, 1) = X Next X End Sub
104
www.todoexcel.com
Que incluyamos la declaracion Option Explicit no implica que vayamos a hacer un buen uso de las variables pues en el siguiente ejemplo, hemos considerado que X es Long, cuando podra utilizar menos recursos siendo Byte: Option Explicit Sub Macro() Dim X As Long ' Aunque sera recomendable Dim X As Byte For X = 1 To 25 Cells(X, 1) = X Next X End Sub Una solucin momentnea para saber que tipo de variable deberamos utilizar podra ser de la siguiente forma. Observa que hemos eliminado la instruccin Option Explicit, pues nuestro objetivo es descubrir que tipo de variable necesitaremos: Sub Macro() ' Dim X As Long For X = 1 To 65536 Cells(X, 1) = X Next X MsgBox TypeName(X) End Sub O bien: Option Explicit Sub Macro() ' Decimos que es variant, que es lo mismo que no decir nada pero definiendo esa nada y luego Dim X For X = 1 To 65536 Cells(X, 1) = X Next X MsgBox TypeName(X) End Sub Y en ambos ejemplos obtendramos el resultado Long, mientras que si hubiramos puesto: Option Explicit Sub Macro() Dim X For X = 1 To 1500 ' Aqu escribimos un intervalo menor Cells(X, 1) = X Next X MsgBox TypeName(X) End Sub obtendramos como resultado Integer.
105
www.todoexcel.com
Dim X For X = 1 To 25 Cells(X, 1) = X Next X MsgBox TypeName(X) End Sub Daria como resultado Integer, en lugar de Byte, no obstante el ahorro de recursos resulta en cualquier caso evidente.
3.2.4. Locales
Las variables locales se declaran dentro de cada macro, y solo pueden ser utilizadas dentro de la macro en la que han sido creadas, cuando la macro termina de ejecutarse, la variable desaparece y Excel libera la memoria que estaba utilizando recordando a qu hacan referencia. Una variable se declara como local cuando est declarada dentro de la macro que har uso de la misma, por ej: Sub Macro() Dim X As Single Dim Y As Single Dim Z As Single X=5 Y = 10 Z = 50 ActiveCell = X * Y * Z End Sub Tambin se pueden declarar varias variables en la misma lnea de cdigo tal que: Option Explicit Sub Macro() Dim x As Byte, y As Single, z As Long, Resultado As Variant x = 5: y = 2000: z = 50000 Resultado = x * y * z MsgBox TypeName(Resultado) ' en este caso el resultado seria Double ActiveCell = Resultado End Sub Si una variable es local todas el resto de las macros podrn utilizar el mismo nombre de la variable tal que: Option Explicit Sub Macro1() Dim Autor As String Autor = "TodoEXCEL" ActiveCell = Autor End Sub
106
www.todoexcel.com
Sub Macro2() Dim Autor As String Autor = "Pedro" ActiveCell = Autor End Sub Sub Macro3() Dim Autor As String Autor = "Jose" ActiveCell = Autor End Sub Sub Macro4() Dim Autor As String Autor = "Salvador" ActiveCell = Autor End Sub
Se recomienda la utilizacin de variables locales antes que la de variables pblicas (las veremos en la seccin siguiente), ya que una vez que la macro termina de ejecutarse, VBA ya no las reconoce de nuevo y libera memoria, mientras que si son pblicas an cuando la macro termina, el valor al que hacen referencia las variables sigue vigente y ocupando espacio en memoria.
3.2.5. Pblicas
Las variables declaradas mediante la instruccin Public estn disponibles para todos los procedimientos en todos los mdulos de todas las aplicaciones, a menos que Option Private Module est en efecto; en este caso, las variables slo son pblicas dentro del proyecto en el que residen. Este tipo de variables son tiles cuando empezamos a trabajar con macros pues facilitan la comprensin, y nos ahorran el hecho de tener que declarar lo mismo una y otra vez. Usamos la instruccin Public para declarar el tipo de datos de una variable. Por ejemplo, la instruccin siguiente declara una variable como de tipo Integer: Public NmeroDeEmpleados As Integer Usamos tambin la instruccin Public para declarar el tipo de objeto de una variable. La instruccin siguiente declara una variable para una nueva instancia de una hoja de clculo: Public X As New Worksheet Si no utilizamos la palabra clave New al declarar una variable de objeto, la variable que se refiere a un objeto debe asignarse a un objeto existente mediante la instruccin Set antes de que se pueda usar. Hasta que se le asigne un objeto, la variable de objeto declarada tiene el valor especial Nothing, el cual indica que no se refiere a ninguna instancia en particular de un objeto.
107
www.todoexcel.com
Tambin podemos utilizar una instruccin Public con parntesis vacos para declarar matrices dinmicas. Despus de declarar una matriz dinmica, usamos la instruccin ReDim dentro de un procedimiento para definir el nmero de dimensiones y elementos de la matriz. Si intentamos volver a declarar un dimensin para una matriz cuyo tamao se ha especificado explcitamente en una instruccin Private, Public o Dim, ocurrir un error. Si no especificamos un tipo de datos o un tipo de objeto y no existe una instruccin Deftipo en el mdulo, la variable es Variant de manera predeterminada. Cuando se inicializan las variables, una variable numrica se inicializa a 0, una cadena de longitud variable se inicializa a una cadena de longitud cero ("") y una cadena de longitud fija se rellena con ceros. Las variables Variant se inicializan a Empty.
Ejemplo de la instruccin Public En este ejemplo se utiliza la instruccin Public a nivel de mdulo (seccin General) de un mdulo estndar para declarar variables como pblicas; es decir, disponibles para todos los procedimientos en todos los mdulos de todas las aplicaciones (a menos que Option Private Module est en vigor). Cuando una variable es declarada como Public y es colocada al principio del mdulo, puede ser utilizada por cualquier macro, mientras que si fuera una variable no pblica deberamos definir su nombre cada vez que la necesitemos en cada macro, por ejemplo:
Option Explicit Public X As Byte Sub Macro() For X = 1 To 25 Call Macro2 Next X End Sub Sub Macro2() Cells(X, 1) = X End Sub ' An cuando este ejemplo puede resultar absurdo pues: Sub Macro() Dim X As Byte For X = 1 To 25 Cells(X, 1) = X Next X End Sub
Con el ejemplo anterior tan solo pretendemos hacer referencia a que a veces conviene utilizar variables pblicas pues son variables que van a ser utilizadas ampliamente y es absurdo ir definindolas en cada macro. Que una variable sea pblica no significa que su valor deba ser constante, tan solo que no es necesario definirla en cada macro y que mientras no le asignemos otro valor conserva el que tena.
108
www.todoexcel.com
En el siguiente ejemplo hemos decidido no definir dos veces la variable Rg, no obstante hemos querido que en cada macro haga referencia a diferentes rangos: Public Rg As Range Sub Macro() Dim x As Byte For x = 1 To 25 Set Rg = Cells(x, 1) Rg.Value = x Next x End Sub Sub Macro2() Set Rg = Range("A1:A25") Rg.Interior.ColorIndex = 3 End Sub
3.2.6. Estticas
Las variables declaradas con la instruccin Static conservan su valor mientras el cdigo se est ejecutando. Una vez que el cdigo del mdulo se est ejecutando, las variables declaradas con la instruccin Static conservan su valor hasta que se reinicie o restablezca el mdulo. En los mdulos de clase, las variables declaradas con la instruccin Static conservan su valor en cada instancia de clase hasta que se destruye la instancia. En mdulos de formulario, las variables estticas conservan su valor hasta que se cierra el formulario. Use la instruccin Static en procedimientos no estticos para declarar explcitamente variables que son visibles slo dentro de un procedimiento, pero cuya vida es la misma que la del mdulo en la que se defini el procedimiento. Usamos una instruccin Static dentro de un procedimiento para declarar el tipo de datos de una variable que conserva su valor entre llamadas a procedimiento. Se declaran dentro de cada macro, pero retienen el valor que tenan la ltima vez que fueron utilizados, se declaran tal que: Static X as byte, o Static Y as Long En este ejemplo trabajaremos con dos macros: macro1 y macro2. Ambas utilizarn una variable comn tal que: Public Rg As Range Utilizaremos Option Explicit para forzar la declaracin de variables. El hecho de que ambas macros utilicen una variable llamada x no significa que hagan referencia a la misma variable, tan solo se llaman igual, de hecho a medida que la macro1 vaya ejecutndose x en el primera macro ira desde 1 hasta 25 mientras que en la macro2 desde 10 hasta ?, dependiendo de cuantas veces utilicemos esta macro. Pero en principio si es utilizada solo a travs de la macro1 desde 10 hasta 250. Option Explicit Public Rg As Range Sub Macro1()
109
www.todoexcel.com
Dim x As Byte For x = 1 To 25 Set Rg = Cells(x, 1) Call Macro2 Next x End Sub Sub Macro2() Static x As Byte x=x+5 Rg.Select Rg = x End Sub
Si una vez ejecutada la macro1, ejecutramos la macro2 repetidas veces, la celda A25 seguira seleccionada, pero su valor aumentara hasta 255. Y porque no ms? Porque aunque sea static hemos definido x en esta macro como Byte luego cuando x>255 obtendramos un error de recompilacin, ya que habra un desbordamiento. Para poder utilizar x>255 deberiamos haber usado en la macro2: Static x As single. Nota: la instruccin Static y la palabra clave Static son similares, pero se utilizan para conseguir efectos diferentes. Si declara un procedimiento con la palabra clave Static (como en Static Sub ContarVentas()), el espacio de almacenamiento correspondiente a todas las variables locales dentro del procedimiento se asigna una nica vez y el valor de las variables se conserva durante todo el tiempo que se est ejecutando el programa. Para procedimientos no estticos, el espacio de almacenamiento para las variables se asigna cada vez que se llama al procedimiento y se libera cuando se sale del procedimiento. La instruccin Static se usa para declarar variables especficas dentro de procedimientos no estticos para conservar su valor mientras el programa se est ejecutando. En este ejemplo se utiliza la instruccin Static para conservar el valor de una variable mientras el cdigo del mdulo se est ejecutando. ' Definicin de funcin. Function ConservarTotal(Nmero) ' Slo la variable Acumulado conserva su valor entre distintas llamadas. Static Acumulado Acumulado = Acumulado + Nmero ConservarTotal = Acumulado End Function ' Definicin de una funcin como Static. Static Function MiFuncin(Arg1, Arg2, Arg3) ' Todas las variables locales conservan su valor entre llamadas a la funcin. Acumulado = Arg1 + Arg2 + Arg3 Mitad = Acumulado / 2 MiFuncin = Mitad End Function Ya sean pblicas, locales o estticas, cuando se inicializan las variables, una variable numrica se inicializa a 0, una cadena de longitud variable se inicializa a una cadena de longitud cero ("") y una cadena de longitud fija se rellena con ceros. Las variables Variant se inicializan a Empty. Cada
110
www.todoexcel.com
elemento de una variable de un tipo definido por el usuario se inicializa como si fuera una variable distinta.
3.2.7. Constantes
Por lo general las variables hacen referencia a valores que acostumbran a cambiar tal que, por ej: Sub Macro() Dim Rng As Range Dim x As Byte For x = 1 To 25 Set Rng = Cells(x, 1) Rng.Select Rng = x Next x End Sub Pero a veces queremos que una variable no cambie, es decir que siempre haga referencia al mismo valor, ejemplo: mi nombre, la capital de Francia etc. Lgicamente carece de sentido declarar variables como constante si stas no son pblicas. Para declarar una variable como constante utilizamos la instruccin Const, por ej:
Option Explicit Const nPaises As Byte = 53 Const UKrate = 1.43, USrate = 0.78 Const autorLibro As String = "TodoEXCEL" En la 1 lnea hemos definido una variable como nPaises as byte y su valor sera siempre 53. La 2 lnea de cdigo declara dos variables como constantes pero no especifica si son as double o as, con lo cual se consideraran as variant. La 3 linea de cdigo declara autorLibro como una constante de tipo string y le da el valor TodoEXCEL.
3.2.8. Conversin
Es posible convertir variables de un tipo a otro. Existen distintas funciones que que permiten hacer estas conversiones, por ej: CBool(expresin), CDec(expresin), CVar(expresin) CByte(expresin), CInt(expresin), CCur(expresin), CLng(expresin), CDate(expresin), CSng(expresin), CDbl(expresin), CStr(expresin),
111
www.todoexcel.com
Tipos devueltos: el nombre de la funcin determina el tipo devuelto, como se muestra a continuacin: Funcin CBool CByte CCur CDate CDbl Tipo devuelto Boolean Byte Currency Date Double Intervalo del argumento expresin expresin de cadena o numrica vlida. 0 a 255 .337.203.685.477,5808 a 922.337.203.685.477,5807. expresin de fecha .79769313486231E308 a -4,94065645841247E-324 para valores negativos; 4,94065645841247E-324 a 1,79769313486232E308 para valores positivos. +/79.228.162.514.264.337.593.54 3.950.335 para nmeros basados en cero, es decir, nmeros sin decimales. Para nmeros con 28 decimales, el intervalo es +/7,922816251426433759354395 0335. La menor posicin para un nmero que no sea cero es 0,000000000000000000000000 0001. .768 a 32.767; las fracciones se redondean. .147.483.648 a 2.147.483.647; las fracciones se redondean. ,402823E38 a 1,401298E-45 para valores negativos; 1,401298E-45 a 3,402823E38 para valores positivos. mismo intervalo que Double para valores numricos. El mismo intervalo que String para valores no numricos. valor de retorno de CStr depende del argumento expresin.
Cdec
Cint Clong
CSng
Cstr
CVar
Si la expresin del argumento expresin que se pasa a la funcin est fuera del intervalo del tipo de dato al que se va a convertir, se produce un error. En general, el cdigo se puede documentar utilizando las funciones de conversin de tipos de datos para indicar que el resultado de alguna de las operaciones se debera expresar como un tipo de datos en particular, no como el tipo de datos predeterminado.
112
www.todoexcel.com
Cuando la parte fraccionaria es exactamente 0,5, CInt y CLng siempre redondean al nmero par ms cercano. Por ejemplo, 0,5 redondea a 0, y 1,5 redondea a 2. CInt y CLng se diferencian de las funciones Fix e Int en que truncan, en lugar de redondear, la parte fraccionaria de un nmero. Adems, Fix e Int siempre devuelven un valor del mismo tipo del que se le pasa. Utilizamos la funcin IsDate para determinar si se puede convertir date a una fecha o una hora. Si tubiramos una cadena de texto tal que: Sub EjCdate() Dim QAZ As String QAZ = "5/5/2008" If IsDate(QAZ) Then QAZ = CDate(QAZ) MsgBox QAZ & " SI es una Fecha." Else MsgBox QAZ & " no es una Fecha" End If End Sub CDate reconoce literales de fecha y literales de hora adems de nmeros comprendidos dentro del intervalo de fechas aceptables. Al convertir un nmero a una fecha, la parte numrica entera se convierte a una fecha. Cualquier parte fraccionaria del nmero se convierte a la hora del da, comenzando a medianoche. CDate reconoce formatos de fecha que se ajusten a la configuracin regional de tu sistema. Es posible que no se determine el orden correcto del da, mes y ao si se proporciona en un formato diferente del que reconoce la configuracin de fecha. Adems, no se puede reconocer un formato de fecha largo si contiene la cadena del da de la semana.
3.2.9. Ejemplos
Recordar siempre que antes de utilizar una variable, debemos saber como funciona: Las variables String siempre deben definirse entre comillas: Sub ejString() Dim QAZ As String QAZ = "TodoEXCEL" Debug.Print QAZ ' Debug.Print es 1 comodn que solemos utilizar para ver lo que sucede a traves de la ventana inmediata de VBA MsgBox QAZ End Sub Salvo cuando hacen referencia a algn valor que venga de la misma hoja de Excel tal que: Sub ejString() Dim QAZ As String QAZ = ActiveCell.Value Debug.Print QAZ MsgBox QAZ
113
www.todoexcel.com
End Sub Pero en este caso si ActiveCell.Value=255, QAZ hara referencia a 255 como si de un nombre se tratara y no como si de una cifra. Para utilizar este valor 255 guardado como QAZ deberamos previamente convertirlo a alguna variable que permita la manipulacin de cifras (Byte, Single, Long, Integr, Variant, etc), por ej: Sub ejString() Dim QAZ As String QAZ = ActiveCell.Value Debug.Print QAZ MsgBox QAZ ' CInt se utiliza para convertir una variable ej de texto a integer como en este ejemplo [A1] = CInt(QAZ) + 50 'Range('A1')=[A1] ' Es lo mismo ' La mar = El mar End Sub
En este otro ejemplo definimos tres variables como String y concatenamos sus valores para mostrarlos en la celda A1, en la ventana inmediata y en un mensaje tal que: Sub ejString() Dim QAZ As String QAZ = ActiveCell.Value Dim WSX As String WSX = "TodoEXCEL" Dim EDC As String Debug.Print QAZ & WSX MsgBox QAZ & WSX EDC = QAZ & WSX [A1] = EDC End Sub
La fechas se pueden guardar como string pero no pueden ser utilizads en operaciones como fechas salvo que las convertamos a Date: Sub EjByte() Dim X As Byte For X = 1 To 25 Cells(X, 1) = X Next X End Sub Sub EjInteger() Dim X As Integer, Y As Integer For X = 1 To 1000 Y = Y + 20 Cells(X, 1) = X + Y Next X End Sub Sub EjLong()
114
www.todoexcel.com
Dim X As Integer, Y As Long ' de haber definido Y as Integer ' obtendramos un desbordamiento For X = 1 To 2000 Y = Y + 20 Cells(X, 1) = X + Y Next X End Sub
115
www.todoexcel.com
3.3. LIBROS
Mediante macros VBA podemos manipular de distintas formas tanto libros Excel como archivos con otras extensiones. En este captulo veremos como hacerlo.
Para abrir un libro cuando tiene vnculos deberamos especificar si queremos actualizar los vnculos o no, tal como se ve a continuacin: Sub Abrir() Application.EnableEvents = True Workbooks.Open Filename:="c:\Directorio\MiLibro.xls", UpdateLinks:=False End Sub
Para obtener informacin de un libro: Sub Informacion () ActiveWorkbook.Name 'Obtendramos su nombre, por ej. Libro4.xls ActiveWorkbook.Path ' Obtendramos la ruta del libro activo, por ej. C:\Windows ActiveWorkbook.FullName ' Obtendramos ruta+nombre, por ej. C:\Windows\Libro4.xls End Sub
116
www.todoexcel.com
Para abrir todos los libros de un directorio: Sub AbrirLibros() Dim X As Long Dim Libro As Workbook Dim Directory As String Directory = ActiveWorkbook.Path On Error Resume Next Application.EnableEvents = False ' Para evitar macros de evento en los libros abiertos With Application.FileSearch .NewSearch .LookIn = Directory .Filename = "*.Xls" ' si solo quisiramos abrir libros Excel, extensin = XLS .SearchSubFolders = False ' Si no quisiramos abrir los Subdirectorios .Execute For X = 1 To .FoundFiles.Count Set Libro = Workbooks.Open(Filename:=.FoundFiles(X)) Next X End With Application.EnableEvents = True ' Para volverlo a su estado natural End Sub
Si queremos cerrarlo sin que nos pregunte si queremos guardar los posibles cambios realizados, debemos indicar que no queremos que se muestren los mensajes de alerta: Sub Cerrar() Application.DisplayAlerts = False ActiveWorkbook.Close End Sub
Para cerrar todos los libros abiertos sin que nos pregunte si queremos guardar los posibles cambios registrados en cada libro si los hubiese: Sub Cerrar() Application.DisplayAlerts = False Application.Workbooks.Close End Sub
117
www.todoexcel.com
Sub Cerrar() Application.Workbooks.Close End Sub Con lo cual si tubiramos 5 libros abiertos y en cuatro de estos libros hubiramos cambiado algo obtendramos 4 mensajes con la pregunta: microsoft Excel: Desea guardar los cambios efectuados en...?
Para guardar un libro en otra carpeta deberamos especificar en que carpeta queremos guardarlo tal que : Sub Macro() Dim Carpeta As String On Error Resume Next Carpeta = "F:\" ActiveWorkbook.SaveAs Carpeta & [A1].Value ' Si utilizamos el nombre de la celda A1 ActiveWorkbook.SaveAs "F:\Ventas.xls" ' O podramos especificar este otro nombre End Sub
118
www.todoexcel.com
Del mismo modo que podemos guardar y abrir podemos guardarlo en diferentes formatos. especificamos su extensin Excel lo hace como podramos especificar el formato como si de otra Sub Macro() Dim Carpeta As String On Error Resume Next Carpeta = "F:\" ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlTemplate ' Lo guardara como una plantilla es decir con una extensin: XLA ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlNormal ' Lo guardara como una hoja normal es decir con una extensin: XLS ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlHtml ' Lo guardara como una Hoja Web es decir con una extensin: Htm ActiveWorkbook.SaveAs Filename:="F:\QAZ1", FileFormat:=xlUnicodeText ' Lo guardara como una Hoja de texto es decir con una extensin: TxT End Sub un documento desde y donde querramos, tambin Por defecto cuando guardamos un libro y no un .XLS, es decir un libro de Excel. Pero tambin propiedad se tratara:
Para eliminar el libro activo, en caso de que estuviera abierto, primero deberiamos cerrarlo, tal que:
119
www.todoexcel.com
Sub Eliminar() Dim strFile As String strFile = ActiveWorkbook.FullName ActiveWorkbook.Close SaveChanges:=False Kill strFile End Sub o bien: Kill "C:\Hola.xls" o bien: Sub BorrarLibros() Dim X As Long Dim Libro As Workbook Dim Directory As String Directory = ActiveWorkbook.Path On Error Resume Next Application.EnableEvents = False ' Para avitar macros de evento en los libros abiertos With Application.FileSearch .NewSearch .LookIn = Directory .Filename = "*.Xls" 'si solo quisiramos borrar los libros Excel, extension = XLS .SearchSubFolders = False ' Si no quisiramos borrar los libros de los Subdirectorios .Execute For X = 1 To .FoundFiles.Count kill .FoundFiles(X) Next X End With Application.EnableEvents = True ' Para volverlo a su estado natural End Sub
Si quisiramos crear 2 nuevos libros: Sub NuevoLibro() Workbooks.Add Workbooks.Add End Sub
120
www.todoexcel.com
Abrir un libro en blanco o crear un libro es lo mismo, pero tambin podemos crear libros basados en plantillas o en otras hojas de clculo, es decir en otros libros tal que: Sub Macro() Dim Libro1 As Workbook Dim Libro2 As Workbook Set Libro1 = Workbooks.Add Debug.Print Libro1.Name ' Utilizamos la ventana Inmediata del editor de VBA Set Libro2 = Workbooks.Add Libro1.Activate End Sub Podemos crear 2 nuevos libros y activar el primero de ellos creado, pero la palabra Add permite crear un nuevo libro y el libro creado no tiene por que estar guardado como una plantilla es decir con la extension xla, puede ser un libro xls: Sub Macro() Dim OtroLibro As Workbook Dim X As Byte For X = 1 To 10 Set OtroLibro = Workbooks.Add(template:="C:\QAZ.xls") Debug.Print OtroLibro.Name Next X ' Abriramos 10 libros que saldran con los siguientes nombres, en la ventana inmediata de VBA 'QAZ2 'QAZ3 'QAZ4 'QAZ5 'QAZ6 'QAZ7 'QAZ8 'QAZ9 'QAZ10 'QAZ11 End Sub
Si queremos imprimir un libro y hoja determinada: Sub Imprimir () ' Imprime el libro y hoja indicados Workbooks("MiLibro.Xls").Sheets("Hoja1").Printout End Sub
121
www.todoexcel.com
Si queremos imprimir un rango determinado, por ejemplo A4:H100 Sub ImprimirRango () ' Imprime el rango indicado Sheets("Hoja1").PageSetup.PrintArea = "$A$4:$H$100" Workbooks("MiLibro.Xls").Sheets("Hoja1").Printout End Sub
Calcular hoja: calcula la hoja de clculo activa, as como los grficos y las hojas de grfico vinculados a esta hoja de clculo: Sub CalculaHoja() ActiveSheet.Calculate End Sub
Tambin podemos especificar las opciones de clculo para indicarle a Excel como realizar los clculos. La configuracin de clculo predeterminada de Excel es Automtico, pero tambin podramos definir otras formas: Automtico: calcula todas las frmulas dependientes cada vez que se cambia un valor, una frmula o un nombre. Sub CalculoAutomatico () Application.Calculation = xlAutomatic End Sub
Automtico excepto tablas: calcula todas las frmulas dependientes, salvo las tablas de datos (para calcular las tablas de datos podemos hacer clic en "Calcular ahora" en la ficha Clculo del men Herramientas, Opciones):
122
www.todoexcel.com
Sub CalculoAutomaticoSinTablas () Application.Calculation = xlSemiautomatic End Sub
Manual: slo calcula los libros abiertos cuando se presiona la tecla F9 Sub CalculoAutomatico () Application.Calculation = xlManual End Sub
Para desproteger el libro hacemos: Sub DesprotegeLibro () ActiveWorkbook.Unprotect ("Excel") End Sub
123
www.todoexcel.com
124
www.todoexcel.com
3.4. HOJAS
Mediante macros VBA podemos manipular de distintas formas las hojas de los libros Excel. En este captulo veremos como hacerlo.
3.4.1. Agregar
Para agregar una nueva hoja al libro utilizamos la instruccin Add. Si queremos agregar una nueva hora al libro activo utilizamos el siguiente cdigo: Sub AgregarHoja() ActiveWorkbook.Worksheets.Add End Sub
Otra forma de hacerlo es: Sub AgregarHoja() Dim Hoja As Worksheet Set Hoja = Worksheets.Add End Sub Utilizando los cdigos anteriores la nueva hoja creada se colocar justo delante de la hoja activa de nuestro libro activo. Si quisiramos crear una nueva hoja en nuestro libro, y que fuera colocada a la derecha de todas las demas hojas, podramos utilizar la siguiente sintaxis: expresin.Add(Before, After, Count, Type) expresin (requerida): expresin que devuelve uno de los objetos arriba mencionados, en nuestro caso Worksheets. Before Variant (opcional): un objeto que especifica la hoja antes de la cual se agregar la hoja nueva. After Variant (opcional): un objeto que especifica la hoja despus de la cual se agregar la hoja nueva. Count Variant (opcional): el nmero de hojas de clculo que se agregarn. El valor predeterminado es uno. Type Variant (opcional): especifica el tipo de hoja. Puede ser una de las siguientes constantes XlSheetType: xlWorksheet, xlChart, xlExcel4MacroSheet o xlExcel4IntlMacroSheet. Si deseas insertar una hoja basada en una plantilla existente, especifica la ruta de acceso a dicha plantilla. El valor predeterminado es xlWorksheet.
125
www.todoexcel.com
Teniendo en cuenta lo anterior, podramos hacer: Sub Agregar() Dim Hoja As Worksheet Set Hoja = Worksheets.Add(After:=Sheets(Worksheets.Count)) End Sub Esta macro crea una nueva hoja y la coloca despues de la ultima hoja, a la cual hacemos mencin con "Sheets(Worksheets.Count)".
Tambin hubiramos podido utilizar el siguiente cdigo en base a lo dicho al principio de esta seccin: Sub Agregar() Dim Hoja As Worksheet Set Hoja = Worksheets.Add(After:=Sheets("hoja3")) End Sub Es decir crearamos una hoja despus de la hoja llamada "hoja3".
En el caso anterior, podra darse el caso de que el nombre de esta hoja estuviera mal escrito tal que: Sub Agregar() Dim Hoja As Worksheet Set Hoja = Worksheets.Add(After:=Sheets("oja3")) ' Escribimos 'oja' en lugar de 'Hoja' End Sub Entonces obtendramos un error de compilacin, el cual podemos evitar agregando una instruccin On Error al comienzo de la macro: Sub Agregar() On Error Resume Next Dim Hoja As Worksheet Set Hoja = Worksheets.Add(After:=Sheets("oja3")) End Sub En el caso anterior evitaramos el error de compilacin. Como "oja3" no existe, la macro, al no saber que hacer, continuara a la siguiente lnea de cdigo saltndose las instrucciones dadas y que han provocado el error.
Si quisiramos crear 5 nuevas hojas antes que la 3 hoja en un libro que contiene 7 hojas: Sub Agregar() Dim Hoja As Worksheet Set Hoja = Worksheets.Add(before:=Sheets(3), Count:=10) End Sub y si esta 3 hoja se llamara "Ventas":
126
www.todoexcel.com
Sub Agregar() Dim Hoja As Worksheet Set Hoja = Worksheets.Add(before:=Sheets("Ventas"), Count:=10) End Sub
3.4.2. Selecionar
Dentro de los libros de excel, podemos encontrar hojas y grficos. Para referirnos a una hoja dentro de un libro tenemos distintas posibilidades. Podemos utilizar las instrucciones Select o Activate (en la seccin siguiente veremos la diferencia). Seleccionar una hoja utilizando su nmero de hoja contenida dentro del libro, como se ve a continuacin: Sub Seleccionar() ' para seleccionar la primera hoja del libro activo ActiveWorkbook.Sheets(1).Select ' para seleccionar la segunda hoja del libro activo ActiveWorkbook.Sheets(2).Select ' para seleccionar la tercera hoja del libro activo ActiveWorkbook.Sheets(3).Select End Sub
Ahora bien, si una hoja esta oculta no podremos seleccionarla ni activarla. Esto lo solucionamos de la siguiente forma: Sub Seleccionar() With ActiveWorkbook.Sheets(1) .Visible = True .Select End With End Sub o bien: Sub Seleccionar() With Sheets(1) .Visible = True .Activate End With End Sub
Seleccionar una hoja utilizando el nombre de la hoja contenida dentro del libro, como se ve a continuacin: Sub Seleccionar() ' para seleccionar la segunda hoja del libro activo ActiveWorkbook.Sheets("Hoja2").Select End Sub
127
www.todoexcel.com
o lo que es lo mismo en caso de que una hoja este oculta: Sub Seleccionar() With ActiveWorkbook.Sheets("Hoja2") .Visible = True .Select End With End Sub
Para selecionar todas las hojas de un libro utilizaremos la siguiente instruccion: Sub SeleccionarTodas() Activeworkbook.Sheets.Select End Sub La instruccin anterior a su vez activar una hoja...cual? La primera del libro. La manera de comprobarlo es sencilla, ya que la hoja activa es aquella que presenta su nombre en negrita.
Tambin se pueden seleccionar hojas mediante la instruccin Array, por ej. creando un array que contenga en ndice de las hojas que querramos selecionar (ver captulo "Arrays" para ms detalle). Esta instruccin seleccionara las hojas 3 y 1 en este orden con lo cual la hoja 3 ser la hoja activa. Sub Seleccionar () ActiveWorkbook.Sheets(Array(3, 1)).Select End Sub Esta instruccin seleccionara las hojas 1,2,3 y la hoja activa seria la 1 Sub Seleccionar () ActiveWorkbook.Sheets(Array(1,2,3)).Select End Sub Tambin se puede crear un Array que contenga los nombres de las hojas que queramos selecionar. Esta instruccin activara la hoja llamada "hoja3" y selecionara las hojas llamadas "hoja3" y "pedro": Sub Seleccionar () ActiveWorkbook.Sheets(Array("hoja3", "pedro")).Select End Sub Con esta otra instruccin selecionaramos las hojas cuyos nombres son: "ventas","compras", "resultado" y activara la hoja "ventas". Sub Seleccionar () ActiveWorkbook.Sheets(Array("ventas","compras", "resultado")).Select End Sub
128
www.todoexcel.com
Tambin podemos al mismo tiempo mezclar ambos mtodos comentados antes (seleccionar por nombre o por nmero de hoja): Sub Seleccionar () ActiveWorkbook.Sheets(Array(1, 2, "ventas")).Select End Sub En el ejemplo anterior la hoja activa sera la primera de nuestro libro y las hojas selecionadas seran las 2 primeras y la llamada "ventas". Recordar que la hoja activa siempre es la que figura como primer miembro del array.
129
www.todoexcel.com
La instruccin anterior a su vez activar una hoja...Cual? La primera del libro ! La manera de comprobarlo es sencilla, ya que la hoja activa es aquella que presenta su nombre en negrita.
Si abrimos un libro con 3 hojas (teniendo la hoja 2 como activa) la siguiente macro primero movera la hoja 2 delante de la hoja 1, y despus moveria la hoja 2 al final de todo hacia la derecha. Sub moverHoja() Dim Hoja As Worksheet Set Hoja = ActiveSheet Hoja.Move before:=Sheets(1) Set Hoja = Sheets(1) Hoja.Move after:=Sheets(Sheets.Count) End Sub La siguiente macro realizara la misma funcin en un libro con 3 hojas: Sub moverHoja() Dim Hoja As Worksheet
130
www.todoexcel.com
Set Hoja = Sheets(2) Hoja.Move before:=Sheets(1) Set Hoja = Sheets(1) Hoja.Move after:=Sheets(Sheets.Count) End Sub La siguiente macro contiene 2 lneas absurdas ya que al ser en principio, Hoja1 la primera hoja cuando abrimos un nuevo libro, moverla de la posicin 1 sera como volver a selecionar una celda que ya estaba selecionada: Sub moverHoja() Dim Hoja As Worksheet Set Hoja = Sheets("Hoja1") Hoja.Move before:=Sheets(1) Set Hoja = Sheets(1) Hoja.Move after:=Sheets(Sheets.Count) End Sub
En este otro ejemplo se elimina la hoja1 del libro activo sin mostrar el cuadro de dilogo de confirmacin: Sub borrarHoja() Application.DisplayAlerts = False Sheets("Hoja1").Delete Application.DisplayAlerts = True End Sub En este otro ejemplo se elimina la hoja situada en primer lugar del libro activo sin mostrar el cuadro de dilogo de confirmacin: Sub borrarHoja() Application.DisplayAlerts = False Sheets(1).Delete Application.DisplayAlerts = True End Sub
131
www.todoexcel.com
Veamos un ejemplo de cmo copiar una hoja: Sub Copiar() ' Copiamos la Hoja1 despus de la Hoja3 Worksheets("Hoja1").Copy after:=Worksheets("Hoja3") End Sub Veamos otro ejemplo de cmo copiar una hoja: Sub copiarHoja() Dim Hoja As Worksheet Set Hoja = ActiveSheet Hoja.Copy before:=Sheets(1) Set Hoja = Sheets(1) Hoja.Copy after:=Sheets(Sheets.Count) End Sub
132
www.todoexcel.com
Tambin podemos ocultar varias hojas utilizando la instruccin Array: Sub Ocultar ActiveWorkbook.Sheets(Array(1, 2, "ventas")).Visible = False End Sub La instruccin anterior oculta las dos primeras hojas como as tambin la hoja llamada "ventas". Ahora bien, la intruccin no funcionara para volver a mostrar, ya que esto debe ser realizado de una en una. Sub Mostrar() Sheets(1).Visible = True Sheets(2).Visible = True Sheets("ventas").Visible = True End Sub
Esta manera de ocultar las hojas no evitara poder saber que existen hojas ocultas. Podramos saber si hay hojas ocultas desde el men Formato > Hojas > Mostrar de Excel y podramos observar el nombre de las hojas ocultas, an cuando estas estuvieran ocultas con una contrasea que nos impidiera mostrarlas. Que no podamos mostrarlas no implica que no sepamos que algo esta oculto si lo quisiramos. Si queremos ocultar hojas y adems ocultarlas desde el men Formato > Hojas > Mostrar de Excel (an cuando estas hojas no contengan contrasea para ser desprotegidas) deberamos hacer: Sub SuperOcultas() ActiveWorkbook.Sheets("ventas").Visible = xlSheetVeryHidden End Sub
3.4.8. Nombrar
Para renombrar una hoja utilizamos la instruccin Name, tal como se ve a continuacin: Sub Renombrar() Sheets("Ventas").Name = "Compras" End Sub En el caso anterior renombraramos la hoja llamada "Ventas" con el nuevo nombre "Compras". Si queremos renombrar la primer hoja del libro con el nombre "total": Sub Renombrar() Sheets(1).Name = "total" End Sub Conviene recordar que da lo mismo que los nombres de las hojas estn escritos en maysculas o en minsculas, ya que:
133
www.todoexcel.com
Sheets("Ventas").select Sheets("VenTAs").select Sheets("ventas").select sera lo mismo, Excel no diferenciara maysculas o minsculas y en todos los casos seleccinara la hoja "Ventas".
Con la siguiente macro crearamos una hoja, la situaramos al final (despus de la ltima hoja del libro) y finalmente la llamaramos con el nombre "ventas": Sub Macro() Dim Hoja As Worksheet Set Hoja = Worksheets.Add(After:=Sheets(Worksheets.Count)) Hoja.Name = "Ventas" End Sub En la macro anterior, Worksheets.Count devuelve un nmero que representa la cantidad de hojas que tiene el libro. Ante el caso de que otra de nuestras hojas se llamara "ventas" nos encontraramos ante un error de compilacin, ya que no es posible llamar dos hojas con el mismo nombre. Entonces, primero deberamos renombrar previamente.
134
www.todoexcel.com
Sheets(1).Unprotect Password:="hola" End Sub
Desde Excel no podemos proteger varias hojas en simultneo, nos obliga proteger una a una. Sin embargo desde una macro s podemos proteger las hojas que querramos de forma simultnea. La siguiente macro protegera todas las hojas del libro activo, excepto las hojas que son grficos. Adems las protegera con la contrasea "hola". Sub Proteger() Dim Sht As Worksheet For Each Sht In ThisWorkbook.Sheets 'If TypeName(Sht) = 'worksheet' With Sht If TypeName(Sht) = "Worksheet" Then .Protect Password:="hola" End If End With Next Sht End Sub Ahora bien, existen gran cantidad de datos y elementos dentro de las hojas que queremos proteger (y otra gran cantidad que no queremos proteger). Todas ellas figuran en la lista del men Excel Herramientas > Proteger > Proteger hoja. La siguiente macro explica como proteger todo (podemos cambiar True por False en caso de no querer aplicar la proteccin a algn elemento en particular): Sub ProtegerTodo() With ActiveSheet .Protect DrawingObjects:=True ' Protegemos objetos .Protect Contents:=True ' Protegemos contenidos .Protect Scenarios:=True ' Protegemos escenarios .Protect AllowFormattingCells:=True ' Protegemos formato de celdas .Protect AllowFormattingColumns:=True ' Protegemos formato de columnas .Protect AllowFormattingRows:=True ' Protegemos formato de filas .Protect AllowInsertingColumns:=True ' Protegemos la posibilidad que se inserten columnas .Protect AllowInsertingRows:=True ' Protegemos la posibilidad que se inserten filas .Protect AllowInsertingHyperlinks:=True
135
www.todoexcel.com
' Protegemos la posibilidad que se inserten hipervcnulos .Protect AllowDeletingColumns:=True ' Protegemos la posibilidad que se borren columnas .Protect AllowDeletingRows:=True ' Protegemos la posibilidad que se borren filas .Protect AllowSorting:=True ' Protegemos la posibilidad que se utilice la opcin de Ordenar .Protect AllowFiltering:=True ' Protegemos la posibilidad que se utilice la opcin de Filtrar .Protect AllowUsingPivotTables:=True ' Protegemos la posibilidad que se utilicen Tablas Dinmicas .Protect Password:="WW" ' Asignamos la clave de proteccin 'WW' End With End Sub En la macro anterior protegemos todo dentro de la hoja, y lo hacemos con la contrasea "WW" la cual SI que distingue entre maysculas y minsculas. Recuerda que si no quisiramos proteger alguna de esas propiedades bastara con poner:=False. No obstante conviene entender que hay propiedades que al ser aplicadas impiden que otras que no han sido aplicadas puedan ser utilizadas (en este sentido es como si yo te dejara ver un partido en el estadio de ftbol del Real Madrid, pero te impidiera estar en Madrid). Lgicamente no podras llegar a ver el partido, pues una de las restricciones impide otro de los permisos. Lo mismo ocurre en Excel, por lo que debemos tener cuidado y recordar esto.
136
www.todoexcel.com
La macro anterior anulara la utilidad del botn de vista preliminar, pues el mismo quedara inutilizado de inmediato.
Si deseamos poner un encabezado a la izquierda de cada hoja, con la frase "Reporte Trimestral" (o cualquier otro mensaje): Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim Sht As Worksheet For Each Sht In ThisWorkbook.Sheets With Sht.PageSetup .LeftHeader = "Reporte Trimestral" ' O cualquier otro mensaje... End With Next Sht End Sub
137
www.todoexcel.com
ActiveWorkbook.Sheets("Hoja1").Tab.ColorIndex = 5 End Sub El nmero que se le asigna a ColorIndex indica el color. Si quieres averiguar el nmero correspondiente para un determinado color, puedes hacer lo siguiente: 1. Clic derecho sobre una etiqueta de hoja 2. Elige la opcin "Color de Etiquetas" 3. Elige un color de la paleta 4. Aceptar 5. En la ventana Inmediato del editor VBA escribe: ?Activesheet.Tab.ColorIndex 6. Enter Vers que aparece un nmero que representa el color de la etiqueta. Podrs utilizar dicho nmero en la macro.
Sub OrdenarDescendentemente() Dim X As Integer, Y As Integer For X = 1 To Sheets.Count For Y = X To Sheets.Count If UCase(Worksheets(Y).Name) > UCase(Worksheets(X).Name) Then Worksheets(Y).Move Before:=Worksheets(X) End If Next Y Next X End Sub
Tambin se podran ordenar las hojas de un libro utilizando un array con los nombres de las hojas, ordenando este array y luego moviendo en funcin del orden. El caso es que el anterior ejemplo funciona perfectamente, ya que saca provecho de la funcin uppercase "maysculas" pues A>AA>AB>ABC es decir, que nos dice el orden necesario.
138
www.todoexcel.com
Otras maneras de ordenar podran ser: Sub OrdenarAscendentemente() Dim X As Long, Y As Long For X = 1 To Worksheets.Count Y=X Do While Y > 1 If Worksheets(Y).Name < Worksheets(Y - 1).Name Then Worksheets(Y).Move Before:=Worksheets(Y - 1) End If Y=Y-1 Loop Next End Sub
Sub OrdenarDescendentemente() Dim X As Long, Y As Long For X = 1 To Worksheets.Count Y=X Do While Y > 1 If Worksheets(Y).Name > Worksheets(Y - 1).Name Then Worksheets(Y).Move Before:=Worksheets(Y - 1) End If Y=Y-1 Loop Next End Sub
139
www.todoexcel.com
3.5. RANGOS
Mediante macros VBA podemos manipular de distintas formas los rangos y celdas de las hojas Excel. En este captulo veremos como hacerlo.
140
www.todoexcel.com
Cells.SpecialCells(xlCellTypeVisible).Select End Sub
Conviene deducir que si quisiramos seleccionar las celdas que contienen comentarios en un rango concreto y no en toda la hoja deberamos utilizar: Sub Seleccion () On Error Resume Next ' Mtodo 1 Range("A1:G10").SpecialCells(xlCellTypeComments).Select ' Mtodo 2 [A1:G10].SpecialCells(xlCellTypeComments).Select ' Mtodo 3 Range(cells(1,1),cells(10,7)).SpecialCells(xlCellTypeComments).Select End Sub
Para seleccionar hasta la ltima celda no vaca: Sub Seleccion () On Error Resume Next ' Es un buen hbito utilizar comodines como este ' aunque si lo mantenemos activo resultara difcil saber donde podra estar el problema ' Selecciona desde la celda actual hasta la ltima celda no vaca hacia la derecha. Selection.End(xlToRight).Select ' Selecciona desde la celda indicada hasta la ltima celda no vaca hacia abajo. Range("AF10").End(xlDown).Select ' Selecciona desde la celda actual hasta la ltima celda no vaca hacia la izquierda. Selection.End(xlToLeft).Select ' Selecciona desde la celda actual hasta la ltima celda no vaca hacia arriba. Selection.End(xlUp).Select End Sub
Otra forma interesante de seleccionar es con el mtodo Offset, que permite seleccionar un rango de acuerdo a unas coordenadas indicadas. Esta instruccin requiere que le indiquemos un origen y una cantidad de filas y columnas desde el origen (es muy til para seleccionar rangos variables). La sintaxis es: Origen.Offset.(filas, columnas).select. Las filas y nmeros se indican como nmeros. Si estos son positivos el desplazamiento es hacia abajo - derecha respectivamente. Si son negativos el desplazamiento es hacia arriba - izquierda respectivamente.
141
www.todoexcel.com
Veamos los siguiente ejemplos para entender mejor la seleccin con Offset: Sub Selecciona () On Error Resume Next ' Selecciona desde la celda actual hasta una celda (fila) hacia abajo. Selection.Offset(1, 0).Select ' La instruccin Selection hace que el origen sea la celda actual ' El 1 indica las filas a desplazarce hacia abajo ' El 0 indica las columnas a desplazarce a la derecha ' Hace lo mismo que la anterior. Poner 0 u omitirlo es lo mismo. Selection.Offset(1).Select ' Selecciona desde la celda actual, + una celda hacia abajo + una celda hacia la derecha. Selection.Offset(1, 1).Select 'Selecciona una columna y/o celda hacia la derecha desde la celda [A1] [A1].Offset(0, 1).Select ' Selecciona desde la celda actual hasta la misma celda selecionada, sin cambio alguno. Selection.Offset().Select ' Desde B1 selecciona una celda hacia arriba y otra a la izquierda [B2].Offset(-1, -1).Select ' Recuerda que al poner un signo negativo el movimiento cambia de direccin ' Si el negativo el movimiento es hacia abajo/derecha. Con el negativo es hacia arriba/izquierda ' Si desde A1 intentamos seleccionar una celda hacia arriba y otra a la izquierda... [A1].Offset(-1, -1).Select ' Se producira un error, porque como A1 es la primera celda, no podemos seleccionar ' una celda ni a la izquierda ni arriba de A1. De todas formas el error se ignora ya que ' hemos escrito On Error Resume Next al comienzo de la macro. ' Selecciona desde la celda actual hasta una celda hacia la izquierda (si fuera posible) Selection.Offset(-1).Select 'Selecciona desde la celda actual hasta una celda hacia la arriba (si fuera posible) Selection.Offset(, -1).Select ' Desde la celda actual, seleciona todo el cuadrante de celdas contiguas. Selection.CurrentRegion.Select ' Selecciona el cuadrante de celdas selecionadas en bloque una celda ms hacia la derecha y abajo. Selection.CurrentRegion.Offset(1, 1).Select End Sub Todas las acciones anteriores se pueden concatenar de tal manera que podramos realizar lo siguiente: Sub Seleccion () On Error Resume Next [F7].End(xlDown).Offset(4).End(xlToRight).End(xlDown).Select ' Si F7 estuviera vaco y la columna F tambin, ' tras ejecutar [F7].End(xlDown). nos encontraramos en la ltima fila (F65536) ' Pero no podramos ir a [F7].End(xlDown).Offset(4) pues excel tiene 65536 filas y no 65536+X+4
142
www.todoexcel.com
End Sub Con la macro anterior iriamos desde la celda F7 hasta la ltima celda no vaca hacia abajo. Luego nos desplazaramos 4 celdas desde esta nueva posicin hacia abajo. Luego iramos hasta la ltima celda no vaca hacia la derecha desde esta nueva posicin. Finalmente de nuevo hacia abajo desde esta nueva posicin.
Tambin es posible la seleccin de rangos utilizando variables en filas y columnas, utilizando el objeto Cells. Esta forma es muy til cuando queremos utilizar variables en la fila la columna. La sintaxis debe ser: cells(fila,columna) Sub Seleccion() ' Seleccin desde A1 hasta fila N y columna J (asumimos que N y J son variables) range(cells(1,1),cells(N,J)).select End Sub
Estos 3 lneas de cdigo seleccionan el mismo rango de celdas: Sub Seleccionar () Range("A1:E5").Select [A1:E5].Select Range(Cells(1, 1), Cells(5, 5)).Select End Sub
143
www.todoexcel.com
Con la macro anterior se seleciona el cuadrante, rectngulo y/o cuadrado de celdas adyacentes a nuestra celda activa. El rectngulo queda definido por las celdas con informacin. Tambin podramos modificar la macro anterior para que seleccione la regin actual desde una celda determinada, por ejemplo: ' Selecciona el rectngulo adyacente a C2. Sub Seleccionar () [C2].CurrentRegion.Select End Sub o tambin podemos hacer: ' Selecciona el rectngulo adyacente a C2. Sub Seleccionar () Range("C2").CurrentRegion.Select End Sub
144
www.todoexcel.com
Sub SeleccionaColumna () ' Selecciona la Columna B Columns("B:B").Select ' Selecciona la Columna H Columns("H:H").Select ' Selecciona des de la Columna C hasta la F Columns("C:F").Select ' Selecciona las siguientes Columnas: A,C,E,G, I y K. Range("A:A,C:C,E:E,G:G,I:K").Select End Sub
Para seleccionar todas las celdas que contengan cierto Valor: Sub SeleccionarPorValor() On Error Resume Next Dim Columna As Single, Fila As Long, X As Long Dim Rg As Range, miRango As Range, RgValores As Range 'vamos a selecionar todas las celdas del UsedRange que contengan el valor que introduzcamos: Dim MiValor As String MiValor = InputBox("Introduce el valor que deseas selecionar!", "Por Favor:") With ActiveSheet Fila = Range([A1], .UsedRange).Rows.Count Columna = Range([A1], .UsedRange).Columns.Count Set miRango = Range([A1], Cells(Fila, Columna))
145
www.todoexcel.com
End With For Each Rg In miRango If LCase(Rg.Value) = LCase(MiValor) Then If X = 0 Then X = 1: Set RgValores = Rg Else Set RgValores = Union(RgValores, Rg) End If End If Next Rg RgValores.Select End Sub
Para seleccionar todas las celdas que contengan Valores no duplicados en el rango utilizado: Sub SeleccionarValoresUnicos() On Error Resume Next Dim Columna As Single, Fila As Long, X As Long Dim Rg As Range, miRango As Range, RgValores As Range 'vamos a selecionar todas las celdas del UsedRange que contengan el valor que introduzcamos: With ActiveSheet Fila = Range([A1], .UsedRange).Rows.Count Columna = Range([A1], .UsedRange).Columns.Count Set miRango = Range([A1], Cells(Fila, Columna)) End With For Each Rg In miRango If Application.CountIf(miRango, Rg.Value) = 1 Then If X = 0 Then X = 1: Set RgValores = Rg Else Set RgValores = Union(RgValores, Rg) End If End If Next Rg RgValores.Select End Sub
Para seleccionar todas las celdas que contengan Valores no duplicados en UsedRange: Sub SeleccionarValoresdUPLICADOS() On Error Resume Next Dim Columna As Single, Fila As Long, X As Long Dim Rg As Range, miRango As Range, RgValores As Range 'vamos a seleccionar todas las celdas del UsedRange que contengan el valor que introduzcamos: With ActiveSheet Fila = Range([A1], .UsedRange).Rows.Count Columna = Range([A1], .UsedRange).Columns.Count Set miRango = Range([A1], Cells(Fila, Columna)) End With For Each Rg In miRango If Application.CountIf(miRango, Rg.Value) > 1 Then If X = 0 Then X = 1: Set RgValores = Rg Else
146
www.todoexcel.com
Set RgValores = Union(RgValores, Rg) End If End If Next Rg RgValores.Select End Sub
Excel considera que pese a que tengamos 65.536 filas y 256 columnas, prcticamente siempre utilizamos una nfima cantidad de estas filas y columnas. Para saber el rango de celdas que utilizamos basta con utilizar el siguiente cdigo: Sub Rango() ActiveSheet.UsedRange.Select End Sub
Para selecionar desde la celda A1 hasta la ltima celda del rango utilizado: Sub Rango() Range([a1], ActiveSheet.UsedRange).Select End Sub
Para selecionar la ltima celda con datos del rango utilizado (suponemos que tenemos seleccionado B4:D4): Sub Seleccion () ' Esto dara como resultado 5 R = Range([a1], ActiveSheet.UsedRange).Rows.Count ' Esto dara como resultado 4 C = Range([a1], ActiveSheet.UsedRange).Columns.Count ' Selecionara la celda D5 Cells(R, C).Select End Sub En la macro anterior, el objeto UsedRange seleciona el rango "cuadrado o rectngulo" utilizado.
Si quisiramos seleccionar la ltima celda con informacin del rango seleccionado, he aqu 4 mtodos posibles:
' Mtodo 1 Sub Seleccionar () ' Definimos las variables Dim R As Long, C As Single
147
www.todoexcel.com
' Utilizamos R que indicara la ltima fila que contiene datos R = Range([A1], ActiveSheet.UsedRange).Rows.Count ' Utilizamos C que indicara la ltima columna que contiene datos C = Range([A1], ActiveSheet.UsedRange).Columns.Count 'Selecionamos la ltima celda del rango UsedRange Cells(R, C).Select End Sub ' Mtodo 2 Sub Seleccionar () ' Definimos las variables Dim R As Long, C As Single With [A1].SpecialCells(xlCellTypeLastCell) R = .Row C = .Column End With Cells(R, C).Select End Sub ' Mtodo 3 Sub Seleccionar () ' El cdigo on error evita el error debido a que no haya celdas con valor On Error Resume Next ' Definimos las variables Dim R As Long, C As Single R = Cells.Find("*", Range("A1"), xlFormulas, , xlByRows, xlPrevious).Row C = Cells.Find("*", Range("A1"), xlFormulas, , xlByColumns, xlPrevious).Column Cells(R, C).Select End Sub ' Mtodo 4 Sub Seleccionar () With Selection.CurrentRegion .Cells(.Cells.Count).Select End With End Sub
148
www.todoexcel.com
[A1].EntireColumn.Insert ' Inserta una nueva fila sobre la fila 1 [A1].EntireRow.Insert End Sub
Tambin podemos insertar tantas nuevas filas o columnas como tenga el rango: Sub Inserta () ' Inserta 3 nuevas columnas a la izquierda de la columna B Range("B1:D10").EntireColumn.Insert ' Inserta 5 nuevas filas sobre la fila 10. Rows("10:15").Insert End Sub
Si queremos realizar el borrado de diferentes propiedades de un mismo rango podramos hacer: Sub Borrar () With Range("A1") .ClearComments 'Borra comentarios .ClearContents 'Borra contenidos .ClearFormats 'Borra formatos .ClearNotes 'Borra notas .Clear 'Borra todo lo anterior
149
www.todoexcel.com
End With End Sub La instruccin Clear sola, como se v en la macro anterior, borra toda informacin de la celda (formato, contenido, comentarios, etc).
A veces queremos borrar el contenido de ciertas celdas, por ej. las celdas que contienen frmulas: Sub BorrarFormulas() Cells.SpecialCells(xlCellTypeFormulas, 23).ClearContents End Sub
Tambin podemos realizar borrados sobre filas y columnas enteras: Sub Borrar () On Error Resume Next ' Borra toda informacion de la Fila 1. Rows(1).Clear ' Borra el formato de la Columna A. Columns("A:A").ClearFormats ' Borra toda informacin, formato, etc, de la columna A [A1].EntireColumn.Clear ' Borra los comentarios de la Fila 1. [A1].EntireRow.ClearComments ' Borra toda informacin de las 5 primeras Filas. Rows("1:5").Clear ' Borra toda informacin de las Filas 10 a 15 inclusives Rows("10:15").Clear ' Borra toda la informacin del rango actual utilizado, comenzando desde A1 Rango("A1").CurrentRegion.Clear End Sub
150
www.todoexcel.com
[C4].Copy ' Copia la celda C2 (la primera posicin equivale a fila y la segunda a columna). Cells(2, 4).Copy ' Copia el rango de celdas B6:B10 Range("B6:B10").Copy ' Copia el rango de celdas B12:B22, esta es otra terminologa tambin vlida. [B12:B22].Copy ' Copia el cuadrante, rectngulo y/o cuadrado de celdas adyacentes a nuestra celda. El rectngulo queda definido por las celdas con informacin. Selection.CurrentRegion.Copy ' Copia el cuadrante, rectngulo y/o cuadrado de celdas comenzando en C2 y en direccin derechainferior. El rectngulo queda definido por las celdas con informacin. [C2].CurrentRegion.Copy ' Copia el cuadrante, rectngulo y/o cuadrado de celdas comenzando en C4 y en direccin derechainferior. El rectngulo queda definido por las celdas con informacin. Range("C4").CurrentRegion.Copy ' Copia la Fila 1. Rows("1:1").Copy ' Copia la fila 4. Rows("4:4").Copy ' Copia desde la fila 4 hasta la 11 ambas inclusive. Rows("4:11").Copy ' Copia las siguientes filas a la vez: 4,5,15 y 22. Range("4:4,8:8,15:15,22:22").Copy ' Copia la Columna B Columns("B:B").Copy ' Copia desde la Columna C hasta la F, ambas inclusive Columns("C:F").Copy ' Copia las siguientes Columnas: A,C,E,G y I-K. Range("A:A,C:C,E:E,G:G,I:K").Copy
Para realizar el pegado de los rangos copiados utilizamos las siguientes macros: ' Copia todo contenido de la celda A1 y lo pega en la celda B1 Range("A1").Copy Range("B1") ' Aqu realizamos lo mismo solo que de otra manera, especificando donde queremos que la informacin sea pegada mediante la utilizacion de propiedades Range("B1").Copy Destination:=Range("C1")
151
www.todoexcel.com
A la hora de pegar podemos elegir que es lo que queremos pegar: valores, formatos, todo, etc. La opcin ms utilizada es xlPasteValues, que solo pega los valores. La lista de las cosas que podemos pegar es: Valores con formatos: xlPasteValuesAndNumberFormats Valores: xlPasteValues Validacin xlPasteValidation Frmulas y nmeros: xlPasteFormulasAndNumberFormats Frmulas: xlPasteFormulas Formatos: xlPasteFormats Comentarios: xlPasteComments Ancho de columna: xlPasteColumnWidths Todo excepto bordes: xlPasteAllExceptBorders Todo: xlPasteAll Veamos ejemplos sobre como pegar distintas cosas: Sub Copiar() ' Copia la celda A1 y la pega en B1 Range("A1").Copy Range("B1") ' Copia la celda A1 y la pega en B1 (podemos escribirlo en la misma lnea) Range("A1").Copy Range("B1") ' Misma operacin, copia la celda A1 y la pega en B1 Range("A1").Copy Cells(1, 2).PasteSpecial(xlPasteAll) ' Copia la celda A1 pero solo pega el valor en B1, no el formato Range("A1").Copy [B1].PasteSpecial(xlPasteValues) ' Copia la celda A1 y pega solo la frmula en B1, ni el valor ni el formato Range("A1").Copy Range("A1").Offset(, 1).PasteSpecial(xlPasteFormulas) ' Cuando copiamos algo se ve que Excel deja un rastro sobre lo copiado. Para quitarlo utilizamos: Application.CutCopyMode=False End Sub
152
www.todoexcel.com
Otra forma de nombrar un rango es seleccionndolo y luego encima de la columna A, existe un espacio que nos da informacin sobre la celda activa. Se puede escribir un nombre all y ya quedara nombrado dicho rango. Para nombrar un rango desde una macro utilizamos la instruccin Name, por ej.: Sub Nombrar() ' En el caso de que quisiramos crear un nombre para un valor constante Names.Add Name:="Euro", RefersTo:=166.67 ' En el caso de que quisieramos crear un nombre para refererirnos al rango A1:B4 con el nombre Ventas. Range("A1:B4").Name = "Ventas" End Sub
Los nombre creados pueden utilizar frmulas, esto es muy frecuente si queremos aplicar un nombre a un rango de una Tabla Dinmica. En lugar de tener que cambiar el rango utilizado en la TD, cada vez que aadimos un nuevo registro a nuetra base de datos, podemos utilizar nombres que hagan referencia a rangos dinmicos mediante frmulas tal que: Sub RangoNombrado() ActiveWorkbook.Names.Add _ Name:="RangoTD", _ RefersToR1C1:= "=OFFSET(Hoja1!R1C1,0,0,(COUNTA(Hoja1!C1)-0),COUNTA(Hoja1!R1)+0)" End Sub
Conviene recordar que si combinamos desde una macro, y las celdas que queremos combinar no estan vacas, Excel nos pedir confirmacin, pues podramos perder informacin. Para evitar la confirmacin deberamos modificar la macro anterior agregando una nueva lnea al comienzo: ' Combinar las celdas del rango B4:D4 y evitar confirmacin Sub Combinar () Application.DisplayAlerts = False
153
www.todoexcel.com
Range("B4:D4").MergeCells = True End Sub
Si luego queremos volver a mostrar la fila oculta, simplemente cambiamos el True por False: Sub Mostrar () ' Mostrar la fila 3 Rows("3:3").EntireRow.Hidden = False End Sub Para ocultar columnas es exactamente igual:
Sub Ocultar () ' Ocultar la columna B, sin selecionarla primero Columns("B:B").EntireColumn.Hidden = True ' Ocultar las columnas contiguas D,E,F y G selecionndolas primero Columns("D:G").Select Selection.EntireColumn.Hidden = True ' Ocultar varias columnas discontnuas, sin necesidad de selecionarlas Range("I:K,M:O,Q:Q,S:S").EntireColumn.Hidden = True End Sub
Si luego queremos volver a mostrar la columna oculta, simplemente cambiamos el True por False.
154
www.todoexcel.com
Sub Proteger () ' Protege el rango seleccionado Selection.Locked = True ' Protege el rango indicado Range("T7:T16").Locked = True ' Protege la celda indicada Range("T11").Locked = True ' Desprotege el rango indicado Range("T7:T16").Locked = False End Sub
155
www.todoexcel.com
156
www.todoexcel.com
.ClearComments ' Borra contenidos .ClearContents ' Borra formatos .ClearFormats ' Borra notas .ClearNotes ' Borra todo .Clear End With End Sub En la macro anterior hemos ido realizando un borrado escalonado, para al final resumir todo en un nico borrado que realizara todo lo anterior de una vez (instruccin Clear), es decir, que si queremos borrar todo junto directamente utilizamos Clear.
Tambin podramos imprimir automticamente desde una macro tal que: Sub ImprimeHoja () ActiveSheet.PrintOut End Sub
157
www.todoexcel.com
FilaBorrable.EntireRow.Delete Set FilaBorrable = Range("B:B").FindNext Loop End Sub El mtodo anterior tiene el inconveniente que si el rango es muy grande y hay muchas filas vacas, el looping se eterniza an con el Application.ScreenUpdating = False
Segundo mtodo para borrar filas vacas Sub BorrarFilasVacias1() Dim X As Long Dim R As Long ' Para aumentar la velocidad de ejecucin With ActiveSheet R = Range([a1], .UsedRange).Rows.Count Application.ScreenUpdating = False For X = R To 1 Step -1 Rows(X).Select If Application.CountA(Rows(X)) = 0 Then Rows(X).Delete End If Next X End With End Sub
Tercer mtodo para borrar filas vacas Sub BorrarFilasVacias3() Dim FilaBorrable As Range Dim R As Single ' Para aumentar la velocidad de ejecucin Application.ScreenUpdating = False ' insertamos una nueva fila para despus aplicar un criterio de bsqueda y borrar los valores obtenidos de esta bsqueda With ActiveSheet .Rows(1).Insert .Cells(1, 2) = "Valores a borrar" R = Range(.Range("B2"), .UsedRange).Rows.Count Set FilaBorrable = Range("B1", Cells(R, 2)) FilaBorrable.AutoFilter Field:=1, Criteria1:="" 'Borra solo las celdas visibles FilaBorrable.SpecialCells(xlCellTypeVisible).EntireRow.Delete .UsedRange End With End Sub El anterior es el mtodo ms rpido.
158
www.todoexcel.com
Recuerda que para desocultar todas las filas y columnas ocultas debes hacer: Sub Desocultar() With Cells .EntireColumn.Hidden = False .EntireRow.Hidden = False End With End Sub
159
www.todoexcel.com
3.6. ARRAYS
Los Arrays son conjuntos de elementos y son muy tiles a la hora de manipular varios objetos de forma simultnea. En este captulo veremos ms en detalle como crearlos y los diferentes tipos que existen. Recuerda que la mayora de macros de este captulo estn estn en el libro Arrays.xls, dentro de los 400 Extras que se envan junto con el Manual.
3.6.1. Definicin
Un Array es un grupo de elementos secuencialmente puestos con un ndice, que tienen el mismo nombre y tipo de datos intrnseco. Cada elemento de un array tiene un nmero de ndice que lo identifica como nico. Los cambios realizados a un elemento de un array no afectan los otros elementos. Antes de que poner valores en un Array, primero debemos crearlo. El Array es declarado utilizando la instruccin Dim. En resumen, un array es un grupo de elementos del mismo tipo, cada elemento en un grupo array es nico y puede ser cambiado sin que afecte al resto de los elementos del siguiente array. Por ejemplo: Dim MiArray(0 To 3) El array anterior contiene 4 elementos: el elemento 0,1,2 y 3 Dicho array puede ser simplificado como: Dim Miarray(3) Esta ltima definicin significa que los elementos de un array empiezan por el 0, que siempre resulta ser el primer elemento.
3.6.2. Fijos
Una array con los das de la semana (nmero fijo de elementos) Sub EjArrays() Dim DiaSemana(0 To 6) As String ' Tambien podramos poner: ' Dim DiaSemana(6) As String, es decir un array de 7 elementos DiaSemana(0) = "Lunes" DiaSemana(1) = "Martes" DiaSemana(2) = "Mircoles"
160
www.todoexcel.com
DiaSemana(3) = "Jueves" DiaSemana(4) = "Viernes" DiaSemana(5) = "Sbado" DiaSemana(6) = "Domingo" Debug.Print DiaSemana(0) ' Esto nos permite visualizar 'Lunes' en la Ventana Inmediato End Sub Recuerda que el primer elemento del array es el equivalente a DiaSemana(0). Esta terminologa es un prstamo de otros lenguajes de programacin, ahora bien si quieres refererirte al primer elemento de un array como miarray(1) la solucin es introducir la instruccin Option Base 1 al comienzo de la macro, tal que:
Option Base 1 Sub EjArrays() Dim DiaSemana(1 To 7) As String ' Tambien podramos poner: ' Dim DiaSemana(7) As String es decir un array de 7 elementos pues es Option Base 1 DiaSemana(1) = "Lunes" DiaSemana(2) = "Martes" DiaSemana(3) = "Miercoles" DiaSemana(4) = "Jueves" DiaSemana(5) = "Viernes" DiaSemana(6) = "Sbado" DiaSemana(7) = "Domingo" Debug.Print DiaSemana(1) ' Esto nos permite visualizar 'Lunes' en la Ventana Inmediato End Sub
La mayora de las veces los elementos de los arrays quedan definidos desde un rango o bien desde una nica lnea tal que:
Option Base 1 Sub EjArrays() Dim DiaSemana() As Variant DiaSemana = Array("Lunes", "Martes", "Mircoles", "Jueves", "Viernes", "Sbado", "Domingo") Debug.Print DiaSemana(1) ' Esto nos permite visualizar 'Lunes' en la Ventana Inmediato End Sub
3.6.3. Variables
Un array no tiene por qu tener un nmero fijo de elementos, es decir un array puede contener un nmero variable de elementos en cualquier momento. Los arrays se utilizan para aumentar la velocidad de las macros pues permiten la manipulacin de gran cantidad de informacin sin necesidad de operar con ella, salvo en memoria. La utilizacin de Arrays dinmicos (aquellos que no tienen un nmero fijo de elementos), en muchas ocasiones es obligatoria.
161
www.todoexcel.com
Por ej. supongamos que queremos obtener el nmero de directorios existentes en en el dicos C. Deberamos utilizar un array como el siguiente: Sub ArrayDirectorios() Dim X As Single Dim NXls() As String Dim MiRuta As String, MiNombre As String Cells.ClearContents ' Muestra los nombres en C:\ que representan directorios. MiRuta = "C:\" ' Establece la ruta. ' Recupera la primera entrada, del directorio C:\ MiNombre = Dir(MiRuta, vbDirectory) Do While MiNombre <> "" ' Inicia el bucle. ' Ignora el directorio actual y el que lo abarca. If MiNombre <> "." And MiNombre <> ".." Then ' Realiza una comparacin a nivel de bit para asegurarse de que MiNombre es un directorio. If (GetAttr(MiRuta & MiNombre) And vbDirectory) = vbDirectory Then X=X+1 ReDim Preserve NXls(1 To X) NXls(X) = MiNombre Debug.Print MiNombre ' Muestra la entrada End If ' solamente si representa un directorio. End If MiNombre = Dir ' Obtiene siguiente entrada. Loop If X = 0 Then MsgBox "No hay directorios en C:\": Exit Sub For X = LBound(NXls) To UBound(NXls) Cells(X, 1) = NXls(X) Next X Columns.AutoFit End Sub Del mismo modo hubiramos podido crear un Array con los Libros xls, contenidos en un directorio cualquiera. Las arrays expuestos hasta aqu son unidireccionales, y aunque los array pueden tener hasta 60 direcciones, casi nunca utilizaremos Arrays com ms de tres dimensiones.
3.6.4. Bidimensionales
Los array unidimensionales son muy frecuentes, aunque tambin se pueden usar arrays bidemensinales, por ej: Dim MiArray(1 To 10, 1 To 10) As Integer Esto sera como pensar en una matriz de 100 elementos, 10 filas x 10 columnas, con lo cual para referirte a la segunda fila y tercera fila utilizaramos: Debug.Print MiArray(2,3) Lo mas comn es que siempre declaremos en principio un array como Variant.
162
www.todoexcel.com
3.6.5. Ejemplo
A continuacin observaremos diferentes ejemplos que utilizan arrays. Supongamos que tenemos diferentes controles en una hoja y queremos colocarlos en determinados lugares: Sub EjArrays() Dim X As Byte Dim Rg As Range Dim MyShapesArray() As Variant Dim MyShapesRgArray Dim MyShape As Shape ' Es lo mismo poner () as VARIANT QUE NO PONER NADA ' MyShapesArray es un array que contiene los nombre the diferentes controles en nuestra ActiveSheet MyShapesArray = Array("IShape", "SB_H", "SB_V", "BPlay", "SB_Bombs") ' MyShapesRgArray en un array que contiene el lugar donde pondremos los controles MyShapesRgArray = Array(Range(ActiveCell.Offset(-5, -5), ActiveCell.Offset(-2, -2)), _ Range(ActiveCell.Offset(-3, 0), ActiveCell.Offset(-2, 4)), _ Range(ActiveCell.Offset(0, -3), ActiveCell.Offset(1, -2)), _ Range(ActiveCell.Offset(5, -5), ActiveCell.Offset(-1, -2)), _ Range(ActiveCell.Offset(-3, 5), ActiveCell.Offset(-2, -1))) For X = LBound(MyShapesArray) To UBound(MyShapesArray) With ActiveSheet Set MyShape = .Shapes(MyShapesArray(X)) Set Rg = MyShapesRgArray(X) 'Rg.Select With MyShape '.Select '.Visible = True 'True .Height = Rg.Height .Width = Rg.Width .Left = Rg.Left: .Top = Rg.Top End With End With Next X End Sub Este cdigo lo utilizamos para colocar los controles en el lugar deseado. Es posible ver esta macro en funcionamiento en los juegos: Buscaminas.xls y MinesWeeper.xls la macro se llama GameSetup, dentro del modulo GameSetup.
3.6.6. Redim
Cuando utilizamos el comando Redim redimensionamos el Array y al hacerlo perdemos todos los valores que habamos creado inicialmente, por ej: Sub EjArrays() Dim DiaSemana() As Variant
163
www.todoexcel.com
DiaSemana = Array("Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sbado", "Domingo") Debug.Print DiaSemana(1) ReDim DiaSemana(2) ' Al redimensionar el array para con 3 elementos perdemos los valores previamente asignados en: ' DiaSemana = Array('Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sbado', 'Domingo') ' con lo que: Debug.Print DiaSemana(1) ' no devuelve valor alguno! End Sub La macro anterior no devuelve ningn valor porque hemos perdido los mismos al no utilizar la instruccin REDIM PRESERVE, que la veremos en la seccin siguiente.
3.6.7. Preserve
La instruccin Preserve se utiliza para conservar los valores de cada elemento, an cuando redimensionamos el array: Sub EjArrays() Dim NAleatorios() As Variant NAleatorios = Array(1, 2, 3, 4, 5, 6, 7, 8, 9) Dim X As Byte Do MsgBox "El array tiene: " & UBound(NAleatorios) & " Elementos" ReDim Preserve NAleatorios(UBound(NAleatorios) + 1) NAleatorios(UBound(NAleatorios)) = Rnd * 100 Cells(X + 1, 1).Value = Round(Rnd * UBound(NAleatorios)) X=X+1 Loop While UBound(NAleatorios) <> 15 ' Seleccionara la celda: Cells(UBound(NAleatorios), 1).Select End Sub
Tambin podemos asignar los valores de un rango a un array, tal que: aaa=range("A1:A15").values lo cual significa que es un array Bidemensional ya que aunque solo tiene una columna (en este caso la columna A), para referirnos a cualquier elemento de este array deberemos especificar no solo la fila sino tambin la columna. Hemos asignado los valores de un rango a un array con lo que para referirnos a lo elementos del array deberemos hacerlo como si de un array bidemensional se tratara, an cuando todas las celdas del rango estn en la misma columna como en el caso siguiente: Private Sub RgArray_Click() Dim X As Single Dim Rango() As Variant Dim miarray As Variant Rango = Range("Col1")
164
www.todoexcel.com
For X = LBound(Rango,1) To UBound(Rango,1) ' Aunque podemos simplificar como: For X = LBound(Rango) To UBound(Rango) Range("col1").Cells(X).Select Debug.Print Rango(X, 1) Next X End Sub
165
www.todoexcel.com
3.7. ESTRUCTURAS
Las estructuras son conjuntos de instrucciones VBA que deben respetar una sintxis determinada y que nos permiten realizar diversas operaciones. En este captulo las veremos en detalle. Recuerda que la mayora de macros de este captulo estn estn en el libro Estructuras.xls, dentro de los 400 Extras que se envan junto con el Manual.
3.7.1. Do Loop
La instruccin Do Loop es utilizada para repetir las mismas instrucciones una y otra vez hasta que una condicin tenga lugar. Es probablemente la estructura ms simple de cuantas hay en cuanto a repeticiones, pues no establece condiciones de entrada ni de salida como ocurre en Do While o Do Until. Veamos algunos ejemplos: Si la celda contiene datos coloreamos toda la fila: Sub Colorea() [A1].EntireRow.Select ' Comenzamos desde la fila 1 Do ' Comenzamos a evaluar If ActiveCell.Value = "" Then Exit Do ' Si la celda activa no tiene valor salimos de la macro Selection.EntireRow.Interior.ColorIndex = 15 ' Si la celda tiene valor pinta la fila de gris Selection.Offset(2).Select ' Nos movemos a la fila siguiente Loop ' Comenzamos nuevamente 'el rulo' desde el Do End Sub Podemos retocar lo anterior y poner la condicin no de inicio dentro del Looping tal que: Sub Colorea() [A1].EntireRow.Select Do While ActiveCell.Value <> "" Selection.EntireRow.Interior.ColorIndex = 15 Selection.Offset(2).Select Loop End Sub Donde obviamente hemos tenido que cambiar la condicin de = "" a <>"", es decir distinta de vaca. De haber querido poner una condicin no de inicio sino de salida, es decir que el looping se ejecute por lo menos una vez: Sub Colorea() [A1].EntireRow.Select Do Selection.EntireRow.Interior.ColorIndex = 15 Selection.Offset(2).Select Loop While ActiveCell.Value <> "" End Sub
166
www.todoexcel.com
En el caso anterior, an cuando la celda A1 estuviera vaca el looping se ejecutara por lo menos una vez. Tambin hubiramos podido jugar tal que: Sub Colorea() [A1].EntireRow.Select Do Selection.EntireRow.Interior.ColorIndex = 15 Selection.Offset(2).Select Loop Until ActiveCell.Value = "" End Sub O bien: Sub Colorea() [A1].EntireRow.Select Do Until ActiveCell.Value = "" Selection.EntireRow.Interior.ColorIndex = 15 Selection.Offset(2).Select Loop End Sub Este ltimo caso podra dar lugar a que el looping terminara antes de empezar.
El caso es que todos estos ejemplos son prcticamente idnticos y depende de nosotros utilizar uno u otro, salvo en contadas ocasiones donde algunos obviamente no sirven. El tlimo ejemplo no valdra si quisiramos que el looping ejecutara las instrucciones internas al menos una vez.
167
www.todoexcel.com
-Incremento (opcional): cantidad en la que cambia el contador cada vez que se ejecuta el bucle. Si no se especifica, el valor predeterminado de incremento es uno. -Instrucciones (opcional): una o ms instrucciones entre For y Next que se ejecutan un nmero especificado de veces.
El argumento incremento puede ser positivo o negativo. El valor del argumento incremento determina la manera en que se procesa el bucle, como se muestra a continuacin: For X = 1 to 50 es decir el valor del incremento es positivo donde 1 es el Principio y 50 el Fin, es decir 1<= 50, o bien Principio <= Fin o bien: For X = 50 to 1 es decir el valor del incremento es negativo donde 50 es el Principio y 1 el Fin, es decir 50 >= 1, o bien Principio >= Fin Cuando el incremento es negativo es necesario especificar el incremento que va a tener lugar en el bucle mediante la palabra Step tal que: Sub For_Next() Dim X As Integer ' Establece 10 repeticiones, con incremento negativo de 2 For X = 10 To 1 Step -2 Cells(X, 1) = X Next X End Sub En el caso anterior X tomara los valores 10,8,6,4,2 sucesivamente. Sub For_Next() Dim X As Integer ' Establece 10 repeticiones, con incremento negativo de 1 For X = 10 To 1 Step -1 Cells(X, 1) = X Next X End Sub En el caso anterior X tomara los valores 10,9,8,7,6,5,4,3,2,1 sucesivamente.
Se pueden colocar en el bucle cualquier nmero de instrucciones Exit For como una manera alternativa de salir del mismo. La instruccin Exit For, que se utiliza a menudo en la evaluacin de alguna condicin (por ejemplo, If...Then), transfiere el control a la instruccin que sigue inmediatamente a la instruccin Next. ej:
168
www.todoexcel.com
Sub For_Next() Dim X As Integer ' Establece 10 repeticiones. For X = 1 To 10 If Cells(X, 1) = "" Then Exit Sub Cells(X, 1) = X Next X End Sub En el ejemplo anterior realizaramos un bucle de 10 repeticiones pero si en el trascurso del mismo las celdas (X,1) estuvieran vacas el bucle se rompera y saldramos de l. Del mismo modo se puede modificar el valor del contador volviendo a un valor dado tal que: Sub For_Next() Dim X As Integer ' Establece 10 repeticiones. For X = 1 To 10 If Cells(X, 1) = "" Then X=1 Cells(X, 1) = X + Cells(X, 1) End If Cells(X, 1) = X + Cells(X, 1) Next X End Sub En el ejemplo anterior, si el valor de (X,1) estuviera vaco volveramos a X=1, y para evitar un bucle infinito le daramos a la celda (X,1) el valor igual a = X + Cells(X, 1)
Este otro ejemplo muestra que cambiar el valor del contador mientras est dentro de un bucle puede acarrear un bucle infinito, haciendo difcil su lectura y depuracin. Ejemplo: Sub For_Next() Dim X As Integer ' Establece 10 repeticiones. For X = 1 To 10 If Cells(X, 1) = "" Then X=1 Else Cells(X, 1) = X End If Next X End Sub En el ejemplo anterior, si el valor de la celda (1,1) estuviera vaco tendramos un bucle repetitivo infinito ya que x siempre sera = a 1. Se pueden anidar bucles For...Next, colocando un bucle For...Next dentro de otro. Para ello, proporcionamos a cada bucle un nombre de variable nico como su contador. La siguiente construccin sera la correcta: For I = 1 To 10 For J = 1 To 10
169
www.todoexcel.com
For K = 1 To 10 ... Next K Next J Next I
Por lo general la instruccin For Each Next suele utilizarse para evaluar rangos y o hojas, como se ve en los siguientes ejemplos: ' Queremos colocar en el encabezado de cada una de las hojas del libro la palabra 'TodoEXCEL' Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim Hoja As Worksheet For Each Hoja In ThisWorkbook.Sheets Hoja.PageSetup.LeftFooter = "TodoEXCEL" Next Hoja End Sub ' Queremos borrar todo el contenido de cada hoja antes de cerrar un libro Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim Hoja As Worksheet For Each Hoja In ThisWorkbook.Sheets Hoja.Cells.Clear Next Hoja End Sub
La entrada al bloque For Each se produce si hay al menos un elemento en grupo. Una vez que se ha entrado en el bucle, todas las instrucciones en el bucle se ejecutan para el primer elemento en grupo. Despus, mientras haya ms elementos en grupo, las instrucciones en el bucle continan ejecutndose para cada elemento. Cuando no hay ms elementos en el grupo, se sale del bucle y la ejecucin contina con la instruccin que sigue a la instruccin Next. Se pueden colocar en el bucle cualquier nmero de instrucciones Exit For. La instruccin Exit For se utiliza a menudo en la evaluacin de alguna condicin (por ejemplo, If...Then) y transfiere el control a la instruccin que sigue inmediatamente a la instruccin Next. Podemos anidar bucles For Each...Next, colocando un bucle For Each...Next dentro de otro. Sin embargo, cada elemento del bucle debe ser nico.
170
www.todoexcel.com
Nota: si omitimos un elemento en una instruccin Next, la ejecucin contina como si se hubiera includo, es decir tanto: For Each Cell In Range("Rg") ' Instrucciones... Next Cell como: For Each Cell In Range("Rg") ' Instrucciones... Next funcionaran mientras hubiera mas elementos en el grupo, en el caso anterior dentro del rango llamado "Rg". Si se encuentra una instruccin Next antes de su instruccin For correspondiente, se producir un error. No se puede utilizar la instruccin For Each...Next con una matriz de tipos definidos por el usuario porque un tipo Variant no puede contener un tipo definido por el usuario.
171
www.todoexcel.com
3.7.5. GoTo
La instruccin GoTo es un mtodo bastante rudo de variar el sentido que debera tomar una macro, ya que cuando una macro llega a una lnea que contiene dicha instruccin "salta" al lugar especificado en GoTo (es decir, saltamos incondicionalmente a una lnea especificada en el procedimiento). La Sintaxis de GoTo es: GoTo lnea El argumento lnea puede ser cualquier etiqueta de lnea o nmero de lnea. GoTo solamente puede saltar a lneas del procedimiento en el que aparece. Nota: demasiadas instrucciones GoTo pueden ser difciles de leer y de depurar. Siempre que sea posible, conviene utilizar instrucciones de control estructuradas (Do...Loop, For...Next, If...Then...Else, Select Case). Es decir conviene no habituarse a utilizar este cdigo, salvo cuando no quede otro remedio. Veamos un ejemplo: Sub Macro() GoTo Adios Range("A1").Font.Bold = True Range("A1").Font.Size = 50 Range("A1").Font.ColorIndex = 3 Range("A1").Interior.ColorIndex = 5 Range("A1").Select Adios: End Sub La macro anterior no realiza ninguna operacin, ya que nada ms empezar saltamos a la lnea "Adios:" y despus no hay ms cdigo. Nota: en principio nunca deberamos utilizar GoTo, pues siempre, o prcticamente siempre deberamos ser capaces de encontrar una alternativa a travs de instrucciones de control estructuradas tales como: Do...Loop, For...Next, If...Then...Else, Select Case.
172
www.todoexcel.com
Veamos un ejemplo sencillo con el cual asignamos un formato a la celda A1: ' La siguiente macro NO utiliza With Sub Macro() Range("A1").Font.Bold = True Range("A1").Font.Size = 50 Range("A1").Font.ColorIndex = 3 End Sub ' Repetimos lo anterior pero con With Sub Macro() With Range("A1") .Font.Bold = True .Font.Size = 50 .Font.ColorIndex = 3 End With End Sub En el ejemplo anterior se ve que al utilizar el With, no es necesario volver a repetir el objeto Range("A1"). Todo lo que est entre With y End With se aplica al objeto Range("A1").
Veamos otro ejemplo algo ms complejo con el cual asignamos un formato a la celda A1 y adems aplicamos el With en dos niveles: ' La siguiente macro NO utiliza With Sub Macro() Range("A1").Font.Bold = True Range("A1").Font.Size = 50 Range("A1").Font.ColorIndex = 3 Range("A1").Interior.ColorIndex = 5 Range("A1").Select End Sub ' La siguiente macro realiza las mismas operaciones utilizando With Sub Macro_With() With Range("A1") With .Font .Bold = True .Size = 50 .ColorIndex = 3 End With .interior.ColorIndex = 5 .Select End With End Sub Nota: una vez que se ha entrado en un bloque With no es posible cambiar el objeto. Por tanto, no podemos utilizar una nica instruccin With para varios objetos diferentes, pero si podemos utilizar otro bloque que utilice el anterior bloque, como lo hace el ejemplo anterior. Aunque en principio parece que la segunda macro es ms difcil de entender, es un buen hbito utilizar estructuras With pues aumentan la velocidad de ejecucin de las macros, siendo ms fciles de manipular a medida que nos acostumbramos a ellas.
173
www.todoexcel.com
3.7.7. If Then
La instruccin If Then permite escoger entre 2 o ms posibilidades, para decidir sobre que es lo que queremos, entre una serie de alternativas. La instruccin ejecuta condicionalmente un grupo de instrucciones, dependiendo del valor de una expresin. Su sintaxis es: If condicin Then [instrucciones]-[Else instrucciones_else] Tambien podemos utilizar la siguiente sintaxis en formato de bloque: If condicin Then [instrucciones] [ElseIf condicin-n Then [instrucciones_elseif] ... [Else [instrucciones_else]] End If Condicin (requerido): uno o ms de los siguientes dos tipos de expresiones: Una expresin numrica o expresin de cadena que puede ser evaluada como True o False. Si condicin es Null, condicin se considera False. Una o ms instrucciones separadas por dos puntos ejecutados si la condicin es True. condicin-n (Opcional). igual que -condicin. instrucciones_elseif (Opcional): una o ms instrucciones ejecutadas si la condicin-n asociada es True. instrucciones_else (opcional): una o ms instrucciones ejecutadas si ninguna de las expresiones anteriores condicin o condicin-n es True. Veamos algunos ejemplos de If, escritos en una sola lnea: En esta macro si el valor de la celda A1 es > a 15, entonces la condicin es verdadera (es decir TRUE) con lo cual se ejecuta la instruccin definida para tal caso, en este ejemplo lanzamos un mensaje, que dice: "La celda A1> 15" Sub If_Then() If [A1] > 15 Then Msgbox "La celda A1> 15" End Sub
En esta otra macro si el valor de la celda es >15 se cumple con la condicin demandada con lo cual se ejecuta la primera opcin, en caso de que no sea TRUE (es decir en caso de que sea FALSE) ejecutamos la segunda instruccin, en nuestro ejemplo, el mensaje: "La celda A1< 15" Sub If_Then() If [A1] > 15 Then Msgbox "La celda A1> 15" Else MsgBox "La celda A1< 15" End Sub
174
www.todoexcel.com
Tambin hubiramos podido escribir el anterior ejemplo a travs de dos construcciones If tal que: Sub If_Then() If [A1] > 15 Then Msgbox "La celda A1> 15" If [A1] < 15 Then MsgBox "La celda A1< 15" End Sub
Si el valor de la celda A1 fuera 200, la siguiente macro lanzara dos mensajes pues las dos instrucciones IF... seran TRUE: Sub If_Then() If [A1] > 15 Then Msgbox "La celda A1> 15" If [A1] > 15 Then MsgBox "La celda A1< 15" End Sub
En el caso de que querramos realizar ms de una operacin si una condicin devuelve True, o bien si devuelve False, conviene utilizar una construccin en bloque. Veamos algunos ejemplos de If, escritos en bloque: En caso de que el valor de la celda A1>15 entonces la condicion es True, y siendo True, lanzaramos un mensaje y despus pondramos la celda A1 en negrita y con fondo Rojo. Sub If_Then() If [A1] > 15 Then Msgbox "La celda A1> 15" With [A1] .Interior.ColorIndex = 3 .Font.Bold = True End With End If End Sub o bien: Sub If_Then() If [A1] > 15 Then ' si la condicion es TRUE MsgBox "La celda A1> 15" ' lanzaramos un mensaje [A1].Interior.ColorIndex = 3 ' el fondo de la celda [A1] seria rojo [A1].Font.Bold = True ' y la celda [A1] estara en negrita Else ' Si la condicion fuera False [A1].Interior.ColorIndex = 10 'el fondo de la celda [A1] sera Verde [A1].Font.Size = 50 ' y la fuente tendra tamao 50 End If End Sub
Un boloque If puede tener as mismo varias secciones ElseIf, que vendran a decir "de lo contrario", "o". La instruccin ElseIf impide que el cdigo contine verificndose cuando una de las condiciones se a presentado como True. Veamos un ejemplo:
175
www.todoexcel.com
Si el valor de la celda A1 fuera 500 al confirmarse como verdadera la primera condicin (>15) ejecutaramos las tres instrucciones tal que, (MsgBox "La celda A1> 15"), ([A1].Interior.ColorIndex = 10), y ([A1].Font.Bold = True) y a continuacin acabaramos con la ejecucin de la condicin: Sub If_Then() If [A1] > 15 Then MsgBox "La celda A1> 15" [A1].Interior.ColorIndex = 10 [A1].Font.Bold = True ElseIf [A1] > 10 Then [A1].Interior.ColorIndex = 10 [A1].Font.Size = 50 ElseIf [A1] > 2 Then MsgBox "2" End If End Sub En el caso anterior, si el valor de A1 fuera 3, an cuando las tres condiciones devolveran True por separado, solo se ejecutara la primera.
Veamos otro ejemplo donde en funcin de la hora del da obtendremos un mensaje diferente: Sub If_Then() If Time < TimeValue("08:30:00") Then MsgBox "Buenos Dias!" If Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then MsgBox "Buenas Tardes!" If Time >= TimeValue("20:30:00") Then MsgBox "Buenas noches!" End Sub On bien escrito de diferente manera: Sub If_Then() If Time < TimeValue("08:30:00") Then MsgBox "Buenos Dias!" ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then MsgBox "Buenas Tardes!" Else: MsgBox "Buenas noches!" 'cuando ninguna de las anteriores posibilidades se cumple: End If End Sub o bien: Sub If_Then() If Time < TimeValue("08:30:00") Then MsgBox "Buenos Dias!" ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then MsgBox "Buenas Tardes!" Else MsgBox "Buenas noches!" End If End Sub
176
www.todoexcel.com
o bien: Sub If_Then() If Time < TimeValue("08:30:00") Then MsgBox "Buenos Dias!" ElseIf Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then MsgBox "Buenas Tardes!" Else: MsgBox "Buenas noches!" End If End Sub o bien: Sub If_Then() If Time < TimeValue("08:30:00") Then MsgBox "Buenos Dias!" Else If Time > TimeValue("15:30:00") And Time < TimeValue("20:30:00") Then MsgBox "Buenas Tardes!" Else MsgBox "Buenas noches!" End If End If End Sub Como se ve hay muchsimas maneras de escribir la misma Macro. Ahora depende de cada uno decidir cual se prefiere.
Veamos un ejemplo: Sub Select_Case() Dim Nmero As Variant ' la declaramos como Variant para evitar el error de compilacin que ' obtendramos en el caso de que [A1] fuera texto Nmero = [A1] ' Inicializa variable.
177
www.todoexcel.com
Select Case Nmero ' Evala Nmero. Case 1 To 5: MsgBox "Entre 1 y 5" Case 6, 7, 8: MsgBox "Entre 6 y 8" Case 9 To 10: MsgBox "Mayor que 8" Case Else ' Para otros valores. MsgBox "No est entre 1 y 10" End Select End Sub ' Para Ns entre 1 y 5, inclusive ' Para Ns entre 1 y 5, inclusive ' Para Ns entre 9 y 10, inclusive
Si expresin_prueba coincide con cualquier lista_expresin asociada con una clusula Case, las instrucciones que siguen a esa clusula Case se ejecutan hasta la siguiente clusula Case o, para la ltima clusula, hasta la instruccin End Select. El control pasa despus a la instruccin que sigue a End Select. Si expresin_prueba coincide con una expresin de lista_expresin en ms de una clusula Case, slo se ejecutan las instrucciones que siguen a la primera coincidencia. En el ejemplo anterior, si [A1] fuera "pedro" se ejecutara la condicion Case Else ' Otros valores Si [A1] fuera 5 se ejecutara la instruccin Case 1 To 5: MsgBox "Entre 1 y 5"
En la siguiente macro, si A1 fuera 15, solo se ejecutara la primera opcin del Case Select, al devolver TRUE: Sub Select_Case() Dim Nmero As Variant ' La declaramos como Variant para evitar el error de compilacin que obtendramos en el caso de que [A1] fuera texto Nmero = [A1] ' Inicializa variable. Select Case Nmero ' Evala Nmero. ' Nmero entre 1 y 25, inclusive. Case 1 To 25: Debug.Print "Entre 1 y 25" ' Nmero entre 6 y 8. Case 10, 14, 15: Debug.Print "Bien 10, 14 o 15" Case 15 To 18 ' Nmero entre 15 y 18. Debug.Print "'Nmero entre 15 y 18, inclusive." Case Else ' Otros valores. Debug.Print "Valor no comprendido en los diferentes Casos" End Select End Sub La clusula Case Else se utiliza para indicar las instrucciones que se van a ejecutar si no se encuentran coincidencias entre expresin_prueba y una lista_expresin en cualquiera de las otras selecciones de Case. Aunque no es necesario, es buena idea tener una instruccin Case Else en el bloque Select Case para controlar valores imprevistos de expresin_prueba. Cuando no hay una instruccin Case Else y ninguna expresin de la lista en las clusulas Case coincide con la expresin de prueba, la ejecucin contina en la instruccin que sigue a End Select, es decir la instruccin no ejecuta ninguna opcin pues no hay valor que devuelva TRUE.
178
www.todoexcel.com
Lgicamente Select Case ayuda bastante como se ve en el siguiente ejemplo conocido, pues ya lo hemos utilizado al explicar IF Then: Sub Select_Case() Select Case Time Case Is < TimeValue("08:30:00"): MsgBox "Buenos Dias!" Case Is >= TimeValue("20:30:00"): MsgBox "Buenas Noches!" Case Else: MsgBox "Buenas Tardes!" End Select End Sub Constuir la macro anterior con Select Case en lugar de If Then hace que sea ms sencilla de entender y de escribir.
En la siguiente macro nos daria igual no utilizar la opcin o comodn Case Else ya que sabemos que los das de la semana son 7: Sub Select_Case() Select Case Weekday(Now, vbMonday) ' o bien: Weekday(Now, 2) Case 1: MsgBox "Hoy es Lunes" Case 2: MsgBox "Hoy es Martes " Case 3: MsgBox "Hoy es Mircoles" Case 4: MsgBox "Hoy es Jueves" Case 5: MsgBox "Hoy es Viernes" Case 6: MsgBox "Hoy es Sbado" Case 7: MsgBox "Hoy es Domingo" End Select End Sub En la macro anterior utilizamos la opcin Weekday(Now, vbMonday) o Weekday(Now, 2), porque la frmula Weekday puede dar como resultado 1-7 en funcin del da por el que querramos comenzar la semana. La semana que empieza por el da se pone tal que: Weekday(Now, vbMonday) o bien: Weekday(Now, 2)
VBA permite realizar la misma operacin de cientos de maneras distintas, como ya se ha demostrado antes. De hecho la macro anterior podra simplificarse tal que: Sub Macro() Dim ArrayDiaSemana ArrayDiaSemana = Array("", "Lunes", "Martes", "Mircoles", "Jueves", "Viernes", "Sbado", "Domingo") MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday)) End Sub
179
www.todoexcel.com
En la macro anterior hemos utilizado un array que contiene los das de la semana, pero cuyo primer elemento esta vaco "", pues Weekday(Now,2) jams dara 0, con lo cual o bien utilizaramos la macro anterior o bien: Sub Macro() Dim ArrayDiaSemana ArrayDiaSemana = Array("Lunes", "Martes", "Mircoles", "Jueves", "Viernes", "Sbado", "Domingo") MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday) - 1) End Sub o bien ponemos la Option Base 1, que se utiliza cuando queremos que un array no contemple el valor 0 de inicio tal que: Option Base 1 Sub Macro() Dim ArrayDiaSemana ArrayDiaSemana = Array("Lunes", "Martes", "Mircoles", "Jueves", "Viernes", "Sbado", "Domingo") MsgBox "Hoy es: " & ArrayDiaSemana(Weekday(Now, vbMonday)) End Sub
3.7.9. DoEvents
La instruccin DoEvents cede el control de la ejecucin al sistema operativo, para que ste pueda procesar otros eventos. Su Sintaxis es: DoEvents( ) La funcin DoEvents pasa el control al sistema operativo. El control no se devuelve hasta que el sistema operativo haya terminado de procesar los eventos en cola y se hayan enviado todas las teclas de la cola SendKeys. Advertencia: siempre que demos preferencia al procesador temporalmente dentro de un procedimiento de evento, debemos asegurarnos que el procedimiento no se ejecute de nuevo desde una parte diferente del cdigo antes de que devuelva la primera llamada. Esto podra causar resultados impredecibles. Adems, no debemos utilizar la funcin DoEvents si existe la posibilidad de que otras aplicaciones interacten con el procedimiento, de manera imprevista, durante el tiempo en que ste ha cedido el control. DoEvents suele utilizarse muchas veces para que a medida que una instruccin Looping o For Next se est ejecutando si presionamos otro control tal que: Private Sub Workbook_SheetActivate(ByVal Sh As Object) End Sub Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) End Sub
180
www.todoexcel.com
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) End Sub Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) End Sub Las macros dentro de las opciones anteriores se ejecutan antes de volver al looping o For Next que contiene el cdigo DoEvents(). Si quisiramos que una macro realizara cierta cantidad de operaciones siguiendo un looping, y supiramos que no debemos seleccionar ninguna celda mientras tanto, podramos utilizar la siguiente macro "DoEventsMacro" en conjuncin con la macro de evento.
181
www.todoexcel.com
182
www.todoexcel.com
3.8.1. Ejemplos
Como se suele decir en programacin, cuando queremos realizar algo, antes que inventarlo conviene descubrir si ya esta inventado! Para que crear algo que ya ha sido creado con anterioridad, desde VBA tenemos acceso a la mayora de lo Built In Dialogs. Por ejemplo, si quisiramos que el usuario guarde su libro con con el cuadro de dilogo "Guardar como" podramos llamarlo desde el Built In Dialog xlDialogSaveAs. La instruccin completa sera: Application.Dialogs(xlDialogSaveAs).Show La instruccin anterior abrira nuestro viejo y conocido cuado de dilogo "Guardar como", tal como se ve en la siguiente figura:
Los built-in dialogs son funcionalidades que permiten interactuar con la voluntad del usuario en la ejecucin de la macro. Para tener acceso a todos los built-in dialogs, lo podemos hacer desde el editor de VBA:
183
www.todoexcel.com
1. Presionamos la tecla F2 para abrir el Examinador de objetos. 2. En la lista Clases elegimos XLBuiltInDialog 3. En la lista Miembros de la derecha veremos todos los disponibles.
En el siguiente ejemplo abrimos un archivo mediante el Built In Dialog GetOpenFilename pero solo listamos los archivos XL* (el asterisco significa "cualquier caracter"). En este caso solo listaramos archivos XLS y XLA: Sub Ejemplo1() Dim Nombre_del_Fichero As Variant 'o bien: As String Nombre_del_Fichero = Application.GetOpenFilename( _ FileFilter:="Hojas de clculo (*.xl*),*.xl*", _ Filterindex:=1, _ ' Podemos definir el ttulo del Built In Dialog Title:="Sobre que Libro deseas operar?", MultiSelect:=False) Workbooks.Open Nombre_del_Fichero End Sub
Si quisiramos abrir ms de un libro de excel: Sub Ejemplo2() Dim Nombre_del_Fichero As Variant 'o bien: As String Nombre_del_Fichero = Application.GetOpenFilename( _ FileFilter:="Hojas de clculo (*.xl*),*.xl*", _ Filterindex:=1, _ Title:="Sobre que Libro deseas operar?", MultiSelect:=True) On Error Resume Next If Nombre_del_Fichero <> False Then NumFiles = UBound(Nombre_del_Fichero) - LBound(Nombre_del_Fichero) + 1 If Nombre_del_Fichero(LBound(Nombre_del_Fichero)) = False Then Exit Sub ' Para evitar que las macros de evento Private Sub Workbook_Open() ' se ejecuten Application.EnableEvents = False For X = LBound(Nombre_del_Fichero) To UBound(Nombre_del_Fichero) Workbooks.Open Nombre_del_Fichero(X) Next X
184
www.todoexcel.com
Application.EnableEvents = True Else Exit Sub End If End Sub FileFilter se aplica para definir el tipo de ficheros sobre los que deseamos trabajar. En este sentido si quisramos que el usuario pudiera escoger entre abrir Ficheros de Text "TXT", ficheros de Excel "Xls", o bien Cualquier Otro deberiamos utilizar: FileFilter:="Archivos de texto (*.txt),*.TXT," & _ " Todos los archivos de Microsoft Excel (*.Xls),*.Xls," & _ " Todos los archivos (*.*),*.*" dndole la oportunidad de elegir entre TXT, XLS. Tambin hubiramos podido llamarles tal que: FileFilter:="Archivos de texto (*.txt),*.TXT," & _ "hojas de clculo Excel (*.Xls),*.Xls," & _ "cualquier otro (*.*),*.*" Lo nico que hay que respetar es la extensin aplicable a cada fichero sobre el que deseemos trabajar si colocaramos: Filterindex:=1 El cuadro de dilogo abierto mostrara Archivos de texto como el tipo de archivo. Filterindex:=2 El cuadro de dilogo abierto mostrara Hojas de Clculo Excel como el tipo de archivo. Filterindex:=3 El cuadro de dilogo abierto mostrara cualquier otro archivo como el tipo de archivo Title es el ttulo que mostrar el cuadro de dilogo: Title:="Sobre que Libro deseas operar?" Title:="Que Libros deseas Abrir?" Title:="Que Libros deseas Guardar?" MultiSelect:=True, Si queremos tener la posibilidad de operar sobre ms de un libro deberemos poner True, de lo contrario False.
He aqui un Ejemplo que podemos utilizar: Sub Ejemplo3() Dim FileList As Variant Dim NumFiles As Integer, X As Integer
185
www.todoexcel.com
On Error Resume Next FileList = Application.GetOpenFilename( _ "Archivos de texto (*.txt),*.TXT," & _ "Todos los archivos de Microsoft Excel (*.Xls),*.Xls," & _ "Todos los archivos (*.*),*.*", _ 3, _ "Seleccione los Ficheros sobre los que desees Trabajar!", _ ,_ True) ' Permitimos seleccionar mas de un Fichero ' la opcin deseada para mostrar es: Todos los archivos ' el ttulo es='Seleccione los Ficheros sobre los que desees Trabajar!' ' esto tan solo otra forma de escribir lo mismo If FileList <> False Then NumFiles = UBound(FileList) - LBound(FileList) + 1 If FileList(LBound(FileList)) = False Then Exit Sub Cells.Clear For X = LBound(FileList) To UBound(FileList) Cells(X, 1) = FileList(X) ' Debug.Print FileList(x) ' Hubiramos podido trabajar con ellos tal que ' Creando otra macro que trabajara con ellos ' Call ReporteVentas Next X Else Application.EnableEvents = True Exit Sub End If End Sub
186
www.todoexcel.com
La barra de men: tambin es comn en todas las aplicaciones existentes, ahora bien las palabras que contiene esta barra varan en funcin de la funcionalidad que tenga la aplicacion en si. En este sentido la barra de menu de MS Word difiere de la barra de men de MS Excel. Independientemente de cual sea la aplicacin en si tendremos los siguientes menus dentro de la barra de menus: (Archivo, Edicin y Ayuda, aunque este ltimo trmino en Excel venga expresado con el caracter "?"). Puesto que Excel es una hoja de clculos, Word un procesador de textos y access una base de datos, estas aplicaciones diferirn en cuanto a las palabras que contengan su barra de men, as como en cuanto a los controles que contengan cada una de los mens de la barra de men.
Los controles que contiene el men formato de Word difieren de los que tiene el men formato de Excel, lo cual es lgico. Si sobre cualquier punto de la horizontal que representa la barra de men hacemos clic con el botn derecho del ratn cualquier aplicacin nos permitira ver el nmero de barras de herramientas disponibles para la aplicacin en si, as como cuales de ellas estn visibles y cuales no o cuales podemos personalizar.
187
www.todoexcel.com
Si abriramos un documento de texto desde el escritorio, obervaramos que un documento de texto posee una barra de ttulos idntica a la de Excel pero una barra de men que solo tendra 4 menus (Archivo, Edicin, Formato y Ayuda). Si hiciramos clic derecho en la misma, observaramos que un documento de texto "bloc de notas" no contiene barra de herramientas. Si abrimos Internet Explorer, observaremos que la barra de ttulos estar siempre, con la misma disposicin que la descrita al principio de este captulo (Logotipo, Nombre del documento contenido en la aplicacin, nombre de la aplicacin, minimizar, maximizar o restaurar y cerrar). Despues la barra de mens ( Ver, Favoritos y Herramientas). Si hiciramos clic drecho sobre la barra de mens, observaramos que contiene entre otras la siguientes barras de herramientas (Barra de direcciones, botones estndar, vnculos, personalizar, etc.), es decir la barra de herramientas de MS Internet Explorer pueden ser personalizadas, pero hasta cierto punto y/o lmite ya que solo podemos variar los vnculos, la disoposicin de la diferentes barras de herramientas y la disposicin y presencia de los botones dentro de la barra de heraamientas llamada "botones estandar". Tambin conviene recordar que Excel, Word, y el resto de aplicaciones Office siempre mantienen la ltima configuracin utilizada. En este sentido si ocultramos todas la barras de herramientas y
188
www.todoexcel.com
cerrramos la aplicacin la siguiente vez que abriramos la misma aplicacin todas las barras de herramientas estaran ocultas. Tras esta introduccin, podemos decir que en Excel todo es posible en cuando a barras de herramintas y barra de mens, entendiendo como todo es posible: 1. Crear una nueva barra de herramientas personalizada 2. Modificar cualquiera de la existentes aadiendo nuevos comandos y/ mens 3. Deshabilitar controles y/o funciones 4. Cambiar el nombre de las barras personalizadas Nosotros somos partidarios de no crear barras de herramientas en Excel debido a que simpre quedarn en el listado de barras de herramientas salvo que las eliminemos al cerrar el libro que las cre. Est sera innecesario ya que en lugar de crear barras de herramientas nos podemos limitar a aadir controles en la misma hoja o bien aadir barras de herramientas POPUP. La dinmica y el el proceso de creacin de una barra de herraminta y un men, submen o control dentro de un submen es el mismo. Cualquier men, submen y/o control tiene un identificador "ID" al cual podremos hacer referencia al crearlo y/o borrarlo.
La siguiente instruccion evita que podamos personalizar y/o modificar las barras de herramientas de Excel, en caso que ninguna estuviera visible. Con el siguiente cdigo, no podremos visualizar ninguna barra. CommandBars("Toolbar List").Enabled = False Si quisiramos volver a permitir la modificacin de las barra de herramientas, tan solo necesitariamos cambiar el False por True. En ambos casos, la funcin es evitar que el usuario final aada y/o modifique las Barras de Herramientas (Barras de herramientas).
A la hora de crear una Barras de herramientas, conviene borrarla previamente, para evitar el problema derivado de crear una Barras de herramientas con un nombre preexistente, por ej: Sub BorrarToolbar() On Error Resume Next ' Borra la barra de Herramientas llamada TodoEXCEL ' On error resume next evita el problema derivado en caso de que no ' hubiera ninguna barra de herramientas llamada TodoEXCEL CommandBars("TodoEXCEL").Delete End Sub Es decir si quisiramos crear una Barras de herramientas llamada "TodoEXCEL", sera conveniente llamar a la macro anterior primero tal que: Sub CrearToolbar() Dim X As Byte On Error Resume Next
189
www.todoexcel.com
Call BorrarToolbar ' Llamamos a la macro BorrarToolbar, para evitar problemas en cdigo ' Creamos la barra deHerramientas With CommandBars.Add(Name:="TodoEXCEL") .Visible = True ' esta Barras de herramientas tendr 3 controles, o mejor dicho 2 controles de botn y un Dropdown control With .Controls.Add(Type:=msoControlButton) .Caption = "VBA" .Visible = True .OnAction = "SheetVBA" .FaceId = 1954 .TooltipText = "Muestra el Editor de VBA" .Style = msoButtonIconAndCaption ' el 1 control ensear la imagen y el texto End With With .Controls.Add(Type:=msoControlButton) .Caption = "Saludos:" .OnAction = "Msg" .FaceId = 1954 .BeginGroup = True .TooltipText = "Simple Saluda!" .Style = msoButtonCaption ' An cuando hemos puesto un FacedID=1954, ' al definir que solo queremos ensear el texto y no la imagen del botn, el cdigo ' .FaceId = 1954 no es necesario End With With .Controls.Add(Type:=msoControlDropdown) ' Cuando el control es ejecutado la macro MacroDiaSemana se ejecutar. .OnAction = "MacroDiaSemana" ' el 3 control es de tipo ContolDropDown, por ello necesitamos saber los valores que tendr For X = 2 To 8 .AddItem Application.WorksheetFunction.Proper(Format(X, "DDDD")) Next X ' los valores aadidos son: Lunes, Martes, Mircoles, Jueves, Viernes, Sbado, Domingo .ListIndex = 1 .BeginGroup = True .TooltipText = "Que da es Hoy?!" End With End With End Sub
Conviene recordar que al ejecutar esta macro crearemos una Barras de herramientas llamada "TodoEXCEL", y al cerrar el libro, esta Barras de herramientas seguir como una de las Barras de herramientas de Excel, ya que no la hemos borrado antes de cerrar el libro. Es por ello que preferimos no utilizar Barras de herramientas creadas con VBA, ya que todo lo que realizamos a travs de ellas puede ser realizado mediante simples comandos adjuntos en las hojas. Cmo solucin podramos utilizar una nacro de evento que al cerrar el libro activo llamara a la macro "BorrarToolbar", y con ello borraramos esta Barras de herramientas recin creada, por ejemplo: Private Sub Workbook_BeforeClose(Cancel As Boolean) Call BorrarToolbar End Sub Sub BorrarToolbar() On Error Resume Next ' Para evitar la imposibilidad de Borrar algo que no existe.
190
www.todoexcel.com
Application.CommandBars("TodoEXCEL").Delete 'TodoEXCEL' End Sub ' Borraramos la Barras de herramientas
Finalmente, si lo que queremos es utilizar una Barras de herramientas y no queremos utilizar eventos, tambin podremos utilizar PopUps, que son Barras de herramientas que solo aparecen cuando una caracterstica dada tiene lugar. Esto lo veremos en la prxima seccin.
3.9.2. PopUp
Si lo que queremos es utilizar una BH solo cuando, por ejemplo, hacemos clic con el botn derecho del ratn en una hoja determinada, podemos utilizar una macro de evento que cree una BH temporal o PopUp, tal que: Sub CrearPOPUP() Dim CBarPOPUP As CommandBar Dim POPUPControl As CommandBarControl Dim SubPOPUPControl As CommandBarButton ' Borrar la Previa Call BorrarPOPUP Set CBarPOPUP = CommandBars.Add( _ Name:="TodoEXCELPOPUP", _ Position:=msoBarPopup, _ MenuBar:=False, _ Temporary:=False) With CBarPOPUP ' Vamos aadindole diferentes botones tal que... ' 1) Set POPUPControl = .Controls.Add(Type:=msoControlButton) With POPUPControl .Caption = "&Informe Ventas..." .FaceId = 1922 .OnAction = "MacroEg" End With ' 2) Set POPUPControl = .Controls.Add(Type:=msoControlButton) With POPUPControl .Caption = "&Plan Contable..." .FaceId = 1016 .OnAction = "MacroEg" End With ' 3) Set POPUPControl = .Controls.Add(Type:=msoControlPopup) With POPUPControl .Caption = "Paises" .BeginGroup = True End With ' 3.A) Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton) With SubPOPUPControl .Caption = "Francia" .FaceId = 71 .OnAction = "MacroEg"
191
www.todoexcel.com
End With ' 3.B) Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton) With SubPOPUPControl .Caption = "Espaa" .FaceId = 72 .OnAction = "MacroEg" End With ' 3.C) Set SubPOPUPControl = POPUPControl.Controls.Add(Type:=msoControlButton) With SubPOPUPControl .Caption = "Portugal" .FaceId = 73 .OnAction = "MacroEg" End With End With End Sub Private Sub MacroEg() MsgBox "en lugar de este mensaje hubieramos podido ejecutar nuestra macro", vbInformation, "LOGICAMENTE..." End Sub
Sub BorrarPOPUP() On Error Resume Next CommandBars("TodoEXCELPOPUP").Delete End Sub Al ser una BH PopUp, no necesitamos crearla cada vez que hacemos clic con el botn derecho del ratn, tal que: Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Range("RangoCeldas"), Target) Is Nothing Then Call CrearPOPUP Application.CommandBars("TodoEXCELPOPUP").ShowPopup ' CommandBars('TodoEXCELPOPUP').ShowPopup '.showpopup ' Pues queremos observar como los comandos del boton derecho ' de nuestro raton varan Cancel = True End If End Sub
Pero para ello si necesitaremos crearla al abrir el libro tal que: Private Sub Workbook_Open() Call CrearPOPUP End Sub
192
www.todoexcel.com
y una vez creada, podremos visualizarla cuando lo querramos tal que: Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Range("RangoCeldas"), Target) Is Nothing Then Application.CommandBars("TodoEXCELPOPUP").ShowPopup ' Pues queremos observar como los comandos del botn derecho ' de nuestro raton varan Cancel = True End If End Sub Recordemos que esta macro de evento BeforeRightClick solo tiene lugar cuando hacemos clic con el botn derecho del ratn estando dentro del rango definido como: Range("RangoCeldas") ya que no queremos perder la funcionalidad del botn derecho del ratn en otros rangos.
193
www.todoexcel.com
esto queremos decir que si queremos deshabilitar los controles de copiar, cortar y pegar, deberamos tambin deshailitarlos del botn derecho del ratn y no solo los de la barra estndar. No obstante tambin podramos ir al men Edicin > Copiar con lo que an deshabilitando los controles de las BH, los controles del men bar seguiran activos, como as tambin CONTROL+C que es la combinacin de teclas para copiar y CONTROL+V que es la combinacin de teclas para pegar. En definitiva, para deshabilitar todos los controles de copiar deberamos: 1) Saber si existe alguna combinacin de teclas que ejecuten la accin que queremos evitar y deshabilitarla. Luego al cerrar el libro esto se hace tal que: Application.OnKey "^C", "" Application.OnKey "^C" ' Con esto deshabilitaramos las teclas Control + C ' Con esto re-habilitaramos las teclas Control + C
2) Deshabilitar los contoles de copiar en cada una de las BH disponibles en Excel. Esto se hace dela siguiente forma: Sub DeshabilitaCiertosControles() Dim CBControl As CommandBarControl Dim CBar As Integer Dim MyArray Dim X As Byte Application.ScreenUpdating = False MyArray = Array(19, 21, 22) On Error Resume Next ' Para Deshabilitar los controles definidos en el array MyArray For CBar = 1 To Application.CommandBars.Count For Each CBControl In CommandBars(CBar).Controls For X = LBound(MyArray) To UBound(MyArray) Application.CommandBars(CBar).FindControl(ID:=MyArray(X), Recursive:=True).Enabled = False Next X Next CBControl Next CBar Application.CommandBars("PLY").Enabled = False CommandBars("Toolbar List").Enabled = False On Error GoTo 0 End Sub Hemos utilizado un array de los identificadores de los comandos que queremos deshabilitar que son 19,21,22 es decir, Copiar, Cortar y Pegar respectivamente. Una vez que hemos deshabilitado todos los controles con estos ID, necesitamos a su vez realizar el siguiente paso...
3) Evitar la personalizacin: CommandBars("Toolbar List").Enabled = False Ya que de lo contrario podramos volver a personalizar nuestras BH e incluir los controles 19, 21 y 22 en cualquier BH bien sea personalizada o de las que trae Excel, por ej Estndar.
194
www.todoexcel.com
4) Deshabilitar copiado de hoja: Application.CommandBars("PLY").Enabled = False Deberemos deshabilitar al mismo tiempo la copia de la hoja desde el botn derecho del ratn en los tabuladores (etiquetas) de hoja, pues de lo contrario lo realizado hasta ahora sera inservible.
5) Deshabilitar opciones del botn derecho del reatn: Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Cancel = True End Sub Como hemos mencionado en repetidas ocasiones el botn derecho del ratn siempre tiene las opciones de copiar, cortar y pegar con lo que es ms sencillo directamente deshabilitar por completo la opcin de botn derecho del ratn. Sin embargo, todo lo realizado sigue sin ser ptimo, ya que desde el men Edicin tenemos la posibilidad de mover o copiar la hoja. Es decir que necesitaramos saber todos los controles que sirven para realizar lo mismo, o que pueden servir para de alguna manera llegar a evitar el fin pretendido. E incluso, si conociramos todos los ID's, luego quedara la posibilidad de acceder al editor de VBA y desde aqu habilitar los comandos deshabilitados. Puede que lleguemos a la conclusin que finalmente es imposible, pero no lo es, tan solo lleva tiempo, y ademas el 99,9% de lo usuarios no emplearn el tiempo requerido para volver a habilitar algo, que el creador haya querido deshabilitar. De hecho muchos programadores nunca protegen su cdigo teniendo en cuenta que existen herramientas con las que se podra crackear fcilmente las claves e proteccin. Como alternativa recurrente podriamos crear un men bar carente de funcionalidad y evitar el acceso a VBA, deshabilitar el botn derecho del ratn tambin en los tabuladores de hoja tal que: Public Sub MakeMenuBar() Dim X As Byte Dim ABC As String ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Dim CBar As CommandBar Call DeleteMenuBar For Each CBar In CommandBars ' Borramos las barras visibles If CBar.Type = msoBarTypeNormal Then CBar.Visible = False Next CBar Set CBar = CommandBars.Add(MenuBar:=True) With CBar .Name = "MenuPARIA" .Visible = True End With Application.VBE.MainWindow.Visible = False Application.CommandBars("PLY").Enabled = False ' Para deshabilitar los comandos tales como 'CONTROL+P' es decir PRINT ' Nos faltaran todava algunos pero... For X = 1 To Len(ABC) Application.OnKey "^" & Mid(ABC, X, 1), "" Application.OnKey "^" & LCase(Mid(ABC, X, 1)), "" Application.OnKey "%" & Mid(ABC, X, 1), ""
195
www.todoexcel.com
Application.OnKey "%" & LCase(Mid(ABC, X, 1)), "" Next X ' Tampoco hemos deshabilitado los ALT+F1, F2,... ' Application.SendKeys ('%q') CommandBars("Toolbar List").Enabled = False End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) ' Utilizamos este cdigo porque si el commandbar PLY esta activo no merece la pena deshabilitar el botn derecho. If Application.CommandBars("PLY").Enabled = True Then Exit Sub Cancel = True End Sub
Recordemos nuevamente que cualquier ExcelManaco podra sin gran dificultad habilitar cualquier comando y/o control previamente deshabilitado.
196
www.todoexcel.com
3.10. MENUS
Podemos personalizar o adaptar nuestros propios mens y barras de herramientas dentro de Excel. En este captulo veremos como hacerlo.
197
www.todoexcel.com
' hemos colocado un & antes que la 'x' para que la 'x' est subrayada y podamos acceder al men no solamente con el ratn sino desde el teclado con la combinacion de teclas 'ALT + X' MenuNuevo.Caption = "E&xceluciones" ' Y vamos aadindole diferentes botones y/o controles tal que... '1) Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlButton) With MenuItem .Caption = "&Informe Ventas..." .FaceId = 176 .OnAction = "MacroEjemplo" ' esta ser la macro que ejecutaremos al hacer clic sobre el botn '&Informe Ventas...', o cuando utilicemos la combinacin de teclas 'ALT +X...ALT+I' End With '2) Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlButton) With MenuItem .Caption = "&Plan Contable..." .FaceId = 36 .OnAction = "MacroEjemplo" End With '3) Set MenuItem = MenuNuevo.Controls.Add(Type:=msoControlPopup) With MenuItem .Caption = "Pases" .BeginGroup = True End With '3.A) Del mismo modo que aadimos controles, podemos aadir subcontroles ' y dentro de estos podramos aadir a su vez ms subcontroles, aunque no es aconsejable Set SubmenuItem = MenuItem.Controls.Add(Type:=msoControlButton) With SubmenuItem .Caption = "Francia" .FaceId = 71 .OnAction = "MacroEjemplo" 'Estamos utilizando la misma macro, pero lgicamente, se suelen colocar tantos botones como macros querramos utilizar, End With '3.B) Set SubmenuItem = MenuItem.Controls.Add(Type:=msoControlButton) With SubmenuItem .Caption = "Espaa" .FaceId = 72 .OnAction = "MacroEjemplo" End With '3.C) Set SubmenuItem = MenuItem.Controls.Add(Type:=msoControlButton) With SubmenuItem .Caption = "Portugal" .FaceId = 73 .OnAction = "MacroEjemplo" End With Sheets("Crear MenuTodoEXCEL").Shapes("ImgMenu").Visible = True End Sub Esta es la macro que hemos creado para que sea ejecutada al hacer clic sobre cualquier control del men creado:
198
www.todoexcel.com
Private Sub MacroEjemplo() MsgBox "en lugar de un mensaje hubieramos podido...", vbInformation, "LOGICAMENTE..." End Sub
Haber decidido colocar el menu "TodoEXCEL" antes que el men y/o control Ayuda "?" no significa que debamos hacerlo siempre asi. Pero debemos de saber el ID del men para poder maniobrar sobre el y/o con el. 30002 =&Archivo 30003 30004 30005 30006 30007 =&Edicin =&Ver =&Insertar =&Formato =&Herramientas
En el siguiente ejemplo insertamos un nuevo control en el Menu Insertar, y le adjuntamos una macro sencillita para cuando el control creado sea ejecutado y/o clicado a travs del ratn o a travs de teclado con el metodo abreviado de teclas "Conbinacin de teclas": Sub AadirControl_al_MenuXX() Dim MenuXX As CommandBarPopup
199
www.todoexcel.com
Dim nuevoControl As CommandBarButton ' Elimina el Control si existiera: Call DeleteMenuControl ' Encontrar el Menu Insertar: Set MenuXX = Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30005) ' Buscamos por el Menu Insertar y en caso de que no existiera, EXIT ' Lgicamente el menu 'Insertar' debera estar siempre, pero nos aseguramos... If MenuXX Is Nothing Then MsgBox "Parece que su Barra de Menu, no Contiene el Control Insertar", vbInformation, "ATENCION" Exit Sub End If Set nuevoControl = MenuXX.Controls.Add( _ Type:=msoControlButton) ' before:= en caso de que quisiramos colocarlo no en el final, sino ' antes que el control llamado 'Com&entario' ' Set nuevoControl = MenuXX.Controls.Add( _ Type:=msoControlButton, _ Before:=Application.CommandBars("Insert").Controls("Com&entario").Index) With nuevoControl .Caption = "Insertar Mensaje E&xceLuciones" .BeginGroup = True .FaceId = 1589 .OnAction = "MsgBox_Hola" End With End Sub
Sub DeleteMenuControl() On Error Resume Next Application.CommandBars("Worksheet Menu Bar").FindControl(ID:=30005).Controls("Insertar Mensaje E&xceLuciones").Delete End Sub Sub MsgBox_Hola() MsgBox Chr(10) & "Un Feliz AO Nuevo!!!", _ vbInformation, _ "TodoEXCEL le desea:" End Sub Conviene recordar que si ejecutramos esta macro y no borrramos el control creado al cerrar el libro, luego si furamos al men Insertar e hiciramos clic sobre el control "Insertar Mensaje E&xceLuciones", Excel automticamente abrira el libro que contiene la macro que hemos ordenado que se ejecute. Es por ello que los mens nuevos y/o personalizados se aportan como complementos o bien se borran cuando el libro que los cre se cierra. Tambin debemos recordar que podemos hacer eferencia a un men por su nombre y/o por su identificativo (es decir su ID). Los ID no variarn de pas a pas (versiones de Excel en distintos idiomas) mientras que los nombres puede que si !.
200
www.todoexcel.com
3.11. COMANDOS
En este captulo se explicarn algunos comandos tiles que suelen utilizarse con frecuencia en las macros.
En otros casos, la misma cambia el mensaje mostrado, segn la operacin que estemos por realizar. Por ejemplo, si seleccionamos un rango y lo copiamos, la barra de estado dara una instruccin como la que se ve a continuacin:
201
www.todoexcel.com
Es posible cambiar el mensaje de la Barra de estado mediante cdigo VBA. Esto permite mostrar mensajes personalizados ya sea mientras se ejecutan las macros o al finalizar las mismas.
A continuacin se exponen algunas instrucciones para saber como manipularla y modificarla: Sub BarraEstado() ' Si queremos ver la barra de estado original Application.DisplayStatusBar = True ' Si NO queremos verla bastar con: Application.DisplayStatusBar = False ' Por defecto la Barra de estado siempre estar Visible, es decir: Application.DisplayStatusBar = True ' Si queremos que la barra de estado muestre un mensage diferente bastar con: Application.DisplayStatusBar = "Procesando mi reporte..." ' Si queremos que la Barra de Estado este limpia, es decir sin mensaje alguno: Application.DisplayStatusBar = "" End Sub
3.11.3. Msgbox
Un Msgbox es simplemente una ventana que muestra un mensaje. Por ej., con la siguiente instruccin mostraramos un saludo:
Sub Saludo() ' Escribimos el mensaje entre comillas Msgbox "Hola, Excel te saluda!" End Sub
202
www.todoexcel.com
El mesaje anterior se vera as en la hoja Excel:
En este otro ejemplo, el mensaje lo tomamos de una celda Excel: Sub Saludo() ' El mensaje mostrar el contenido de la celda A1 Dim M As Variant M = range("A1").value Msgbox M End Sub
Tambin es posible dar formato y aplicar otras propiedades al Msgbox, tal como se ve explica continuacin: Sub MacroMensajes() ' Los mensajes que excel puede lanzar se rigen por: ' Prompt:='Me llamo Pedro.' Ensearia el mensaje... ' Buttons:= VbInformation, O bien ' Buttons:= 64 ' con lo cual Buttons ----> Muestra el icono de mensaje de informacin. ' Title:='TodoEXCEL:', el ttulo que adjuntaramos al mensaje MsgBox Prompt:="Me llamo Pedro.", Buttons:=vbInformation, Title:="TodoEXCEL:" End Sub La macro anterior mostrara un mensaje como el siguiente:
Por defecto, un Msgbox siempre incluye el botn "Aceptar", el cual hara desaparecer el mensaje y continuara ejecutando el cdigo restante si lo hubiera. Tambin podemos configurar para que en lugar del botn "Aceptar" aparezca un botn de "Ok" y "Cancelar" y de acuerdo al que elija el usuario, la macro continuara con un cdigo u otro cdigo. Esto lo realizamos agregando la instruccin vbOKCancel, tal como vemos a continuacin:
203
www.todoexcel.com
Sub Mensaje() Dim Respuesta As Integer Respuesta = MsgBox("Seleccione Aceptar o Cancelar", vbOKCancel) ' verificamos si se presion 'Cancelar' If Respuesta = vbCancel Then MsgBox "Macro caso Cancelar" ' Aqu continuara la macro en caso de Cancelar End If ' si se presion 'Aceptar' If Respuesta = vbOK Then MsgBox "Macro caso Aceptar" ' Aqu continuara la macro en caso de Aceptar End If End Sub El Msgbox anterior se vera as:
Si quisiramos separar en varias lneas el mensaje, deberamos hacerlo con la instruccin &Chr(13): Sub Mensaje() MsgBox "Este es un mensaje " & Chr(13) _ & "escrito en 2 lneas" End Sub El mensaje anterior se vera as:
3.11.4. InputBox
Un InputBox se utiliza cuando requerimos un input del Usuario (es decir, cuando esperamos que el usuario introduzca un dato). Bsicamente lo que hacemos es asignarle un valor a una variable, pero le damos el control al usuario para que asigne dicho valor o dato a gusto.
204
www.todoexcel.com
Dentro del InputBox utilizamos las siguientes instrucciones: Prompt: mensaje del InputBox Title: ttulo del InputBox Default: valor por defecto al abrir el InputBox (si omitimos no aparecer nada) Type: indica el tipo de dato a introducir (1 Nmero, 2 Texto, 4 True o False, 5 Rangos) Vamos ahora como queda el InputBox: Sub Nombre() ' el dato que proporcionar el usuario quedar registrado por la Variable Respuesta. Como no sabemos que tipo de dato es lo definimos como una variable de tipo Variant. Dim Nombre As Variant Nombre = Application.InputBox(prompt:="Escriba su nombre", Title:="Colegio de Abogados", Default:="Pedro", Type:=2) Msgbox Nombre ' En lugar de este Msgbox continuara el resto de la macro... End Sub El InputBox anterior se ver as:
205
www.todoexcel.com
4. LIBRERIA
Una "librera" es una coleccin de macros. En la medida que vamos haciendo nuestras macros, conviene ir guardndolas en una librera. De este modo las tendremos disponibles para cuando necesitemos usarlas nuevamente y evitaremos tener que reprogramar las macros en cada momento. En esta seccin veremos nuestra librera de macros (aquellas que utilizamos frecuentemente). Borrar filas: macros para borrar filas. Bsquedas: macros para realizar bsquedas. Clculos: macros para operar y realizar clculos. 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 versin 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. Imgenes: macros para manipular imgenes. Imprimir: macros para imprimir. Msgbox: macros de mensajes. Ordenar: macros para ordenar. Proteger: macros para proteger y desproteger hojas y libros.
206
www.todoexcel.com
Rangos: macros para manipular rangos. Resolucin de Pantalla: macros para determinar la resolucin de pantalla. Seleccin: macros relacionadas con seleccin. Tablas: macros relacionadas con tablas. Tablas dinmicas: macros para operar con tablas dinmicas. Varios: otras macros de inters.
4.2. Bsquedas
Para hacer bsquedas (el equivalente a la funcin "buscarv" de Excel) utilizamos la instruccin lookupvalue. Veamos un ejemplo: Sub BuscarCodigo() 'Definimos variables Dim lookupvalue As Variant, value As Variant, lookupRange As Range value = Range("A1").value 'celda con el valor buscado Set lookupRange = Range("A10:A100") 'rango donde buscar lookupvalue = Application.VLookup(value, lookupRange, 3, False) 'Queremos la columna 3 'Si no encuentra valor terminamos la macro If IsError(lookupvalue) Then exit sub
207
www.todoexcel.com
'Si lo encuentra lo devuelve Else Msgbox lookupvalue End If End Sub
4.3. Clculos
Muchas veces, cuando ejecutamos macros, nos interesar poner el modo de clculo manual. Para esto utilizamos la instruccin Calculation. Veamos un ejemplo: 'Poner modo de clculo manual Application.Calculation = xlManual 'Poner mode de clculo automtico Application.Calculation = xlAutomatic
4.4. ComboBox
Cuando trabajamos con un combobox, podemos crear un evento que se dispare luego de presionar intro. Veamos un ejemplo: Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then 'Cuando apreto enter dentro del combo box entonces Range("I6").value = ComboBox1.Text 'Pasamos el valor del combo a la celda I6 End If End Sub 'Para rellenar con lista un combobox q est en una hoja ActiveSheet.OLEObjects("CBoxTipo").ListFillRange = "ConfTipos" 'Se completa con lo que tengamos en el rango nombrado "ConfTipos"
4.5. CommandBars
Aqu jugamos un poco con las barras de comando. Cambiando los "True" por "False" y viceversa veremos como afecta. 'RESTITUYE LOS COMMAND BARS Y BORRA EL DE REFRESH ! Sub CmdBarsOn() Application.CommandBars("Worksheet Menu Bar").Reset 'Activa menu boton derecho en menus CommandBars("Refresh").Enabled = True 'Para volver a ver el menu de clic derecho en celda Application.CommandBars("Cell").Enabled = True End Sub
208
www.todoexcel.com
4.6. CopiarPegar
Un ejemplo sencillito sobre copiar una celda y pegarla como valor. Sub CopiarPegar() Range("A104").Copy Range("A105").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub
4.7. Demos
Esta es una macro sumamente interesante. Esta macro sirve para crear versiones "demo" de nuestros libros. 1) Primero se ejecuta una macro "Auto_Open" (se ejecuta automticamente al abrir el libro) 2) Dicha macro pedir al usuario una clave de desactivacin 3) Si la clave de desactivacin es correcta, el usuario podr usar el libro normalmente 4) Si la clave es incorrecta, se ejecutar la macro "Demo" 5) La macro "Demo" hace que se pueda ejecutar el libro una cantidad de veces o hasta una fecha dada 6) Si se ha superado la cantidad de usos o la fecha, el libro se cerrar automticamente Veamos como funciona: Sub Auto_Open() Dim V As String 'Defino una palabra clave de activacin (ponerla en una celda oculta o con texto y fondo blanco) If Hoja6.Range("B1").value = "espaa" Then Exit Sub Else V = Application.InputBox("Introduzca la clave de activacin. Si todava no la conoce presione 'Aceptar'") If V = "espaa" Then Hoja6.Range("B1").value = "espaa" MsgBox "Activacin exitosa, presione 'Ok' para guardar los cambios." ThisWorkbook.Save Exit Sub End If 'Si no puso la clave correcta llama macro demo Call Demo End If End Sub
209
www.todoexcel.com
Sub Demo() Dim V As String, FechaFin As Date, Usos As Range FechaFin = #7/15/2007# 'm-d-aaaa... CAMBIAR ESTA FECHA !!! Set Usos = Hoja6.Range("A1") 'CAMBIAR CELDA DONDE PEGAR USOS !!! 'Incremento el contador Usos.value = Usos.value + 1 MsgBox "Esta es una versin DEMO que expirar el " & FechaFin & " o luego de 20 usos." MsgBox "Usted ha consumido " & Usos & " de 20 usos disponibles." If Date > FechaFin Or Usos > 20 Then 'Aqu se puede cambiar el N de usos MsgBox "Demo expirada, contacte con el autor" ThisWorkbook.Close SaveChanges:=True End If End Sub
Esta es otra macro ms simple que la anterior: 'MACRO DEMO PARA CERRAR LIBRO EN DETERMINADA FECHA Sub Auto_Open() Dim FechaFin As Date FechaFin = #2/27/2007# 'm-dd-aaa MsgBox "Esta es una versin DEMO que expirar el " & FechaFin If Date > FechaFin Then MsgBox "Demo expirada, contacte con TodoEXCEL" ThisWorkbook.Close SaveChanges:=True End If End Sub
4.8. Eventos
En este ejemplo vemos un ejemplo sobre cmo llamar macros cuando cambia algn valor de una columna determinada. 'Esta declaracion de variables va al inicio de la hoja o modulo porq luego las uso en cada caso Dim LCR As Long, LCC As Long 'Esta macro se ejecuta cuando cambia algo en la hoja Private Sub Worksheet_Change(ByVal Target As Range) LCR = Target.Row 'Definmos variable LCR (por Last Changed Row) LCC = Target.Column 'Definimos variable LCC (por Last Changed Column) With Application .ScreenUpdating = False .EnableEvents = False End With If LCR > 10 Then 'Solo ejecutamos la macro cuando estamos en fila 11 o mayor.
210
www.todoexcel.com
Select Case LCC Case Is = 2: Call Fecha 'Si cambia columna 2 se ejecuta macro "Fecha" Case Is = 3: Call Concepto 'Si cambia columna 3 se ejecuta macro "Concepto" Case Is = 4: Call Grupo Case Is = 5: Call Tipo Case Is = 7: Call Importe Case Is = 8: Call Cuenta Case Is = 9: Call GrupoCta End Select End If Application.EnableEvents = True End Sub Otras macros relacionadas: 'MACRO Q SE DISPARA CUANDO CAMBIA UNA CELDA NOMBRADA 'La macro se dispara cuando cambia la celda nombrada como "AhorroCliente" Private Sub Worksheet_Change(ByVal Target As Range) Dim Isect As Range Set Isect = Application.Intersect(Target, Range("AhorroCliente")) If Not Isect Is Nothing Then MsgBox "Hola" End Sub 'MACRO Q CIERRA EL LIBRO PASADA UNA FECHA (ponerla es this workbook) Private Sub Workbook_Open() Dim FechaFin As Date Dim FechaHoy As Date FechaFin = DateSerial(6, 8, 3) FechaHoy = Date If FechaHoy >= FechaFin Then MsgBox "Ha caducado la demo y el libro se cerrar, contacte con TodoEXCEL" ThisWorkbook.Close End If End Sub 'MAcro q se dipara cuando se selecciona una celda determinada (en este caso la de fila 1, columna 1) Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row = 1 And Target.Column = 1 Then MsgBox "QQQ" End Sub 'Macro para determinar ultima celda modificada Private Sub Worksheet_Change(ByVal Target As Excel.Range) 'En este caso, si el color de la ultima celda modificada es 35 o 6 entonces 'genera una variable celda q corresponde a la ltima modificada If Target.Interior.ColorIndex = 35 Or _ Target.Interior.ColorIndex = 6 Then Set Celda = Target End If End Sub
211
www.todoexcel.com
4.9. ExcelVersions
Para saber con que versin de Excel nos encontramos utilizamos la instruccin Application.Version Sub ExcelVersionControl() ''CONTROLA LA VERSION DE EXCEL Dim xlVer As Variant xlVer = Val(Application.Version) MSgbox XlVer If xlVer < 10 Then MsgBox "Version no soportada" 'Para avisar que no funciona para Excel inferior a 2.002 End Sub La macro devuelve: 08 Para Excel 97 09 Para Excel 2.000 10 para Excel 2.002 11 para Excel 2.003 12 Para Excel 2.007
4.10. LayOut
Con estas macros jugaremos a ocultar y mostrar barras de herramientas o desactivar mens. Recordar que podemos cambiar las propiedades "True" por "False" y viceversa para lograr el efecto contrario. Option Explicit Sub OcultaMenus() 'Ocultar menus Application.CommandBars("Worksheet Menu Bar").Enabled = False 'Ocultar barras de herramientas Application.DisplayFullScreen = True End Sub Sub HideToolBars() 'Ocultar barras Dim CurrTB As Toolbar, Counter As Integer With Worksheets("List") For Each CurrTB In Application.Toolbars If CurrTB.Visible = True Then Counter = Counter + 1 .Cells(Counter, 1).value = CurrTB.Name .Cells(Counter, 2).value = CurrTB.Top .Cells(Counter, 3).value = CurrTB.Left End If Next For Each CurrTB In Application.Toolbars If CurrTB.Visible = True Then CurrTB.Visible = False Next If Counter > 0 Then
212
www.todoexcel.com
.Range("A1").CurrentRegion.Sort Key1:=.Range("B1"), Order1:=xlAscending, Key2:=.Range("C1"), Order2:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom End If End With End Sub Sub RestoreToolBars() 'Reestableces barras Dim TBRg As Range, CurrTBCell As Range Set TBRg = Worksheets("List").Cells(1, 1).CurrentRegion.Columns(1) If Not IsEmpty(TBRg) Then For Each CurrTBCell In TBRg.Cells With Toolbars(CurrTBCell.value) .Visible = True .Top = CurrTBCell.Offset(0, 1).value .Left = CurrTBCell.Offset(0, 2).value End With Next End If End Sub Sub CmdBarsOff() Dim ctl As CommandBarControl For Each ctl In Application.CommandBars("Worksheet Menu Bar").Controls 'Debug.Print ctl.Caption If ctl.BuiltIn = True Then ctl.Enabled = False End If Next ctl 'Desactiva menu boton derecho en menus CommandBars("Toolbar List").Enabled = False 'No ver el menu de clic derecho en celda Application.CommandBars("Cell").Enabled = False With CommandBars("Worksheet Menu Bar") .Enabled = True With .Controls(1) .Enabled = True .Visible = True End With End With End Sub Sub CmdBarsOn() Application.CommandBars("Worksheet Menu Bar").Reset 'Activa menu boton derecho en menus CommandBars("Toolbar List").Enabled = True 'Para volver a ver el menu de clic derecho en celda Application.CommandBars("Cell").Enabled = True End Sub
213
www.todoexcel.com
4.11. Filtros
Algunos cdigos interesantes relacionados con filtros. Option Explicit 'Extraer unicos con filtro avanzado Sheets("aaa").Select Range("E6:E18").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("AC7"), Unique:=True El rango q filtro debe contener el encabezado, el copytorange no. *** Esta macro conviene ponerla en 1 mdulo (si la pongo en hojas da muchos problemas) 'Poner autofiltro Range("B6:M6").AutoFilter 'DETERMINAR SI ESTA PUESTO EL AUTOFILTRO If ActiveSheet.AutoFilterMode = True Then 'FILTRAR CON CONDICION Range("A1").AutoFilter Field:=8, Criteria1:="<=" & Range("M5").value, Operator:=xlAnd * En A1 est en encabezado de columna. Luego filtro por <= a valor de M5 'QUITAR FILTROS If Range("InHuurData").AutoFilter = xlOn Then Range("InHuurData").AutoFilter End If 'PINTAR CELDA CON FILTRO 'Requiere q en alguna celda este la formula =hoy() 'dado q al filtrar se recalcula y dispara el evento calculate Private Sub Worksheet_Calculate() Dim af As AutoFilter Dim fFilter As Filter Dim iFilterCount As Integer If ActiveSheet.AutoFilterMode Then Set af = ActiveSheet.AutoFilter iFilterCount = 1 For Each fFilter In af.Filters If fFilter.On Then af.Range.Cells(1, iFilterCount) _ .Interior.ColorIndex = 6 Else af.Range.Cells(1, iFilterCount) _ .Interior.ColorIndex = 40 End If iFilterCount = iFilterCount + 1 Next fFilter Else Rows(1).EntireRow.Interior.ColorIndex = xlNone End If End Sub 'FILTROS AVANZADOS
214
www.todoexcel.com
'el 1 rango indica la tabla 'el 2 rango indica los criterios 'el 3 rango indica la tabla con los encabezados q quiero de resultados Range("E7:CL23").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("Filtros").Range("D3:G10"), _ CopyToRange:=Range("G26:O26"), Unique:=False 'Funcin Mostrar criterios filtrados Function FilterCriteria(Rng As Range) As String By Stephen Bullen Dim Filter As String Filter = "" On Error GoTo Finish With Rng.Parent.AutoFilter If Intersect(Rng, .Range) Is Nothing Then GoTo Finish With .Filters(Rng.Column - .Range.Column + 1) If Not .On Then GoTo Finish Filter = .Criteria1 Select Case .Operator Case xlAnd Filter = Filter & " AND " & .Criteria2 Case xlOr Filter = Filter & " OR " & .Criteria2 End Select End With End With Finish: FilterCriteria = Filter End Function 'Luego usar esto para q actualice al autofiltrar: =FilterCriteria(B5)&left(Subtotal(9,B5:B200),0)
4.12. FTP
Algunos cdigos de inters relacionados con FTP desde Excel. 'GUARDAR LIBRO ACTIVO EN FTP (requiere ftp configurado en SaveAs, si no pedir user y pass) ActiveWorkbook.SaveAs Filename:= _ "ftp://ftp.MiWeb.com/public_html/prueba/Libro123.xls", FileFormat:= _ xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _ , CreateBackup:=False 'ABRIR LIBRO DESDE FTP (requiere ftp configurado en SaveAs, si no pedir user y pass) Workbooks.Open Filename:= _ "ftp://ftp.MiWeb.com/public_html/prueba/Libro88.xls" Range("D11").Select 'ABRIR LIBRO DESDE FTP (***No requiere ftp configurado en SaveAs, lo configuramos desde vba) Sub Abrir() Workbooks.Open Filename:= _ "ftp://miusarioaqui:miclaveaqui@ftp.miweb.com/public_html/prueba/Libro88.xls" End Sub
215
www.todoexcel.com
4.13. Funciones
Aplicando funciones desde VBA 'Ejemplo de SUMA If Application.Sum(Range("D7:D65536")) = 0 Then MsgBox "nada" 'Ejemplo de SUMARSI myVal = Application.SumIf(Range("A1:A10"), "a", Range("b1:b10")) 'Ejemplo de CONTARSI n = Application.CountIf(Range("K:K"), "Check Record") 'Ejemplo de LARGO Dim L As Long L = Len(Sheets("Menu").Range("B1"))
4.14. Guardar
Para forzar el directorio de guardado 'Forzar directorio de guardado igual al del archivo Dim MyDirectory As String MyDirectory = ActiveWorkbook.Path ChDir MyDirectory
4.15. Hojas
Macros relacionadas con Hojas 'Funcin definida por el usuario para determinar si existe la hoja Function SheetExists(SheetName As String) As Boolean On Error Resume Next SheetExists = CBool(Len(ThisWorkbook.Worksheets(SheetName).Name)) End Function 'Luego podemos usar nuestra funcin desde nuestras macros as If SheetExists("Sheet1") = True Then ' hago esto Else ' hago lo otro End If
216
www.todoexcel.com
4.16. Imgenes
Veamos algunas operaciones que podemos realizar con imgenes. 'INSERTAR UNA IMAGEN Public Sub InsertaLogo() Dim vFullName As Variant vFullName = Application.GetOpenFilename("Image Files,*.jpg;*.gif") If vFullName <> False Then Hoja6.Pictures.Insert CStr(vFullName) End If End Sub 'BORRAR IMAGEN DE UN RANGO Sub BorrarImagen() Dim Rng As Range Dim SH As Shape Dim TLC As Range Set Rng = Range("F4:AJ23") For Each SH In ActiveSheet.Shapes If Not Application.Intersect(Rng, SH.TopLeftCell) Is Nothing Then SH.Delete End If Next SH End Sub 'OCULTAR IMAGEN 'Boton para q si esta oculta la muestre y si esta visible la oculte Private Sub ToggleButton1_Click() Worksheets("Sheet1").Shapes("Rectangle 3").Visible = Not (Shapes("Rectangle3").Visible) End Sub
4.17. Imprimir
Algunas macros relacionadas con impresin: 'Esta macro establece el rango de impresin a la ultima fila ocupada Private Sub PrintArea() Dim LngLastRow As Long LngLastRow = ActiveSheet.Range("G65536").End(xlUp).Row ActiveSheet.Range("A1:G" & LngLastRow).Select With ActiveSheet.PageSetup .PrintArea = ("A1:G" & LngLastRow) .FitToPagesWide = 1 .FitToPagesTall = False End With End Sub
217
www.todoexcel.com
4.18. Msgbox
Macros relacionadas con mensajes 'Msgbox con varias lneas MsgBox " Equipment No. " & EquipNum & Chr(13) _ & " Description - " & Description & Chr(13) _ & " Internal Due - " & Format(partDate,"mmm-dd" 'INPUT BOX es un tipo especial de Msgbox que solicita al usuario una entrada de un valor o texto Sub Entrada() Dim V As String V = Application.InputBox("Introduzca la clave del administrador") End Sub 'INPUT BOX (solo nmero entero) Sub EntradaNumerica() Dim V As String V = Application.InputBox("Introduzca nmero entero", , , , , , , 1) 'el 1 es para forzar nmero entero 'COMILLAS DENTRO DE UN MSGBOX MsgBox "Esto no est dentro de comillas " & Chr(34) & "Y esto si!" & Chr(34)
4.19. Ordenar
Macros utilizadas para ordenar 'Con esto ordeno una columna ascendentemente Range("A38:G65536").Sort Key1:=Range("F39"), Order1:=xlDescending, Header:=xlYes, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal 'En A38:G38 esta el encabezado. El Key1 es F39 (una fila mas abajo, osea el primer registro)
4.20. Proteger
Macros para proteger 'FORMATO DE CELDA PROTEGIDA Selection.Locked = True Selection.FormulaHidden = False 'PROTEGER Y PERMITIR FILTROS ActiveSheet.Protect AllowFiltering:=True
218
www.todoexcel.com
PROTEGER/DESPROTEGER CON CLAVE ActiveSheet.Protect Password:="anystring", AllowFiltering:=True, AllowSorting:=True, userinterfaceonly:=True ActiveSheet.Unprotect Password:="anystring", AllowSorting:=True 'Cuando protejo agregando "userinterfaceonly:=True" no es necesario desproteger para que funcione la macro ! 'PROTEGER CON UNA CLAVE VARIABLE '1 DEFINO LA FUNCION Function pswd() As String pswd = "iakiphone" 'si cambio este texto cambio todas las pass de una End Function 'LUEGO PROTEJO USANDO ActiveSheet.Protect Password:=pswd 'DESPROTEGER OPTION BUTTON EN HOJA PROTEGIDA ActiveSheet.Shapes("Option Button 10").OLEFormat.Object.value = xlOff 'Tambin tengo q desproteger la celda vinculada !
4.21. Rangos
Macros relacionadas con rangos 'UN RANGO VARIABLE Range(Cells(LR, 1), Cells(LR, 11)) 'NOMBRAR RANGOS Dim LR As Long LR = 100 ActiveWorkbook.Names.Add Name:="LasRow", RefersToR1C1:=LR ActiveWorkbook.Names.Add Name:="Max", RefersToR1C1:="=100" 'INOVILIZAR PANELES ActiveWindow.FreezePanes = False Range("B105").Select ActiveWindow.FreezePanes = True 'REDIMENSIONAR UN RANGO Selecciona una tabla menos la 1 fila de encabezado Range("PerPrimero").CurrentRegion.Offset(1, 0).Select 'PINTAR RANGOS Si es Ingreso pinto verde If Cells(LCR, 2).value = "Ingreso" Then Range(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 10 End If Si es Gasto pinto Rojo If Cells(LCR, 2).value = "Gasto" Then Range(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 3
219
www.todoexcel.com
End If Si es vaco (cuando borra) pinto negro If Cells(LCR, 2).value = "" Then Range(Cells(LCR, 2), Cells(LCR, 13)).Font.ColorIndex = 1 End If
4.23. Seleccin
Macros de seleccin 'Selecciona todo un rango activo menos la primera fila Sub Rango() Dim Rg As Range Set Rg = Range("FiltrosConIni").CurrentRegion Rg.Offset(1).Resize(Rg.Rows.Count - 1).Select End Sub
4.24. Tablas
Cmo determinar la ltima fila de una tabla 'Determinar ltima fila de una tabla UsedRange.Rows.Count
220
www.todoexcel.com
'La siguiente macro actualiza una TD automticamente al entrar a la hoja 'Esta macro debe estar colocada en la misma hoja que contiene la TD Private Sub Worksheet_Activate() ActiveSheet.PivotTables(1).PivotCache.Refresh End Sub
4.26. Varios
Otras macros de inters ' ULTIMA FILA VACIA LR = Range("a65536").End(xlUp).Row + 1 ' COPIAR VALORES Range("CuentasIngreso").Copy Range(Cells(LR, 1), Cells(LR, 11)).PasteSpecial xlPasteValues 'SCROLLING ActiveWindow.ScrollRow = 1 ActiveWindow.ScrollColumn = 1 'BORRAR FILAS (hay q borrar desde abajo para arriba) Sub Borrar() Dim R As Long For R = 210 To 1 Step -1 If Cells(R, 3).value = "" Then Cells(R, 3).EntireRow.Delete Next R End Sub 'SCROLL AREA ActiveSheet.ScrollArea = "A1:S50" 'CAMBIAR DIRECCCION DE MOVIMIENTO DEL CURSOR Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.MoveAfterReturnDirection = xlDown End Sub Private Sub Workbook_Deactivate() Application.MoveAfterReturnDirection = xlDown End Sub Private Sub Workbook_Open() Application.MoveAfterReturnDirection = xlToRight End Sub Private Sub Workbook_Activate() Application.MoveAfterReturnDirection = xlToRight End Sub 'OCULTAR BARRA FORMATO, ESTANDAR y FORMULA BAR Application.CommandBars("Formatting").Visible = False
221
www.todoexcel.com
Application.CommandBars("Standard").Visible = False Application.DisplayFormulaBar = False 'Pone un tilde en la celda (ideal para usar en lugar de checkboxes) Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("A1:A100")) Is Nothing Then Target.Font.Name = "Marlett" If Target = vbNullString Then Target = "a" Else Target = vbNullString End If End If End Sub
222
www.todoexcel.com
5. EXTRAS
Hemos preparado una buena cosecha de recursos ms que interesantes para tus macros. Puedes descargar todos estos desde el siguiente enlace: http://www.todoexcel.com/descargas/EXTRAS.zip
AndrewsUtils: nuevas funcionalidades y opciones para tu Excel (200) Nuevas funcionalidades y opciones para tu Excel 2 (71) PivotPower: opciones adicionales para las tablas dinmicas (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 mens y barras de herramientas (7) MenuMaker: crea nuevos mens de opciones fcilmente (1) ListFiles: listar los archivos de un directorio (1) Envo automtico de emails desde Excel (1) Gauges: indicadores tipo velocmetro (1) TranslateIt: traductor automtico de funciones (1) Lista VBA: 1.921 trminos VBA en espaol e ingls ! (1) Variant: 1.000.000 de clculos en 5 segundos ! (1) Turbofiltro:- nuevas opciones para filtrar listas (1) Pausar Macros: (1)
223
www.todoexcel.com
Men Generator: crear nuevos mens fcilmente (1) Blink: hacer titilar celdas con distintos colores (1) CellSpotter: indicador automtico de fila y columna actual (1) ListBoxSort: agrega elementos nicos y ordenados a un Listbox (1) FaceIds: iconos para usar en las barras y mens (1) EnableMacros: obligar la habilitacin de Macros (1) FindLinks: encuentra, administra y destruye vnculos externos DatosUF: ejemplo paso paso de un formulario / userform (1) SamRadDatePicker: calendario despleglabe en celdas ! (1)
224
www.todoexcel.com
6. TodoEXCEL
www.todoexcel.com
225