Vous êtes sur la page 1sur 73

Funciones definidas por el usuario 31/01/2014 by FLOR DEL CARMEN | 0 comments Las funciones efini as !

o" e# usua"io o $se" Define Functions %$DF&' !e"mite a #os usua"ios c"ea" nue(as y i(e"sas funciones me iante (isua# basic %)*A& con #as cua#es se !ue e "ea#i+a" c,#cu#os sim!#es y com!#e-os a t"a(.s e una cie"ta canti a e a"/umentos !a"a #ue/o e(o#(e"#os con(e"ti os en un (a#o"0 Estas funciones se",n a#macena as -unto a ot"as ya e1istentes en E1ce# !a"a 2ue !ue an (o#(e" a se" uti#i+a as0 3a"a em!e+a" a c"ea" una funci4n !"ime"o se ebe ab"i" E1ce# y a5a i" #a !esta5a !"o/"ama o" ya 2ue en un !"inci!io no a!a"ece0 Lue/o se 6ace c#ic7 en esa !esta5a' !a"a es!u.s 6ace" c#ic7 en (isua# basic0 En #a !anta##a 2ue a!a"ece", se 6ace c#ic7 en inse"ta" m4 u#o' on e se esc"ibi", como en e# si/uiente e-em!#o8 Function 3o"centa-e %a"/1' a"/2& 3o"centa-e 9 %a"/1 / a"/2& : 100 En Function $na fo"ma senci##a !a"a com!"oba" 2ue se 6aya c"ea o #a funci4n es 6ace" c#ic7 en e# icono f1' 2ue es e# s;mbo#o e inse"ta" funci4n' #ue/o se 6ace c#ic7 en cate/o";as' efini as !o" e# usua"io on e sa# ", e# nomb"e 2ue se #e !uso a #a funci4n' en este caso 3o"centa-e' es!u.s c#ic7 en ace!ta" y fina#mente sa# ", una (entana on e se !on ",n #os a"/umentos' a"/19<0 y a"/291=00 A# nue(amente 6ace" c#ic7 en ace!ta" sa# ", #a so#uci4n e #a f4"mu#a "ea#i+a a' es eci"' 33'30 Este !"oce imiento se !ue e ##e(a" a cabo con ot"as f4"mu#as como e# >n ice e Masa Co"!o"a# %>MC&' #as ,"eas e #as fi/u"as /eom.t"icas' etc0 E-em!#o $DF

UDF- Prueba Defensiva (Ratio de Liquidez) 02/11/2013 by Ca"men Ame#ia e# Mi#a/"o | 1 Comment En #a actua#i a es necesa"io me i" #a ca!aci a efecti(a e una em!"esa' en e# co"to !#a+o0 Es !o" eso 2ue se consi e"a una "atio im!o"tante e #i2ui e+' a #a 3"ueba Defensi(a? ya 2ue esta so#o consi e"a e# (a#o" e #os acti(os e Ca-a y *ancos y )a#o"es Ne/ociab#es' f"ente a# @ota# e 3asi(o Co""iente0 E# "esu#ta o ebe se" #o mayo" !osib#e' ya 2ue esto nos in ica 2ue #a em!"esa tiene un buen ni(e# e #i2ui e+ 2ue #e !e"mite o!e"a"' cum!#i" con sus ob#i/aciones con te"ce"os? ent"e ot"os? sin 2ue #a Fi"ma se (ea en #a necesi a e esta" "ecu""ien o a sus f#u-os e (entas0 Los !asos a se/ui" !a"a #a c"eaci4n e #a $DF son #os si/uientes8 1& )a"iab#es Necesa"ias !a"a c"ea" mi $DF0

De #os Esta os Financie"os' necesito8 A A A Ca-a y bancos )a#o"es Ne/ociab#es 3asi(o Co""iente

2& C"eo mi mo u#o' in/"esan o #os a"/umentos !a"a /ene"a" mi funci4n? se/Bn #a fo"mu#a !a"a 6a##a" este "atio0

3& Desc"ibo #a Funci4n' 6acien o c#ic7 en m4 u#o? busco mi $DF oy c#ic7 secun a"io' #ue/o en !"o!ie a es !a"a esc"ibi"#o0

4& Fina#mente A!#ico #a Funci4n' uti#i+an o #as ce# as on e se encuent"an #os atos so#icita os en #a misma? #ue/o e esto ana#i+o e inte"!"eto e# "esu#ta o0

$DFA3R$E*A DEFENC>)A

Funciones en VBA

Las si/uientes Funciones en )*A o Mac"os !o ";an se" e muc6a ayu a !a"a #as i(e"sas ta"eas en #as 2ue nos (eamos in(o#uc"a os en "eso#(e"' en esta "e#aci4n tenemos un ace"camiento a #as funciones en )*A mas usua#es 2ue !o ";amos ##e/a" a em!#ea"0 A #a fec6a en #a Deb no encont"amos una "e#aci4n #o suficientemente e16austi(a e #as funciones en )*A is!onib#es as; 2ue es e e# b#o/ 6emos comen+a o' !aso a !aso' a estab#ece" nuest"a !"o!ia "e#aci4n e funciones' !"estan o es!ecia# inte".s a #os e-em!#os e uso e ca a funci4n 2ue esa""o##emos' si esean 2ue a/"e/uemos a#/una en !a"ticu#a" o 6an encont"a o a#/una obse"(aci4n sob"e a#/unas e #as funciones esc"itas' !o" fa(o" a(;sennos a infoEe1e#Aa(an+a o0com a fin e "ea#i+a" #as "e(isiones y a ecuaciones 2ue sean necesa"ias0 Debe tene"se en cuenta 2ue estas funciones en )*A !ue en em!#ea"se es e cua#2uie" !a"te e# !"oyecto' es eci" ya sea es e #os m4 u#os' 6o-as' @6isFo"7boo7' y fo"mu#a"ios0 Al unas de las funciones en VBA revisadas! 10 E(a#uacion e# ia con #a Funci4n Day 20 Funci4n Mont6 en )*A 30 FORGCHEE@F$NC@>ON0MAI !a"a e# !"ome io e notas 40 Funci4n Ri/6t en )*A J0 Funci4n Fo"7s6eetFunction0A(e"a/e <0 $so e Fo"7s6eetFunction0Count*#an7 K0 $so e Fo"7s6eetFunction0CountA =0 Funci4n C>N@ L0 Funci4n Mi !a"a ca#ificaci4n c"e iticia 100Funci4n Abs 110Funci4n NoD en )*A 120Funci4n Fo"mat!e"cent 130Funci4n DateA %@eo";a Na/e#e&

140Funci4n Fi#eLen en )*A 1J0Funci4n >sEm!ty en )*A 1<0Funci4n Len en )*A 1K0Funci4n Left 1=0Funci4n C!ace en *)A 1L0$so e Fo"7s6eetFunction0Ran *etDeen 200Funci4n Rn 210Funcion >sNume"ic 220Funci4n Fo"matCu""ency en )*A 230Funci4n >sNu## en )*A 240Funci4n Cbyte en )*A 2J0Funci4n Ct"Con( 2<0Funci4n Re!#ace 2K0Funci4n )a# en )*A 2=0Funci4n CLn/ en )*A 2L0$so e Fo"7s6eetFunction0)#oo7u! 300Funci4n C ec 310Funci4n MC6ooseM en )*A 320Funci4n CCt" 330Funci4n Cu"Di" 340Funci4n C)AR en )*A 3J0Funci4n >n!ut*o1 en )*A 3<0Funci4n CCu" en )*A 3K0Funci4n DateCe"ia# en )*A 3=0Funci4n Fee7 ayName

3L0Funci4n LCase con )*A 400Funci4n RO$ND 410Funci4n C/n 420Funci4n Date 430Funci4n >N@ 440Funci4n DateDiff 4J0Funci4n CDate con )*A 4<0Funci4n Fi1 con )*A 4K0Funci4n L@"im 4=0Funci4n CHR 4L0Funci4n DateCe"ia# J00Funcion Cboo# J10Funci4n @imeCe"ia# J20Funcion $case J30Funci4n >nCt" J40Funci4n Fo"mat JJ0Funci4n CDb# J<0Funci4n >sDate JK0Funci4n Asc J=0Funci4n >nCt"Re( Captulo 1. Introduccin y primeros pasos Este curso va dirigido a aprender a programar en Visual Basic for Applications (VBA) para la hoja de clculo Microsoft Excel. El VBA es muy similar en el resto de herramientas de Microsoft ffice (!ord" #o$er#oint" etc)" por lo %ue los conocimientos a%u& ad%uiridos pueden aplicarse en esos otros programas. Adems el VBA es tam'i(n muy

similar al Visual Basic de verdad" por lo %ue puede ser una puerta de acceso a la programaci)n de aplicaciones (utili*ando Visual Basic) para personas sin conocimientos previos de programaci)n. +esde los primeros tiempos de las hojas de clculo" con las m&ticas primeras versiones de ,otus -./.0" exist&an macros (el nom're completo era macro.comandos)" %ue serv&an para automati*ar tareas repetitivas. En a%uellos tiempos las macros se limita'an 'sicamente a simular pulsaciones del teclado el usuario" es decir" al ejecutar una macro era como si el usuario estuviese pulsando las teclas %ue la macro 1pulsa'a1" lo %ue a pesar de su sencille* permit&a hacer cosas interesantes. 2on el tiempo las macros fueron evolucionando" pudi(ndose incluir en ellas sentencias %ue no se traduc&an en pulsaciones de teclas" aun%ue todo ello se hac&a introduciendo f)rmulas en las celdas de la hoja de clculo" lo %ue deja'a 'astante %ue desear. 2on la llegada de Excel 3.4" Microsoft introdujo las macros 'asadas en el popular Visual Basic" creando lo %ue ha llamado Visual Basic for Applications" compartido por todas las aplicaciones de Microsoft" y %ue a5ade a las mismas unas posi'ilidades enormes de personali*aci)n y creaci)n de soluciones a medida de las necesidades de cada usuario. +e hecho" creo %ue el nom're 1macro1 de'er&a dejar de utili*arse en favor de otros conceptos ms relacionados con los lenguajes de programaci)n (como rutinas" su'rutinas y funciones)" pero yo creo %ue se mantiene por ra*ones hist)ricas. ,o primero %ue tuve %ue decidir antes de escri'ir este curso so're programaci)n en Excel fue hacia %ui(n i'a a ir dirigido6 por un lado estn todas las personas %ue dominan uno o ms lenguajes de programaci)n" y con poco esfuer*o pueden aprender los detalles espec&ficos de Visual Basic for Applications para Excel. #or otro lado estn todas a%uellas personas %ue utili*an Excel simplemente como una hoja de clculo %ue hace operaciones aritm(ticas" %ue desaprovechan toda la potencia de Excel. 7e decidido %ue este curso va a ir dirigido a estos 8ltimos" por%ue creo %ue es el perfil del usuario ha'itual de Excel" y a%uellas personas %ue est(n en el primer grupo pueden tam'i(n utili*ar el curso" deteni(ndose en las partes %ue expli%uen cosas espec&ficas de Excel y saltndose otras como los conceptos generales de programaci)n.

9na nota so're versiones de Excel6 la 8ltima versi)n de Excel es la de ffice :; (llamada Excel :;)" aun%ue todav&a existen muchos sitios en los %ue se utili*a la versi)n de ffice :3 (Excel :3). 2asi todo lo %ue vamos a hacer funciona en las dos versiones" y en los casos en los %ue no sea as& procurar( indicarlo. El mejor m(todo para aprender VBA es utili*ar la opci)n de gra'ar macros de Excel6 todo lo %ue hagamos mientras Excel est gra'ando una macro se traduce en la instrucciones de VBA necesarias para repetir nuestras acciones. Vamos a utili*ar esa opci)n para crear nuestra primera macro. #rimero selecciona la opci)n 1 Herramientas, Grabar Macro1" y escri'e algo en la celda A-. ,uego selecciona la opci)n "Herramientas, Grabar macro..., Detener grabacin" para %ue Excel de'e de gra'ar. #ara ver la macro %ue aca'amos de crear el m(todo es distinto en Excel :3 y Excel :;6 en Excel :3" las macros se almacenan en m)dulos" %ue son como una hoja ms del li'ro" podemos ver una hoja llamada "Mdulo1" en las pesta5as %ue estn en la parte inferior. En Excel :;" para escri'ir macros se utili*a el Visual Basic Editor" y accedemos a (l mediante la opci)n 7erramientas" Macros" A'rir Editor Visual Basic. En cual%uiera de las dos versiones veremos %ue Excel ha escrito algo parecido a esto6 Sub Macro1() ActiveCell.Formula = "Mi primera macro" Range("A2").Select End Sub Esta rutina escri'e 1Mi primera macro1 en la celda activa y luego se despla*a a la celda inferior" en este caso la celda A/ (esto ocurre por%ue Excel tiene por defecto la opci)n de %ue cuando pulsas 1<ntro1 el cursor se despla*a a la celda de a'ajo" y Excel tam'i(n ha incluido eso en la macro). Vamos a ir poco a poco. ,a primera l&nea define una su'rutina llamada Macro1 (es el nom're %ue le ha puesto Excel" pero podemos cam'iarlo a lo %ue nosotros %ueramos). 2ada rutina %ue escri'amos de'e empe*ar con Sub y terminar con una sentencia 1End Sub1. Antes de explicar la segunda l&nea" una explicaci)n so're los "objetos"6 un o'jeto es una varia'le de VBA %ue representa cual%uier

elemento de Excel. #or ejemplo" para representar un rango de una hoja de clculo se utili*a el o'jeto =ange" o para representar una hoja de clculo se utili*a el o'jeto !or>sheet. En nuestra macro estamos utili*ando el o'jeto 1Active2ell1" %ue es un o'jeto de tipo =ange %ue siempre apunta a la celda activa. ,os o'jetos tienen 1propiedades1 y 1mtodos1. 9na propiedad es un atri'uto del o'jeto %ue define una caracter&stica del mismo. #or ejemplo" la propiedad 1Row1 del o'jeto 1ActiveCell1 nos indica en %u( fila de la hoja de clculo est la celda activa. #ara acceder a una propiedad de un o'jeto se utili*a el nom're del o'jeto" un punto y el nom're de la propiedad (p.ej. Active2ell.=o$). 9nas propiedades muy utili*adas son las propiedades 1 Value1 y 1 ormula1 %ue se aplican a todos los o'jetos =ange. En nuestro ejemplo de macro" asignamos a la propiedad 1 ormula1 del o'jeto ActiveCell un texto" %ue es como si el usuario escri'iera ese texto en esa celda. ,os 1m(todos1 son acciones %ue se pueden llevar a ca'o so're un o'jeto" son rutinas %ue se aplican so're el o'jeto. #ara llamar a un m(todo se utili*a el nom're del o'jeto" un punto y el nom're del m(todo. #or ejemplo" el m(todo 1Active2ell.2lear2ontents1 'orra el contenido de la celda activa (es decir" como si el usuario pulsa la tecla 1?uprimir1). Volvamos a nuestra primera macro. ,a segunda l&nea asigna un valor a la propiedad 1 ormula1 del o'jeto Active2ell. En realidad no es una formula sino una cadena" pero da lo mismo. @&jate en %ue en VBA siempre %ue escri'amos una cadena de carcteres hay %ue encerrarla entre comillas do'les (1)" igual %ue en otros lenguajes. ?i dentro de una cadena %ueremos poner unas comillas do'les" s)lo tenemos %ue escri'irlas dos veces (1en esta cadena hay unas comillas 11 do'les1) ,a tercera l&nea llama al m(todo ?elect del rango 1A/1 de la hoja activa. @&jate en la forma de o'tener el o'jeto %ue representa a la celda 1A/1" utili*ando =ange(1A/1). ,a 8ltima l&nea se encarga de indicar d)nde termina la rutina. #or cada !ub %ue escri'amos o'ligatoriamente tenemos %ue escri'ir un 1 "nd !ub1. Ejecutar una subrutina #ara ejecutar una rutina hay varios m(todos.

