Está en la página 1de 19

GUA DE VBA EXCEL Los temas se encuentran separados en categoras, desde un repaso por las instrucciones bsicas, hasta

macros ms desarrolladas, con varios ejemplos en cada una. Como casi siempre hay ms de una forma de programar un evento, podrn observar que a veces se escribe una lnea O la otra. Quiere decir que puedo utili ar cualquiera de las !. "#$unca las ! juntas%&

Los temas estn divididos en ! grupos principales' Conceptos e (nstrucciones bsicas "ver ndice de contenidos en margen i quierdo& )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) *+C,O' -na macro es un conjunto de instrucciones escritas en lenguaje .isual /asic "0&, que nos permite automati ar ciertas tareas que la aplicaci1n no contempla desde las herramientas de la hoja. 2or ejemplo, si necesitamos que se inserten automticamente ! hojas nuevas al abrir un libro, recurriremos a una macro. Otros casos' completar alguna tarea cada ve que se ingresa un valor en una celda o rango de celdas3 reali ar un cierto control antes de imprimir, guardar o cerrar el libro, etc. 4on todas tareas que pueden ser automati adas mediante rutinas o macros. "0& 5l lenguaje utili ado en 56cel es ./+ ".isual /asic for +pplications& C1mo se crea una macro' para automati ar una tarea mediante una macro bsicamente se necesitan los siguientes elementos' 7) un espacio de trabajo donde escribir las instrucciones o rutinas que harn esas tareas' el 5ditor de *acros. + este espacio se accede desde men8 9erramientas, *acros, 5ditor o con el atajo de teclado +lt:;77. 5n versi1n !<<=, activar la opci1n 2rogramador de la Cinta de Opciones. -na ve en ese >espacio>, escribiremos o copiaremos las rutinas en' a) alguno de los objetos "hoja o libro& que seleccionemos con doble clic en el panel de Objetos que se encuentra a la i quierda del 5ditor. b) insertando m1dulos

c) o insertando formularios personales o -serforms. !) una acci1n que har que la tarea programada se ejecute. + esto llamamos >5ventos> que inician una macro y pueden ser' abrir o cerrar un libro, entrar o salir de una hoja, cambios o selecci1n de celdas, antes de imprimir o guardar, el >clic> en un bot1n de comando, al presionar un atajo de teclado, y otros ms. ?) un lenguaje de programaci1n. 5n 56cel utili amos ./+ ".isual /asic para +plicaciones& @) Ocasionalmente un formulario donde trabajar para luego volcar los resultados en las hojas' llamados -serforms. A1nde colocar o escribir la macro' esto depender de lo que deba ejecutar nuestra rutina. 4i las instrucciones se deben ejecutar, por ejemplo, al abrir o cerrar un libro, se colocan en el objeto BhisCorDbooD "o 5steLibro seg8n la versi1n&. 4i las instrucciones se deben ejecutar al entrar o salir de una hoja o al seleccionar o modificar una celda, se colocan en el objeto 9oja. 5stos objetos se encuentran en el margen i quierdo del 5ditor, en la ventana 2royecto) ./+2royect 4i nuestra rutina ser llamada con un bot1n, atajo de teclado o desde otra rutina, se colocar en un m1dulo "estando en el 5ditor, men8 (nsertar, *1dulo&. Las instrucciones para los controles de un formulario o -serforms se colocan en la secci1n C1digo del mismo formulario. C1mo ejecutar una macro' 5n el punto anterior se menciona que se necesita una >acci1n> que dispare o ejecute una macro grabada. .eamos los distintos casos' 7) -na acci1n automtica resultado de un evento, ya sea a nivel libro, hoja, rango o celda 5n este grupo se encuentran las rutinas que se ejecutan en la apertura o cierre de libro, al entrar o salir de una hoja, al seleccionar o cambiar valores en celda E4on las que se colocan en el objeto 9OF+ o BhisCorDbooD, como se menciona en tema anterior !) +l presionar un bot1n dibujado en la hoja. 2odemos utili ar botones de la barra >Cuadro de controles o +ctiveG> o de la barra >;ormularios>. 5n versi1n !<<? se encuentra en *en8 .er, /arras de 9erramientas. 5n versi1n !<<= desde la ficha 2rogramador

