InformaticaMacros en Excel - VBA
Carmen Graciani DıazLuis Valencia Cabrera
Dpto. Ciencias de la Computacion e Inteligencia ArtificialUniversidad de Sevilla
Luis Valencia Cabrera Informatica
¿VBA?
Nos adentramos en el mundo de las macros en Excel, en elcontexto de VBA. ¿Que es VBA?
Como se explica muy bien en este enlace introductorio, setrata de Visual Basic para Aplicaciones
Se trata de un lenguaje de programacion para el desarrolloVisual Basic integrado en aplicaciones como Excel u otras deOffice que proporcionen una biblioteca de objetos.
Nos permite automatizar todo tipo de tareas a traves demacros.
Luis Valencia Cabrera Informatica
¿Solamente para Excel?
Con las macros en VBA no solamente podemos trabajar con Excel,sino tambien con cualquier otra aplicacion que proporcione unabiblioteca de objetos accesible:
Luis Valencia Cabrera Informatica
¿Biblioteca de objetos?
La biblioteca de objetos, o modelo de objetos, permite accederdesde codigo a las distintas funcionalidades y caracterısticascon las que solemos trabajar a mano en Excel.
Estos elementos estan accesibles desde VBA, a traves denumerosos objetos que podemos consultar y manipular, ynumerosas funciones que podemos invocar.
Solamente en Excel, ya existen mas de 100 tipos de objetos quemanipular. A continuacion analizamos 4 de las colecciones deobjetos mas importantes.
Luis Valencia Cabrera Informatica
Biblioteca de objetos de Excel
Esta es la jerarquıa principal de objetos de Excel:
Estos elementos estan accesibles desde VBA
Luis Valencia Cabrera Informatica
¿Macros Excel?
Vale, nos situamos en un contexto del lenguaje VBA empleadodentro de Excel, pero... ¿que es eso de una macro?
Es la unidad basica que nos permite automatizar tareas, uncomando al que dotamos de un codigo, y que podemos lanzarcuando lo solicitemos, de modo que ejecute la secuencia deinstrucciones de su codigo.
Una explicacion detallada se encuentra en este interesantetutorial de introduccion a las macros.
Como ya vimos en clase y recuerda el enlace, un primer pasopara generar nuestras macros puede ser la opcion de grabarmacro. Probemos para recordar y despues consultemos elcodigo generado. Recuerde que debe tener habilitada lapestana del desarrollador.
Luis Valencia Cabrera Informatica
Visualizar el codigo de VBA en Excel
Ok, he seguido paso a paso las instrucciones y grabado una macro.¿Como veo lo que he generado?
Mediante la combinacion de teclas Alt+F11 podra accedersiempre al editor de VBA de Excel.
Luis Valencia Cabrera Informatica
Un ejemplo basico de macro...
Sub: definicion de macro
Macro1: nombre macro
Select: seleccionarango/celda
ActiveCell: celdaseleccionada
FormulaR1C1: formula
Sub Macro1 ()
’
’ Macro1 Macro
’
Range("C2").Select
ActiveCell.FormulaR1C1 = "Ah"
Range("C3").Select
ActiveCell.FormulaR1C1 = "vale"
Range("C4").Select
End Sub
Luis Valencia Cabrera Informatica
Comenzando con macros de Excel
Mas informacion en: [exceltotal.com] [excel-avanzado.com]
Al margen de la grabacion automatica de macros, podemoscrearlas desde el Editor de Visual Basic, accesible desde lapestana del desarrollador.
Una vez ahı, podemos proceder a crear un modulo quecontenga nuestras macros, y crear una primera macro:
Luis Valencia Cabrera Informatica
Detalles y buenas practicas
Conviene comentar el codigo que vamos escribiendo.
Debemos distinguir entre propiedades y metodos, es decir,entre elementos que identifican el estado y las acciones sobrelos mismos.
Este enlace ilustra muy bien una breve introduccion al uso deelementos basicos de ambos tipos en una hoja Excel.
Podemos acceder y manipular los elementos basicos de labiblioteca de objetos
Mas informacion sobre: [hojas y libros] [el objeto Application]
Conforme comience a escribir codigo, ira cometiendo errores.Puede tratar de corregirlos a traves de la depuracion, para loque dispone de algunas opciones interesantes
Luis Valencia Cabrera Informatica
El lenguaje VBA (I)Elementos basicos
Variables y tipos. (Ver referencia de los tipos)
Cadenas (texto) y funciones sobre ellas
Fechas y horas
Arrays (listas unidimensionales de elementos)
Funciones basicas
Mas sobre funciones definidas por el usuario
Devolucion de errores
Uso del With
Luis Valencia Cabrera Informatica
El lenguaje VBA (II)Instrucciones selectivas
Instrucciones selectivas
If-Then-Else (ej: par) (ref) [Mucho mas]
Operadores logicos: And/Or
Select-Case (ref)
Mucho mas (ejemplos resueltos sobre instrucciones selectivas)
Luis Valencia Cabrera Informatica
El lenguaje VBA (II)Instrucciones repetitivas
Instrucciones repetitivas
For-To-Next [Mucho mas]
For-Each
Acceso a celdas en bucle
Do-While
Luis Valencia Cabrera Informatica
Asignacion de formulas
No solamente se pueden cambiar valores y formatos de lasceldas, tambien asignar formulas a las mismas medianteFormula o FormulaR1C1.
En las formulas podemos emplear funciones, mediante sunombre en ingles.
Correspondencia entre funciones en espanol y en ingles.
Otra alternativa es asignar una funcion nombrada como en lainstalacion local de nuestro Excel, mediante FormulaLocal oFormulaR1C1Local, como se detalla aquı.
Range ( ”A5” ) . Formula = ”=AVG(A4 , A10 ) ”Range ( ”A5” ) . FormulaR1C1 = ”=AVG( R4C1 , R10C1 ) ”S e p a r a d o r = A p p l i c a t i o n . I n t e r n a t i o n a l ( x l L i s t S e p a r a t o r )Range ( ”A5” ) . F o rm u la L oc a l = ”=PROMEDIO(A4” & S e p a r a d o r & ”A10 ) ”Range ( ”A5” ) . FormulaR1C1Local = ”=PROMEDIO( F4C1” & S e p a r a d o r & ”F10C1 ) ”
Luis Valencia Cabrera Informatica
VBA en Excel y controles
Controles ActiveX
Hemos trabajado con controles de formulario
Los controles ActiveX son posteriores, mas modernos, ypermiten controlar muchos mas comportamientos
Se trabaja con ellos mediante el Modo Diseno
Se tiene acceso a sus propiedades
Aquı tiene mas informacion sobre controles ActiveX
Luis Valencia Cabrera Informatica
Algunos controles activeX
Cuadro de texto
Cuadro de lista, Seleccion multiple
Cuadro combinado
Casilla de verificacion
Boton de opcion
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Cuadro de texto
Vamos a crear un nuevo libro, ControlesActiveX.xlsm e incluirun cuadro de texto, indicando su nombre (propiedad (Name)) paraacceder desde codigo. Por ejemplo: TxbNombre.
Su valor por defecto (propiedad Value) es vacıo.
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Cuadro de texto
Creamos ahora una macro para inicializar el cuadro:
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Cuadro de texto
Sub I n i c i a l i z a r C u a d r o T e x t o ( )
’ Dentro d e l b l o q u e With , l o que e s c r i b a m o s t r a s e l punto ( . )’ e s como s i a n t e p u s i e r a m o s Worksheets (” Hoja1 ”) a l .With Worksheets ( ” Hoja1 ” )
’ M o d i f i c a r e l v a l o r d e l cuadro de t e x t o ( e l t e x t o v i s i b l e ). TxbNombre . Value = ” L u i s ”
’ L e e r e l v a l o r d e l cuadro de t e x t o y a l m a c e n a r l o en una c e l d a. Range ( ”H6” ) = . TxbNombre . Value
End With
End Sub
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Cuadro de lista
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Cuadro de texto
Ademas de un boton para lanzar una macro, podemos crear unnuevo cuadro de texto como anteriormente con TxbNombre:
Nombre: TxbContinente
Value: vacıo
LinkedCell: B12
(al actualizar TxbContinente,se actualizara B12)
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Boton
A continuacion, incluimos el boton para anadir elementos delcuadro de texto a la lista:
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Cuadro de lista
Una vez incluidas las propiedades del boton, pulsamos doble click yaparece la macro, en la que podemos anadir el codigo:
P r i v a t e Sub B t n A n a d i r C o n t i n e n t e C l i c k ( )’ Vamos a a n a d i r e l c o n t i n e n t e i n t r o d u c i d o en e l cuadro de t e x t o’ en e l cuadro de l i s t a
With Worksheets ( ” Hoja1 ” )
’ E l c o n t e n i d o d e l cuadro de t e x t o e s Worksheets (” Hoja1 ”) . TxbCont inente . Value’ Anadimos a l cuadro de l i s t a con Worksheets (” Hoja1 ”) . L s b C o n t i n e n t e s . AddItem
. L s b C o n t i n e n t e s . AddItem . TxbCont inente . Value
’Como sabemos , a l e s t a r d e n t r o d e l With podemos o m i t i r Worksheets (” Hoja1 ”) ,’ s o l a m e n t e e s c r i b i m o s e l . y l o que va a c o n t i n u a c i o n’ ( o jo , hay un e s p a c i o t r a s e l AddItem )
End WithEnd Sub
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Cuadro de lista
Tambien podemos hacer que la lista sea poblada desde un rango:
ListFillRange indica el rango
En este caso O2:O6
MultiSelect establece si podemosseleccionar un valor de la lista omas.
0 - fmMultiSelectSingle
permite seleccionar un solo valor.
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Cuadro de lista
Se puede emplear nombre de rango, y cambiar al modo de seleccionmultiple:
ListFillRange indica el rango
En este caso Comunidades
Opciones sel. multiple:
0-fmMultiSelectMulti
0-fmMultiSelectExtended
En este enlace se detalla la diferencia entre las dos opciones anteriores.
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Cuadro de lista
Podemos colocar un boton que nos devuelva un mensaje con los valoresseleccionados:
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Cuadro de lista
P r i v a t e Sub B t n M o s t r a r S e l e c c i o n C l i c k ( )’ Vamos r e c o r r i e n d o cada v a l o r d e l cuadro de l i s t a LsbComunidades’ Por cada v a l o r s e l e c c i o n a d o ( LsbComunidades . S e l e c t e d ( p o s L i s t a ) ) ,’ vamos a na d ie nd o e l e l emento ( LsbComunidades . L i s t ( p o s L i s t a ) ) a l mensaje
’ En p o s L i s t a i r e m o s almacenando l a p o s i c i o n de l a l i s t a que r e c o r r e m o sDim p o s L i s t a As Long’ En mensaje vamos c o n s t r u y e n d o e l mensaje que f i n a l m e n t e mostramosDim mensaje As S t r i n g
’ Dentro de l a l i s t a de comunidades :With LsbComunidades
’ Para cada p o s i c i o n de l a l i s t a , p o s L i s t aFor p o s L i s t a = 0 To . L i s t C o u n t − 1
’ S i e s a p o s i c i o n de l a l i s t a f u e s e l e c c i o n a d a :I f . S e l e c t e d ( p o s L i s t a ) Then
’ Entonces anadimos a l mensaje a c t u a l e l e l emento s e l e c i o n a d omensaje = mensaje & . L i s t ( p o s L i s t a ) & vbCrLf’ vbCrLf va a na d i en d o un s a l t o de l i n e a t r a s cada o p c i o n s e l e c c i o n a d a
End I fNext p o s L i s t a
End With
’ S i e l mensaje t i e n e l o n g i t u d c e r o i n d i c a m o s que no hay nada s e l e c c i o n a d oI f Len ( mensaje ) = 0 Then
mensaje = ”No hay e l e m e n t o s s e l e c c i o n a d o s ”End I f
’ F ina lmente , mostramos e l mensaje emergenteMsgBox mensaje
End Sub
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Boton de opcion
Podemos incorporar botones de opcion, pertenecientes a grupos:
Ası, los botones OpbMujer y OpbHombre pertenecen al grupo sexo, demodo que al pulsar en mujer se desmarca el de hombre, y viceversa.
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Checkbox (casilla)
Podemos incorporar casillas (mas conocidos como checkbox),pertenecientes a grupos:
El comportamiento es similar al anterior, y en ambos casos el Value decada control devuelve VERDADERO o FALSO.
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Boton de opcion ycheckbox
P r i v a t e Sub B t n A n a l i z a r O p c i o n e s C l i c k ( )
’ Colocamos en l a c e l d a F27 e l v a l o r VERDADERO o FALSO ,’ segun s i s e ha marcado o no e l checkbox ChbMedia4Range ( ”F27” ) . Value = ChbMedia4 . Value
’ Se muestra un mensaje en f u n c i o n de s i l a o p c i o n de’ Sexo s e l e c c i o n a d a e s Mujer u HombreI f OpbMujer . Value = True ThenMsgBox ( ”Has s e l e c c i o n a d o l a o p c i o n Mujer ” )
E l s e I f OpbHombre . Value = True ThenMsgBox ( ”Has s e l e c c i o n a d o l a o p c i o n Hombre” )
End I f
End Sub
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Lista desplegable
Podemos incorporar listas desplegables (combo boxes):
Las propiedades son similares a las vistas para controles anteriores,cogiendo los datos de la lista de un nombre de rango y vinculandose suseleccion a una celda.
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Propiedades hoja
Si estamos consultando propiedades de un control y pinchamos enla hoja, pasamos a ver o modificar las propiedades de la misma.Por ejemplo, podemos cambiar la propiedad del nombre de la hoja,pasando de Hoja2 a HojaLote:
Luis Valencia Cabrera Informatica
Trabajando con controles activeX - Evento cambiar opcion
Al hacer doble-click en modo diseno sobre la lista desplegable, senavega hasta el codigo del evento de cambiar la opcionseleccionada, en el que podemos incluir las acciones que queramos:
P r i v a t e Sub CmbComunidades Change ( )
’ Al cambiar l a o p c i o n s e l e c c i o n a d a , s e muestra un mensaje’ mostrando e l nuevo v a l o r t r a s e l cambioMsgBox HojaLote . CmbComunidades . Value
End Sub
Luis Valencia Cabrera Informatica
Comenzando a trabajar con Userforms
Para familiarizarse con muchas practicas habituales con VBA yUserforms, es conveniente no partir de cero.
Puede encontrar una introduccion en este enlace. Mas informacionen las entradas de blog: [entrada 1] [entrada 2] [Propiedades]Conviene practicar con ejemplos paso a paso:
Algunos userforms de ejemplo en excel-avanzado.com
Mas ejemplos en este documento, a partir del ejemplo 5:
Desarrollo de aplicaciones en Microsoft Excel. 12 casospracticos resueltos paso a paso
Muchos mas ejemplos de userforms
Agradecimientos a exceltotal.com, excel-avanzado.com y laUniversidad de Cartagena.
Luis Valencia Cabrera Informatica