2on la opci)n "Herramientas, Macro..." Excel te lista todas las macros disponi'les y puedes seleccionar la %ue %uieras y ejecutarla. Asignar una macro a una nueva opci)n del men de Herramientas. Asignar una 1tecla rpida1 a la macro" %ue se ejecutar cada ve* %ue pulsemos esa tecla. 2rear un botn y asignar a ese 'ot)n la rutina" de forma %ue (sta se ejecutar cada ve* %ue pulsemos el 'ot)n. #ara crear un 'ot)n tenemos %ue mostrar la 'arra de herramientas de 1+ilogo1 (pulsa con el 'ot)n derecho so're cual%uier 'arra de herramientas" y en el men8 %ue aparece selecciona 1+ilogo1 y vers %ue aparece la nueva 'arra de herramientas). En esa 'arra de herramientas hay un 'ot)n %ue sirve para colocar 'otones (valga la redundancia) en nuestra hoja. #ulsa ese 'ot)n y crea el tuyo en cual%uier parte de una hoja de clculo" con el tama5o %ue %uieras. ,uego pulsa so're ese 'ot)n con el 'ot)n derecho y del men8 contextual selecciona la opci)n 1Asignar macro1. Vers una lista de macros disponi'les" selecciona la %ue aca'amos de crear (Macro-). Ahora cada ve* %ue pulsemos el 'ot)n se ejecutar la macro Macro-. Mientras estamos editando una hoja de m)dulos" un m(todo muy prctico de ejecutar las rutinas es situar el cursor dentro de una rutina y pulsar el 'ot)n de 1 Ejecutar macro1 de la 'arra de herramientas de Visual Basic. 7ay %ue tener cuidado con este m(todo en Excel :3" por%ue en algunos casos puede dar errores6 por ejemplo" con este m(todo nuestra primera macro no funciona por%ue 1Active2ell1 no existe" ya %ue estamos en una hoja de m)dulo" por lo %ue Excel nos dar un mensaje de error. En Excel :; este pro'lema no ocurre por%ue no existen hojas de m)dulo" sino m)dulos dentro del Visual Basic Editor.

#odemos utili*ar cual%uiera de estos m(todos (y otros %ue ya veremos) para ejecutar nuestra rutina" y compro'aremos %ue cada ve* %ue la ejecutamos escri'e un texto en la celda activa y luego despla*a la selecci)n a la celda de a'ajo.

Utilizar funciones de VBA Adems de los o'jetos con sus m(todos y propiedades Excel tam'i(n tiene funciones. #ara llamar a una funci)n simplemente hay %ue escri'ir su nom're y luego los parmetros necesarios. #or ejemplo" vamos a hacer una pe%ue5a macro %ue utilice la funci)n MsgBox. Esta funci)n sirve para presentar cuadros de dilogo con mensajes para el usuario" aun%ue no tenemos muchas opciones para dise5ar el dilogo" s)lo se puede elegir el tipo de icono entre varios predefinidos (interrogaci)n" exclamaci)n" etc.) y unas cuantas opciones so're los 'otones del cuadro de dilogo (Aceptar" 2ancelar" ?&" Ao...). A pesar de todo es muy 8til para presentar informaci)n al usuario" por ejemplo cuando se ha terminado un proceso con (xito" cuando ha ocurrido un error" o para pedir informaci)n del tipo de 1BEsts seguro de %ue %uieres hacer....C1" lo %ue hace %ue se una funci)n 'astante utili*ada. #ues nada" a%u& tenemos una pe%ue5a rutina %ue utili*a la funci)n MsgBox6 Sub MiMacro() M g!o" "#ola mundo"$ vb%&%nl' ( vb)n*ormation$ "Mi egunda macro" End Sub =ecuerda %ue para escri'ir la macro tienes %ue situarte en una hoja de m)dulo en Excel :3" o ir al editor de VB en Excel :;" y dentro de (l seleccionar un m)dulo. #or ejemplo" podemos escri'ir esta macro de'ajo de la %ue hemos creado antes utili*ando la 1gra'adora1 de Excel. ?i ejecutamos esta macro" veremos %ue sale un cuadro de dilogo con el t&tulo 1Mi segunda macro1 y con el texto 17ola mundo1" adems de un icono %ue indica %ue es un cuadro de informaci)n" y el 'ot)n aceptar. 7emos llamado a MsgBox" pasndole como primer parmetro el texto del cuadro de mensaje" como segundo parmetro los 'otones e icono %ue %ueremos %ue tenga y como tercer parmetro el t&tulo del cuadro de dilogo. 2omo ha'rs podido o'servar los argumentos van separados por comas.

Dam'i(n se pueden poner ms parmetros para indicar %u( fichero de ayuda %ueremos %ue se a'ra si el usuario pulsa @- mientras est viendo el cuadro de dilogo. ?i %uieres ms informaci)n so're dichos parmetros" as& como una lista de todas las opciones %ue puedes utili*ar como segundo parmetro (distintos 'otones e iconos) utili*a la ayuda de Excel" %ue es 'astante completa. ,a mejor forma de utili*ar la ayuda es colocar el cursor so're la instrucci)n so're la %ue %ueremos 'uscar la ayuda y pulsar @-. ?i Excel encuentra esa pala'ra en el archivo de ayuda" nos mostrar la pgina de ayuda so're ella. tra pe%ue5a macro %ue utili*a MsgBox6 Sub Macro+() )* M g!o"(",ul a Aceptar o Cancelar"$ vb%-Cancel) = vb%- ./en M g!o" ("#a pul ado Aceptar") El e M g!o" ("#a pul ado Cancelar") End )* End Sub Bueno" varias cosas nuevas. En primer lugar el 1If !"en Else End If1. 2omo su nom're indica" esta instrucci)n (la ayuda de Excel los llama enunciados) se utili*a para evaluar condiciones. ?u forma general es6 <f Econdici)nF Dhen .... Else .... End <f ?i el resultado de la condici)n es verdadero" se ejecutan las instrucciones %ue hay entre el If y el Else. ?i es falso" se ejecutan las instrucciones %ue hay entre el Else y el End If. El Else no es o'ligatorio" o sea %ue si no nos interesa ejecutar nada en caso de %ue la condici)n no sea verdadera" simplemente ponemos un End If y ya est. Volvamos a nuestra funci)n6 lo %ue hacemos es llamar a la funci)n MsgBox con un texto y un parmetros (v' >2ancel) indicando los 'otones %ue %ueremos %ue tenga. 7asta a%u& todo claro. ,o 8nico %ue cam'ia respecto al ejemplo anterior es %ue como hemos puesto MsgBox detrs del <f" Excel nos o'liga a poner los parmetros entre par(ntesis. ,o %ue hacemos despu(s es compro'ar el valor %ue nos

devuelve la funci)n Msg#o$ una ve* %ue el usuario ha cerrado el cuadro de dilogo. El usuario va a tener dos 'otones (Aceptar y 2ancelar)" y dependiendo de cul de ellos pulse o'tendremos un valor u otro" representados por Excel mediante unas constantes6 v' > si el usuario pulsa Aceptar" v'2ancel si el usuario pulsa 2ancelar" v'Ges si el usuario pulsa ?& (%ue en este ejemplo no existe pero podemos ponerlo)" etc. 2omo siempre" en la ayuda de Excel estn todas los valores posi'les %ue puede devolver MsgBox. Bueno" entendido esto supongo %ue el resto de la macro es fcil de entender6 lo %ue hace es mostrar un mensaje con dos 'otones (Aceptar y 2ancelar)" y dependiendo de lo %ue el usuario seleccione muestra otro mensaje informando al usuario de lo %ue ha pulsado. Ao es %ue sea demasiado 8til pero nos ha servido para aprender algo ms. Vamos hacer otra macro un poco ms complicada" %ue utilice la funci)n MsgBox y las propiedades de los o'jetos %ue hemos aprendido antes6 Sub Macro0() )* M g!o"(")n*ormaci1n obre la celda activa2 " 3 C/r(1+) 3 4 "F1rmula2 " 3 ActiveCell.Formula 3 C/r(1+) 3 4 "5alor2 " 3 ActiveCell.5alue 3 C/r(1+) 3 C/r(1+) 3 4 ",ul a Aceptar para borrar el contenido de la celda activa " 4 3 "' Cancelar para de6arla como e t7"$ 4 vb%-Cancel ( vb)n*ormation$ "Mi cuarta macro") = vb%- ./en ActiveCell.5alue = "" End )* End Sub Bueno" hay varias cosas %ue explicar6 con el caracter 1H1 al final de una l&nea %ueremos decirle a Excel %ue la l&nea contin8a" pero lo vamos a escri'ir de'ajo (por ra*ones de legi'ilidad). Es decir" es como si desde el 1<f1 de la segunda l&nea hasta el 1Dhen1 de la s(ptima l&nea

estuviese todo en la misma l&nea" pero si lo puesi(semos en la misma l&nea ser&a 'astante dif&cil de leer. El carcter 1I1 se utili*a para concatenar dos cadenas de caracteres. #or ejemplo" la cadena 1Macedonia Maga*ine1 es igual %ue la cadena 1Macedonia 1 I 1Maga*ine1. ,a funci)n C%r() se utili*a para o'tener el carcter representado por un c)digo A?2<<. Ao es demasiado utili*ada" tan s)lo nos interesa sa'er %ue c)digo A?2<< n8mero -0 representa el cam'io de l&nea" y en este caso lo utili*amos para empe*ar una nueva l&nea en el texto %ue vamos a presentar en el cuadro de dilogo. @&jate c)mo o'tenemos informaci)n so're la celda activa utili*ando las propiedades ormula y Value del o'jeto Active2ell. #odemos o'servar %ue las propiedades @ormula y Value son distintas cuando las leemos (una tiene la f)rmula" y la otra tiene el valor) mientras %ue para dar un valor a la celda nos da lo mismo utili*ar una u otra6 la linea %ue dice Active2ell.Value J 11 puede sustituirse por Active2ell.@ormula J 11" o'teniendo el mismo resultado. #ara ejecutar esta rutina" vamos a pro'ar el m(todo de asignar a una tecla esta macro. #ara ello vamos a Herramientas, Macro. +e la lista de macros" seleccionamos (sta y pulsamos el 'ot)n 1 pciones...1" %ue nos llevar a una ventana donde aparecen varias opciones para nuestra macro. En este dilogo podemos decir a Excel %ue ponga la macro como una opci)n del menu de 7erramientas" y tam'i(n como tecla rpida. #odemos poner por ejemplo la tecla 2trl.M. Ahora vamos a una hoja de clculo" e introducimos en cual%uier celda la f)rmula 1J3K/1. ?i pulsamos ahora las teclas 2trl.M ejecutaremos nuestra macro y veremos lo siguiente6 Bueno" espero %ue haya %uedado relativamente claro. 7asta ahora hemos aprendido lo %ue es una macro o rutina" c)mo ejecutarla" unos conceptos 'sicos so're o'jetos y la instrucci)n 1 &'()%en("lse1" una de las ms utili*adas. Vamos a avan*ar un poco ms" aprendiendo a utili*ar otra instrucci)n muy 8til" el 'ucle 1@or1" y a profundi*ar un poco en el uso del o'jeto =ange" %ue es seguramente el ms utili*ado. +espu(s de ha'er hecho el t&pico programa 1Hola mundo1 (el primero %ue hemos hecho todos

cuando hemos aprendido un lenguaje de programaci)n) vamos a hacer ahora otro clsico6 vamos a pedirle al usuario %ue nos de un n8mero y le vamos a dar la ta'la de multiplicar de ese n8mero. A%u& va la rutina completa" y luego la explicamos6 Sub .ablaMultiplicar() 8im n$ i A )nteger 8im A String 8im r A Range = )nput!o"(".abla de multiplicar del n9mero2 "$ ".:tulo") )* ;< "" ./en n = 5al( ) ActiveS/eet.Range("C2").5alue = ".abla de multiplicar del " 3 n Set r = ActiveS/eet.Range("C0") For i = = .o 1= r.%** et(i$ =).5alue = i r.%** et(i$ 1).5alue = i > n ?e"t i End )* End Sub #ulsa a%u& para 'ajarte un fichero de Excel %ue contiene este ejemplo. ,o primero es la declaraci)n de varia'les. 9na varia'le es un espacio de memoria %ue reservamos para almacenar datos. 2on la sentencia 1Dim n,i as &nteger1 estamos diciendo %ue %ueremos reservar memoria para dos varia'les (n" i) de tipo entero" para almacenar n8meros enteros. <gualmente en las siguientes l&neas reservamos memoria para una varia'le de cadena (string)" %ue almacenar cadenas de caracteres" y para una varia'le de tipo =ange. En VBA no es o'ligatorio declarar las varia'les antes de utili*arlas" a no ser %ue en cada m)dulo escri'amos al principio 1 ptions Explicit1" con lo %ue estaremos indicando a VBA %ue de'e compro'ar %ue todas las varia'les %ue utilicemos est(n previamente declaradas. Ao voy a entrar en la eterna pol(mica de si es mejor declarar las varia'les o no hacerlo" pero personalmente creo %ue es mejor hacerlo" para %ue el

tipo de datos %ue almacena cada varia'le est( claro y para evitar errores al escri'ir los nom'res de varia'les %ue luego pueden ser dif&ciles de locali*ar. En la siguiente l&nea utili*amos la funci)n 1&n*ut#o$1" %ue sirve para mostrar un cuadro de dilogo simple en el %ue el usuario puede escri'ir un dato. El primer parmetro es el texto descriptivo %ue se mostrar en el cuadro de dilogo y el segundo parmetro es el t&tulo del cuadro de dilogo. El usuario puede utili*ar el cuadro de edici)n del dilogo para introducir el dato %ue le pedimos y luego pulsar Aceptar o 2ancelar. ?i pulsa Aceptar" la funci)n <nputBox devuelve una cadena de caracteres con el dato introducido por el usuario. ?i pulsa 2ancelar" la funci)n devuelve una cadena de caracteres vac&a (11). 9tili*amos la funci)n <nputBox para %ue el usuario nos diga %u( ta'la de multiplicar %uiere" y almacenamos el valor devuelto por la funci)n en la varia'le s" %ue previamente hemos declarado como una varia'le de tipo cadena de carcteres (string). +espu(s de llamar a <nputBox" compro'amos %ue varia'le 1s1 no est vac&a" lo %ue significa %ue el usuario ha escrito algo en el dilogo y luego ha pulsado Aceptar. ?i 1s1 esta vac&a" la rutina termina sin hacer nada ms. Auestro siguiente paso es o'tener el n8mero %ue ha introducido el usuario. Es importante distinguir entre n8meros y cadenas6 en este momento tenemos la cadena de carcteres 1 s1 %ue contiene la cadena introducida por el usuario" y como %ueremos hacer operaciones aritm(ticas necesitamos el n8mero contenido en esa cadena. #or ejemplo" si el usuario ha escrito 101" la varia'le 1 s1 contendr una cadena de carcteres de un solo carcter (101)" y lo %ue nosotros %ueremos o'tener es el valor num(rico 0. #ara ello utili*amos la funci)n Val()" %ue dada una cadena de carcteres no da su valor num(rico6 p.ej6 Val(101) nos devuelve 0. El resultado de la funci)n Val lo almacenamos en la varia'le n" %ue previamente hemos declarado como varia'le de tipo entero. 2omo siempre suele suceder" existe la posi'ilidad de %ue el usuario haya escrito un valor con decimales o %ue haya escrito letras en lugar de n8meros. En una macro ms profesional de'er&amos compro'ar