Aibujamos el control en la hoja, ajustamos algunas propiedades como te6to, tamaHo, ubicaci1n. +l hacer clic derecho sobre el control optamos por >.er c1digo> o >+signar macro> seg8n quI barra de herramientas hemos utili ado. a) Cuadro de controles' al optar por >.er c1digo> nos llevar al 5ditor, al objeto 9OF+ donde se generar automticamente una rutina con estas ! instrucciones' 2rivate 4ub Command/utton7JclicD"& >aqu escribiremos nuestras instrucciones 5nd 4ub b) ;ormularios' ya debemos tener lista la rutina en un m1dulo del 5ditor y la asignaremos cuando optemos por >+signar macro>. Las rutinas para este caso son como el siguiente ejemplo' 4ub nombreJrutina"& >nuestras instrucciones 5nd 4ub ?) 5jecutar un atajo de teclado' 5n estos casos tendremos una rutina como la del punto anterior "b& en un m1dulo del 5ditor. Aesde la hoja 56cel, men8 9erramientas, *acros, *acros seleccionarla de la lista. 2resionar el bot1n >+van adas> e ingresar una letra, por ejemplo >t> "sin las comillas& $ota' 4i 56cel ya tiene asignada esta letra la reempla ar por Ctrl:*ay8sc :t 5sto significa que en el momento que necesitemos que la macro se ejecute presionaremos juntas las teclas Ctrl : t "o Ctrl:*ayusc:t& @) Aesde el men8 9erramientas' si no hemos asignado la rutina que se encuentra en un m1dulo a ning8n bot1n ni a atajo de teclado, la ejecutaremos desde este men8 de 56cel. 5n versi1n !<<=, activar la opci1n 2rogramador de la Cinta de Opciones.

,eferencias' .eamos los diferentes modos de referirnos a libros, hojas y celdas'

CorDbooD +ctiveCorDbooD CorDbooDs"!&

' ' '

Libro de trabajo. Libro activo 5l segundo libro abierto Llamada al libro de nombre Libro7

CorDbooDs"KLibro7.6lsK& '

CorDbooDs"milibro& 0)4i el nombre del libro se encuenta en una variable, $O lleva comillas 2reviamente asignamos nombre, por ej' milibroL+ctiveCorDbooD.name

CorD4heet '

9oja de trabajo

+ctive4heet ' 9oja activa 4heets"K5neroK& ' 9oja de nombre >5nero> 4heets"?& ' $8mero de hoja seg8n el orden de las pestaHas. M9oja!N ' La !da hoja seg8n orden de las pestaHas ' rango o celda

,ange o Cells

+ctivecell ' la celda activa ,ange"K+!K& ' la celda +! Cells"!,7& ' la celda +! . 0)$1tese que mientras en ,ange se introduce la celda en el orden Col,;ila, en Cells es a la inversa' Cells"fila,col& ,ange"K+O'/7<K& ' rango de celdas desde +O hasta /7< inclusive ,ange"K5'5K& ' columna 5 ,ange"K!'!K& ' fila ! M+?N ' la celda +?

,ange"K+K P fila& ' celda de la col + y fila seg8n valor de variable Brabajando con Libros

5n esta secci1n aparecern algunas de las instrucciones >bsicas> para utili ar con L(/,O4. -na ve copiada en el 5ditor, colocar el cursor sobre la palabra en negrita y presionar ;7 para acceder a la +yuda 56cel. +ll se encontrarn ms e6plicaciones y ejemplos para cada instrucci1n.

$ota' +l inicio de esta secci1n *acros hemos visto las distintas maneras de hacer referencia a Libros, 9ojas y ,angos o celdas. + partir de aqu usarI solo el objeto activo considerando que puede usarse algunas de las otras e6presiones

7)+brir un segundo libro'

CorDbooDs.Open KC'Q*is documentosQLibro7.6lsbK