esas posi'ilidades para asegurarnos de %ue nuestra macro no sufre ning8n error en caso de %ue el usuario introdu*ca alg8n dato inesperado" pero por ahora no vamos a meternos en l&os de esos. ,a siguiente l&nea de'er&a ser fcil de entender a estas alturas6 damos un valor a la propiedad 1Value1 del rango 2/ de la hoja activa" al %ue accedemos utili*ando 1Active?heet.=ange(12/1)1. 9na pe%ue5a recomendaci)n6 siempre %ue hagas referencia a rangos de hojas de clculo desde VBA es recomenda'le utili*ar nom'res definidos de rango en lugar de referencias tipo 2/. #or ejemplo" podemos dar a la celda 2/ el nom're 1D&tulo ta'la1 y acceder a ella utili*ando =ange(1D&tulo ta'la1). ,a ventaja de esto es %ue si luego %ueremos %ue en lugar de en la celda 2/ lo escri'a en cual%uier otra celda s)lo tenemos %ue cam'iar el nom're" sin tocar el c)digo. En la siguiente l&nea utili*amos el enunciado 1 !et1 para %ue la varia'le r (de tipo Range) apunte al rango 2L de la hoja activa. ,uego viene la sentencia 1 or ( +e$t1" %ue tiene varias formas" pero esta es la ms sencilla6 lo %ue hacemos es %ue la varia'le 1 i1 (como siempre" previamente declarada como de tipo entero) tome los valores comprendidos entre el 4 y el -4 (am'os inclusive)" y para cada uno de esos valores se ejecute el c)digo comprendido entre las l&neas or y +e$t. Es decir" las dos l&neas %ue hay entre el or y el +e$t se van a ejecutar once veces6 la primera ve* %ue se ejecuten" la varia'le i tendr el valor 4M la segunda ve*" i tendr el valor -M y la 8ltima ve* i tendr el valor -4. El 'ucle 1@or . Aext1 es muy utili*ado" y en VBA funciona de forma muy parecida a cual%uier otro lenguaje de programaci)n. ,as dos l&neas %ue hay entre el @or y el Aext son prcticamente iguales. El m(todo 1,''set1 es un m(todo %ue se aplica a los o'jetos de tipo =ange (como nuestra varia'le 1 r1) para despla*ar el rango al %ue apunta. El primer parmetro del m(todo ffset es el n8mero de filas %ue %ueremos despla*ar el rango (positivo hacia a'ajo" negativo hacia arri'a)" y el segundo parmetro es el n8mero de columnas %ue %ueremos despla*ar el rango. Vamos a verlo con un ejemplo6 si nuestra varia'le 1r1 apunta al rango 2L6 r.Value = 1 Pone el valor 1 en la celda C4

r.Offset(1,0).Value = 2 r.Offset(-1,0).Value = 3 r.Offset(0,1).Value = 4

Pone el valor 2 en la celda C5 Pone el valor 3 en la celda C3 Pone el valor 4 en la celda D4

r.Offset(-1,-1).Value = 5 Pone el valor 5 en la celda 3

,as dos l&neas de nuestra rutina lo %ue hacen es crear una ta'la de dos columnas" poniendo en la primera columna los n8meros del 4 al -4 (es decir" los valores %ue va tomando i cada ve* %ue se ejecutan estas dos l&neas) y en la segunda columna el resultado de multiplicar el valor de i por el n8mero %ue nos ha indicado anteriormente el usuario (n). Antes de terminar con este ejemplo hay %ue dejar claro %ue la ta'la de multiplicar puede hacerse de forma mucho ms sencilla y rpida sin utili*ar macros" utili*ando tan s)lo funciones de hoja de clculo" pero nos ha servido como ejemplo sencillo para aprender algunas cosas ms so're VBA. Bueno" hasta a%u& ha llegado la primera entrega de este curso. 2on lo %ue hemos aprendido hasta a%u& se pueden hacer ya algunas cosas. Nue a nadie le de miedo hacer todos los experimentos %ue %uiera" %ue es la mejor forma de aprender. Dam'i(n es muy 8til consultar a menudo la ayuda de Excel" %ue es 'astante completa. Espero %ue alguno de los %ue ha'(is llegado hasta a%u& me escri'is dici(ndome %u( os ha parecido.

Captulo #. Celdas$ ran%os$ libros y "ojas. En este cap&tulo vamos a aprender un poco ms so're c)mo hacer referencia a celdas" rangos" hojas y li'ros. ?upongo %ue todos estos

conceptos estn claros" %ue todo el mundo sa'e lo %ue es una celda o un rango" o la diferencia entre un li'ro y una hoja. @o os #os e-em!#os e este ca!;tu#o est,n inc#u; os en este E1ce#201#s fic6e"o8 %3L7bs& Bueno" para entrar en calor vamos a hacer una pe%ue5a rutina %ue pida al usuario un valor y luego sume ese valor a la celda activa.

Sub Sumar4A4Celda()

8im

8ouble

)* M g!o"("E ta macro pide al u uario un valor ' lo uma a la celda activa."$ 4 vb%-$ "Sumar a celda") = vbCancel ./en E"it Sub i = 5al()nput!o"(")mporte a umar2 "$ "Sumar a celda activa")) ActiveCell.5alue = ActiveCell.5alue ( i End Sub ,a primera l&nea es la declaraci)n de la varia'le &i&. Ga hemos comentado anteriormente lo %ue es la declaraci)n de varia'les" lo 8nico nuevo es el tipo de varia'le (dou'le). 2uando declaramos una varia'le hay %ue indicar %u( tipo de varia'le %ueremos %ue sea. ,os tipos de varia'les ms importantes son6 "nte er Lon Boolean #in le Double #trin Date $b%ect Variant $n (a#o" ente"o' ent"e A320K<= y 320K<K $n (a#o" ente"o' ent"e A2014K04=30<4= y 2014K04=30<4K )e" a e"o y Fa#so $n (a#o" con ecima#es' con !"ecisi4n sim!#e $n (a#o" con ecima#es' con !"ecisi4n ob#e $n ca ena e ca"acte"es $na fec6a Refe"encia a cua#2uie" ti!o e ob-eto e E1ce# $n (a"iab#e 2ue !ue e cambia" e ti!o

En este caso declaramos la varia'le como 'ouble" por si acaso al usuario se le ocurre meter un valor con decimales. ?iguiendo con nuestra rutina" primero presentamos al usuario un pe%ue5o mensaje diciendo lo %ue vamos a hacer. Esto est explicado en la entrega anterior" no creo %ue necesite nada ms. ?i el usuario pulsa 12ancelar1" salimos de la rutina y no hacemos nada. En la siguiente l&nea o'tenemos del usuario el valor %ue %uiere sumar a la celda activa. ,a funci)n Input(o) ya la hemos visto antes" o'tiene del usuario una entrada" pero en formato de cadena de caracteres. 2omo nosotros lo %ue %ueremos es un valor num(rico" utili*amos la funci)n *al+, para convertir la cadena de caracteres proveniente de <nputBox en un n8mero. ,o ponemos todo en la misma l&nea" pero tam'i(n se pod&a ha'er escrito en dos l&neas6 8im a String = )nput!o"(")mporte a activa") i = 5al( ) umar2 "$ "Sumar a celda

Bueno" seguramente %ueda ms claro %ue de la otra forma" pero normalmente se escri'e de la primera forma. 2ada uno %ue lo escri'a como %uiera" tampoco tiene demasiada trascendencia. ,a 8ltima l&nea es la %ue hace realmente la suma" dando valor a la propiedad *alue de -cti.eCell. Ga hemos visto en la entrega anterior lo %ue es Active2ell. 9na aclaraci)n so're Active2ell y Active?heet (%ue tam'i(n vimos en la entrega anterior)6 en realidad" Active2ell no es un o'jeto" sino %ue es una 1propiedad1 de un o'jeto especial llamado -pplication" pero cuando escri'imos 1Active2ell1 Excel entiende %ue estamos escri'iendo 1Application.Active2ell1. Application es un o'jeto %ue representa la aplicaci)n Excel completa. A trav(s de -pplication se puede acceder a todas las opciones de la aplicaci)n (las %ue podemos cam'iar a trav(s de 7erramientas" pciones)" acceder a las funciones de hoja de clculo (?9MA" #= ME+< " etc) y tam'i(n podemos o'tener o'jetos %ue referencian a la celda activa

(Active2ell)" la hoja (Active!or>'oo>)" etc.

activa

(Active?heet)"

el

li'ro

activo

9n pe%ue5o ejemplo del uso del o'jeto Application6 para mostrar y ocultar la 'arra de estado (la %ue aparece en la parte de a'ajo" de'ajo de las eti%uetas de las hojas)" podemos usar el siguiente c)digo6 #ara ocultar la 'arra de estado6 Application.DisplayStatusBar = Fal e #ara volver a mostrar la 'arra de estado6 Application.DisplayStatusBar = .rue El o'jeto -pplication tiene un mont)n de propiedades y m(todos" %ue estn muy 'ien explicados en la ayuda de Excel" y su uso es 'astante sencillo. ?iguiendo con la 8ltima l&nea de la rutina" podrs compro'ar %ue utili*amos la propiedad Value de Active2ell. ?i hu'i(semos utili*ado la propiedad ormula en lugar de Value" la rutina tendr&a %ue ser un poco distinta. 9tili*ando Value" estamos dando a la celda activa un valor directamente" es decir" si miras el contenido de la celda vers %ue no hay ninguna f)rmulaM la suma la ha hecho nuestra rutina" y ha puesto en la celda el resultado de dicha suma. ?in em'argo" si %ueremos %ue la f)rmula de la suma %uede en la celda de'emos usar la propiedad ormula. ,a propiedad ormula es una 1cadena de carcteres1" %ue incluye todo lo %ue se escri'ir&a normalmente en una celda de una hoja de clculo para introducir una f)rmula (incluyendo el signo 1J1 al principio). #or ejemplo" si %ueremos %ue poner en la celda A/ una f)rmula %ue nos de el do'le del valor de la celda A-" haremos6 =ange(1A/1).@ormula J 1JA-O/1 2omo es una cadena de caracteres" hay %ue rodearla con comillas do'les" y entre (stas ponemos la f)rmula tal como lo har&amos en la hoja de clculo. Dras esta explicaci)n" si %ueremos cam'iar nuestra rutina para introducir la f)mula de suma en la celda" nuestro primer intento ser&a escri'ir6 Active2ell.@ormula J Active2ell.@ormula K i

?i ejecutamos este c)digo veremos %ue el resultado puede variar dependiendo de lo %ue contenga la celda activa6

?i la celda activa contiene un nmero (no una f)rmula)" el resultado es el mismo %ue antes. ,a ra*)n es %ue como no hay ninguna f)rmula Active2ell.@ormula devuelve un n8mero" igual %ue Active2ell.Value. ,uego le sumamos nuestro valor y asignamos el valor resultante como f)rmula de la celda. ?i la celda activa contiene una frmula" el resultado es %ue la macro se para con un error. Esto es de'ido a %ue Active2ell.@)rmula nos devuelve una cadena de caracteres (por ejemplo" la cadena 1JA-O/1)" y luego estamos intentando sumar un n8mero (i) a una cadena de caracteres" cosa %ue evidentemente no se puede hacer y Excel nos da un error de tipos de datos incompati'les.

#ara conseguir lo %ue realmente %ueremos (introducir una f)rmula en la celda)" de'emos asignar a Active2ell.@ormula una cadena de caracteres con una f)rmula escrita correctamente. Vamos a intentarlo6 Active2ell.@ormula J Active2ell.@ormula I 1K1 I i El operador I ya lo vimos en la primera entrega" se utili*a para concatenar cadenas de caracteres. #artimos de la f)rmula %ue actualmente tiene la celda activa (por ejemplo" 1JA-O/1) y luego le a5adimos un signo 1K1 y luego nuestro valor (i)" con lo %ue la f)rmula pasar a ser 1JA-O/K01 (si i tiene el valor 0). El pro'lema %ue se nos presenta ahora es %ue si en la celda activa no hay una celda" sino un valor (por ejemplo" /)" nosotros asignaremos a Active2ell.@ormula la cadena 1/K01 (si i tiene el valor 0). BVeis el errorC Evidentemente el error es %ue falta el signo 1J1 al principio de la f)rmula para decirle a Excel %ue es una f)rmula. sea %ue de'er&amos a5adir delante de la f)rmula un 1J1" lo %ue podemos hacer de la siguiente forma6 Active2ell.@ormula J 1J1 I Active2ell.@ormula I 1K1 I i B2ul es el pro'lema ahoraC #ues %ue si la celda activa tiene una f)rmula nos encontramos con %ue nuestra f)rmula definitiva tiene dos signos 1J1 al principio" uno el %ue ya ten&a y otro el %ue le hemos

puesto nosotros. El resultado es %ue introducimos una f)rmula incorrecta y Excel nos vuelve a dar un error. Bueno" creo %ue he montado un pe%ue5o l&o" pero en realidad no tiene ninguna dificultad. ,o %ue hay %ue hacer es compro'ar si en la celda activa hay una f)rmula (esto se puede hacer mirando si el primer carcter es el signo 1J1" utili*ando por ejemplo la funci)n -e't). ?i hay una f)rmula" s)lo a5adimos la parte del final" y si no hay una f)rmula a5adimos primero un signo 1J1 y luego la parte del final. Esto %ueda como ejercicio" y si no te sale me escri'es y lo comentamos. #ues aparte de todo este l&o ya lo hemos visto todo. ?i ejecutas la rutina Sumar/-/Celda+, compro'ars %ue primero te pide un valor y luego suma ese valor a la celda activa. #or cierto" %ue nadie piense %ue esta macro es ninguna maravilla" por%ue lo mismo %ue hace se puede hacer ms rpido utili*ando 1#egado especial..1" %ue adems es capa* de restar" multiplicar y dividir. Ga llegaremos a eso tam'i(n" pero para ir aprendiendo un poco no nos viene mal. Ahora vamos a avan*ar otro paso6 la rutina anterior suma'a un valor a la celda activa" y ahora vamos a sumar ese valor a todo el rango %ue seleccione el usuario. 2omo siempre" a%u& va la rutina completa" luego la explicamos6 Sub Sumar4A4Rango() 8im i A 8ouble 8im / A %b6ect )* M g!o"("E ta macro pide al u uario un valor ' lo uma a toda la celda " 3 4 C/r(1+) 3 "del rango eleccionado."$ vb%-$ "Copiar celda i@Auierda") 4 = vbCancel ./en E"it Sub i = 5al()nput!o"(")mporte a umar2 "$ "Sumar a rango eleccionado")) For Eac/ / )n Selection.Cell /.5alue = /.5alue ( i ?e"t / End Sub

,o primero %ue hacemos es declarar las varia'les. ,a primera varia'le (i)" es de tipo Double" al igual %ue en la rutina anterior. ,a segunda varia'le (h) la declaramos como una varia'le de tipo ,b.ect" para %ue apunte a cual%uier tipo de o'jeto de Excel (una hoja" un rango" una celda" etc.) ,as dos siguientes l&neas son iguales %ue antes6 primero presentamos un pe%ue5o mensaje al usuario" y luego o'tenemos el valor y convertimos la cadena a un valor num(rico. En las tres siguientes l&neas est todo lo nuevo. Vamos por pasos6 Selection es una propiedad del o'jeto -pplication" o sea %ue al escri'ir Selection Excel supone %ue estamos escri'iendo -pplication.Selection. #ues 'ien" la propiedad Selection nos devuelve el rango %ue est seleccionado en la hoja activa" es decir" un o'jeto de tipo =ange. 2on Selection o'tenemos un o'jeto de tipo =ange %ue apunta al rango seleccionado de la hoja activa. ?i accedemos a la propiedad Cells de ese o'jeto =ange" o'tendremos un 1conjunto1 de todas las celdas de ese rango. BNue es un conjuntoC 9n conjunto es un o'jeto %ue contiene otros o'jetos" generalmente del mismo tipo (la definici)n la he copiado de la ayuda de !indo$s). ,a propiedad 2ells de un o'jeto =ange nos devuelve un conjunto %ue contiene todas las celdas de ese rango. ,uego viene una instrucci)n 10or1. En la entrega anterior vimos una instrucci)n @or" pero un poco distinta a esta. En ese caso lo %ue hac&amos era dar a una varia'le distintos valores" desde el - hasta el -4" y para cada valor de la varia'le ejecut'amos unas instrucciones. Anlogamente" en esta ocasi)n vamos a dar a la varia'le 1h1 (de tipo 'ject) unos valores" y para cada valor de 1h1 vamos a ejecutar una instrucci)n. #ara dar los distintos valores a 1h1 vamos a utili*ar la instrucci)n 1 0or Eac"1" %ue 1re*ite un gru*o de enunciados *ara cada elemento de una matri/ o de un con.unto 1. El conjunto %ue vamos a utili*ar es Selection.Cells" %ue como sa'emos son todas las celdas del rango seleccionado. Es decir" %ue con

For Eac/ / )n Selection.Cell /.5alue = /.5alue ( 1 ?e"t / lo %ue hacemos es ejecutar una instrucci)n para cada una de las celdas del conjunto Selection.Cells. ,a primera ve* %ue se ejecute la instrucci)n de dentro del 'u'le" h representar la primera celda del conjunto de celdas" la segunda ve* representar la segunda celda del conjunto" etc. En este caso lo %ue hemos hecho ha sido sumar el valor uno a todas las celdas del rango seleccionado. ,a instrucci)n %ue va dentro del 'ucle es la misma %ue en el ejemplo anteriorM tan s)lo f&jate %ue utili*amos 1h1 en lugar de Active2ell. Vamos a hacer otro pe%ue5o ejemplo del uso de 1 0or Eac"1 y de conjuntos. En esta ocasi)n vamos a cam'iar el nom're de todas las hojas del li'ro activo. #ara o'tener una referencia al li'ro activo utili*aremos la propiedad -cti.e1or2boo2 del o'jeto -pplication. #ara acceder a todas las hojas de clculo del li'ro activo" utili*aremos la propiedad 1or2s"eets de dicho o'jeto" Active!or>'oo>. 7e utili*ado la propiedad !or>sheets por%ue esta nos devuelve s)lo las hojas de clculo (no las hojas de grficos" m)dulos" etc.). ?i %ueremos acceder a todas las hojas (de cual%uier tipo) del li'ro" utili*aremos la propiedad S"eets" %ue funciona igual %ue !or>sheets. A%u& va la rutina de ejemplo6 Sub ?ombre #o6a () 8im / A %b6ect 8im i A )nteger i = 1B For Eac/ / )n ActiveCor&boo&.Cor& /eet /.?ame = "#o6a " 3 i i = i ( 1 ?e"t / End Sub ,o %ue hace esta rutina es cam'iar los nom'res de las hojas de clculo del li'ro activo" poni(ndoles los nom'res 17oja-31" 17oja-P1" etc. Ao es %ue sea una rutina demasiado 8til" pero como siempre sirve para aprender un poco.