> o tambiIn' +pplication.CorDbooDs.Open KC'Q.....QLibro7.6lsbK

4i el nombre se encuentra en una varible $O lleva comillas "aqu se abre un libro que se encuentra en la misma carpeta que el libro activo. La variable >libro!> contiene el nombre y la e6tensi1n&

CorDbooDs.Open BhisCorD/ooD.2ath P KQK P libro!

!)+ctivar un segundo libro' CorDbooDs"KLibro!.6lsK&.+ctivate

>o tambiIn' CorDbooDs"!&.+ctivate , en este caso Libro!.6ls es el !do libro abierto

?)Cerrar un libro "sin guardar&' CorDbooDs"KLibro7.6lsK&.Close ;alse >o +ctiveCorDbooD.Close ;alse

@)Cerrar un libro "guardando los cambios&'

+ctiveCorDbooD.4ave +ctiveCorDbooD.Close

>o en 7 sola lnea' +ctiveCorD/ooD.Close Brue

O)Ruardar un libro con otro nombre' +ctiveCorDbooD.4ave+s ;ilename'LKC'Q*is docQLibro7.6lsK, ;ile;ormat'L6l$ormal, 2assSord'LKclaveK, ,eadOnly,ecommended'L;alse

5stas son algunas de las opciones. 4i se omiten, escribir la coma, como en el siguiente ejemplo' +ctiveCorDbooD.4ave+s ;ilename'LKC'Q*is docQLibro.6lsK,,, ,eadOnly,ecommended'L;alse

0) La carpeta y el nombre del libro pueden guardarse en variables, como en este ej' ruta L BhisCorDbooD.2ath P KQK >o qui s' ruta L KC'QK libro L KLibroCopia.6lsmK +ctiveCorDbooD.4ave+s ruta P libro

T)Ruardar un libro cuyo nombre ser el valor de una celda' +ctiveCorDbooD.4ave+s ;ilename'L,ange"K+!K&..alue

=)$o mostrar aviso al salir, al eliminar hoja, o cualquier aviso que queremos omitir' +pplication.Aisplay+lertsL ;alse >volverla a Brue al finali ar la macro

U)Aeshabilitar la opci1n de actuali ar vnculos al abrir un libro' +pplication.Aisplay+lertsL ;alse >volverla a Brue al finali ar la macro CorD/ooDs.Open ;ilename'L KC'Q*is docuQpruebas.6lsK, -pdateLinDs'L <

V)$o mostrar la ejecuci1n de la macro "movimiento de pantalla&' +pplication.4creen-pdating L ;alse >volverla a Brue al finali ar la macro

7<)5jecutar una macro al abrir un libro' (nsertar un m1dulo y all escribir una rutina' 5jemplo' 4ub $uevamacro "& >instrucciones, por ej' *sg/o6 K/ienvenidWK 5nd 4ub X agregar esta otra en el objeto BhisCorDbooD' 2rivate 4ub CorDbooDJOpen "& $uevamacro >o tambiIn puede llamarse utili ando la e6presi1n Call >Call $uevamacro 5nd 4ub

)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) Brabajando con 9ojas

5n esta secci1n aparecern algunas de las instrucciones >bsicas> para utili ar con 9OF+4. -na ve copiada en el 5ditor, colocar el cursor sobre la palabra en negrita y presionar ;7 para acceder a la +yuda 56cel. +ll se encontrarn ms e6plicaciones y ejemplos para esa instrucci1n.

7)4eleccionar la hoja anterior o siguiente' +ctive4heet.2revious.4elect +ctive4heet.$e6t.4elect >hoja anterior a la activa >hoja posterior a la activa

!)Aatos de la hoja' +ctive4heet.$ame +ctive4heet.(nde6 >nombre de la hoja >n8mero de hoja

?)Copiar datos de una hoja a la siguiente' 4election.Copy >previamente se habr seleccionado algo

+ctive4heet.2aste Aestination'L+ctive4heet.$e6t.,ange"K/!K&

@) Ocultar filas o columnas'

+ctiveCell.5ntire,oS.9iddenLBrue +ctiveCell.5ntireColumn.9iddenL Brue

> filas >col

O)2roteger o desproteger una hoja' +ctive4heet.2rotect KcontraseHaK +ctive4heet.-nprotect KcontraseHaK >proteger con contraseHa >quitar la protecci1n

T)(nsertar filas o columnas a partir de cierta ubicaci1n' >reempla ar i por el nro de columna +ctive4heet.Column"i&.4elect 4election.5ntireColumn.(nsert >reempla ar Column por ,oS en caso de filas.

=)Conocer el nro de columna de cierta referencia' Cuando utili amos la e6presi1n' Cells"fila,col& y queremos hacer referencia a la celda +/O por ej, necesitamos conocer cul es el nro de columna. 2ara eso podemos solicitarla en un mensaje con'

4ub nrocol"& *sgbo6 ,ange"K+/7K&.Column 5nd 4ub

U)5liminar filas o columnas' +ctive4heet.,oS"n&.4elect >reempla ar n por el nro de fila

4election.5ntire,oS.Aelete

V)(nsertar una imagen en una hoja' +ctive4heet.2ictures.(nsert"ruta&.4elect >la ruta va entre comillas, por ej' KC'Q*is docuQ;oto7.jpgK

7<)(mprimir la hoja seleccionada' +ctiveCindoS.4elected4heet.2rintOut Copies'L7, Collate'LBrue >o +ctive4heet.2rintOut

,eempla ar 2rintOut por 2rint2revieS para reali ar solo una vista preliminar. Brabajando con ,angos o Celdas

5n esta secci1n aparecern algunas de las instrucciones >bsicas> para utili ar con C5LA+4 o ,+$RO4. -na ve copiada en el 5ditor, colocar el cursor sobre la palabra en negrita y presionar ;7 para acceder a la +yuda 56cel. +ll se encontrarn ms e6plicaciones y ejemplos para esa instrucci1n.

7) ;ormas de seleccionar una celda o un rango de celdas'

,ange"K/=K&.4elect ,ange"K/'/K&.4elect

>selecciona la celda /= >selecciona toda la columna /

,ange"K+@'+7<, A7<, /O'/!<K&.4elect >selecciona rangos discontinuos

,ange"K+K P variable&.4elect >selecciona la celda cuya fila ser el valor de la variable 4i definimos una variable que contiene la 8ltima fila a considerar' rangoL"K/!'5K P variable& , entonces la siguiente instrucci1n selecciona el rango /!'5 hasta la fila indicada en la variable. ,ange"rango&.4elect

Ae igual manera puede establecerse el rango de inicio' rango L K/K P ini P K'5K P fini ,ange"rango&.4elect 0) $1tese que las variables $O llevan comillas ,ange"K+'+, A';K&.4elect ,ange"K!'!, @'=K&.4elect >selecciona las columnas +, A, 5 y ; >selecciona las filas ! y desde @ hasta la =

$ota' al inicio de la secci1n *acros se encuentran otras instrucciones de selecci1n

!) 4eleccionar celdas a cierta distancia de la celda activa' 000 4heets"7&.,ange"K+7K&.Offset"!,?&.4elect >selecciona ! filas hacia abajo y ? col a derecha de +7 L A?

+ctiveCell.Offset")7<,7&.4elect >selecciona la celda que se encuentra 7< filas por encima y 7 columna a la derecha de la celda activa.

?) +signar ;ormato a celdas o rangos'

,ange"K/!'A7<K&.4elect >selecciona el rango y le aplica los siguientes formatos Cith 4election .;ont./oldLBrue >formato negrita .;ont.(talicLBrue >formato cursiva .;ont.-nderlineL6l-nderline4tyle4ingle >subrayado simple .;ont.Color L ,R/"!OO,<,<& >color de fuente "para estos valores ser rojo& .9ori ontal+lignmentL6lCenter >alineaci1n central ",ightLderecha, LeftLi quierda& 5nd Cith

@) Ruardar la direcci1n de una celda en una variable'

lugarL +ctiveCell.+ddress >guarda la referencia absoluta, por ej' Y5Y!