2omo siempre" empe*amos con la declaraci)n de varia'les. ,uego le damos a la varia'le 1i1 el valor -3" por%ue nos da la gana" pod&amos ha'erle dado cual%uier otro. ,uego viene lo %ue nos interesa" el &0or Eac"&. #ara cada hoja de clculo (!or>sheets) del li'ro activo (Active!or>'oo>) vamos a ejecutar las dos instrucciones %ue estn dentro del 'ucle. #ara cam'iar el nom're de una hoja utili*amos la propiedad 3ame. ,uego incrementamos el valor de 1i1 para dar el nom're a la hoja siguiente. (?i intentamos dar a dos hojas el mismo nom're Excel nos dar un mensaje de error) Bueno" otra rutina para jugar un poco con hojas y celdas6 Sub Di ta#o6a () 8im / A %b6ect 8im r A Range )* M g!o"("E ta macro crea en la celda activa una li ta con lo nombre de toda " 3 4 C/r(1+) 3 "la /o6a del libro activo."$ vb%-$ "Di ta #o6a ") = vbCancel 4 ./en E"it Sub Set r = ActiveCell For Eac/ / )n ActiveCor&boo&.S/eet r.5alue = /.?ame r.%** et(=$ 1).5alue = .'pe?ame(/) Set r = r.%** et(1$ =) ?e"t / End Sub ,o %ue hace esta rutina es crear en la hoja de clculo activa una ta'la con los nom'res de todas las hojas del li'ro. #rimero" con 1?et r J Active2ell1" hacemos %ue la varia'le 1r1 apunte a la celda activa. ,uego viene el 'ucle &0or Eac" 4 3e)t&" %ue al igual %ue en el ejemplo anterior hace %ue el c)digo entre estas dos l&neas se ejecute una ve* para cada hoja del li'ro. ,a 8nica diferencia es %ue en el ejemplo anterior utili*'amos &-cti.e1or2boo2.1or2s"eets& (%ue pasa por

todas las hojas de 1clculo1 del li'ro) y a%u& &-cti.e1or2boo2.S"eets& (%ue pasa por todas las hojas del li'ro" de todo tipo). #rimero damos a la celda 1r1 el nom're de la primera hoja del li'ro. En la siguiente l&nea" ponemos en a celda de la derecha de 1r1 (con el ffset(4"-)) el tipo de hoja de %ue se trata" utili*ando la funci)n &!ype3ame+",&6 esta funci)n devuelve una cadena de carcteres %ue proporciona informaci)n so're la varia'le 1h1. En la siguiente l&nea" utili*ando otra ve* 5ffset" 1movemos1 la varia'le 1r1 para %ue apunte a la celda inferior. G as&" vuelta a empe*ar. G para terminar" vamos a aprender a utili*ar el m(todo Copy" %ue se aplica a o'jetos de Excel %ue puedan ser copiados" como por ejemplo un o'jeto de tipo =ange" aun%ue tam'i(n a otros o'jetos como hojas enteras o grficos. ,o %ue vamos a hacer es copiar en la celda activa el contenido de la celda de su i*%uierda6 Sub Copiar4Celda)@Auierda() )* M g!o"("E ta macro copia en la celda activa el contenido de la celda ituada" 3 4 C/r(1+) 3 "a u i@Auierda."$ vb%-$ "Copiar celda i@Auierda") = vbCancel ./en E"it Sub ActiveCell.%** et(=$ E1).Cop' ActiveCell End Sub ,a sintaxis de Copy es muy sencilla6 se ejecuta el m(todo 2opy so're el rango de 1origen1" es decir" el %ue %ueremos copiar. En el ejemplo" hacemos 1Active2ell. ffset(4".-).2opy1" ya %ue %ueremos copiar la celda %ue est a la i*%uierda de la celda activa. El parmetro del m(todo 2opy indica el rango de 1destino1 para la copia. En nuestro ejemplo ponemos 1Active2ell1" ya %ue %ueremos %ue lo %ue hemos copiado se copie en la celda activa. ?i omitimos el parmetro del m(todo 2opy la copia se har en el 1#ortapapeles1" y luego de'eremos utili*ar otros m(todos como 1#aste1 o 1#aste?pecial1 para pegar el contenido del portapapeles en otra celda.

7asta a%u& llega esta segunda entrega del curso. En este cap&tulo hemos aprendido a tra'ajar con celdas" rangos" li'ros y hojas" %ue es una de las partes ms 8tiles de la programaci)n en Excel" permiti(ndonos hacer cual%uier operaci)n (mover" copiar" 'orrar" hacer operaciones aritm(ticas" etc) con los datos de una hoja de clculo.

Captulo 6. Cuadros de dilo%o +7serforms,. Este cap&tulo va a tratar so're los cuadros de dilogo" %ue se utili*an para o'tener informaci)n del usuario. 9na aclaraci)n respecto a versiones6 uno de los cam'ios ms importantes de Excel :3 a Excel :; en el apartado de programaci)n es la parte de cuadros de dilogo. ,a verdad es %ue hay muchas diferencias entre am'os y eso hace imposi'le ha'lar de las dos versiones a la ve*" por lo %ue este cap&tulo est dirigido s)lo a Excel :;.

@o os #os e-em!#os e este ca!;tu#o est,n inc#u; os en este E1ce#301#s fic6e"o8 %11K7bs& ,os cuadros de dilogo en ffice :; son mucho ms potentes %ue en la versi)n anterior. ?e han a5adido muchas opciones" como la posi'ilidad de definir eventos" utili*ar controles ActiveQ adems de los incluidos en Excel (si no sa'es %u( es un control ActiveQ no tiene demasiada importancia" es un tema avan*ado %ue %ui* alg8n d&a tratemos)" etc. Auestro primer cuadro de dilogo va a ser muy sencillo6 vamos a presentar un cuadro de dilogo en el %ue el usuario puede introducir un n8mero" y si pulsa 1Ace*tar1 copiaremos el n8mero introducido en la celda activa. ?i el usuario pulsa 1Cancelar1 no haremos nada. ,o primero es ir al editor de Visual Basic" utili*ando la opci)n 17erramientas" Macro" Editor de Visual Basic1" o simplemente pulsando Alt.@--. En la parte i*%uierda de la pantalla tendremos el 1Explorador de #royectos1 y la ventana de 1#ropiedades1. <gual %ue antes" si no puedes ver estas ventanas utili*a el men8 1Ver1 para hacer %ue apare*can. En el 1Explorador de #royectos1 aparecen todos los 1proyectos1 de VBA6 cada li'ro %ue tengamos a'ierto es un proyecto. +entro de cada li'ro aparecen todas las hojas del li'ro y tam'i(n los m)dulos y cuadros de dilogo %ue crearemos ms adelante. En la ventana de 1#ropiedades1 aparecen las propiedades del o'jeto %ue tengamos seleccionado en ese momento. ?upongo %ue a estas alturas ya de'e estar claro el concepto de 1propiedad1 de un o'jeto. #or ejemplo" vamos a ir a un proyecto de VBA en el 1 "$*lorador de 0ro1ectos1. +entro de (l veremos las hojas de clculo del li'ro" y vamos a seleccionar una de ellas. En la ventana de 1 0ro*iedades1 van a aparecer las propiedades de la hoja seleccionada. #or ejemplo" la primera propiedad %ue vemos es la propiedad 3ame" %ue ya conocemos. #odemos utili*ar la ventana de 1 0ro*iedades1 para cam'iar las propiedades del o'jeto seleccionado.

Ahora para crear nuestro cuadro de dilogo vamos a utili*ar la opci)n 1<nsertar" 9serform1 (7serform es el nom're %ue da Excel :; a los cuadros de dilogo). En este momento vemos en la parte derecha un cuadro de dilogo vac&o" y por otro lado veremos el 1Cuadro de "erramientas1" en el %ue estn todos los controles %ue podemos poner en el cuadro de dilogo. ?i no aparece el Cuadro de Herramientas utili*a la opci)n 1Ver, Cuadro de %erramientas1 para %ue apare*ca. ,os controles del 1Cuadro de %erramientas1 son los t&picos de cual%uier cuadro de dilogo %ue podemos ver en cual%uier aplicaci)n de !indo$s6

Eti8ueta6 para mostrar un texto en el cuadro de dilogo. El usuario no puede editarlo. Cuadro de te)to6 para %ue el usuario introdu*ca un texto. Cuadro combinado6 el clsico control de persiana para %ue el usuario seleccione una opci)n entre varias. Cuadro de lista6 para %ue el usuario seleccione una opci)n de entre las %ue le presentamos. Casilla de .erificacin6 verdadero o falso (otn de opcin6 tam'i(n para %ue el usuario seleccione una opci)n entre varias. (otn de comando6 un 'ot)n normal y corriente" como los t&picos de 1Ace*tar1 y 1Cancelar1

9arco6 para agrupar varios controles. ?u uso es 'sicamente por ra*ones est(ticas. 2omo puedes ver en el dilogo de ejemplo un marco puede tener distintas apariencias.

#rimero vamos a ver las propiedades del objeto 7ser0orm . #ara ello seleccionamos el 9serform de la parte derecha simplemente pulsndolo con el rat)n. En la parte inferior i*%uierda" en la ventana de #ropiedades" tenemos la lista de propiedades del o'jeto 9ser@orm. 9tili*ando esta ventana podemos cam'iar el valor de cual%uier propiedad del 9serform. Algunas de las propiedades ms importantes son6

3ame6 el nom're con el %ue vamos a identificar el 9ser@orm. Diene %ue ser 8nico y no puede tener espacios ni otros caracteres raros. Go suelo ponerles un nom're %ue empiece por 1uf1 (por ejemplo" u'Datos0ersonales)" por%ue as& cuando en el c)digo VB haga una referencia a este o'jeto s( %ue se trata de un o'jeto 9ser@orm. Caption6 es el t&tulo %ue el usuario ver en el cuadro de dilogo. ?e puede poner cual%uier texto" incluyendo espacios. (ac2Color6 el color de fondo del cuadro de dilogo. #or defecto es el color gris %ue suelen tener todos los cuadros de dilogo en !indo$s. 0oreColor6 el color de primer plano" es decir" del texto %ue apare*ca en el cuadro de dilogo. 0ont6 el tipo de letra por defecto para el cuadro de dilogo. Este es el tipo de letra %ue tendrn todos los controles %ue insertemos en el cuadro de dilogo" pero si luego %ueremos cam'iarlo para cual%uier control puede hacerse. Startup:osition6 la posici)n en la %ue aparecer el cuadro de dilogo. ?i le damos el valor 12enter?creen1 el dilogo saldr en el centro de la pantalla. SpecialEffect6 para cam'iar un poco los 'ordes del cuadro de dilogo.

:icture$ :icture-li%nment$ :ictureSi;e9ode$ :icture!ilin% 6 se utili*an para poner un di'ujo como fondo del cuadro de dilogo.

7ay ms propiedades" pero su uso es 'astante sencillo" y consultando la ayuda encontrars la descripci)n de todas las propiedades. Vamos con nuestro dilogo6 lo primero es cam'iarle el nom'reM vamos a la ventana de #ropiedades y en la propiedad Aame" escri'imos por ejemplo 1u'0rimero1. ,uego en la propiedad 12aption1 escri'iremos 1 Mi *rimer 2ser orm1. ,as dems propiedades las dejamos como estn" aun%ue si %uieres cam'iar alguna %ue afecte a la presentaci)n del dilogo (color de fondo" efectos especiales" etc) puedes hacerlo tran%uilamente. En cual%uier momento puedes pro'ar tu cuadro de dilogo seleccionndolo con el rat)n y utili*ando la opci)n 1Ejecutar" Ejecutar ?u'R9serform1 (o ms rpido pulsando @3 o el 'ot)n de ejecutar ). #ara cerrar el dilogo tendrs %ue utili*ar la 1Q1 %ue aparece en la parte superior derecha" por%ue todav&a no hemos a5adido ning8n 'ot)n para cerrar el dilogo. 2omo hemos dicho antes" en nuestro cuadro de dilogo %ueremos %ue el usuario escri'a un n8mero. #ara %ue pueda hacerlo" tendremos %ue poner un cuadro de te)to en el dilogo. #ara ello pulsamos en el 9ser@orm para %ue apare*ca el 12uadro de 7erramientas1 y en (ste pulsamos so're el control 12uadro de Dexto1 . 9na ve* seleccionado el 12uadro de Dexto1 pulsamos en cual%uier parte del 9ser@orm y veremos %ue aparece un cuadro de edici)n. #odemos utili*ar el rat)n para moverlo y cam'iarle el tama5o. #ulsando con el rat)n" seleccionaremos el cuadro de edici)n" y como de costum're veremos %ue en la ventana de 1#ropiedades1 aparecen todas las propiedades del o'jeto 1 Cuadro de )e$to1 ()e$t#o$ en ingl(s)" entre las %ue se encuentran6

3ame6 el nom're del o'jeto. 2omo antes" no puede incluir espacios ni caracteres especiales. Go suelo utili*ar nom'res %ue empiecen por 1t'1" para identificar estos o'jetos como un DextBox" pero se puede utili*ar cual%uier nom're.

!e)t6 es el texto %ue va dentro del cuadro de edici)n" es decir" el %ue ha escrito el usuario. !e)t-li%n6 alineaci)n del texto dentro del cuadro de dilogo. Aormalmente si lo %ue %ueremos es %ue el usuario introdu*ca una cadena de texto se suele alinear a la i*%uierda" y si %ueremos %ue introdu*ca n8meros se suele alinear a la derecha. 9ulti<ine6 los valores posi'les son verdadero y falso" indicando si %ueremos %ue el control permita al usuario escri'ir ms de una l&nea o no.

,as propiedas so're la apariencia del control son parecidas a las %ue hemos visto antes (Bac>2olor" @ore2olor" ?pecialEffects). El resto de propiedades se pueden consultar en la ayuda. Aun%ue pare*ca %ue nos estamos dejando muchas cosas" una ve* %ue empe*amos a tener claras las cosas el utili*ar propiedades %ue no hemos usado nunca es muy sencillo. sea" %ue por ahora nos centramos en lo 'sico. Bueno" ahora vamos a nuestro cuadro de dilogo. ?eleccionamos nuestro cuadro de edici)n" lo colocamos en una posici)n %ue nos guste" y vamos a las propiedades. #rimero la propiedad Aame" %ue en este caso vamos a dejar tal como est" DextBox-. Ao suele ser aconseja'le dejar estos nom'res" por%ue si tienes varios cuadros de edici)n en un dilogo al final no sa'es a cul te ests refiriendo" pero como en este caso s)lo vamos a tener un cuadro de edici)n no nos importa demasiado. Ahora vamos a la propiedad 1DextAlign1 y vamos a seleccionar la opci)n 1fmDextAlign=ight1 para alinear el texto a la derecha" ya %ue lo %ue %ueremos es %ue le usuario introdu*ca un n8mero. #or ahora no vamos a hacer nada ms con este control. ?i ejecutamos el cuadro de dilogo veremos %ue podemos introducir un valor en el cuadro de edici)n %ue hemos creado" pero aparte de eso no podemos hacer mucho ms. ,o siguiente %ue vamos a hacer es poner un texto descriptivo para el cuadro de edici)n. #ara ello seleccionamos del 12uadro de herramientas1 el control 1Eti%ueta1 " y pulsamos en el 9ser@orm para crear un control del tipo eti%ueta. 9tili*ando el rat)n le podemos cam'iar el tama5o y moverlo" para ponerlo a la i*%uierda del control de edici)n %ue hemos creado antes.

En la ventana de propiedades de nuestro nuevo control (recuerda %ue tienes %ue seleccionarlo para poder ver sus propiedades en la ventana de propiedades) veremos como siempre la lista de propiedades. ,a propiedad Aame la vamos a dejar como est" ya %ue no vamos a referirnos a este control en el c)digo" y no nos interesa su nom're6 normalmente los controles de eti%ueta se utili*an s)lo para poner un texto en el dilogo" y no se suelen referenciar desde el c)digo VB. ,a propiedad %ue nos interesa es 12aption1" en la %ue escri'iremos el texto %ue %ueremos %ue apare*ca en el cuadro de dilogo" por ejemplo 1Escri'e un n8mero61. ?i colocamos 'ien los dos controles (utili*ando por ejemplo la opci)n 1@ormato" Alinear" Medio)" ya tenemos un dilogo algo ms completo. ,o t&pico en estos cuadros de dilogo es %ue en la parte inferior haya dos 'otones" uno para 1Ace*tar1 y el otro para 1Cancelar1. Vamos a colocar estos dos 'otones" empe*ando por el de 12ancelar1 %ue es un poco ms fcil. 2omo antes" vamos al 1Cuadro de Herramientas1 y seleccionamos el control 1(otn de comando1 . #ulsamos so're el 9ser@orm y hemos creado nuestro primer 'ot)n" %ue podemos mover y cam'iar de tama5o utili*ando el rat)n. 9na ve* seleccionado nuestro nuevo control podremos ver sus propiedades en la ventana de 1 0ro*iedades16

3ame6 el nom're del control. Vamos a darle el nom're 1cbCancel1 (c' viene de Command#utton). Caption6 el texto del 'ot)n. ,)gicamente" vamos a poner 1Cancelar1. Cancel6 puede ser verdadero o falso. ?)lo puede ha'er un control en el cuadro de dilogo con la propiedad 2ancel esta'lecida como verdadero. ?i le damos a 2ancel el valor verdadero" cuando se est( ejecutando el cuadro de dilogo si el usuario pulsa 1Escape1 ser como si hu'iese pulsado con el rat)n so're este 'ot)n. En este caso nos interesa %ue ocurra" o sea %ue vamos a darle el valor verdadero. 'efault6 verdadero o falso" indica si el 'ot)n es el 'ot)n por defecto del cuadro de dilogo. ?i el usuario pulsa 1 "nter1 cuando est viendo el dilogo ser como si pulsa con el rat)n so're el

'ot)n %ue tenga la propiedad +efault (s)lo puede ha'er uno). En este caso vamos a dejar la propiedad en @alse por%ue %ueremos %ue el 'ot)n por defecto sea el de 1Aceptar1" %ue crearemos ms adelante. #or ahora dejamos el resto de propiedades de los 'otones. Bueno" hasta ahora le hemos dado a nuestro 'ot)n el nom're 1 cbCancel1" le hemos puesto el texto 1Cancelar1 y hemos dado el valor 1Verdadero1 a la propiedad 1Cancel1. ?i ejecutamos el cuadro de dilogo veremos %ue tenemos un 'ot)n muy 'onito" pero %ue no hace a'solutamente nada. #ara %ue haga algo tenemos %ue meternos con un concepto muy importante de la programaci)n orientada a o'jetos" los E.entos. A estas alturas ya de'er&an estar claros los conceptos de 5bjeto" :ropiedad y 9todo. En Excel" un o'jeto es una varia'le %ue representa cual%uier elemento de Excel" como un rango" un li'ro" una celda" o un 9ser@orm. Dodos los o'jetos tienen propiedades (como 2ell.Value" !or>'oo>.Aame o 9ser@orm.Bac>2olor)" y m(todos (como =ange.2lear2ontents o 9ser@orm.?ho$). Adems de propiedades y m(todos los o'jetos tienen tam'i(n 1e.entos1. 7e mirado en la ayuda y no he encontrado una definici)n de evento" y tampoco me atrevo a dar una" pero voy a ver si puedo explicar el concepto. <maginemos %ue tenemos un control" como por ejemplo el control de edici)n %ue hemos colocado en nuestro dilogo. 2uando sucede un 1evento1 de los %ue este control 1entiende1" Excel llamar a una funci)n con un nom're especial" siempre %ue hayamos definido esa funci)n (si no la hemos definido" no pasa nada" el 1evento1 se ignora). 9n ejemplo de evento es %ue el usuario mueva el rat)n por encima de nuestro control. 2ada ve* %ue el rat)n se mueve se produce un evento 1MouseMove1" y entonces Excel llamar a la rutina )e$t#o$13MouseMove( ... )" en caso de %ue hayamos definido esa rutina" lo %ue haremos en caso de %ue nos interese hacer algo cada ve* %ue el rat)n pase por encima de nuestro control. El nom're de la rutina es especial6 primero va el nom're del control (recuerda %ue lo ha'&amos dejado tal como nos lo ha'&a puesto Excel" )e$t#o$1)" luego un carcter de su'rayado (1H1)" y luego el nom're del evento.

tro ejemplo de evento6 %ueremos %ue el usuario introdu*ca un n8mero en el cuadro de edici)n" pero si lo pro'amos veremos %ue se puede escri'ir cual%uier carcter %ue no sea un n8mero. 2ada ve* %ue el usuario pulsa una tecla se produce el evento 1 4e10ress1" %ue podemos utili*ar para ignorar la tecla pulsada por el usuario si (ste pulsa una tecla %ue no es un n8mero. Ms adelante veremos c)mo se hace. Bueno" no s( si ha %uedado muy claro" pero creo %ue con un poco de prctica espero %ue s&. +ominar los conceptos de objeto" propiedad" mtodo y e.ento es muy importante" pero no s)lo para programaci)n en Visual Basic for Applications" sino %ue estos conceptos son 'sicos en todos los lenguajes de programaci)n orientada a o'jetos (Visual Basic" Borland +elphi" Sava" etc.). +e hecho" si dominas esos conceptos con cuatro cosas ms podrs programar en cual%uiera de esos otros lenguajes. Bueno" sigamos con los eventos. Vamos a centrarnos ahora en nuestro 'ot)n de 1Cancelar1. El evento ms normal para un 'ot)n es %ue el usuario lo pulse con el rat)n (o con el teclado). 2uando esto ocurra" se generar un evento Clic2" y llamar a la rutina cbCancelar/Clic2(). (cbCancelar es el nom're %ue ha'&amos dado al control" y 2lic> es el nom're del evento). ,o ms fcil para crear un evento es seleccionar un control y luego pulsar el 'ot)n derecho y seleccionar la opci)n 1Ver Cdigo1. Veremos una pgina de c)digo VB en la %ue Excel ha'r escrito la ca'ecera de un evento para dicho control (la verdad es %ue no s( cul de los eventos coge" supongo %ue coger el ms utili*ado). En nuestro caso" si pulsamos so're el 'ot)n 1Cancelar1 con el 'ot)n derecho y luego 1 Ver cdigo1 en la pgina de c)digo veremos lo siguiente6 ,rivate Sub cbCancelar4Clic&() End Sub Excel nos ha creado la ca'ecera para la funci)n %ue %ueremos crear. En este caso la funci)n no tiene ning8n parmetro" pero en otros eventos la funci)n tiene una lista de parmetros" y Excel tam'i(n nos los pone en la ca'ecera.

tra cosa" la pgina de c)digo %ue estamos viendo es como un m)dulo normal en el %ue escri'imos nuestro c)digo" con la particularidad de %ue no sale en la lista de m)dulos en el 1Explorador de #royectos1" ya %ue es un m)dulo asociado al 9serform. #ara crear una funci)n para cual%uier otro evento tenemos en la parte superior de la ventana de c)digo dos 1 *ersianas1. En la persiana de la i*%uierda tenemos el o'jeto so're el %ue %ueremos definir una funci)n para un evento. En la persiana de la derecha tenemos todos los eventos %ue pueden ocurrir para el control seleccionado en la persiana de la i*%uierda. ?i %ueremos definir la funci)n para otro evento lo 8nico %ue tenemos %ue hacer es seleccionar otro evento en esta persiana" y Excel insertar en el c)digo la ca'ecera para la funci)n %ue se va a ejecutar cuando se de ese evento. Bueno" lo %ue %ueremos hacer cuando el usuario pulsa el 'ot)n de 2ancelar es simplemente cerrar el cuadro de dilogo. Dendremos %ue cerrar el cuadro de dilogo cuando Excel nos avise de %ue ha ocurrido un evento 2lic>" es decir" dentro de la funci)n c'2ancelarH2lic>(). ,a instrucci)n %ue se utili*a para cerrar el 9ser@orm es 19nload1" %ue sirve para %uitar un o'jeto de la memoria. ,a instrucci)n 9nload re%uiere un parmetro" %ue utili*aremos para indicarle cul es el o'jeto. En nuestro caso utili*aremos la pala'ra clave 1Me1" %ue apunta al o'jeto en el %ue se est ejecutando el c)digo" es decir" nuestro 9ser@orm. Auestro 1manejador de eventos1 para el evento 2lic> del 'ot)n c'2ancel %uedar&a as&6 ,rivate Sub cbCancelar4Clic&() Fnload Me End Sub 2uando el usuario pulse el 'ot)n de 2ancelar se generar un evento 2lic>" y Excel llamar a nuestra funci)n" %ue utili*ar la instrucci)n 9nload para cerrar el dilogo. @&jate en %ue si pulsas la tecla 1Escape1 el

dilogo se cierra igual %ue si hu'ieses pulsado con el rat)n so're el 'ot)n6 esto es de'ido a %ue hemos dado el valor verdadero a la propiedad 12ancel1 del 'ot)n 2ancelar. +espu(s de pro'ar el cuadro de dilogo y compro'ar %ue nuestro 'ot)n de 2ancelar funciona perfectamente nos %ueda a5adir el 'ot)n de Aceptar. #ara crear el 'ot)n seleccionamos en el 12uadro de 7erramientas1 el 1Bot)n de comando1 y lo colocamos en el 9ser@orm. ,uego le ponemos su nom're (c'Aceptar por ejemplo)" cam'iamos su texto (ponemos Aceptar) y le damos el valor 1Verdadero1 a la propiedad +efault para %ue si el usuario pulsa Enter sea como si hu'iese pulsado con el rat)n so're el 'ot)n. Ahora nos %ueda todo el tema de los eventos. El procedimiento es el mismo %ue con el 'ot)n de 2ancelar" con la 8nica diferencia de %ue antes de cerrar el cuadro de dilogo (con la instrucci)n 9nload) de'eremos hacer lo %ue %ueremos %ue nuestro dilogo haga" es decir" copiar el contenido del cuadro de edici)n DextBox-. ,a funci)n ser&a la siguiente6 ,rivate Sub cbAceptar4Clic&() ActiveCell.5alue = .e"t!o"1.5alue Fnload Me End Sub Esta funci)n es prcticamente igual %ue la %ue hemos escrito para el 'ot)n Cancelar" con la excepci)n de %ue antes de cerrar el cuadro de dilogo escri'imos otra l&nea" %ue se encarga de copiar en la celda activa (Active2ell) el contenido del cuadro de edici)n. @&jate como accedemos al contenido del cuadro de edici)n" a trav(s del nom're del control (DextBox-) y su propiedad Value" %ue nos devuelve el valor num(rico de lo %ue se ha introducido en el control (si hay caracteres no num(ricos la propiedad Value nos devolver el valor 4). ?i pro'amos ahora el cuadro de dilogo veremos %ue ya funciona perfectamente" ya hemos conseguido %ue nuestro primer 9ser@orm funcione. El 8nico pro'lema %ue tiene es %ue en el cuadro de edici)n el usuario puede escri'ir cual%uier caracter adems de n8meros. #ara evitar esto ya he adelantado antes %ue hay %ue utili*ar el evento Tey#ress del cuadro de edici)n" pero eso lo veremos ms adelante.

El se%undo cuadro de dilo%o. Vamos a hacer otro cuadro de dilogo6 tenemos en una hoja de clculo una celda con el nom're de una persona y otra celda con el apellido. Nueremos crear un 9serform %ue permita al usuario editar ese nom're y apellido" y si pulsa Aceptar en el cuadro de dilogo los valores de esas celdas de'en actuali*arse con lo introducido por el usuario. ?i te fijas en el fichero de ejemplo vers las dos celdas %ue incluyen el nom're y el apellido. A estas celdas les he dado el nom're 1rngAom're1 y 1rngApellido1" respectivamente. 2uando hagamos referencias a celdas de hojas de clculo en nuestro c)digo es muy conveniente utili*ar nom'res de rangos en lugar de referencias a'solutas (como por ejemplo 2-/)" ya %ue si utili*amos nom'res de rangos y movemos esas celdas no tenemos %ue hacer ning8n cam'io en el c)digo" lo %ue de'eremos hacer si utili*amos referencias a'solutas. =epetimos los pasos anteriores6 2rear el 9ser@orm" utili*ando 1<nsertar" 9serform1 en el editor de Visual Basic. Vamos a dar al 9ser@orm el nom're 1uf+atos#ersonales1 <nsertamos dos cuadros de texto" uno para el nom're y otro para el apellido" a los %ue daremos los nom'res t'Aom're y t'Apellido.

<nsertamos dos eti%uetas %ue colocaremos a la i*%uierda de cada uno de los dos cuadros de texto. <nsertamos un 'ot)n para 2ancelar el cuadro de dilogo" al %ue cam'iaremos el nom're a 1c'2ancelar1" el texto a 12ancelar1 (utili*ando la propiedad 2aption1) y daremos a la propiedad 2ancel el valor Verdadero.

<nsertamos un 'ot)n para Aceptar" cam'indole el nom're a 1c'Aceptar1" el texto a 1Aceptar1 y damos a la propiedad +efault el valor Verdadero.

Vamos con los eventos6 para el 'ot)n 2ancelar la funci)n %ue de'emos escri'ir es exactamente igual %ue en el caso anterior6 ,rivate Sub cbCancelar4Clic&() Fnload Me End Sub ,o 8nico %ue hace es cerrar el cuadro de dilogo al producirse el evento 12lic>1 del 'ot)n 2ancelar. ,a funci)n para el 'ot)n Aceptar tam'i(n es muy similar a la anterior6 ,rivate Sub cbAceptar4Clic&() Range("rng?ombre").5alue = tb?ombre..e"t Range("RngApellido").5alue = tbApellido..e"t Fnload Me End Sub Esta funci)n se ejecuta tam'i(n cuando se produce el evento 2lic> del 'ot)n llamado c'Aceptar. Antes de cerrar el cuadro de dilogo de'emos guardar en las celdas de la hoja de clculo los valores de los cuadros de texto. #ara ello utili*amos un o'jeto =ange (a estas alturas somos unos autenticos expertos en el o'jeto =ange)" y le asignamos a su propiedad Value el valor de la propiedad Dext del o'jeto DextBox. Esta es la 8nica novedad" la utili*aci)n de una propiedad de los o'jetos DextBox (t'Aom're y t'Apellido). ?i ejecutamos ahora el cuadro de dilogo veremos %ue funciona perfectamente6 si cam'iamos los nom'res en el 9ser@orm y pulsamos Aceptar veremos %ue las celdas de la hoja de clculo han cam'iado y ahora contienen los nuevos nom'res. #ero hay una pe%ue5a opci)n %ue se nos ha escapado6 si vamos directamente a la hoja de clculo" cam'iamos los nom'res en sus celdas" y ejecutamos el 9serform" veremos %ue los controles de edici)n no tienen ahora los nom'res actuali*ados" ya %ue no recogen

los cam'ios %ue hemos hecho nosotros directamente en la hoja de clculo. #ara eso vamos a utili*ar tam'i(n los eventos. En esta ocasi)n vamos a utili*ar un evento del 9serform (s&" los 9ser@orms tam'i(n tienen eventos). ?e trata del evento <nitiali*e" %ue se produce justo antes del %ue el 9ser@orm apare*ca en la pantalla. Ese es el momento para hacer cual%uier cam'io en el 9serform" como poner un texto en un control" %ue es lo %ue %ueremos hacer. #or lo tanto" seleccionamos el 9ser@orm" pulsamos con el 'ot)n derecho y luego la opci)n 1Ver c)digo1 (tam'i(n se puede hacer do'le. clic> so're el 9serform) y en la persiana de la derecha seleccionaremos el evento <nitiali*e. Excel crear en ese momento la ca'ecera de nuestra funci)n6 ,rivate Sub F erForm4)nitiali@e() End Sub Ahora tenemos %ue escri'ir el c)digo %ue %ueremos %ue se ejecute antes de %ue se muestre el 9serform. ,o %ue %ueremos hacer es poner en los dos cuadros de texto (el de nom're y el de apellido) el contenido de las celdas %ue tienen esos datos. #ara ello utili*aremos el siguiente c)digo6 ,rivate Sub F erForm4)nitiali@e() tb?ombre..e"t = Range("rng?ombre").5alue tbApellido..e"t = Range("rngApellido").5alue End Sub Ao creo %ue tenga demasiada dificultad. Es lo mismo %ue hemos escrito para el 'ot)n Aceptar pero al rev(s" es decir" damos a los cuadros de texto del 9serform el valor %ue tienen las celdas de la hoja de clculo. #ues ya est" ahora s& %ue el cuadro de dilogo funciona perfectamente" tanto si hacemos los cam'ios en el 9ser@orm (se actuali*ar la hoja de clculo si pulsamos Aceptar) como si hacemos los cam'ios en la hoja de clculo (se actuali*ar el 9ser@orm antes de aparecer en pantalla" por%ue se ha'r ocurrido un evento <nitiali*e).