lugarL +ctiveCell.+ddress";alse, ;alse& >guarda la referencia relativa, por ej' 5!

O) Copiar un comentario en otra celda'

+ctiveCell.Offset"<,7&..alue L +ctiveCell.Comment.Be6t >copia el comentario de la celda activa en la celda que se encuentra en la columna siguiente.

T)4eleccionar celdas y borrarlas'

,ange"rango&. 4elect >previamente se asign1 a la variable rango una ref 4election.ClearContents

La e6presi1n Cells.Clearcontents borrar el contenido del total de celdas de la hoja activa -tili ando solamente Clear se borrarn formatos tambiIn.

=) +mpliar un rango seleccionado

4election.,esi e"7<,@&.4elect > "7< filas, @ columnas& > si el rango seleccionado fue +7'/O ahora ser' +7'A7<

U) Combinar celdas selecccionadas'

,ange"K/7'57K&.4elect 4election.*erge

2ara quitar la combinaci1n' -nmerge

V) 4eleccionar el rango donde se encuenra la celda activa'

,ange"K/!K&.Current,egion.4elect

7<) 4eleccionar hasta la 8ltima celda no vaca' ,ange"K+!K, ,ange"K+!K&.5nd"6lAoSn&&.4elect >seleciona desde +! hacia abajo

,ange"K+!K, ,ange"K+!K&.5nd"6lBo,ight&&.4elect >selecciona desde +! hacia la derecha

,ange"KA!K, ,ange"KA!K&.5nd"6lBoLeft&&.4elect >selecciona desde A! hacia la i quierda

,ange"K+!<K, ,ange"K+!<K&.5nd"6l-p&&.4elect >selecciona desde +!< hacia arriba

5n cambio, para seleccionar solo la 8ltima celda con datos ser' ,ange"K+!K&.5nd"6lAoSn&.4elect

$ota' 5sta instrucci1n dar error si la celda +? se encuentra vaca. 5s preferible en ese caso reali ar la b8squeda de >abajo hacia arriba>, con' ,ange"K+TOO?TK&.5nd"6lup&.4elect

77) Obtener la primer celda vaca, en col +' ,ange"K+!K&.5nd"6lAoSn&.,oS : 7 >o

,ange"K+TOO?TK&.5nd"6lup&.,oS : 7

Brabajando con Colecciones