Bueno" hasta a%u& llega esta tercera entrega. Dodav&a nos %ueda mucho por ver so're los cuadros de dilogo (o 9ser@orms" o formularios" como prefieras)" pero eso lo dejamos para la pr)xima entrega. 7asta entonces te toca practicar" y so're todo recuerda %ue lo ms importante es tener claros los conceptos importantes6 objetos$ propiedades$ mtodos y e.entos.

Captulo =. Cuadros de dilo%o +7serforms,. Se%unda parte. ?eguimos con los 9ser@orms y los controles. En esta entrega vamos a ampliar el dilogo so're datos personales" a5adi(ndole ms opciones" y vamos a crear dos nuevos userforms6 uno para convertir de pesetas a euros y viceversa" y otro para hacer operaciones (sumar" restar...) so're un rango seleccionado (algo parecido a lo %ue hicimos antes" pero ms completo). @o os #os e-em!#os e este ca!;tu#o est,n inc#u; os en este E1ce#401#s fic6e"o8 %11<7bs& #rimero vamos a volver a hacer un dilogo de 1 Datos 0ersonales1 como el de la entrega anterior" pero a5adiendo algunas cosas. #artimos del userform de la entrega anterior" %ue ten&a un cuadro de edici)n para el nom're y otro para el apellido" y los dos 'otones clsicos (Aceptar y 2ancelar). 7a'&amos escrito el c)digo necesario para %ue al a'rirse el dilogo (evento Initiali;e del 9serform) los cuadros de edici)n se llenen con el texto de las celdas de la hoja de clculo" y tam'i(n para %ue cuando el usuario pulse Aceptar (evento Clic2 del 'ot)n) se copie el texto de los cuadros de edici)n a la hoja de clculo. #ara hacer estos traspasos entre la hoja de clculo y el 9serform ha'&amos escrito un par de l&neas de c)digo en los eventos indicados" pero vamos a ver %ue hay otro m(todo para hacerlo6 Dodos los controles tienen la propiedad 1 ControlSource1" %ue se utili*a para decirle al control cul es la 1fuente1 de su informaci)n" %ue ser una celda o un rango de una hoja de clculo. #or ejemplo" en el cuadro de edici)n del Aom're podemos poner como 2ontrol?ource la celda de la hoja de clculo en la %ue est ese dato. 2omo siempre" no vamos a utili*ar referencias a'solutas a celdas y rangos (p.ej. 7oja-U A3)" sino %ue vamos a utili*ar nom'res de rango. #or ejemplo" vamos a la hoja de clculo y damos a la celda 1fuente1 el nom're 1rng+ombre1 (rng por%ue es un rango de una hoja de clculo). ,uego vamos al editor VBE" seleccionamos el control de edici)n Aom're y en

su propiedad 2ontrol?ource escri'imos el nom're del rango %ue %ueremos %ue sea su 1fuente1" en este caso 1rngAom're1. Ahora hacemos lo mismpo para el apellido6 primero damos el nom're 1rngApellido1 a la celda de la hoja de clculo y luego escri'imos rngApellido en la propiedad 2ontrol?ource del control de edici)n de Apellido. Ahora tenemos %ue 'orrar el c)digo %ue ha'&amos escrito para pasar la informaci)n de hoja de clculo al 9serform y viceversa. Mejor %ue 'orrarlo" lo %ue haremos ser 1comentarlo1" utili*ando una comilla simple >" %ue indica a Excel %ue todo lo %ue escri'amos en esa l&nea detrs de la comilla son cosas nuestras y %ue las ignore (el texto 1comentado1 aparecer en otro color" normalmente en verde). Aprovechando %ue explico lo de los comentarios" nunca est de ms recordar la importancia %ue tiene a5adir al c)digo todos los comentarios %ue sean necesarios. 2uando ests escri'iendo una rutina sa'es perfectamente c)mo funciona y %u( es lo %ue hace" y todos pensamos %ue los comentarios son innecesarios" pero cuando tras algunas semanas tienes %ue volver a ver la rutina te encuentras con un mont)n de l&neas %ue no sa'es para %u( sirven ni c)mo lo hacen" y si no las has comentado tienes %ue 1'ucear1 en ellas para averiguarlo. A lo %ue &'amos" est'amos 'orrando el c)digo de los eventos Initiali;e del 9serform y Clic2 del 'ot)n Aceptar. Vamos al editor VBE" hacemos do'le.clic> so're el 9serform y nos aparece la rutina 7serform/Initiali;e+,. #onemos una comilla delante de las dos l&neas %ue se encargan de copiar los datos de la hoja de clculo al userform" y veremos %ue dichas l&neas cam'ian de color" indicndonos %ue para Excel son comentarios y los va a ignorar. Ahora volvemos al 9serform y hacemos do'le.clic> en el 'ot)n Aceptar" y nos aparece la rutina btn-ceptar/Clic2+,. Volvemos a poner las comillas en las dos l&neas de c)digo %ue %ueremos %uitar y ya est. ?i pro'amos ahora el dilogo" veremos %ue la propieda 2ontrol?ource funciona" y %ue antes de mostrar el dilogo 1lee1 el contenido de la hoja de clculo y lo pone en el 9serform" y cuando pulsamos Aceptar copia el contenido de los controles del 9serform en la hoja de clculo.

?in em'argo he detectado un pro'lema con el uso de 2ontrol?ource. ?i hacemos alg8n cam'io en el 9serform y luego pulsamos el 'ot)n de 12ancelar1" los cam'ios %ue hemos hecho en los datos se actuali*an en la hoja de clculo" cuando no de'er&an actuali*arse por%ue hemos pulsado 2ancelar. En cam'io" si hacemos alg8n cam'io y pulsamos la tecla Escape los cam'ios no se actuali*an en la hoja de clculo. Es un poco raro. 2reo %ue 1 se me esca*a1 algo" si alguien descu're por %u( ocurre esto %ue me avise. Bueno" ahora vamos a a5adir un control nuevo" %ue Excel llama 1cuadro com'inado1 (el nom're en ingl(s es Combo(o))" %ue es la t&pica persiana %ue estamos hartos de ver en cual%uier dilogo" y permite al usuario escoger una opci)n entre varias %ue le presentamos. En este caso vamos a mostrar una persiana para el 1"stado Civil1" y las opciones %ue vamos a presentar son 1soltero" casado" viudo y divorciado1. ,as propiedades ms importantes de un Combo(o) son6

<ist6 un conjunto de cadenas de caracteres ( strings) %ue representan a todos los elementos de la lista. #ara acceder a un elemento en concreto utili*amos Mi2om'oBox.,ist( 0 )" %ue nos devolver&a el cuarto elemento de la lista" ya %ue el primero tiene el n8mero 4. <istCount6 el n8mero de elementos %ue hay en la lista. ?i utili*amos Mi2om'oBox.,ist( Mi2om'oBox.,ist2ount.) o'tendremos el 8ltimo elemento de la lista. <istInde)6 el n8mero del elemento seleccionado actualmente por el usuario. #ara o'tener el texto del elemento seleccionado utili*ar&amos Mi2om'oBox.,ist( Mi2om'oBox.,ist<ndex ). ?i hemos definido el control como 1multiselecci)n1 (es decir" %ue el usuario pueda escoger ms de un elemento)" esta propiedad no se puede usar" pero por ahora no nos vamos a meter en esto. ?o@source6 es el rango del %ue %ueremos %ue el 2om'oBox lea los elementos. #odemos utili*ar esta propiedad" o 'ien introducir nosotros mismos mediante c)digo los elementos (utili*ando el m(todo Add<tem).

ControlSource6 la celda en la %ue el 2om'oBox lee y escri'e el elemento seleccionado. <gual %ue con =o$?ource" podemos utili*ar esta propiedad para %ue el 2om'oBox nos escri'a en una celda el elemento seleccionado o podemos utili*ar c)digo para o'tener el elemento seleccionado (utili*ando ,ist<ndex). Style6 identifica el tipo de 2om'oBox %ue %ueremos. Diene dos valores posi'les6
o

fmStyle'rop'o@nCombo6 el usuario puede escoger uno de los valores de la lista o escri'ir otro distinto. fmStyle'rop'o@n<ist6 el usuario s)lo puede escoger uno de los valores de la lista.

Control!ip!e)t6 esta propiedad se aplica a todos los controles" pero como todav&a no la he explicado" la pongo a%u&. Esta propiedad sirve para mostrar al usuario un pe%ue5o texto de ayuda so're el control cuando ponga el rat)n so're el mismo" el ya clsico cuadrito amarillo.

9na ve* vistas las propiedades" vamos con los mtodos del o'jeto 2om'oBox6

-ddItem6 sirve para a5adir un elemento a la lista. ?u sintaxis es Mi2om'oBox.Add<tem( VMi textoV" 0 ). El primer parmetro es el texto del elemento" y el segundo parmetro (%ue es opcional)" es la posici)n dentro de la lista %ue %ueremos para el nuevo elemento. ?i no utili*amos el segundo parmetro" nuestro nuevo elemento se a5adir al final de la lista. ?emo.eItem6 para 'orrar un elemento. ?u sintaxis es Mi2om'oBox.=emove<tem( 0 )" para 'orrar el elemento n8mero 0. Clear6 'orra todos los elementos de la lista.

2omo siempre" hay muchos ms m(todos y propiedades" %ue estn 'astante 'ien explicados en la ayuda de Excel.

Vamos a colocar nuestro 2om'oBox en el 9serform" y una ve* colocado vamos a las propiedades. #rimero vamos a esta'lecer la propiedad Style como 'm!t1leDro*Down-ist" para %ue el usuario s)lo pueda escoger uno de los valores %ue le presentamos (es decir" %ue no le dejamos %ue se invente un nuevo estado civil). Ahora vamos a la hoja de clculo y escri'imos en una celda cual%uiera 1?oltero1" de'ajo 12asado1" de'ajo 1+ivorciado1 y de'ajo 1Viudo1. Ahora vamos a dar un nom're a este rango" seleccionando las cuatro celdas y escri'iendo en el 12uadro de Aom'res1 (en la parte superior i*%uierda) el nom're 1rng"stadoCivil1. Ga %ue estamos vamos a seleccionar cual%uier otra celda para %ue el 2om'oBox almacene el elemento seleccionado por el usuario" y le damos a esta celda el nom're 1rngValor"stadoCivil1. Ahora vamos otra ve* al editor de Visual Basic (VBE)" seleccionamos nuestro 2om'oBox" y en la propiedad ?o@Source escri'imos 1rngEstado2ivil1. En la propiedad ControlSource escri'imos 1rngValorEstado2ivil1. 2omo propina" vamos a poner en la propiedad Control!ip!e)t el texto 1!elecciona tu estado civil1" %ue es lo %ue el usuario ver en un cuadrito amarillo cuando ponga el rat)n so're el 2om'oBox. =ecuerda %ue esta propiedad la tienen todos los controles. Ga tenemos nuestro 2om'oBox" y si lo pro'amos veremos %ue funciona perfectamente. =ecuerda %ue el 2om'oBox coge los valores del rango esta'lecido en =o$?ource" y almacena el valor seleccionado por el usuario en la celda esta'lecida en 2ontrol?ource. 2omo ejercicio podemos hacer lo siguiente6 'orramos las propiedades ControlSource y ?o@Source" y hacemos %ue el control funcione igual pero encargndonos nosotros mismos de poner los valores en la lista y luego identificar la selecci)n del usuario y poner su valor en la celda %ue %ueremos. #ara ello tendremos %ue utili*ar las propiedades <ist y <istInde)" y los m(todos Clear y -ddItem" poniendo el c)digo en los eventos 7serform/Initiali;e+, y btn-ceptar/Clic2+,. Ahora %ue ya dominamos el 2om'oBox" una 'uena noticia6 el control <ist(o) (1Cuadro de -ista1 seg8n la traducci)n de Excel) funciona prcticamente igual. El 2om'oBox es el control en el %ue s)lo se ve

una l&nea y pulsando un 'ot)n sale una 1persiana1 con las distintas opciones" y en cam'io en el control ,istBox se ve siempre la lista de opciones" no hay persiana. Aparte de esta diferencia 1 visual1" los dos tipos de controles son prcticamente iguales. Vamos a por otro control" el Spin(utton (#otn de n5mero). Este 'ot)n se utili*a normalmente com'inado con un 2uadro de edici)n6 si pulsamos el ?pinButton hacia arri'a aumentamos el valor del cuadro de edici)n" y viceversa. ,as propiedades ms importantes del Spin(utton son6

*alue6 el valor del ?pinButton" un n8mero. 9in6 el valor m&nimo %ue puede tener el ?pinButton. 9a)6 el mximo. SmallC"an%e6 el incrementoRdecremento %ue sufrir la varia'le Value cada ve* %ue el usuario pulse el ?pinButton. Aormalmente es -" pero lo podemos cam'iar.

Vamos a utili*ar el control Spin(utton com'inado con un cuadro de edici)n %ue vamos a utili*ar para almacenar la edad. #rimero ponemos un cuadro de edici)n" %ue llamaremos 1 edit"dad1 (ya sa'es" cam'iando la propiedad Aame). En una hoja de clculo daremos el nom're 1rng"dad1 a una celda" y utili*aremos esta celda para la propiedad ControlSource de nuestro control 1edit"dad1. Ahora colocamos un control Spin(utton. Aormalmente se suelen colocar a la derecha del cuadro de edici)n al %ue van asociados. En el cuadro de propiedades vamos a poner a 9in el valor 4 (edad m&nima) y a Max el valor 1AB (edad mxima). El nom're del control lo dejamos como est (!*in#utton1). Ahora tenemos %ue jugar un poco con los eventos6 cada ve* %ue el usuario pulsa el ?pinButton se produce el evento C"an%e. 2ada ve* %ue se produ*ca este evento %ueremos cam'iar el valor del cuadro de edici)n 1editEdad1. 7acemos do'le.clic> en el ?pinButton y aparece la ventana de c)digo" en la %ue escri'iremos6 ,rivate Sub Spin!utton14C/ange() editEdad..e"t = Spin!utton1.5alue

End Sub Bastante sencillo" BnoC ?implemente damos a la propiedad !e)t del o'jeto 1editEdad1 el valor del ?pinButton. Ahora tenemos %ue hacer lo mismo pero 1al rev(s1. ?i el usuario va directamente al cuadro de edici)n y escri'e una edad" %ueremos %ue el valor del ?pinButton se actualice" ya %ue tanto el cuadro de edici)n como el ?pinButton tienen %ue tener el mismo valor. #ara ello usamos el evento C"an%e del o'jeto editEdad. 7acemos do'le.clic> so're (l y en la ventana de c)digo escri'imos6 ,rivate Sub editEdad4C/ange() Spin!utton1.5alue = editEdad.5alue End Sub #rcticamente igual %ue antes. El 8nico cam'io es %ue utili*amos la propiedad *alue de editEdad en lugar de la propiedad !e)t" por%ue %ueremos el valor num(rico" y no la cadena de caracteres. ?i en el control de edici)n escri'es alguna letra en lugar de un n8mero vers %ue el 9serform se detiene mostrndote un mensaje de error por%ue no puede calcular la propiedad *alue de editEdad. En una aplicaci)n 1de verdad1 de'er&amos escri'ir algo de c)digo para evitar estos errores" pero todav&a no hemos visto el control de errores (ya llegaremos). Dodav&a nos %ueda un pe%ue5o detalle respecto al ?pinButton. 2uando el 9serform se carga por primera ve*" el control editEdad lee de la hoja de clculo la edad (por%ue se lo hemos dicho en la propiedad 2ontrol?ource)" pero el control ?pinButton no est actuali*ado" tenemos %ue darle el mismo valor %ue tiene el control editEdad. #ara ello usaremos el evento Initiali;e el 9serform" %ue ya conocemos de so'ra6 ,rivate Sub F erForm4)nitiali@e() Spin!utton1.5alue = editEdad.5alue End Sub El c)digo es el mismo %ue el utili*ado en el evento editEdadH2hange(). ?i pro'amos ahora el dilogo veremos %ue la

com'inaci)n editEdad K ?pinButton- funciona perfectamente (aparte de la detecci)n de errores" %ue veremos ms adelante). Ahora vamos con otros tipos de controles6 las casillas de veri'icacin (C"ec2(o)es en ingl(s)" y los botones de o*cin (5ption(uttons). #ara utili*arlos vamos a suponer %ue %ueremos %ue el usuario nos indi%ue si utili*a o no una hoja de clculo" y en caso de %ue s& la utilice nos diga cul es su preferida. ,o primero es preguntar si utili*a una hoja de clculo" y para ello vamos a utili*ar una casilla de verificaci)n" %ue puede tener el valor verdadero o falso. 2omo siempre colocamos el control so're el userform y le damos el nom're 1cbo$2tili/aHo.a1. En la propiedad ControlSource vamos a escri'ir 1rng2tili/arHo.a1" %ue es el nom're %ue hemos dado a un rango de una hoja de clculo (en el fichero de ejemplo es la celda 2-W de la 7oja-). G en la propiedad Caption escri'imos el texto del control" algo as& como 1 2tili/a %o.a de c6lculo1. Dam'i(n podemos escri'ir algo en la propiedad Control!ip!e)t. Adems de todas esas propiedades %ue ya conocemos las propiedades importantes de un control de verificaci)n o C"ec2(o) son6

*alue6 el valor del control. #uede ser verdadero o falso. !ripleState6 puede ser verdadero o falso (esto 8ltimo por defecto). ?i le damos el valor verdadero el control tiene tres estados6 verdadero" falso y nada (cuando se pone gris). En algunas ocasiones puede ser 8til pero normalmente lo dejaremos como falso.

Ahora vamos a ver cul es la hoja de clculo preferida del usuario. #ara ello vamos a utili*ar unos 'otones de opci)n" para darle la opci)n de elegir entre Excel" ,otus -./.0 u otra hoja de clculo. ,o primero %ue tenemos %ue hacer es colocar un control marco (0rame en ingl(s). Estos controles s)lo sirven para agrupar controles y para mejorar la presentaci)n del userform. Dam'i(n tienen sus propiedades y eventos" pero casi nunca se utili*an.

Bueno" colocamos un control 0rame en el userform" y ahora vamos a poner dentro de (l los tres 'otones de opci)n. #ara poner un control dentro del marco lo %ue hay %ue hacer es seleccionar el marco y sin %uitar la selecci)n a5adir el nuevo control. Vamos a hacer esto tres veces" y a5adiremos tres 'otones de opci)n dentro del marco. #ara guardar los valores de los 'otones de opci)n vamos a dar nom'res a tres celdas de la hoja de clculo (en el ejemplo E-P" E-; y E-W)" a las %ue nom'raremos 1rng"$cel1" 1rng-otus1 y 1rng,tros1. Ahora vamos a los tres 'otones de opci)n %ue hemos puesto en el userform y en la propiedad ControlSource de cada uno de ellos escri'imos una de los nom'res %ue aca'amos de crear. Dam'i(n convendr&a cam'iar la propiedad Caption de cada uno de los 'otones para mostrar el texto adecuado. ,as propiedades *alue y !ripleState de un 'ot)n de opci)n funcionan igual %ue en el control de verificaci)n" y el resto de propiedades no son demasiado importantes. ?i pro'amos ahora el userform de'er&a funcionar perfectamente" excepto un pe%ue5o detalle. ?i el usuario nos dice %ue no utili*a ninguna hoja de clculo" los 'otones de opci)n siguen preguntndole cul es su hoja de clculo preferida" lo %ue evidentemente no tiene ning8n sentido. ,o %ue tenemos %ue hacer es desactivar los 'otones de opci)n6 para desactivar cual%uier control (no s)lo los 'otones de opci)n) se utili*a la propiedad EnabledM si esta propiedad es verdadera" el control est activado" y si es falso el control estar desactivado (aparece en color gris)" y el usuario no puede interactuar con (l. ,o %ue nos %ueda ahora es sa'er cundo ha cam'iado de estado (verdadero" falso) la casilla de verificaci)n cbo$2tili/aHo.a. 2omo siempre" lo hacemos con un evento" el evento C"an%e del control de verificaci)n" %ue se ejecuta cada ve* %ue cam'ia el estado del control. #or lo tanto" en el evento C"an%e tendremos %ue cam'iar el estado (activado" desactivado) de los 'otones de opci)n. El c)digo es6 ,rivate Sub cbo"Ftili@a#o6a4C/ange() Frame2.Enabled = cbo"Ftili@a#o6a.5alue %ption!utton1.Enabled = cbo"Ftili@a#o6a.5alue %ption!utton2.Enabled = cbo"Ftili@a#o6a.5alue

%ption!utton+.Enabled = cbo"Ftili@a#o6a.5alue End Sub @&jate %ue damos a la propiedad Enabled de los 'otones de opci)n y el marco el valor de la propiedad *alue del control de verificaci)n. Dam'i(n podr&amos ha'er escrito6 )* cbo"Ftili@a#o6a.5alue = .rue ./en %ption!utton1.Enabled = .rue ..... El e %ption!utton1.Enabled = Fal e ..... End )* El resultado es el mismo" pero la primera opci)n es 'astante ms elegante. 9n pe%ue5o detalle. 2uando el userform se inicia tam'i(n de'er&amos activarRdesactivar los 'otones seg8n el valor de la casilla de verificaci)n. 9na soluci)n rpida ser&a escri'ir dentro del evento 7serform/Initiali;e (%ue ya conocemos) el mismo c)digo %ue en cbo)7tili;aHoja/C"an%e" pero no es lo ms adecuado por%ue estar&amos escri'iendo el mismo c)digo en dos sitios distintos" cosa %ue hay %ue evitar por%ue si luego tenemos %ue hacer alg8n cam'io en el c)digo tendremos %ue hacerlo en dos sitios. ,o mejor es llamar a cbo)7tili;aHoja/C"an%e+, desde el evento 7serform/Initiali;e+,. ,a rutina cbo)7tili;aHoja/C"an%e es llamada cada ve* %ue se produce el evento C"an%e" pero nada nos impide llamarla por nuestra cuenta en cual%uier otro momento" como por ejemplo cuando se inicia el userform. El evento 7serform/Initiali;e %uedar as&6 ,rivate Sub F erForm4)nitiali@e() cbo"Ftili@a#o6a4C/ange Spin!utton1.5alue = editEdad.5alue End Sub

#ues ya tenemos el userform de datos personales completo" y ya hemos aprendido a usar prcticamente todos los controles. ,a apariencia final del userform de datos personales es la siguiente.

2omo ejercicio" vamos a hacer otro userform" en el %ue no vamos a utili*ar ning8n control nuevo pero s& vamos a ver un evento nuevo (Cey7p). ,o %ue vamos a hacer es un dilogo en el %ue el usuario pueda escri'ir una cifra en pesetas y automticamente le diremos cuntos euros son. G al rev(s" si escri'e los euros calcularemos cuntas pesetas son. #ues vamos al VBE" creamos un userform" y ponemos en (l dos controles de edici)n" %ue llamaremos edit:esetas y editEuros" dos eti8uetas al lado de cada control de edici)n" y un botn para cerrar el dilogo. #rimero lo ms fcil. En el 'ot)n de cerrar (al %ue cam'iaremos el Caption para %ue ponga 1Cerrar1" y %ue llamaremos btnCerrar) tenemos %ue poner el c)digo para cerrar el userform6

,rivate Sub btnCerrar4Clic&() Fnload Me End Sub Ahora vamos a los cuadros de edici)n. ,o %ue %ueremos hacer es %ue cada ve* %ue el usuario pulse una tecla se actualice el otro cuadro de edici)n. #or ejemplo" si el usuario va a escri'ir /344 pts" nosotros actuali*aremos el cuadro de edici)n de euros cada ve* %ue el usuario pulse una tecla" sin esperar a %ue termine. #ara eso vamos a utili*ar el e.ento Cey7p" %ue se produce cada ve* %ue el usuario pulsa una tecla. #ara escri'ir el c)digo de este evento vamos a la ventana de c)digo de nuestro userform" y en las persianas de la parte superior seleccionamos el control edit:esetas y en la parte derecha el evento Cey7p. Excel nos ha'r puesto la declaraci)n de la rutina (con los parmetros adecuados" %ue en este caso no nos interesan y vamos a ignorar) y el 1End ?u'1 correspondiente. Ahora s)lo tenemos %ue poner lo del medio6 ,rivate Sub edit,e eta 4-e'Fp(!'5al -e'Code A MSForm .Return)nteger$ !'5al S/i*t A )nteger) )* edit,e eta ..e"t ;< "" ./en editEuro ..e"t = Format(edit,e eta .5alue G 1HI$ "=.==") El e editEuro ..e"t = "" End )* End Sub El 1If1 lo utili*o como una pe%ue5a forma de detecci)n de errores" por si el cuadro de edici)n est vac&o (de todas formas" se pueden producir muchos errores" como por ejemplo si el usuario introduce una letra en lugar de un n8mero" pero no vamos a ponernos ahora a escri'ir c)digo para detectar todos esos errores). El resto es 'astante sencillo" se trata de poner en el cuadro editEuros el importe de edit:esetas dividido por -PW (el valor en pesetas de un euro)" y utili*ando la funci)n 0ormat para %ue s)lo presente dos decimales. (la funci)n 0ormat es muy sencilla de utili*ar" si %uieres ms informaci)n consulta la ayuda).

#odemos pro'ar a ejecutar ahora el dilogo y veremos %ue cada ve* %ue introdu*camos un carcter en el cuadro edit#esetas se actuali*a el cuadro editEuros. Ahora tenemos %ue hacer %ue cuando escri'amos algo en editEuros se actualice edit#esetas. El procedimiento es exactamente el mismo6 ,rivate Sub editEuro 4-e'Fp(!'5al -e'Code A MSForm .Return)nteger$ !'5al S/i*t A )nteger) )* editEuro ..e"t ;< "" ./en edit,e eta ..e"t = Format(editEuro .5alue > 1HI$ "=.==") El e edit,e eta ..e"t = "" End )* End Sub <gual %ue antes" pero multiplicando por -PW en lugar de dividir. 7asta ahora" todos los 'otones %ue hemos utili*ado en los userforms serv&an para cerrar el userform" con la diferencia de %ue solemos poner uno para Ace*tar y otro para Cancelar. #ero tam'i(n podemos poner en un userform un 'ot)n %ue realice cual%uier otra acci)n pero no cierre el userform. ,o ms t&pico es %ue este 'ot)n haga alg8n cam'io so're los controles del userform. En este caso" aprovechando nuestro conversor de euros" vamos a crear dos 'otones" uno al lado de cada cuadro de edici)n" %ue van a pegar en la celda activa de la hoja de clculo el contenido del cuadro de edici)n asociado. 2olocamos los dos 'otones" uno al lado de cada cuadro de edici)n" y les damos los nom'res btn:e%ar:ts y btn:e%arEuros" y les ponemos como Caption algo como 10egar1. Ahora vamos al c)digo6 ,rivate Sub btn,egar,t 4Clic&() ActiveCell.5alue = edit,e eta .5alue End Sub ,rivate Sub btn,egarEuro 4Clic&() ActiveCell.5alue = editEuro .5alue

End Sub El evento %ue utili*amos es el evento Clic2" %ue ya conocemos de so'ra. G el c)digo tampoco tiene ninguna dificultad" simplemente es poner en -cti.eCell el valor del control de edici)n" edit:esetas o editEuros. 2omo vers" al pulsar estos 'otones se pega el contenido en la hoja de clculo" pero no se cierra el userform. ?i %uisi(ramos %ue despu(s de hacer el pegado se cerrara el userform tendr&amos %ue a5adir el clsico 17nload 9e1 a las dos rutinas anteriores. As& nos ha %uedado el userform del conversor de euros6

G para terminar esta entrega" vamos a hacer un dilogo para hacer operaciones so're un rango" como los %ue ya hemos hecho" pero ms completo. El dilogo va a permitirnos cam'iar el rango seleccionado" y luego nos permitir seleccionar la operaci)n aritm(tica %ue %ueremos hacer so're el rango (sumar" restar" multiplicar" dividir) utili*ando para ello unos 'otones de opci)n. En este dilogo vamos a utili*ar un control nuevo" el ?efEdit" %ue sirve para %ue el usuario pueda introducir una referencia (un rango). #uede hacerlo escri'iendo la referencia a'soluta o el nom're del rango (como si fuese un cuadro de edici)n)" o pulsando en el 'otoncito %ue aparece a la derecha" %ue hace %ue desapare*ca el userform y el usuario puede seleccionar el rango con el rat)n o el teclado. ,os controles %ue vamos a poner en este userform son6

&ipo de control RefE it @e1t*o1 F"ame O!tion*utton O!tion*utton O!tion*utton O!tion*utton Comman *utton Comman *utton El resultado final ser algo as&6

'a(e RefE it1 tb)a#o" F"ame1 obCuma" obResta" obMu#ti!#ica" obDi(i i" btnAce!ta" btnCance#a"

)aption N/A N/A O!e"aci4n Cuma" Resta" Mu#ti!#ica" Di(i i" Ace!ta" Cance#a"

,o 8nico nuevo %ue tenemos %ue aprender es %ue el rango %ue el usuario ha introducido en el ?efEdit se guarda en la propiedad !e)t. #ero Dext es una cadena de caracteres" por lo %ue si %ueremos hacer referencia al rango de'eremos usar ?an%e+?efEdit1.!e)t,. Vamos con el c)digo6 ,rivate Sub F erForm4)nitiali@e() obSumar.5alue = .rue Re*Edit1..e"t = Selection.Addre

End Sub #rimero hacemos %ue la operaci)n seleccionada por defecto sea sumar (alguna tiene %ue ser) y %ue en el ?efEdit apare*ca como rango la selecci)n %ue ten&a hecha el usuario antes de llamar al dilogo. Ahora los 'otones6 ,rivate Sub btnAceptar4Clic&() #acer%peracion Fnload Me End Sub ,rivate Sub btnCancelar4Clic&() Fnload Me End Sub ,a 8nica diferencia entre los dos 'otones es %ue uno de ellos llama a la rutina Hacer5peracion antes de cerrar el userform. ,a rutina Hacer5peracion es la siguiente6 Sub #acer%peracion() 8im r A Range 8im c A %b6ect 8im i A 8ouble Set r = Range(Re*Edit1..e"t) i = tb5alor.5alue For Eac/ c )n r.Cell )* obSumar.5alue = .rue ./en c.5alue = c.5alue ( i El e)* obRe tar.5alue = .rue ./en c.5alue = c.5alue E i El e)* obMultiplicar.5alue = .rue ./en c.5alue = c.5alue > i El e)* ob8ividir.5alue = .rue ./en c.5alue = c.5alue G i End )* ?e"t c End Sub

#rimero o'tenemos el rango seleccionado y lo almacenamos en 1 r1. ,uego o'tenemos el valor %ue hay %ue utili*ar" %ue el usuario ha escrito en tb*alor" y lo almacenamos en 1 i1. ,uego hacemos un 'ucle 10or Eac" 3e)t1" %ue ya conocemos" para repetir el mismo c)digo para todas las celdas del rango. El 1 If1 tan largo %ue utili*amos es 'astante ms sencillo de lo %ue parece6 lo 8nico %ue hace es compro'ar cul es el 'ot)n de opci)n activado (Value J Drue) y efect8a la operaci)n asociada a ese 'ot)n. G a%u& termina la cuarta entrega del curso. ?i tienes cual%uier duda o comentario %ue hacer" no dudes en contactar conmigo. En la pr)xima entrega ha'laremos de la creaci)n de men8s y 'arras de herramientas personali*adas.