5n esta secci1n aparecern algunas de las instrucciones >bsicas> para utili ar con COL5CC(O$54. -na ve copiada en el 5ditor, colocar el cursor sobre la palabra en negrita y presionar ;7 para acceder a la +yuda 56cel. +ll se encontrarn ms e6plicaciones y ejemplos para esa instrucci1n.

-na colecci1n es un conjunto de objetos del mismo tipo' hojas, celdas, controles o 4hapes, imgenes. 2ara trabajar con una colecci1n se programa un bucle' es decir repetir la misma instrucci1n para cada elemento de la colecci1n.

+ continuaci1n algunos ejemplos del bucle' ;or 5ach....$e6t

5jemplo7' introducir un nombre para cada hoja del libro activo. 5sta rutina se coloca en un m1dulo'

4ub nombra9ojas"& Aim *i$ombre +s 4tring Aim hoja +s CorDsheet ;or 5ach hoja (n CorDsheets *i$ombre L (nput/o6"K(ngrese nombre de hoja' K&

hoja.$ame L *i$ombre $e6t hoja 5nd 4ub

5jemplo!' introducir valores para cada celda de un rango "se coloca en un m1dulo&

4ub coloca.alores"& Aim celdita as ,ange ;or 5ach celdita in +ctive4heet.,ange"K+7'/7<K& celdita..alue L (nput/o6"K(ngrese valor' K& $e6t celdita 5nd 4ub

5jemplo?' introducir los mismos valores en celdas de todas las hojas "se coloca en un m1dulo&

4ub valores9oja"& Aim hoja as 4heets ;or 5ach hoja in 4heets hoja.,ange"K5?K&..alue L Aate hoja.,ange"K;?K&..alue L Bime $e6t hoja 5nd 4ub

OB,O B(2O A5 /-CL54'

5jemplo7' reali ar una acci1n por cada valor que tome una variable i "se coloca en un m1dulo&

4ub muestra$ombre"&

Aim i as /yte Aim hoja as CorDsheet ;or iL7 to O *sgbo6 CorD4heets"i&.$ame $e6t 5nd 4ub

5n este ejemplo se muestra el nombre de cada hoja, desde la nro 7 a la O

5jemplo!' reali ar una acci1n mientras se cumpla una condici1n "se coloca en un m1dulo&

4ub recorre,ango"& >4e recorre la col + a partir de la fila ! hasta encontrar una celda vaca. >5l valor de cada celda se incrementa en 7 ,ange"K+!K&.4elect Chile +ctivecell..alue Z[ KK +ctiveCell..alue L +ctiveCell..alue : 7 Cend 5nd 4ub

Brabajando con Objetos

+ continuaci1n algunos ejemplos de c1mo llamar a objetos insertados en hoja, como ser Cuadros de te6to, Listas o Cuadros combinados y tambiIn un -serform.

7) Llamando a un -serform, desde un bot1n' 5n una hoja de 56cel, los botones que lan an una acci1n, pueden ser colocados con la barra de ;ormularios o Cuadro de Controles. /ot1n de formulario' se asigna una macro, como la del ejemplo, que previamente se escribi1 en un m1dulo en el 5ditor de .isual /asic. 5jemplo' 4ub mostrando "& -ser;orm7.4hoS 5nd 4ub /ot1n del Cuadro de controles' una ve dibujado en la hoja, clic derecho, opci1n .er c1digo y escribir la rutina "Ista se habilita en la hoja donde aparecer el control&. 5jemplo' 2rivate 4ub Command/utton7JClicD"& -ser;orm7.4hoS 5nd 4ub !) +signando valores a los Cuadros de te6to' 5jemplos de c1mo registrar datos en los te6tbo6 dibujados en hoja con la barra >Cuadro de controles>. >nombre del -serform que se desea mostrar

$ota' 5stas instrucciones como las del punto ? y @, se colocan dentro de alguna rutina general, como puede ser un bot1n para guardar o aceptar. Be6t/o67..alue L KC+$C5L+AOK Be6t/o6! L 4heets"K9oja?K&.,ange"K+OK&..alue Be6t/o6! L ,ange"KC7K&..alue : ,ange"KC!K&..alue

$otese que en Be6tbo6! se omiti1 la e6presi1n >value> ya que esa es su propiedad predeterminada. 2uede colocarse o no. ?) .olcar datos de un control Be6tbo6 y Combobo6 a la hoja' 5stos controles han sido dibujados con la barra >Cuadro de controles> >pasar datos de un control Be6tbo6 a la celda indicada en Cells"fila,col& Cells"fila, col&..alue L Be6t/o67..alue

>pasar el valor de un combo a la fila siguiente de la indicada en Cells"fil, col& 4heets"K9oja7K&.Cells"fila, col&.Offset"7, <&..alue L Combobo67..alue @) +signar rango a un control Listbo6 y Combobo6' 5stos controles han sido dibujados en la hoja con la barra >;ormularios> >asignar rango de entrada al control Lista +ctive4heet.4hapes"KList /o6 7K&.4elect Cith 4election .List;ill,ange L KY;Y7'Y;Y@K 5nd Cith >asignar rango de entrada al control Combobo6 +ctive4heet.4hapes"KArop AoSn 7K&.4elect Cith 4election .List;ill,ange L KY\Y7'Y\Y=K 5nd Cith

0 Otra manera de asignar rango. 5n este caso el control se dibuj1 con la barra +ctiveG o Cuadro de Controles'

+ctive4heet.List/o67.List;ill,ange L KY;Y7'Y;Y@K

O) Cargar datos a un control List/o6 de un -ser;orm' 2rivate 4ub -ser;ormJ+ctivate"& Aim item +s .ariant ;or 5ach item (n ,ange"K;7';TK& List/o67.+dd(tem item..alue $e6t item 5nd 4ub

También podría gustarte