Captulo A. 9ens y barras de "erramientas. En esta entrega vamos a tratar so're la creaci)n de men8s y 'arras de herramientas personali*adas para nuestras hojas. En Visual Basic for Applications" las 'arras de men8 y las 'arras de herramientas estn representadas por el mismo o'jeto ( Command(ar)" y su funcionamiento es exactamente igual. @o os #os e-em!#os e este ca!;tu#o est,n inc#u; os en este E1ce#J01#s fic6e"o8 %L07bs& Antes de nada" vamos a intentar aclarar la nomenclatura %ue se utili*a en VBA para hacer referencia a cada una de las partes de un menu. El nom're del menu en s& mismo es Command(ar. 9n Command(ar ('arra de men8) representa a todo el men8" como por ejemplo el %ue aparece cuando ests en una hoja de clculo. ?i cam'ias a una hoja de grfico vers %ue el men8 cam'ia6 se ha cam'iado de 'arra de men8 (Command(ar). 2ada una de las opciones de la 'arra de men8 se llama Command(ar:op7p (men8 desplega'le seg8n la traducci)n de Microsoft). #or ejemplo" en el men8 de una hoja de clculo la opci)n 1Archivo1 es un men8 desplega'le o Command(ar:op7p. +entro del men8 desplega'le" cada una de las opciones se llama Control(utton (opci)n de men8). #or ejemplo" 1nuevo1 y 1Xuardar1

son opciones del men8 desplega'le 1archivo1 de la 'arra de men8 de 17oja de clculo1 de Excel. #ara tener acceso a las 'arras de comandos (%ue pueden ser men8s o 'arras de herramientas) utili*aremos la propiedad Command(ars" %ue devuelve el conjunto de 'arras de comandos de la aplicaci)n. 2ada una de las 'arras de comando ser por tanto un o'jeto 2ommandBar. #or ejemplo" para ver los nom'res de todas las 'arras de comando %ue existen escri'iremos la siguiente rutina6 Sub Di ta!arra Comando() 8im / a %b6ect 8im d t a Range Set d t = S/eet ("#o6a1").Range("A1") For Eac/ / in Command!ar d t.5alue = /.?ame Set d t = d t.%** et(1$ =) ?e"t / End Sub +e esta forma o'tendremos el nom're de todas las 'arras de comando. =ecuerda %ue puede ha'er 'arras de comando %ue existan pero no est(n activas" %ue no apare*can en la pantalla. 2omo ha'rs podido deducir" la propiedad 3ame de un o'jeto Command(ar nos devuelve el nom're de la 'arra de comando. 1. Crear una opcin de men. ,o primero %ue vamos a hacer es crear una opcion dentro de un men8 desplega'le. #or ejemplo" vamos a crear una opci)n llamada 1Macedonia1 dentro del men8 1"dicin1. Antes %ue nada" declaramos las varia'les %ue vamos a utili*ar6 8im c!ar A %b6ect 8im c!ar,opFp A %b6ect 8im c!utton A %b6ect

,a primera varia'le (c#ar) la utili*aremos para almacenar el men8 de hoja de clculo entero" la segunda ( c#ar0o*2*) para o'tener el men8 de 1Edici)n1 dentro de c#ar" y la tercera para crear nuestra opci)n (Macedonia) dentro del men8 de Edici)n. Vamos a o'tener el men8 de hoja de clculo. ?i te fijas en el resultado de la rutina -ista#arrasComando %ue hemos creado antes" vers %ue una de las 'arras de comando se llama 1 7or8s%eet Menu #ar1. Esta es la 'arra de comandos %ue est presente cuando ests en una hoja de clculo. 7ay otras 'arras" como por ejemplo 12hart Menu Bar1" %ue es la %ue aparece cuando ests en una hoja de grficos. #ara utili*ar la 'arra de comandos 1!or>sheet Menu Bar1 haremos lo siguiente6 Set c!ar = Command!ar ("Cor& /eet Menu !ar") 2on esto hemos conseguido %ue nuestra varia'le" cBar" contenga la 'arra de comandos %ue nos interesa. Ahora %ueremos seleccionar una parte de ese 'arra de comandos6 %ueremos el men8 de Edici)n. #ara ello utili*amos el siguiente c)digo6 Set c!ar,opFp = c!ar.Control ("Edici1n") 7emos utili*ado la propiedad 12ontrols1 del o'jeto 2ommandBar. Esta propiedad nos permite acceder a todos los su'men8s de una 'arra de comandos. El o'jeto devuelto es del tipo 12ommandBar#opup1. =econo*co %ue la terminolog&a es un poco confusa" pero as& lo ha hecho Microsoft. Ahora ya tenemos el men8 de 1 "dicin1 en nuestra varia'le. G lo %ue %ueremos hacer es a5adir una opci)n dentro de ese men8. #ara hacerlo utili*aremos de'eremos acceder a la propiedad 1 Controls1 de nuestro men8 de "dicin. @&jate %ue antes hemos accedido a la propiedad 2ontrols del o'jeto cBar" y ahora vamos a acceder a la propiedad Controls del o'jeto c#ar0o*2*. #ues 'ien" una ve* %ue accedemos a la propiedad 12ontrols1 del men8 "dicin (c#ar0o*2*)" utili*amos el m(todo -dd para a5adir una nueva opci)n del men86

Set c!utton c!ar,opFp.Control .Add(m oControl!utton)

Almacenamos en nuestra varia'le cButton el resultado" por%ue luego %ueremos hacerle unos cam'ios. El tipo de control %ue %ueremos a5adir puede variar ( mso2ontrolButton" mso2ontrolEdit" mso2ontrol+ropdo$n" mso2ontrol2om'oBox o mso2ontrol#opup )" pero en nuestro caso %ueremos una opci)n de men8" y utili*amos mso2ontrolButton. Aos %ueda hacer %ue nuestra opci)n de men8 (o 2ontrolButton)" tenga el texto %ue nosotros %ueremos y haga lo %ue nosotros %ueremos. #ara ello utili*aremos las propiedades del 2ontrolButton6

CaptionD es el texto %ue %ueremos %ue apare*ca en la opci)n de men8. En nuestro caso" 1IMacedonia1. El carcter 1I1 se utili*a para indicar %ue la letra %ue le sigue (la 1M1 en este caso) %ueremos %ue apare*a su'rayada y funcione como tecla rpida una ve* %ue est( a'ierto el men8. 5n-ctionD es el nom're de la rutina %ue %ueremos %ue se ejecute cuando el usuario seleccione esa opci)n. En este caso vamos a darle el valor 1MiMacro1" %ue ser una pe%ue5a rutina %ue simplemente avisar de %ue hemos seleccionado esa opci)n. S"ortcut!e)t6 el texto %ue aparece en la opci)n del men8" a la derecha. Aormalmente se suele poner la tecla rpida para esa opci)n de men8. 2uidado" por%ue esta opci)n s)lo sirve para escri'ir el texto" pero no hace %ue la tecla rpida funcione" eso tendrs %ue hacerlo t8 por otro lado. 0aceI'D es el n8mero de la imagen %ue %ueremos %ue se asigne a nuestra opci)n de men8. ,a imagen aparece en la parte i*%uierda de la opci)n. Excel tiene un mont)n de imgenes para nuestras opciones" y se pueden seleccionar cam'iando el <+. #ara ver todas las imgenes disponi'les y sa'er %u( <+ corresponde a cada imagen" lo mejor es hacer una pe%ue5a rutina %ue muestre todas las imgenes. (eso te %ueda como ejercicioM si tienes alguna duda escr&'eme).

(e%inEroupD true o false" indica si %ueremos %ue antes de nuestra opci)n se ponga un 1separador1" una l&nea %ue separe un poco nuestra opci)n de la anterior.

2omo siempre" hay muchas ms propiedades" pero creo %ue hemos visto las ms importantes. Vamos a ver nuestra rutina completa6 Sub Crear%pcionMenu() 8im c!ar A %b6ect 8im c!ar,opFp A %b6ect 8im c!utton A %b6ect !orrar%pcionMenu Set c!ar = Command!ar ("Cor& /eet Menu !ar") Set c!ar,opFp = c!ar.Control ("Edici1n") Set c!utton = c!ar,opFp.Control .Add(m oControl!utton) Cit/ c!utton .Caption = "3Macedonia" .%nAction = "MiMacro" .Face)d = J .S/ortcut.e"t = "Ctrl(S/i*t(M" .!eginKroup = .rue End Cit/ Call M g!o"("Se /a creado la opci1n LMacedoniaL en el men9 LEdici1nL"$ vb%-%nl'$ "Macedonia") End Sub #ara verla en acci)n a're el fichero de ejemplo" y utili*a el 'ot)n 12rear opci)n de men81. ?i te fijas en la rutina Crear,*cionMenu" hemos incluido una llamada a la rutina #orrar,*cionMenu. Esta 8ltima se encarga de 'orrar la opci)n 1Macedonia1 del men8 Edici)n en caso de %ue ya exista" y llamndola evitamos %ue apare*can dos opciones 1Macedonia1. ,a rutina #orrar,*cionMenu es la siguiente6 Sub !orrar%pcionMenu() 8im c!ar A %b6ect 8im c!ar,opFp A %b6ect 8im cc A %b6ect

Set c!ar = Command!ar ("Cor& /eet Menu !ar") Set c!ar,opFp = c!ar.Control ("Edici1n") For Eac/ cc )n c!ar,opFp.Control )* cc.Caption = "3Macedonia" ./en cc.8elete ?e"t cc End Sub Al igual %ue en la rutina 2rear pcionMenu" primero o'tenemos la 'arra de comandos 1!or>sheet Menu Bar1" despues la 'arra 1Edici)n1" y luego" utili*ando la instrucci)n 1@or Each1" pasamos por todos las opciones de men8" y 'orramos a%uellas cuyo 12aption1 sea 1IMacedonia1 (incluyendo el I). #ara 'orrar la opci)n de men8 utili*amos el m(todo +elete. #. Crear un men desple%able. Ahora vamos a crear un men8 desplega'le (como el men8 Archivo" o Edici)n" de la hoja de clculo de Excel). 2omo siempre" primero declaramos las varia'les %ue vamos a utili*ar. 8im c!ar A %b6ect 8im c!ar,opFp A %b6ect 8im c!utton A %b6ect ,uego vamos a o'tener la 'arra de comandos de la hoja de clculo6 Set c!ar = Command!ar ("Cor& /eet Menu !ar") #ara a5adir un men8 desplega'le a dicha 'arra de comandos vamos a utili*ar el m(todo 1Add1 de la colecci)n 12ontrols1 de la 'arra de comandos6 Set c!ar,opFp = c!ar.Control .Add(.'pe2=m oControl,opup$ !e*ore2=1=) El tipo de control %ue %ueremos a5adir es un 1mso2ontrol#opup1" para indicar %ue %ueremos un men8 desplega'le. c!ar,opFp.Caption = "3Macedonia"

Ahora tenemos en cBar#op9p un men8 desplega'le" igual %ue en el punto anterior ten&amos el men8 desplega'le 1Edici)n1. Ahora tenemos %ue a5adir opciones en dicho men8 desplaga'le" igual %ue hemos hecho antes6 Set c!utton c!ar,opFp.Control .Add(m oControl!utton) Cit/ c!utton .Caption = "3Macedonia 1" .%nAction = "MiMacro" End Cit/ =

Dam'i(n podemos a5adir un su'men8 dentro de alguna opci)n de nuestro men8" de una forma muy parecida. ,a rutina completa para crear un men8 desplega'le es la siguiente6 Sub CrearMenu8e plegable() 8im c!ar A %b6ect 8im c!ar,opFp A %b6ect 8im c!utton A %b6ect 8im i$ 6 A )nteger !orrarMenu8e plegable Set c!ar = Command!ar ("Cor& /eet Menu !ar") Set c!ar,opFp c!ar.Control .Add(.'pe2=m oControl,opup$ 4 !e*ore2=1=) c!ar,opFp.Caption = "3Macedonia" For i = 1 .o 1= )* i ;< B ./en Set c!utton = c!ar,opFp.Control .Add(m oControl!utton) Cit/ c!utton .Caption = "3Macedonia " 3 i .%nAction = "MiMacro" )* i Mod + = = ./en .!eginKroup = .rue End Cit/ El e

Set c!utton = c!ar,opFp.Control .Add(m oControl,opup) c!utton.Caption = "3Macedonia " 3 i For 6 = 1 .o B Cit/ c!utton.Control .Add(m oControl!utton) .Caption = "Submen9 Macedonia " 3 6 .%nAction = "MiMacro" )* 6 Mod + = = ./en .!eginKroup = .rue End Cit/ ?e"t 6 End )* ?e"t i Call M g!o"("Se /a aMadido la opci1n LMacedoniaL en el men9 principal"$ 4 vb%-%nl'$ "Macedonia") End Sub #ara ver esta rutina en acci)n utili*a el 'ot)n 1 Crear men5 des*legable1 del fichero de ejemplo. 6. Crear una barra de men. Ahora vamos a crear una 'arra de men8 completa" como la 'arra de men8 1!or>sheet Menu Bar1. ,o primero" como siempre" es declarar las varia'les6 8im c!ar A %b6ect 8im c!ar,opFp A %b6ect 8im c!utton A %b6ect En lugar de o'tener la 'arra de men8 1!or>sheet Menu Bar1 y luego tra'ajar con ella" ahora lo %ue vamos a hacer es crear nosotros mismos una 'arra de men8" utili*ando el m(todo 1Add1 de la colecci)n 12ommandBars1. Set c!ar = Command!ar .Add("!arra Macedonia"$ m o!ar.op$ .rue)

El primer argumento es el nom're de la 'arra de comandos %ue vamos a crear. El segundo argumento es la posici)n de la nueva 'arra de comandos" y puede ser uno de los siguientes valores6 mso(ar<eft$ mso(ar?i%"t$ mso(ar!op$ mso(ar(ottom6 i*%uierda" derecha" arri'a o a'ajo. mso(ar0loatin%6 %ueremos %ue la nueva 'arra de men8 sea flotante.

mso(ar:op7p6 la nueva 'arra de men8s ser contextual" como las %ue salen cuando pulsamos el 'ot)n derecho.

El tercer argumento (verdadero o falso) indica si %ueremos %ue la nueva 'arra de men8 reemplace a la 'arra de men8s activa o no. 9na ve* %ue tenemos nuestra 'arra de men8 utili*amos el c)digo %ue hemos aprendido antes para crear los men8s desplega'les y sus opciones. ,a siguiente rutina crea una 'arra de men8 y varios men8s desplega'les y opciones6 ,rivate Con t ?%M!REME?F = "Men9 Macedonia" Sub Crear!arraMenu() 8im c!ar A %b6ect 8im c!ar,opFp A %b6ect 8im c!utton A %b6ect 8im i$ 6 A )nteger !orrar!arraMenu Set c!ar m o!ar.op$ .rue) For 6 = 1 .o B Set c!ar,opFp c!ar.Control .Add(.'pe2=m oControl,opup) c!ar,opFp.Caption = "3Macedonia " 3 6 For i = 1 .o 6 ( 2 Set c!utton c!ar,opFp.Control .Add(m oControl!utton) Cit/ c!utton = = Command!ar .Add(?%M!REME?F$

.Caption = "3Macedonia " 3 i .%nAction = "MiMacro" )* i Mod + = = ./en .!eginKroup = .rue End Cit/ ?e"t i ?e"t 6 Call M g!o"("Se /a creado la barra de men9 LMacedoniaL."$ vb%-%nl'$ "Macedonia") End Sub 7emos utili*ado la varia'le 1A MB=EMEA91 para dar el nom're a la 'arra de men8. 2uando se usa una cadena en ms de un sitio del c)digo es aconseja'le sustituir la cadena por una varia'le" para evitar errores al escri'ir la cadena en varios sitios. 2on la rutina anterior hemos creado la 'arra de men8" pero todav&a no la podemos ver" por%ue hay %ue activarla" usando6 Command!ar (?%M!REME?F).5i ible = .rue 2omo al crear la 'arra hemos indicado (con el tercer argumento) %ue esta 'arra tiene %ue sustituir a la %ue esta activa" la 'arra activa desaparece y la nuestra aparece. #ara volver a desactivar nuestra 'arra" utili*aremos6 Command!ar (?%M!REME?F).5i ible = Fal e ?i %ueremos 'orrar la 'arra de menu %ue hemos creado utili*aremos el metodo +elete6 Command!ar (?%M!REME?F).8elete En el fichero excel3.xls tienes unos 'otones %ue sirven para crear" activar" desactivar y 'orrar una 'arra de men8. =. Crear una barra de "erramientasD 2omo hemos visto al principio" en VBA las 'arras de men8 y las 'arras de herramientas estn representadas por el mismo o'jeto (2ommandBar)" y su funcionamiento es prcticamente igual.

2rear una 'arra de herramientas es exactamente igual %ue crear una 'arra de men86 Set c!ar = m o!arFloating$ Fal e) Command!ar .Add(?%M!RE!ARRA$

En este caso hemos creado una 'arra 1flotante1" pero pod&amos ha'er utili*ado cual%uiera de los otros parmetros %ue hemos visto antes. Ahora vamos a crear un 'ot)n de la 'arra de herramientas. ,a 8nica diferencia entre crear un 'ot)n y crear un men8 desplega'le es el tipo de control" el parmetro del m(todo Add. En este caso utili*aremos 1mso2ontrolButton16 Set c!utton c!ar.Control .Add(m oControl!utton) Cit/ c!utton .Caption = "3Macedonia " 3 i .%nAction = "MiMacro" .Face)d = )nt(Rnd > 1===) End Cit/ =

El c)digo utili*ado para crear" activar" desactivar y 'orrar una 'arra de herramientas es el mismo %ue para una 'arra de men8s. +e hecho no hay ninguna diferencia entre ellas" en Excel las dos son una 'arra de comandos (2ommandBar). Adems" tam'i(n podemos me*clar 'otones y men8s dentro de una 'arra de comandos6 s)lo hay %ue crear la 'arra y luego a5adir controles tipo 1mso2ontrol#opup1 para los men8s y controles 1mso2ontrolButton1 para los 'otones. Bueno" a%u& termina la %uinta entrega del curso de VBA para Excel. ?i tienes cual%uier duda o comentario no dudes en escri'irme.

Vous aimerez peut-être aussi