Вы находитесь на странице: 1из 112

MACROS EN MS EXCELL

MACROS EN MS EXCELL

Que es una macro ?. Una macro son un conjunto de instrucciones que sirven para automatizar procesos. Refiri ndonos a e!ce"# supon$amos que rea"izamos frecuentemente "a acci%n de se"eccionar un ran$o para ap"icar"e ne$rita# cam&io de fuente ' centrado. En "u$ar de (acer estas acciones manua"mente# se puede e"a&orar una macro e invocar"a para que ejecute "os tres procesos autom)ticamente. Objetos, propiedades y mtodos. A "a (ora de tra&ajar con macros en e!ce"# de&en tenerse c"aros ciertos conceptos de "o que se ""ama pro$ramaci%n orientada a o&jetos *OO+,. No nos e!tenderemos demasiado so&re "a OO+# pero si definiremos a continuaci%n "os conceptos de Objeto# Propiedades ' Mtodos. Objeto. Cuando en e" mundo rea" nos referimos a o&jeto si$nifica que (a&"amos de a"$o m)s o menos a&stracto que puede ser cua"quier cosa. Si decidimos concretar un poco m)s podemos referirnos a o&jetos coc(e# o&jetos si""a# o&jetos casa# etc. En OO+# "a $enera"izaci%n *o definici%n, de un o&jeto se ""ama Clase# as- "a c"ase coc(e seria como "a representante de todos "os coc(es de" mundo# mientras que un o&jeto coc(e seria un coc(e en concreto. .e momento# no definiremos ni estudiaremos "as c"ases sino que nos concentraremos en "os o&jetos# ten$a en cuenta pero que cualquier objeto est definido por una clase. Cuando decimos que "a c"ase coc(e representa a todos "os coc(es de" mundo si$nifica que define como es un coc(e# cua"quier coc(e. .ic(o de otra forma ' para apro!imarnos a "a definici%n inform)tica# "a c"ase coc(e define a"$o que tiene cuatro ruedas# un motor# un c(asis#... entonces# cua"quier o&jeto rea" de cuatro ruedas# un motor# un c(asis#... es un o&jeto de "a c"ase coc(e. Propiedades. Cua"quier o&jeto tiene caracter-sticas o propiedades como por ejemp"o e" co"or# "a forma# peso# medidas# etc. Estas propiedades se definen en "a c"ase ' "ue$o se particu"arizan en cada o&jeto. As-# en "a c"ase coc(e se podr-an definir "as propiedades Co"or# Anc(o ' Lar$o # "ue$o a" definir un o&jeto concreto como coc(e 'a se particu"arizar-an estas propiedades a# por ejemp"o# Co"or / Rojo# Anc(o / 0 metros ' Lar$o / 1#2 metros. Mtodos. La ma'or-a de o&jetos tienen comportamientos o rea"izan acciones# por ejemp"o# una acci%n evidente de un o&jeto coc(e es e" de moverse o "o que es "o mismo# tras"adarse de un punto inicia" a un punto fina". Cua"quier proceso que imp"ica una acci%n o pauta de comportamiento por parte de un o&jeto se define en su c"ase para que "ue$o pueda manifestarse en cua"quiera de sus o&jetos. As-# en "a c"ase coc(e se definir-an en e" m todo mover todos "os procesos necesarios para ""evar"o a ca&o *"os procesos para desp"azar de un punto inicia" a un punto fina",# "ue$o cada o&jeto de "a c"ase coc(e simp"emente tendr-a
3 4 330

MACROS EN MS EXCELL

que invocar este m todo p ara tras"adarse de un punto inicia" a un punto fina"# cua"esquiera que fueran esos puntos. Repasemos a continuaci%n todos estos conceptos pero a(ora desde e" punto de vista de a"$unos de "os o&jetos que nos encontraremos en E cel como !or"S#eet *O&jeto (oja de c)"cu"o, o Ran$e *O&jeto casi""a o ran$o de casi""as,. Un o&jeto Ran$e est) definido por una c"ase donde se definen sus propiedades# recordemos que una propiedad es una caracter-stica# modifica&"e o no# de un o&jeto. Entre "as propiedades de un o&jeto Ran$e est)n %alue # que contiene e" va"or de "a casi""a # Colu&n ' Ro' que contienen respectivamente "a fi"a ' "a co"umna de "a casi""a# (ont que contiene "a fuente de "os caracteres que muestra "a casi""a# etc. Ran$e # como o&jeto# tam&i n tiene m todos# recordemos que "os m todos sirven ""evar a ca&o una acci%n so&re un o&jeto. +or ejemp"o e" m todo Acti)ate# (ace activa una ce"da determinada# Clear# &orra e" contenido de una ce"da o ran$o de ce"das# Cop*# copia e" contenido de "a ce"da o ran$o de ce"das en e" portapape"es#... Conjuntos. Un conjunto es una co"ecci%n de o&jetos de" mismo tipo# para "os que conozcan a"$5n "en$uaje de pro$ramaci%n es un arra' de o&jetos. +or ejemp"o# dentro de un "i&ro de tra&ajo puede e!istir m)s de una (oja *!or"S#eet,# todas "as (ojas de un "i&ro de tra&ajo forman un conjunto# el conjunto !or"S#eets. Cada e"emento individua" de un conjunto se referencia por un -ndice# de esta forma# "a primera# se$unda ' tercera (oja de un "i&ro de tra&ajo# se referenciar)n por 6or7S(eets*3,# 6or7S(eets*0, ' 6or7S(eets*1,. Objetos de Objetos. Es mu' (a&itua" que una propiedad de un o&jeto sea otro o&jeto. Si$uiendo con e" coc(e# una de "as propiedades de" coc(e es e" motor# ' e" motor es un o&jeto con propiedades como cu&icaje# ca&a""os# n5mero de v)"vu"as# etc. ' m todos# como aumentar8revo"uciones# co$er8com&usti&"e# mover8pistones# etc. En E!ce"# e" o&jeto !or"S#eets tiene "a propiedad Ran$e que es un o&jeto# Ran$e tiene "a propiedad (ont que es tam&i n un o&jeto ' (ont tiene "a propiedad +old *ne$rita,. 9en$a esto mu' presente 'a que uti"izaremos frecuentemente +ropiedades de un o&jeto que ser)n tam&i n O&jetos. .ic(o de otra forma# (a' propiedades que devue"ven o&jetos# por ejemp"o# "a propiedad Ran$e de un o&jeto !or"S#eet devue"ve un o&jeto de tipo Ran$e . Programacin Orientada a Objetos o Programacin Basada en Objetos. :a' una suti" diferencia entre "as definiciones de" t-tu"o. +ro$ramaci%n orientada a O&jetos# si$nifica que e" pro$ramador tra&aja con o&jetos fa&ricados por " mismo# es decir# e" pro$ramador es quien imp"ementa "as c"ases para "ue$o crear o&jetos a partir de e""as. Lo que (aremos nosotros# por e" momento# ser) uti"izar o&jetos 'a definidos por "a ap"icaci%n E!ce" *6or7S(eets# Ran$e#..., sin imp"ementar ni n$uno de nuevo# por "o que en nuestro caso es m)s correcto (a&"ar de pro$ramaci%n &asada en o&jetos. O&serve que esta es una de "as $randes ventajas de "a OO+# uti"izar o&jetos definidos por a"$uien sin tener que conocer nada so&re su imp"ementaci%n# s%"o de&emos conocer sus propiedades ' m todos ' uti"izar"os de forma correcta. ;ueno# despu s de esta e!tensa pero necesaria introducci%n pasemos 'a a (acer a"$una cosa en E!ce". No es necesario que se aprenda "o anterior a" pi de "a "etra ' tampoco es necesario que "o comprenda a" cien por cien# s%"o t n$a"o presente para "as definiciones que vienen a continuaci%n ' ver) como va asimi"ando
0 4 330

MACROS EN MS EXCELL

"os conceptos de O&jeto# propiedades# m todos# etc. E" editor de visua" &)sic es "a ap"icaci%n que uti"izaremos para construir "as macros que interactuaran junto con "os "i&ros de tra&ajo. A continuaci%n prepararemos un arc(ivo en e" que escri&iremos "as primeras instrucciones en <isua" &asic. Preparar un archi o nue o. +ara entrar en e" editor de <isua" ;asic# ejecute "os pasos si$uientes. 3. Active opci%n ,erra&ientas- Macro- Editor de %isual +sic. Se a&rir) "a ventana si$uiente.

Ma!imize "a ventana para tra&ajar m)s c%modamente ' procure tener activadas "a ventana E plorador de pro*ectos ' "a ventana Propiedades *%er- E plorador de pro*ectos ' %er- %entana propiedades,. !nsertar un nue o mdu"o. Un m%du"o sirve para a$rupar procedimientos ' funciones. E" procedimiento ' "a funci%n son entidades de pro$ramaci%n que sirven para a$rupar instrucciones de c%di$o que rea"izan una acci%n concreta. +ara insertar un m%du"o active opci%n de" men5 .nsertar- M/dulo. Se activar) una nueva ventana# si aparece demasiado peque=a# ma!im-ce"a. >a (emos dic(o que un procedimiento es un &"oque de instrucciones de c%di$o que sirven para ""evar a ca&o a"$una tarea espec-fica. Un procedimiento empieza siempre con "a instrucci%n Sub Nombre_Procedimiento > termina con "a instrucci%n End Sub. A continuaci%n crearemos un procedimiento para poner e" te!to ?:o"a? en "a casi""a A3.
1 4 330

MACROS EN MS EXCELL

Eje&plo 0 Sub Primero Ran$e *?A3?,.%alue / ?:o"a? End Sub

O&serve e" c%di$o. Ran$e*?A3?,.%alue/?:o"a? En esta "-nea estamos indicando que tra&ajamos con un o&jeto Ran$e1 +ara indicar"e que nos referimos a "a casi""a A3# encerramos entre par ntesis esta referencia *m)s ade"ante ver) otra forma de referirnos a "as casi""as,. .e este o&jeto# indicamos que queremos esta&"ecer un nuevo va"or para "a propiedad %alue# o&serve que para separar e" o&jeto de su propiedad uti"izamos "a notaci%n punto. Recuerde que e" conjunto Ran$e es un o&jeto que pende de" o&jeto !or"S#eets# as- por ejemp"o e" si$uiente c%di$o (ar-a "o mismo que e" anterior. !or"S#eets*3,.Ran$e *?A3?,.%alue / ?:o"a? ;ueno# de (ec(o no (ace "o mismo# en "a primera opci%n# e" te!to ?:o"a? se pone dentro de "a casi""a A3 de "a (oja activa# mientras que en e" se$undo es en "a casi""a A3 de primera (oja * de" conjunto de (ojas,. La se$unda notaci%n es m)s "ar$a# pero tam&i n m)s recomenda&"e 'a que se especifican todos "os o&jetos. En muc(as ocasiones se pueden omitir a"$unos o&jetos precedentes# no "e aconsejamos (acer"o# sus pro$ramas perder)n c"aridad ' concisi%n. Si desea (acer referencia a "a (oja activa puede uti"izar Acti)eS#eet# as-# e" primer ejemp"o "o dejaremos de "a manera si$uiente.

Sub Primero ActiveS(eet.Ran$e*?A3?,.<a"ue / ?:o"a? End Sub Sub Primero ActiveS(eet.ActiveCe"".<a"ue / ?:o"a? End Sub +ara terminar con este primer ejemp"o. !or"S#eets est)n dentro de" O&jeto !or"+oo"s *"i&ros de tra&ajo, ' !or"+oo"s est)n dentro de Application. Application es e" o&jeto superior# es e" que representa "a ap"icaci%n E!ce". As-# e" primer ejemp"o# si$uiendo toda "a jerarqu-a de o&jetos quedar-a de "a forma si$uiente.
@ 4 330

MACROS EN MS EXCELL

Sub Primero App"ication.6or7;oo7s*3,.6or7S(eets*3,.Ran$e*?A3?,.<a"ue / ?:o"a? End Sub Ansistiendo con "a nomenc"atura# Application casi nunca es necesario especificar"o# piense que todos "os o&jetos penden de este# !or"+oo"s ser) necesario imp"ementar"o si en "as macros se tra&aja con diferentes "i&ros de tra&ajo *diferentes arc(ivos,# a partir de !or"S#eets# es aconseja&"e inc"uir"o en e" c%di$o# so&re todo si se quiere tra&ajar con diferentes (ojas# ver)# sin em&ar$o# que en muc(as ocasiones no se ap"ica. #jecutar un procedimiento o $uncin. +rue&e ejecutar e" primer procedimiento de ejemp"o. 3. 3. Sit5e e" cursor dentro de" procedimiento. 0. 0. Active opci%n de "a &arra de men5s Ejecutar- Ejecutar Sub 2serfor&. 9am&i n puede (acer c"ic so&re e" &ot%n o pu"sar "a tec"a (3. Para ejecutar el procedimiento desde la hoja de clculo. .e&e estar en una (oja# no en e" editor de <isua" ;asic 3. 3. Active opci%n de "a &arra de men5s ,erra&ientas- Macro- Macros. Se desp"ie$a una ventana que muestra una "ista donde est)s todas "as macros inc"uidas en e" "i&ro de tra&ajo. 0. 0. Se"eccione "a macro de "a "ista ' pu"se so&re e" &ot%n Ejecutar. En este se$undo ejemp"o simp"emente amp"iaremos "a funciona"idad de "a macro de" ejemp"o 3. Adem)s de escri&ir ?:o"a? en "a casi""a A3 de "a ce"da A3# "a pondremos en ne$rita ' "e daremos co"or a" te!to. +ara e""o uti"izaremos "as propiedades +old' Color de" o&jeto (ont. Sub Se$undo ActiveS(eet.Ran$e*?A3?,.<a"ue / ?:o"a? ActiveS(eet.Ran$e*?A3?,.Bont.;o"d / True ActiveS(eet.Ran$e*?A3?,.Bont.Co"or / RGB*022#C#C, End Sub True. 4rue# que traducido es verdadero# simp"emente indica que "a propiedad +oldest) activada. Si se deseara desactivar# &astar-a con i$ua"ar"a a" va"or (alse. La funcin RGB.
2 4 330

MACROS EN MS EXCELL

O&serve que para esta&"ecer e" co"or de "a propiedad se uti"iza "a funci%n %&B*Red# Dreen# ;"ue,# "os tres ar$umentos para esta funci%n son va"ores de" C a 022 que corresponden a "a intensidad de "os co"ores Rojo# <erde ' Azu" respectivamente. Referenciar un rango de celdas. S%"o tiene que cam&iar a "a forma Casi""a'!nicia"(Casi""a')ina". +or ejemp"o ap"icar e" 5"timo ejemp"o a" ran$o de casi""as que va de "a A3 a "a AE# pon$a. Sub Segundo ActiveS(eet.Ran$e*?A3FAE?,.<a"ue / ?:o"a? ActiveS(eet.Ran$e*?A3FAE?,.Bont.;o"d / True ActiveS(eet.Ran$e*?A3FAE?,.Bont.Co"or / RGB*022#C#C, End Sub A continuaci%n vamos a repetir e" pro$rama Ejemp"o3# pero en "u$ar de poner ?:o"a? en "a casi""a A3 de "a (oja activa# dejaremos que e" usuario entre un te!to desde tec"ado ' a continuaci%n $uardaremos ese va"or en esa casi""a. O&serve que e" va"or que entre de" usuario de&e $uardarse en a"$5n "u$ar para poder poner"o despu s en "a casi""a A3G pues &ien# ese va"or se $uardar) en una varia&"e. Una varia&"e es simp"emente un trozo de memoria que "a funci%n o procedimineto se reserva para $uardar datos# "a forma $enera" de dec"arar una varia&"e es 5.M varia&"e AS tipo. Siendo varia&"e e" nom&re que se asi$na a "a misma ' 4ipo e" tipo de datos que se $uardar)n *n5meros# te!to# fec(a# &o"eanos#...,. En nuestro ejemp"o# dec"araremos "a varia&"e de tipo *tring *tipo te!to,# ' "o (aremos de "a forma si$uiente. 5i& 9e!to As *tring Con esto estamos indicando que se reserve un trozo de memoria *e" que sea, # que se ""ama 9e!to ' que e" tipo de datos que se $uardar)n a(- ser)n caracteres. La Funcin InputBox. Esta funci%n muestra una ventana para que e" usuario pueda tec"ear datos. Cuando se pu"sa so&re Aceptar# "os datos entrados pasan a "a varia&"e a "a que se (a i$ua"ado "a funci%n. <ea "a "-nea si$uiente. 9e!to / !nputBo+*?Antroduzca e" te!to?# ?Entrada de datos?,. Si en "a ventana que muestra Anput;o! pu"sa so&re e" &ot%n Aceptar# "os datos tec"eados se $uardar)n e" "a varia&"e 9e!to. Sintaxis de nputBox. !nputBo+*Mensaje# Ttulo# Valor por defecto# Posicin ori!ontal# Posicin Vertical# "rc i#o a$uda# N%mero de conte&to para la a$uda,.
H 4 330

MACROS EN MS EXCELL

Mensaje F Es e" mensaje que se muestra en "a ventana. Si desea poner m)s de una "-nea pon$a C(r*31, para cada nueva "-nea# vea e" ejemp"o si$uiente. Ttulo F Es e" t-tu"o para "a ventana !nputBo+. Es un par)metro opciona". Valor por defectoF Es e" va"or que mostrar) por defecto e" cuadro donde e" usuario entra e" va"or. +ar)metro opciona". Posicin 'ori!ontalF La posici%n X de "a panta""a donde se mostrar) e" cuadro# concretamente es "a posici%n para "a parte izquierda. Si se omite e" cuadro se presenta (orizonta"mente centrado a "a panta""a. Posicin VerticalF La posici%n > de "a panta""a donde se mostrar) e" cuadro# concretamente es "a posici%n para "a parte superior. Si se omite e" cuadro se presenta vertica"mente centrado a "a panta""a. "rc i#o "$uda( Es e" arc(ivo que contiene "a a'uda para e" cuadro. +ar)metro opciona". N%mero de conte&to para la a$uda( N5mero asi$nado que corresponde a" identificador de" arc(ivo de a'uda# sirve para "oca"izar e" te!to que se de&e mostrar. Si se especifica este par)metro# de&e especificarse o&"i$atoriamente e" par)metro Arc(ivo A'uda. Sub )ntrar8Valor 5i& 9e!to As Strin$ * + r,-./ sir#e para 0ue el mensaje se muestre en dos 1neas 9e!to / Anput;o!*?Antroducir un te!to ? I C(r*31, I ?+ara "a casi""a A3?# ?Entrada de datos?, ActiveS(eet.Ran$e*?A3?,.<a"ue / 9e!to End Sub Este ejemp"o tam&i n se puede (acer sin varia&"es. Sub )ntrar_Valor ActiveS(eet.Ran$e*?A3?,.<a"ue / 2nputBo&*?Antroducir un te!to ? I C(r*31, I ?+ara "a casi""a A3?# ?Entrada de datos?, End Sub

Eje&plo 6 Repetiremos e" ejemp"o 1# pero en "u$ar de entrar "os va"ores so&re "a casi""a A3# (aremos que e" usuario pueda e"e$ir en que casi""a quiere entrar "os dat os# es decir# se "e pre$untar) a" usuario mediante un se$undo Anput&o! so&re que casi""a quiere entrar e" va"or de" primer Anput&o!. Ser)n necesaria dos varia&"es# una para $uardar "a casi""a que escoja e" usuario ' otra para $uardar e" va"or. Option E plicit Sub )ntrar_Valor
J 4 330

MACROS EN MS EXCELL

5i& Casi""a As Strin$ 5i& 9e!to As Strin$ Casi""a / Anput;o!*?En que casi""a quiere entrar e" va"or?# ?Entrar Casi""a?, 9e!to / Anput;o!*?Antroducir un te!to ? I C(r*31, I ?+ara "a casi""a ? I Casi""a # ?Entrada de datos?, ActiveS(eet.Ran$e*Casi""a,.<a"ue / 9e!to End Sub En visua" &asic no es necesario dec"arar "as varia&"es# por ejemp"o# en e" pro$rama anterior se (u&iera podido prescindir de "as "-neas 5i& Casi""a As *tring 5i& 9e!to As *tring A pesar de e""o# "e recomendamos que siempre dec"are "as varia&"es que va a uti"izar# de esta forma sa&r) cua"es uti"iza e" procedimiento ' que tipo de datos $uarda cada una# piense que a medida que va'a aprendiendo# crear) procedimientos cada vez m)s comp"icados ' que requerir)n e" uso de m)s varia&"es# si no dec"ara "as varia&"es a" principio de" procedimiento ocurrir)n dos cosas. +rimero# "as varia&"es no dec"aradas son asumidas como tipo %ariant *este es un tipo de datos que puede a"macenar cua"quier va"or# n5mero# fec(as# te!to# etc. pero ten$a en cuenta que ocupa 0C ;'tes ' para $uardar una referencia a una casi""a# "a edad de a"$uien# etc. no son necesarios tantos &'tes,G se$undo# reducir) considera&"emente "a "e$i&i"idad de sus procedimient os 'a que "as varia&"es "as ir) co"ocando a medida que "as necesite# esto# a "a "ar$a comp"icar) "a correcci%n o modificaci%n de" procedimiento. ;ueno# pues toda "a e!p"icaci%n anterior es para que dec"are todas "as varia&"es que va a uti"izar. La sentencia Option E plicit a" principio de" m%du"o fuerza a que se dec"aren todas "as varia&"es. Si a" ejecutar e" pro$rama# se encuentra a"$una varia&"e sin dec"arar se producir) un error ' no se podr) ejecutar e" pro$rama (asta que se dec"are. Si todav-a no se (a convencido so&re "a conveniencia de dec"arar "as varia&"es ' uti"izar Option E plicit# prue&e e" procedimiento si$uiente# c%pie"o ta" cua" *9e!to ' 9esto est)n puestos adrede simu"ando que nos (emos equivocado a" tec"ear,.

E 4 330

MACROS EN MS EXCELL

Sub Entrar8<a"or 9e!to / Anput;o!*?Antroducir un te!to ? I C(r*31, I ?+ara "a casi""a A3?# ?Entrada de datos?, ActiveS(eet.Ran$e*?A3?,.<a"ue / 9esto End Sub O&serve que e" pro$rama no (ace "o que se pretend-a que (iciera. Efectivamente# 9e!to ' 9esto son dos varia&"es diferentes# como no se (a dec"arado nin$una ni se (a uti"izado Option E plicit <isua" ;asic no da nin$5n tipo de error ' ejecuta e" pro$rama. +rue&e e" si$uiente m%du"o e intente ejecutar"o. Option E plicit Sub Entrar8<a"or 5i& 9e!to As Strin$ 9e!to / Anput;o!*?Antroducir un te!to ? I C(r*31, I ?+ara "a casi""a A3?# ?Entrada de datos?, ActiveS(eet.Ran$e*?A3?,.<a"ue / 9esto End Sub O&serve que e" pro$rama no se ejecuta# a" poner Option E plicit# forzamos a que se dec"aren todas "as varia&"es. <isua" ;asic detecta que "a varia&"e Testo no (a sido dec"arada ' as- "o indica mostrando Error# entonces es cuando es m)s f)ci" darnos cuenta de" error que (emos cometido a" tec"ear ' cam&iamos 9esto por 9e!to. A(ora ima$ine que e" error se produce en un pro$rama de cientos de "-neas que necesita otras tantas varia&"es.

K 4 330

MACROS EN MS EXCELL

4ipo de datos +*te +oolean .nte$er Lon$*entero "ar$o, Sin$le *coma f"otanteL precisi%n simp"e, 5ouble *coma f"otanteL precisi%n do&"e, Currenc* *entero a esca"a, 5eci&al 5ate Object Strin$ *"on$itud varia&"e, Strin$*"on$itud fija, %ariant*con n5meros, %ariant*con caracteres, 5efinido por el usuario *uti"izando 9'pe,

4a&a7o 5e al&acena&iento 3 &'te 0 &'tes 0 &'tes @ &'tes @ &'tes E &'tes E &'tes 3@ &'tes E &'tes @ &'tes 3C &'tes M "on$itud de "a cadena Lon$itud de "a cadena 3H &'tes 00 &'tes M "on$itud de cadena N5mero requerido por "os e"ementos

.nter)alo C a 022 9rue o Ba"se 410.JHE a 10.JHJ 40.3@J.@E1.H@E a 0.3@J.@E1.H@J 41#@C0E01E1E a 43#@C30KEE4@2 para va"ores ne$ativosG 3#@C30KEE4@2 a 1#@C0E01E1E para va"ores positivos 43#JKJHK131@EH010E1CE a 4@#K@CH2H@2E@30@JE410@ para va"ores ne$ativosG @#K@CH2H@2E@30@JE410@ a 3#JKJHK131@EH010E1CE para va"ores positivos 4K00.11J.0C1.HE2.@JJ#2ECE a K00.11J.0C1.HE2.@JJ#2ECJ ML4 JK.00E.3H0.23@.0H@.11J.2K1.2@1.K2C.112 sin punto decima"G ML4 J#K00E3H023@0H@11J2K12@1K2C112 con 0E posiciones a "a derec(a de" si$no decima"G e" n5mero m)s peque=o distinto de cero esML4 C#CCCCCCCCCCCCCCCCCCCCCCCCCCC3 3 de enero de 3CC a 13 de diciem&re de KKKK Cua"quier referencia a tipo O&ject .esde C a 0.CCC mi""ones .esde 3 a H2.@CC apro!imadamente Cua"quier va"or num rico (asta e" interva"o de un tipo .ou&"e E" mismo interva"o que para un tipo Strin$ de "on$itud varia&"e E" interva"o de cada e"emento es e" mismo que e" interva"o de su tipo de datos.

Con ersin de ,ipos de datos. Copie e" si$uiente Ejemp"o. Simp"emente se piden dos n5meros# se suman ' se $uardan e" "a casi""a A3 de "a (oja activa. Eje&plo 3 Option E plicit Sub Sumar*, 5i& Numero3 As .nte$er 5i& Numero0 As .nte$er Numero3 / Anput;o!*?Entrar e" primer va"or?# ?Entrada de datos?, Numero0 / Anput;o!*?Entrar e" primer va"or?# ?Entrada de datos?, ActiveS(eet.Ran$e*?A3?,.<a"ue / Numero3 M Numero0 End Sub A(ora# vue"va a ejecutar e" pro$rama ' cuando se "e pide e" primer va"or tec"ee ?:o"a?. O&serve que e" pro$rama se detiene indicando un error en e" tipo de datos. Efectivamente# o&serve que "a funci%n Anput;o! devue"ve siempre datos tipo *tring# en e" primer ejemp"o no (a (a&ido nin$5n pro&"ema# a" entrar caracteres num ricos3# estos pueden asi$narse a varia&"es tipo !nteger porque <isua" ;asic (ace autom)ticamente "a conversi%n# pero a" entrar te!to e intentar"o asi$nar a una varia&"e !nteger <isua"
3C 4 330

MACROS EN MS EXCELL

;asic muestra un error indicando que "a varia&"e no es adecuada para "os datos que se desean $uardar. +ara so"ucionar estos pro&"emas se de&en uti"izar funciones de conversi%n de tipo. Estas funciones# como su nom&re indica# convierten datos de un tipo a otro# de *tring a !nteger# de !nteger a *tring# de -ate a *tring #... As- e" procedimiento anterior quedar-a. Option E plicit Sub Sumar*, 5i& Numero3 As .nte$er 5i& Numero0 As .nte$er Numero3 / <a"*Anput;o!*?Entrar e" primer va"or?# ?Entrada de datos?,, Numero0 / <a"*Anput;o!*?Entrar e" primer va"or?# ?Entrada de datos?,, ActiveS(eet.Ran$e*?A3?,.<a"ue / Numero3 M Numero0 End Sub La funci%n .a" *.ato Strin$,# convierte una cadena de caracteres a va"or num rico. Si "a cadena a convertir contiene a"$5n car)cter no num rico devue"ve C. As-# si a" pedir un va"or se tec"ea ?:o"a?# "a funci%n <a"# devo"ver) un cero.

9en$a en cuenta que para "os ordenadores no es "o mismo e" n5mero 3 que e" car)cter ?3?. En "os "en$uajes de pro$ramaci%n actua"es "a conversi%n de car)cter ?3? a n5mero 3 se (ace autom)ticamente en muc(os casos# esto es &ueno ' es ma"o. Es &ueno porque nos a(orra tener que (acer "as conversiones ' es ma"o porque es m)s dif-ci" contro"ar ciertos casos. Si$a con "os ejemp"os ' entender) de "o que estamos (a&"ando. S%"o para su informaci%n# e" ordenador $uarda e" n5mero 3 de "a si$uiente manera CCCCCCC3# mientras que e" car)cter ?3? se $uarda como CC33CCCC *e" n5mero @E de" c%di$o ASCAA,.

)unciones de con ersin de tipos. ,Tabla copiada de la a$uda en lnea de Visual


33 4 330

MACROS EN MS EXCELL

Basic para )&cel/3 .a" *Cadena,. Convierte "a cadena a un va"or num rico. *tr*N5mero,. Convierte e" n5mero a una e!presi%n cadena. Las si$uientes funciones tienen "a forma )uncin*E!presi%n,. C-b" (unci/n Cboo" Cbyte Ccur Cdate 5ouble 4ipo 4@#K@CH2H@2E@30@JE410@ para va"ores de)uelto +oolean ne$ativosG @#K@CH2H@2E@30@JE410@ a +*te Currenc* 5ate 3#JKJHK131@EH010E1CE para va"ores positivos. .nter)alo del ar$u&ento e presi/n Cua"quier e!presi%n de cadena o num rica v)"ida. C a 022. 4K00.11J.0C1.HE2.@JJ#2ECE a K00.11J.0C1.HE2.@JJ#2ECJ. Cua"quier e!presi%n de fec(a. 5eci&al .nte$er ML4J#K00E3H023@0H@11J2K12@1K2C112. La Lon$ Sin$le menor posici%n para un n5mero que no sea cero %ariant Strin$ es C#CCCCCCCCCCCCCCCCCCCCCCCCCCC3. 410.JHE a 10.JHJG "as fracciones se redondean. 40.3@J.@E1.H@E a 0.3@J.@E1.H@JG "as fracciones se redondean. 41#@C0E01E1E a 43#@C30KEE4@2 para va"ores ne$ativosG 3#@C30KEE4@2 a 1#@C0E01E1E para va"ores positivos. E" mismo interva"o que .ou&"e para va"ores num ricos. E" mismo interva"o que Strin$ para va"ores no num ricos. E" va"or de retorno de CStr depende de" ar$umento e!presi%n.

Cdec C!nt C/ng C*ng C.ar C*tr

;ueno# despu s de esta introducci%n a "as varia&"es# pasemos a estudiar unos cuantos o&jetos ' propiedades que se uti"izan (a&itua"mente. !"jeto #ells$fila% columna&. Sirve# como e" o&jeto ran$e# para referenciar una casi""a o ran$o de casi""as# pero en "u$ar de uti"izar "a referencia de "a forma A3# ;3# X10C#... uti"iza "a fi"a ' "a co"umna que ocupa "a casi""a dentro de "a (oja *o o&jeto 6or7S(eet,. +or ejemp"o# para poner (o"a en "a casi""a A3 de "a (oja activa seria# ActiveS(eet.Ce""s*3#3,.<a"ue/?:o"a? 'tili(ar #ells para referenciar un rango. Esto seria e" equiva"ente a Ran$e*?Casi""a8Anicia"FCasi""a8Bina"?,. La forma que se o&tiene uti"izando Ce""s es un poco m)s "ar$a# pero se ver) que a veces resu"ta muc(o m)s funciona" que uti"izando 5nicamente ran$e. +ara referirnos a" ran$o A3F;E# pondremos# Ran$e*Ce""s*3# 3,# Ce""s*E# 0,,.<a"ue / ?:o"a? Otra forma interesante de Ce""s es "a si$uiente# Ran$e*?A2F;3C?,.Ce""s*0# 3,.<a"ue / ?:o"a? +ondr) en "a ce"da AH e" va"or ?:o"a?# o&serve que en
30 4 330

MACROS EN MS EXCELL

este ejemp"o Ce""s comienza a contar fi"as ' co"umnas a partir de" ran$o especificado en e" o&jeto Ran$e. Una varia&"e o&jeto sir ve para (acer referencia a un o&jeto# esto si$nifica que podremos acceder a "as propiedades de un o&jeto e invocar a sus m todos a trav s de "a varia&"e en "u$ar de (acer"o directamente a trav s de" o&jeto. +osi&"emente no se uti"ice demasiado esta c"ase de varia&"es *esta c"aro que esto depender) de "as preferencias de" pro$ramador,# pero (a' casos en "os que no (a' m)s remedio que uti"izar"as # por ejemp"o en estructuras (or Eac# ... Ne t como veremos# o cuando sea necesario construir funciones que devue"van ran$os# referencias a (ojas# etc. +ara dec"arar una varia&"e o&jeto se uti"iza tam&i n "a pa"a&ra 5i& de "a forma si$uiente# 5i&<ar8O&jeto As Objeto +or Ejemp"o 5i&R As Ran$e 5i&:oja As !or"S#eet +ara asi$nar un o&jeto a una varia&"e de&e u ti"izar "a instrucci%n Set. Set <aria&"e8O&jeto / O&jeto +or Ejemp"o Set R/ ActiveS(eet.Ran$e*?A3F;3C?, Set :oja / ActiveS(eet Set :oja / 6or7S(eets*3,

<eamos a continuaci%n un ejemp"o de c%mo uti"izar este tipo de varia&"es# Eje&plo 81 A"$o mu' simp"e# ""enar e" ran$o de A3 a ;3C con "a pa"a&ra ?:o"a? ' despu s poner ne$rita# o&serve como se asi$na una varia&"e o&jeto a" o&jeto ' "ue$o como se tra&aja con esa varia&"e de "a misma forma que tra&ajar-a directamente so&re e" o&jeto. Sub o&j*, 5i&R As Ran$e Set R / ActiveS(eet.Ran$e*?A3CF;32?, R.<a"ue / ?:o"a? R.Bont.;o"d / 9rue End Sub )l *alor +othing. A"$unas veces puede que sea necesario desasi$nar una varia&"e de" o&jeto a" cua" (ace referencia# en este caso de&e i$u a"ar "a varia&"e a" va"or Not#in$ de "a forma si$uiente.
31 4 330

MACROS EN MS EXCELL

Set <aria&"e8O&jeto / Not#in$ :a&itua"mente se uti"iza Not#in$ en una estructura condiciona" para compro&ar si "a varia&"e o&jeto est) asi$nada. O&serve que si se uti"iza una varia&"e o&jeto a "a cua" todav-a no se "e (a (ec(o nin$una asi$naci%n e" pro$rama dar) error ' detendr) su ejecuci%n. Es &uena pr)ctica (acer este tipo de compro&aciones antes de tra&ajar con varia&"es o&jeto. <eremos un ejemp"o de esto en e" tema si$uiente. A(ora que 'a (a e!perimentado con unos cuantos o&jetos ' propiedades# nos detendremos a estudiar "as estructuras condiciona"es. Las estructuras condiciona"es son instrucciones de pro$ramaci%n que permiten contro"ar "a ejecuci%n de un fra$mento de c%di$o en funci%n de si se cump"e o no una condici%n. Estudiaremos en primer "u$ar "a instrucci%n if Condici%n t#en..End if *Si Condici%n Entonces...(in Si, La estructura condiciona" que se constru'e con "a instrucci%n Si Condici%n Entonces... (in Si tiene "a forma si$uiente. . Si Condici%n Entonces Sent ncia3 Sent ncia0 . . Sent nciaN (in Si . . Cuando e" pro$rama ""e$a a "a instrucci%n Si Condici%n Entonces # se eva"5a "a condici%n# si esta se cump"e *es cierta,# se ejecutan todas "as sentencias que est)n encerradas en e" &"oque# si no se cump"e "a condici%n# se sa"tan estas sentencias. Esta estructura en <isua" ;asic tiene "a sinta!is si$uiente# .f Condici%n 4#en Sent ncia3 Sent ncia0 . . Sent nciaN End .f

3@ 4 330

MACROS EN MS EXCELL

Eje&plo 8. Entrar una cantidad que representa e" precio de a"$o por e" tec"ado con "a instrucci%n !nputBo+ ' $uardar"o en "a ce"da A3 de "a (oja activa. Si e" va"or entrado desde e" tec"ado *' $uardado en A3, es superior a 3CCC# pedir descuento con otro Anput;o! ' $uardar"o en "a casi""a A0 de "a (oja activa. Ca"cu"ar en A1# e" precio de A3 menos e" descuento de A0. Sub Condiciona"*, ActiveS(eet.Ran$e*?A3?,.<a"ue / C * Poner las casillas donde se guardan los #alores 43 ActiveS(eet.Ran$e*?A0?,.<a"ue / C ActiveS(eet.Ran$e*?A1?,.<a"ue / C ActiveS(eet.Ran$e*?A3?,.<a"ue / <a"*Anput;o!*?Entrar e" precio?# ?Entrar?,, * Si el #alor de la casilla "- es ma$or 0ue -4445 entonces5 pedir descuento .f ActiveS(eet.Ran$e*?A3?,.<a"ue N 3CCC 4#en ActiveS(eet.Ran$e*?A0?,.<a"ue / <a"*Anput;o!*?Entrar .escuento?# ?Entrar?,, End .f ActiveS(eet.Ran$e*?A1?,.<a"ue / ActiveS(eet.Ran$e*?A3?,.<a"ue 48 ActiveS(eet.Ran$e*?A0?,.<a"ue End Sub E" mismo que e" anterior pero uti"izando varia&"es. Option E pl icit Sub Condiciona"*, 5i& +recio As .nte$er 5i& .escuento As .nte$er +recio / C

.escuento / C +recio / <a"*Anput;o!*?Entrar e" precio?# ?Entrar?,,

* Si el #alor de la #ariable precio es ma$or 0ue -4445 entonces5 pedir descuento .f +recio N 3CCC 4#en .escuento / <a"*Anput;o!*?Entrar .escuento?# ?Entrar?,, End .f ActiveS(eet.Ran$e*?A3?,.<a"ue / +recio ActiveS(eet.Ran$e*?A0?,.<a"ue / .escuento ActiveS(eet.Ran$e*?A1?,.<a"ue / +recio 4 .escuento
32 4 330

MACROS EN MS EXCELL

End Sub <iendo "os dos pro$ramas anteriores puede que "e surja "a duda de si emp"ear varia&"es o directamente va"ores a"macenados en "as ce"das. La so"uci%n es f)ci"# "o que "e parezca m)s conveniente en cada caso concreto que desee so"ucionar. Las varia&"es# aunque muc(as veces ?innecesarias?# quiz)s dejan "os pro$ramas m)s "e$i&"es ' c"aros. > "a "e$i&i"idad de un pro$rama es "o m)s va"ioso de" mundo para un pro$ramador *profesiona"mente (a&"ando ,# so&re todo si se da e" caso *inevita&"e e" KK#KKK...O de "as ocasiones, que se ten$a que modificar un pro$rama para dotar"e de m)s funciona"idades# faci"itar su manejo# etc. En "a ma'or-a de ejemp"os que encontrar) en este manua" ver) que se uti"izan varia&"es preferentemente. Aunque muc(as veces su funci%n sea simp"emente reco$er datos de "as ce"das para operar"as ' dejar"as en otras ce"das '# consecuentemente# aumente e" n5mero de operaciones# creemos que con e""o se $ana en "e$i&i"idad ' f"e!i&i"idad. Eje&plo 91 Macro que compara "os va"ores de "as casi""as A3 ' A0 de "a (oja activa. Si son i$ua"es pone e" co"or de "a fuente de am&as en azu". Sub Condiciona"0*, .f ActiveS(eet.Ran$e*?A3?,.<a"ue / ActiveS(eet.Ran$e*?A0?,.<a"ue 4#en ActiveS(eet.Ran$e*?A3?,.Bont.Co"or / RD;*C# C# 022, ActiveS(eet.Ran$e*?A0?,.Bont.Co"or / RD;*C# C# 022, End .f End Sub Estructura .f11Else Esta estructura se uti"iza cuando se requiere una respuesta a"ternativa a una condici%n. Su estructura es "a si$uiente. Si Condici%n Entonces Sent ncia3 Sent ncia0 . . Sent nciaN Sino Sent ncia3 Sent ncia0 . . Sent nciaN
3H 4 330

MACROS EN MS EXCELL

(in Si O&serve que# si se cump"e "a condici%n# se ejecuta e" &"oque de sentencias de"imitado por Si Condici%n Entonces ' Si no se cump"e "a condici%n se ejecuta e" &"oque de"imitado por Sino ' (in Si. En <isua" ;asic "a instrucci%n Si Condici%n Entonces ... Sino ... (in Si se e!presa con "as instrucciones si$uientes. .f Condici%n 4#en Sent ncia3 Sent ncia0 . . Sent nciaN Else Sent ncia3 Sent ncia0 . . Sent nciaN End .f

Eje&plo :1 Entrar una cantidad que representa e" precio de a"$o por e" tec"ado con "a instrucci%n Anput;o! ' $uardar"o en "a ce"da A3 de "a (oja activa. Si e" va"or entrado desde e" tec"ado *' $uardado en A3, es superior a 3CCC# se ap"ica un descuento de" 3CO sino se ap"ica un descuento de" 2O# e" descuento se $uarda en "a casi""a A0 de "a (oja activa. Co"ocar en A1# e" tota" descuento ' en A@ e" tota" menos e" descuento. 5i& +recio As Sin$le 5i& .escuento As Sin$le +recio / C +recio / <a"*Anput;o!*?Entrar e" precio?# ?Entrar?,, * Si el #alor de la #ariable precio es ma$or 0ue -4445 entonces5 aplicar descuento del -46 .f +recio N 3CCC 4#en .escuento / +recio P *3C L 3CC, ActiveS(eet.Ran$e*?A0?,.<a"ue / C#3 Else * Sino "plicar descuento del 76 .escuento / +recio P *2 L 3CC, ActiveS(eet.Ran$e*?A0?,.<a"ue / C#C2
3J 4 330

MACROS EN MS EXCELL

End .f ActiveS(eet.Ran$e*?A3?,.<a"ue / +recio ActiveS(eet.Ran$e*?A1?,.<a"ue / .escuento ActiveS(eet.Ran$e*?A@?,.<a"ue / +recio 4 .escuento End Sub Eje&plo 0;1 Restar "os va"ores de "as casi""a A3 ' A0. Duardar e" resu"tado en A1. Si e" resu"tado es positivo o C# poner "a fuente de A1 en azu"# sino poner"a en rojo. Sub Condiciona"8E"se0*, ActiveS(eet.Ran$e*?A1?,.<a"ue / AvtiveS(eet.Ran$e*?A3?,.<a"ue 48 ActiveS(eet.Ran$e*?A0?,.<a"ue .f ActiveS(eet*?A1?,.<a"ue Q C 4#en ActiveS(eet.Ran$e*?A1?,.Bont.Co"or / RD;*022#C#C, Else ActiveS(eet.Ran$e*?A1?,.Bont.Co"or / RD;*C#C#022, End .f End Sub Estructuras .f anidadas1 No tiene que sorprender"e# dentro de una estructura if puede ir otra# ' dentro de esta otra# ' otra... <ea e" ejemp"o si$uiente. Eje&plo 001 Comparar "os va"ores de "as casi""a A3 ' A0 de "a (oja activa. Si son i$ua"es# escri&ir en A1 81os #alores de "- $ "9 son iguales8# si e" va"or de A3 es ma'or que A0# escri&ir 8"- ma$or 0ue "98# sino# escri&ir 8"9 ma$or 0ue "-8 . .f ActiveS(eet.Ran$e*?A3?,.<a"ue / ActiveS(eet.Ran$e*?A0?,.<a"ue 4#en ActiveS(eet.Ran$e*?A1?,.<a"ue / ?Los <a"ores de A3 ' A0 son i$ua"es? Else .f ActiveS(eet.Ran$e*?A3?,.<a"ue N ActiveS(eet.Ran$e*?A0?,.<a"ue 4#en ActiveS(eet.Ran$e*?A1?,.<a"ue / ?A3 ma'or que A0?
3E 4 330

MACROS EN MS EXCELL

Else ActiveS(eet.Ran$e*?A1?,.<a"ue / ?A0 ma'or que A3? End .f End .f End Sub O&serve que "a se$unda estructura .f..Else..End .f queda dentro de" Else de "a primera estructura. Esta es una re$"a $enera"# cuando pone un End .f# este cierra siempre e" 5"timo .f * o Else, a&ierto. Operadores l/$icos1 Estos operadores se uti"izan cuando se necesitan eva"uar dos o m)s condiciones para decidir si se ejecutan o no determinadas acciones. !perador Lgico ,nd $-&. Uti"izaremos este operador cuando sea preciso que para ejecutar un &"oque de instrucciones se cump"a m)s de una condici%n. O&serve que de&er)n cump"irse todas "as condiciones . <ea e" ejemp"o si$uiente. Eje&plo 0<1 Entrar e" Nom&re# "a cantidad ' e" precio de un producto desde e" tec"ado ' $uardar"os respectivamente en A3# A0 ' A1. Ca"cu"ar e" tota" ' $uardar"o en A@. Si e" tota" es superior a 3C.CCC * e" nom&re de" producto es ?+atatas?# pedir un descuento# ca"cu"ar"o e" tota" descuento ' $uardar"o en A2# "ue$o restar e" descuento de" tota" ' $uardar"o en AH. Sub Ejemp"o830*, 5i& +roducto As Strin$ 5i&Cantidad As .nte$er 5i& +recio As Sin$le 5i& 9ota" As Sin$le 5i& .escuento As Sin$le 5i& 9ota"8.escuento As Sin$le +recio / C +roducto / Anput;o!*?Entrar Nom&re de" +roducto?#?Entrar?, +recio / <a"*Anput;o!*?Entrar e" precio?# ?Entrar?,, +recio / <a"*Anput;o!*?Entrar "a cantidad?# ?Entrar?,, 9ota" / +recio P Cantidad ActiveS(eet.Ran$e*?A3?,.<a"ue / +roducto ActiveS(eet.Ran$e*?A0?,.<a"ue / +recio ActiveS(eet.Ran$e*?A1?,.<a"ue / Cantidad ActiveS(eet.Ran$e*?A@?,.<a"ue / 9ota" * Si total ma$or 0ue -43444 $ el producto es Patatas5 aplicar descuento3
3K 4 330

MACROS EN MS EXCELL

.f 9ota" N 3CCCC And +roducto / ?+atatas? 4#en .escuento / <a"*Anput;o!*?Entrar .escuento?# ?Entrar?,, 9ota"8.escuento / 9ota" P *.escuento L 3CC, 9ota" / 9ota" 4 9ota"8.escuento ActiveS(eet.Ran$e*?A2?,.<a"ue / 9ota"8.escuento ActiveS(eet.Ran$e*?AH?,.<a"ue / 9ota" End .f End Sub O&serve que para que se ejecute e" &"oque de instrucciones entre Af.. End Af de&en cump"irse "as dos condiciones que se eva"5an# si fa""a cua"quiera de "as dos *o "as dos a "a vez,# no se ejecuta dic(o &"oque. !perador Lgico !r $!&. Uti"izaremos este operador cuando sea preciso que para ejecutar un &"oque de instrucciones se cump"a a"$una de una serie de condiciones. O&serve que s%"o es necesario que se cump"a a"$una de "as condiciones que se eva"5an. <ea e" ejemp"o si$uiente. Eje&plo 0=1 Entrar e" Nom&re# "a cantidad ' e " precio de un producto desde e" tec"ado ' $uardar"os respectivamente en A3# A0 ' A1. Ca"cu"ar e" tota" ' $uardar"o en A@. Si e" tota" es superior a 3C.CCC o e" nom&re de" producto e" ?+atatas?# pedir un descuento# ca"cu"ar"o e" tota" descuento ' $uardar"o en A2# "ue$o restar e" descuento de" tota" ' $uardar"o en AH. Sub Ejemp"o831*, 5i& +roducto As Strin$ 5i&Cantidad As .nte$er 5i& +recio As Sin$le 5i& 9ota" As Sin$le 5i& .escuento As Sin$le 5i& 9ota"8.escuento As Sin$le +recio / C +roducto / Anput;o!*?Entrar Nom&re de" +roducto?#?Entrar?, +recio / <a"*Anput;o!*?Entrar e" precio?# ?Entrar?,, +recio / <a"*Anput;o!*?Entrar "a cantidad?# ?Entrar?,, 9ota" / +recio P Cantidad ActiveS(eet.Ran$e*?A3?,.<a"ue / +roducto ActiveS(eet.Ran$e*?A0?,.<a"ue / +recio ActiveS(eet.Ran$e*?A1?,.<a"ue / Cantidad ActiveS(eet.Ran$e*?A@?,.<a"ue / 9ota"

0C 4 330

MACROS EN MS EXCELL

* Si total ma$or 0ue -43444 o el producto es Patatas5 aplicar descuento3 .f 9ota" N 3CCCC Or +roducto / ?+atatas? 4#en .escuento / <a"*Anput;o!*?Entrar .escuento?# ?Ent rar?,, 9ota"8.escuento / 9ota" P *.escuento L 3CC, 9ota" / 9ota" 4 9ota"8.escuento ActiveS(eet.Ran$e*?A2?,.<a"ue / 9ota"8.escuento ActiveS(eet.Ran$e*?AH?,.<a"ue / 9ota" End .f End Sub !perador Lgico +ot $no&. Este operador se uti"iza para ver si NO se cump"e una condici%n. E" si$uiente ejemp"o (ace "o mismo que e" ejemp"o J pero uti"izando e" operador Not. Eje&plo 061 Entrar una cantidad que representa e" precio de a"$o por e" tec"ado con "a instrucci%n Anput;o! ' $uardar"o en "a ce"da A3 de "a (oja activa. Si e" va"or entrado desde e" tec"ado *' $uardado en A3, es superior a 3CCC# pedir descuento con otro Anput;o! ' $uardar"o en "a casi""a A0 de "a (oja activa. Ca"cu"ar en A1# e" precio de A3 menos e" descuento de A0. Sub Ejemp"o83@*, 5i& +recio As .nte$er 5i& .escuento As .nte$er +recio / C .escuento / C +recio / <a"*Anput;o!*?Entrar e" precio?# ?Entrar?,, * Si el #alor de la #ariable precio N: es menor igual -4445 entonces5 pedir descuento .f Not *+recio Q/ 3CCC, 4#en .escuento / <a"*Anput;o!*?Entrar .escuento?# ?Entrar?,, End .f ActiveS(eet.Ran$e*?A3?,.<a"ue / +recio ActiveS(eet.Ran$e*?A0?,.<a"ue / .escuento ActiveS(eet.Ran$e*?A1?,.<a"ue / +recio 4 .escuento End Sub 4ablas de la )erdad1
03 4 330

MACROS EN MS EXCELL

<ea "as ta&"as si$uientes para ver "os resu"tados de eva"uar dos condiciones con e" operador And ' con e" operador Or. And. Or. Condici/n 0 Ba"sa Ba"sa Cierta Cierta Condici/n< Resultado Condici/n0 Condici/n< Resultado Ba"sa Cierta Ba"sa Cierta Ba"so Ba"so Ba"so Cierto Ba"sa Ba"sa Cierta Cierta Ba"sa Cierta Ba"sa Cierta Ba"so Cierto Cierto Cierto

O&serve que con e" operador AN. de&en de cump"irse todas "as condiciones *dos o veinticinco, para que e" resu"tado sea cierto. Con e" operador OR s%"o es necesario que se cump"a una *de "as dos o de "as veinticinco, para que e" resu"tado sea cierto. Estructura Select Case1 En ocasiones se dar) e" caso que en funci%n de" va"or o ran$o de va"ores que pueda tener una varia&"e# una casi""a# una e!presi%n# etc. de&er)n ""evarse a ca&o diferentes acciones o $rupos de acciones. <ea e" ejemp"o si$uiente. Eje&plo 031 Macro que suma# resta# mu"tip"ica o divide "os va"ores de "as casi""as A3 ' A0 dependiendo de si ;3 contiene e" si$no M# 4# !# F. E" resu"tado "o deja en A1. Si en ;3 no (a' nin$uno de "os si$nos anteriores en A1 de&e dejarse un C. Sub Ejemp"o832*, 5i&Si$no As Strin$ 5i& <a"or3 As .nte$er# <a"or0 As .nte$er# 9ota" As .nte$er <a"or3 / ActiveS(eet.Ran$e*?A3?,.<a"ue <a"or0 / ActiveS(eet.Ran$e*?A0?,.<a"ue Si$no / ActiveS(eet.Ran$e*?;3?,.<a"ue 9ota"/C .f Si$no / ?M? 4#en 9ota" / <a"or3 M <a"or0 End if .f Si$no / ?4? 4#en 9ota" / <a"or3 4 <a"or0 End if .f Si$no / ?!? 4#en
00 4 330

MACROS EN MS EXCELL

9ota" / <a"or3 P <a"or0 End if .f Si$no / ?F? 4#en 9ota" / <a"or3 L <a"or0 End if ActiveCe"".Ran$e*?A1?,.<a"ue / 9ota" End Sub O&serve que en e" ejemp"o anterior todas "as instrucciones if eva"5an "a misma varia&"e. E" pro$rama funciona correctamente pero para estos casos es mejor uti"izar "a instrucci%n Se"ect Ca se# e" motivo principa" es por "e$i&i"idad ' e"e$ancia. Se"ect Case tiene "a sinta!is si$uiente# Select Case E!presi%n Case va"ores F Anstrucciones. Case va"ores F Anstrucciones. . . Case va"oresF Anstrucciones. Case Else Anstrucciones en caso que no sean nin$uno de "os va"ores anteriores. End Select Eje&plo 081 Sub Ejemp"o83H*, 5i&Si$no As Strin$ 5i& <a"or3 As Ante$er# <a"or0 As .nte$er# 9ota" As .nte$er <a"or3 / ActiveS(eet.Ran$e*?A3?,.<a"ue <a"or0 / ActiveS(eet.Ran$e*?A0?,.<a"ue Si$no / ActiveS(eet.Ran$e*?A1?,.<a"ue

Select Case si$no Case ?M? 9ota" / <a"or3 M <a"or0 Case ?4?
01 4 330

MACROS EN MS EXCELL

9ota" / <a"or3 4 <a"or0 Case ?!? 9ota" / <a"or3 P <a"or0 Case ?F? 9ota" / <a"or3 L <a"or0 Case Else 9ota" / C End Select ActiveCe"".Ran$e*?A1?,.<a"ue / 9ota" End Sub <ea e" ejemp"o si$uiente donde cada sentencia Case eva"5a un ran$o de va"ores. Eje&plo 0>1 +ro$rama que pide tres notas de un a"umno mediante "a funci%n Anput;o!. Las notas van a parar respectivamente a "as casi""as A3# A0 ' A1 de "a (oja activa. E" pro$rama ca"cu"a "a media ' "a deja en A@. Si "a media est) entre C ' 0 deja en A2 e" mensaje ?Mu' deficiente?# si "a nota es 1 deja en A2 e" mensaje ?.eficiente?# si "a nota es @ deja ?Ansuficiente?# si es 2 ?Suficiente?# si es H ?;ien?# si est) entre J ' E deja ?Nota&"e?# si es ma'or que E deja ?So&resa"iente?. Sub Ejemp"o83J*, 5i& Nota3 As .nte$er# Nota0 As .nte$er# Nota1 As .nte$er 5i& Media As Sin$le Nota3 / <a"*Anput;o!*?Entrar Nota primera eva"uaci%n?# ?Nota?,, Nota0 / <a"*Anput;o!*?Entrar Nota Se$unda eva"uaci%n?# ?Nota?,, Nota1 / <a"*Anput;o!*?Entrar Nota 9ercera eva"uaci%n?# ?Nota?,, Media / *Nota3 M Nota0 M Nota1, L 1 ActiveS(eet.Ran$e*?A3?,.<a"ue / Nota3 ActiveS(eet.Ran$e*?A0?,.<a"ue / Nota0 ActiveS(eet.Ran$e*?A1?,.<a"ue / Nota1 ActiveS(eet.Ran$e*?A@?,.<a"ue / Media Select Case Media Case C 4o 0 ActiveS(eet.Ran$e*?A2?,.<a"ue / ?Mu' deficiente? Case 1 ActiveS(eet.Ran$e*?A2?,.<a"ue / ?.eficiente? Case @ ActiveS(eet.Ran$e*?A2?,.<a"ue / ?Ansuficiente?
0@ 4 330

MACROS EN MS EXCELL

Case 2 ActiveS(eet.Ran$e*?A2?,.<a"ue / ?Suficiente? Case H ActiveS(eet.Ran$e*?A2?,.<a"ue / ?;ien? Case J 4o E ActiveS(eet.Ran$e*?A2?,.<a"ue / ?Nota&"e? Case NE ActiveS(eet.Ran$e*?A2?,.<a"ue / ?So&resa"iente? End Select End Sub (unciones de co&probaci/n1 Antes de terminar con e" tema de condiciona"es veremos unas funciones que nos ser)n 5ti"es a "a (ora de compro&ar o va"idar e" tipo de "os datos ent rados desde tec"ado o simp"emente "os datos contenidos en una casi""a. <o"vamos a" ejemp"o que codificamos de "a manera si$uiente. Sub Ejemp"o83H*, 5i&Si$no As Strin$ 5i& <a"or3 As .nte$er# <a"or0 As .nte$er# 9ota" As .nte$er <a"or3 / ActiveS(eet.Ran$e*?A3?,.<a"ue <a"or0 / ActiveS(eet.Ran$e*?A0?,.<a"ue Si$no / ActiveS(eet.Ran$e*?A1?,.<a"ue

Select Case si$no Case ?M? 9ota" / <a"or3 M <a"or0 Case ?4? 9ota" / <a"or3 4 <a"or0 Case ?!? 9ota" / <a"or3 P <a"or0 Case ?F? 9ota" / <a"or3 L <a"or0 Case Else 9ota" / C End Select ActiveCe"".Ran$e*?A1?,.<a"ue / 9ota"
02 4 330

MACROS EN MS EXCELL

End Sub Ama$ine que en a"$una de "as casi""as que se de&en operar no (u&iera nin$5n va"or o &ien datos a"fanum ricos. A" ejecutar "a macro se producir) un error. Aunque con <isua" ;asic se puede contro"ar e" f"ujo de" pro$rama cuando se produce un error imprevisto# para so"ucionar este pro&"ema uti"izaremos una funci%n de compro&aci%n que nos di$a si en "as casi""as A3 ' A0 (a' va"ores adecuados *num ricos, para prose$uir con "a ejecuci%n de "a macro# en caso contrario se mostrar) un error ' no se ejecutar) nin$una de "as operaciones. La funci%n que uti"izaremos es .sNu&eric*e!presi%n,# esta funci%n devue"ve un va"or 4rue si "a e!presi%n que se eva"5a es un va"or num rico# en caso contrario devue"ve (alse. <ea como quedar-a e" pro$rama. 9am&i n se uti"iza "a funci%n .sE&pt* para compro&ar si en ;3 (a' a"$o# .sE&pt**E!presi%n, eva"5a si e!presi%n est) vac-a# devue"ve 4rue si es as- '(alse en caso contrario. Eje&plo 091 Sub Ejemp"o83E*, 5i&Si$no As Strin$ 5i& <a"or3 As .nte$er# <a"or0 As .nte$er# 9ota" As .nte$er 5i& Continuar As +oolean <a"or3 / ActiveS(eet.Ran$e*?A3?,.<a"ue <a"or0 / ActiveS(eet.Ran$e*?A0?,.<a"ue Si$no / ActiveS(eet.Ran$e*?A1?,.<a"ue Continuar / 9rue * Si en la casilla "- no a$ un #alor num;rico .f Not AsNumeric*ActiveS(eet.Ran$e*?A3?,, 4#en Ms$;o! +romptF/?En "a casi""a A3 no (a' nin$5n va"or num rico?# 9it"eF/?ERROR? Continuar/ Ba"se End .f * Si en la casilla "9 no a$ un #alor num;rico .f not AsNumeric*ActiveS(eet.Ran$e*?A0?,, 4#en Ms$;o! +romptF/?En "a casi""a A0 no (a' nin$5n va"or num rico?# 9it"eF/?ERROR? Continuar/ Ba"se End .f .f AsEmpt'*ActiveS(eet.Ran$e*?;3?,, 4#en Ms$;o! +romptF/?"a casi""a ;3 est) vac-a?# 9it"eF/?ERROR? Continuar/ Ba"se End .f .f Continuar 4#en Select Case si$no
0H 4 330

MACROS EN MS EXCELL

Case ?M? 9ota" / <a"or3 M <a"or0 Case ?4? 9ota" / <a"or3 4 <a"or0 Case ?!? 9ota" / <a"or3 P <a"or0 Case ?F? 9ota" / <a"or3 L <a"or0 Case Else 9ota" / C End Select ActiveCe"".Ran$e*?A1?,.<a"ue / 9ota" End if End Sub En "u$ar de "os tres Af de compro&aci%n se (u&iera podido uti"izar e" operador OR de "a manera si$uientes# .f not AsNumeric*ActiveS(eet.Ran$e*?A3?,, Or not AsNumeric*ActiveS(eet.Ran$e*?A0?,, 8 Or AsEmpt'*ActiveS(eet.Ran$e*?;3?,, 9(en Ms$;o! +romptF/?.e&e entrar n5meros en A3 ' A0 ' un si$no *M#4#!# F , en ;3# 9it"eF/?ERROR? Else * 2nstrucciones de las operaciones ....... End if Lista de Funciones de #ompro"acin. .sNu&ric*E!presi%n,. Comprue&a si e!presi%n tiene un va"or que se puede interpretar como num rico. .s5ate*E!presi%n,. Comprue&a si e!presi%n tiene un va"or que se puede interpretar como tipo fec(a. .sE&pt**E!presi%n,. Comprue&a que e!presi%n ten$a a"$5n va"or# que se (a'a inicia"izado. .sError*E!presi%n,. Comprue&a si e!presi%n devue"ve a"$5n va"or de error. .sArra**E!presi%n,. Comprue&a si e!presi%n *una varia&"e, es un arra' o no. .sObject*E!presi%n,. Comprue&a si e!presi%n *una varia&"e, representa una varia&"e tipo o&jeto. .sNull*E!presi%n,. Comprue&a si e!presi%n contiene un va"or nu"o de&ido a datos no v)"idos. Not#in$. No es propiamente una funci%n# sirve para compro&ar si una varia&"e o&jeto esta asociada a un o&jeto antes de (acer cua"quier operaci%n con e""a. Recuerde que para tra&ajar con una varia&"e o&jeto antes de&e asi$narse a uno *mediante "a instrucci%n Set?# en caso contrario se
0J 4 330

MACROS EN MS EXCELL

producir) un error en e" pro$rama cuando uti"ice e" o&jeto ' se detendr) su ejecuci%n. Sub O&j*, 5i&R As Ran$e . . * Si la #ariable R es Not ing es 0ue no a sido asignada5 no se puede trabajar con ella .f R .s Not#in$ 4#en Ms$;o! +rompt F/ ?La varia&"e O&jeto no (a sido asi$nada?# ;uttonsF/v&O7# 8 9it"e F/ ?Error? Else R.<a"ue / ?:o"a? End .f . . End Sub La funci/n Ms$+o 1 Esta funci%n muestra un mensaje en un cuadro de di)"o$o (asta que e" usuario pu"se un &ot%n. La funci%n devue"ve un dato tipo Ante$er en funci%n de" &ot%n pu"sado por e" usuario. A "a (ora de invocar est) funci%n# s e permiten diferentes tipos de &otones. Sintxis de .sgBox. Ms$+o * Mensaje# ;otones# 9-tu"o# Arc(ivo de a'uda# conte!to, Mensaje F O&"i$atorio# es e" mensaje que se muestra dentro de" cuadro de di)"o$o. +otones F Opciona". Es un n5mero o una suma de n5meros o constantes *vea ta&"a <a"ores para &otones e Aconos,# que sirve para mostrar determinados &otones e iconos dentro de" cuadro de di)"o$o. Si se omite este ar$umento asume va"or C que corresponde a un 5nico ;ot%n OR. 4@tulo F Opciona". Es e" te!to que se mostrar) en "a &arra de" t-tu"o de" cuadro de di)"o$o. Arc#i)o de A*uda F Opciona". Si (a asi$nado un te!to de a'uda a" cuadro de di)"o$o# aqu- de&e especificar e" nom&re de" arc(ivo de a'uda donde est) e" te!to. Conte tF Opciona". Es e" n5mero que sirve para identificar e" te!to a" tema de a'uda correspondiente que estar) contenido en e" arc(ivo especificado en e" par)metro Arc(ivo de A'uda. 4abla para botones e iconos del cuadro Ms$+o . *9a&"a copiada de" arc(ivo de a'uda de Microsoft E!ce",. <&OROn"' Constante <&ORCance" <&A&ortRetr'A$nor e <&>esNoCance" C %alor Muestra so"amente e" &ot%n 5escripci/n Aceptar. 3 Muestra "os &otones Aceptar ' Cance"ar. 0 Muestra "os &otones Anu"ar# Reintentar e A$norar. 1 Muestra "os &otones S-# No '
0E 4 330

MACROS EN MS EXCELL

<&>esNo <&Retr'Cance" <&Critica" <&Suestion <&E!c"amation <&Anformation <&.efau"t;utton3 <&.efau"t;utton0 <&.efau"t;utton1 <&.efau"t;utton@ <&App"icationMod a" <&S'stemModa"

@ 2 3H 10 @E H@ C 02H 230 JHE C

@CKH

Cance"ar. Muestra "os &otones S- ' No. Muestra "os &otones Reintentar ' Cance"ar. Muestra e" icono de mensaje cr-tico. Muestra e" icono de pre$unta de advertencia. Muestra e" icono de mensaje de advertencia. Muestra e" icono de mensaje de informaci%n. E" primer &ot%n es e" predeterminado. E" se$undo &ot%n es e" predeterminado. E" tercer &ot%n es e" predeterminado. E" cuarto &ot%n es e" predeterminado. Ap"icaci%n moda"G e" usuario de&e responder a" cuadro de mensajes antes de poder se$uir tra&ajando en "a ap"icaci%n actua". Sistema moda"G se suspenden todas "as ap"icaciones (asta que e" usuario responda a" cuadro de mensajes.

E" primer $rupo de va"ores *C a 2, descri&e e" n5mero ' e" tipo de "os &otones mostrados en e" cuadro de di)"o$oG e" se$undo $rupo *3H# 10# @E# H@, descri&e e" esti"o de" icono# e" tercer $rupo *C# 02H# 230, determina e" &ot%n predeterminado ' e" cuarto $rupo *C# @CKH, determina "a moda"idad de" cuadro de mensajes. Cuando se suman n5meros para o&tener e" va"or fina" de" ar$umento &uttons# se uti"iza so"amente un n5mero de cada $rupo. Nota Estas constantes "as especifica <isua" ;asic for App"ications. +or tanto# e" nom&re de "as mismas puede uti"izarse en cua"quier "u$ar de" c%di$o en vez de sus va"ores rea"es. 9a&"a de va"ores que puede devo"ver Ms$;o!. *9a&"a copiada de" arc(ivo de a'uda de Microsoft <isua" ;asic para ap"icaciones,. Constant e <&OR <&Cance" <&A&ort <&Retr' <&A$nore %alor 5escripci/n 3 0 1 @ 2 Aceptar Cance"ar Anu"ar Reintentar A$norar
0K 4 330

MACROS EN MS EXCELL

<&>es <&No

H J

SNo

Eje&plos de Ms$+o 1 Sub 9a"*, . . * )l cuadro Muestra los botones Si $ No $ un icono en forma de interrogante3 +uando se pulsa * un botn5 el #alor lo recoge la #ariable <3 )n este caso los #alores de#ueltos pueden ser = o > * 0ue corresponden respecti#amente a las constantes Vb?es $ VbNo5 obser#e la instruccin 2f de *despu;s3 X / Ms$;o!*?.esea Continuar?# v&>esNo M v&Suestion# ?Opci%n?##, * Se a pulsado sobre botn Si .f X / v&>es 4#en ..... Else T Se (a pu"sado so&re &ot%n No ..... End .f . . End Sub A"$unas veces puede que "e interese simp"emente desp"e$ar un cuadro Ms$;o! para mostrar un mensaje a" usuario sin que se requiera reco$er nin$5n va"or. En este caso puede optar por "a forma si$uiente# Ms$+o PromptF/?:o"a usuaria# :a aca&ado e" proceso?# ButtonsF/<&O7OnL' 8 ,it"eF/?Mensaje? Lo que no puede (acer porque <isua" ;asic dar-a error es poner "a primera forma sin i$ua"ar"a a nin$una varia&"e. +or ejemp"o# "a e!presi%n si$uinete es incorrecta# Ms$+o *?:o"a usuario# :a aca&ado e" proceso?# <&O7On"'# ?Mensaje?, Seria correcto poner X/ Ms$+o *?:o"a usuario# :a aca&ado e" proceso?# <&O7On"'# ?Mensaje?, En este caso# aunque X reci&a un va"or# "ue$o no se uti"iza para nada# es decir simp"emente se pone para que <isua" ;asic d error. La instrucci/n !it#1 Suponemos que ""e$ado a este punto "e parecer) en$orroso tener que referirse a "os o&jetos si$uiendo toda o casi toda "a jerarqu-a. >a (emos indicado que es mejor (acer"o de esta manera porque e" pro$rama $ana en c"aridad ' e"e$ancia '# consecuentemente# e" pro$ramador $ana tiempo a "a (ora de (acer modificaciones o actua"izaciones. La sentencia !it# "e a'udar) a tener que escri&ir menos c%di$o sin que
1C 4 330

MACROS EN MS EXCELL

por esto e" pro$rama pierda en c"aridad. Concretamente esta funci%n sirve para ejecutar una serie de acciones so&re un mismo O&jeto. Su sinta!is es "a si$uiente. !it# O&jeto Anstrucciones End !it# Repetiremos e" ejemp"o 31 uti"izando esta sentencia. O&serve como con !it# se (ace referencia a" o&jeto Acti)eS#eet. Eje&plo 0:1 Entrar e" Nom&re# "a cantidad ' e" precio de un producto desde e" tec"ado ' $uardar"os respectivamente en A3# A0 ' A1. Ca"cu"ar e" tota" ' $uardar"o en A@. Si e" tota" es superior a 3C.CCC o e" nom&re de" producto e" ?+atatas?# pedir un descuento# ca"cu"ar"o e" tota" descuento ' $uardar"o en A2# "ue$o restar e" descuento de" tota" ' $uardar"o en AH. Sub Ejemp"o83K*, 5i& +roducto As Strin$ 5i&Cantidad As .nte$er 5i& +recio As Sin$le 5i& 9ota" As Sin$le 5i& .escuento As Sin$le 5i& 9ota"8.escuento As Sin$le +recio / C +roducto / Anput;o!*?Entrar Nom&re de" +roducto?#?Entrar?, +recio / <a"*Anput;o!*?Entrar e" precio?# ?Entrar?,, +recio / <a"*Anput;o!*?Entrar "a cantidad?# ?Entrar?,, 9ota" / +recio P Cantidad !it# ActiveS(eet .Ran$e*?A3?,.<a"ue / +roducto .Ran$e*?A0?,.<a"ue / +recio .Ran$e*?A1?,.<a"ue / Cantidad .Ran$e*?A@?,.<a"ue / 9ota" End !it# * Si total ma$or 0ue -43444 o el producto es Patatas5 aplicar descuento3 .f 9ota" N 3CCCC Or +roducto / ?+atatas? 4#en .escuento / <a"*Anput;o!*?Entrar .escuento?# ?Entrar?,, 9ota"8.escuento / 9ota" P *.escuento L 3CC, 9ota" / 9ota" 4 9ota"8.escuento !it# ActiveS(eet
13 4 330

MACROS EN MS EXCELL

.Ran$e*?A2?,.<a"ue / 9ota"8.escuento .Ran$e *?AH?,.<a"ue / 9ota" End !it# End .f End Sub Este tipo de estructuras permiten ejecutar m)s de una vez un mismo &"oque de sentencias. Eje&plo <;1 Supon$amos que tenemos que (acer un pro$rama para entrar "as notas de una c"ase de 2 a"umnos que se $uardaran respectivamente en "as ce"das de A3 a A2 de "a (oja activa. .espu s (acer "a media que se $uardar) en AH. Con "as estructuras vistas (asta a(ora# podr-amos (acerF Sub Ejemp"o80C *, 5i&Nota As .nte$er 5i& Media As Sin$le Media / C Nota / <a"*Anput;o!*?Entrar "a 3 Nota F ?#?Entrar Nota?,, ActiveS(eet.Ran$e*?A3?,.<a"ue / Nota Media / Media M Nota Nota / <a"*Anput;o!*?Entrar "a 3 Nota F ?#?Entrar Nota?,, ActiveS(eet.Ran$e*?A0?,.<a"ue / Nota Media / Media M Nota Nota / <a"*Anput;o!*?Entrar "a 3 Nota F ?#?Entrar Nota?,, ActiveS(eet.Ran$e*?A1?,.<a"ue / Nota Media / Media M Nota Nota / <a"*Anput;o!*?Entrar "a 3 Nota F ?#?Entrar Nota?,, ActiveS(eet.Ran$e*?A@?,.<a"ue / Nota Media / Media M Nota Nota / <a"*Anput;o!*?Entrar "a 3 Nota F ?#?Entrar Nota?,, ActiveS(eet.Ran$e*?A2?,.<a"ue / Nota Media / Media M Nota

Media / Media L 2 ActiveS(eet.Ran$e*?AH?,.<a"ue / Media

10 4 330

MACROS EN MS EXCELL

End Sub O&serve que este pro$rama repite e" si$uiente &"oque de sentencias# 2 veces. Nota / <a"*Anput;o!*?Entrar "a 3 Nota F ?#?Entrar Nota?,, ActiveS(eet.Ran$e*?A2?,.<a"ue / Nota Media / Media M Nota

+ara evitar esta tipo de repeticiones de c%di$o# "os "en$uajes de pro$ramaci%n incorporan instrucciones que permiten "a repetici%n de &"oques de c%di$o. Estructura repetiti)a Para Afor?1 Esta estructura sirve para repetir "a ejecuci%n de una sentencia o &"oque de sentencias# un n5mero definido de veces. La estructura es "a si$uienteF Para var /<a"or8Anicia" ,asta <a"or8Bina" Paso Ancremento ,acer .nicio Sentencia 3 Sentencia 0 . . Sentencia N (in %ar es una varia&"e que "a primera vez que se entra en e" &uc"e se i$ua"a a Valor_2nicial# "as sentencias de" &uc"e se ejecutan (asta que %ar ""e$a a" Valor_@inal# cada vez que se ejecutan e" &"oque de instrucciones %ar se incrementa se$5n e" va"or de 2ncremento. En <isua" ;asic para E!ce" "a estructura +ara se imp"ementa con "a instrucci%n (or ... Ne t. (or <ari&"e / <a"or8Anicia" 4o <a"or8Bina" Step Ancremento Sentencia 3 Sentencia 0 . . Sentencia N Ne t <aria&"e

A Si el incremento es -5 no ace falta poner Step -3 Eje&plo <01


11 4 330

MACROS EN MS EXCELL

Entrar 3C va"ores uti"izando "a funci%n Anput;o!# sumar"os ' $uardar e" resu"tado en "a casi""a A3 de "a (oja activa. Sub Ejemp"o803*, 5i& i As .nte$er 5i& 9ota" As .nte$er 5i& <a"or As .nte$er (or i/3 4o 3C <a"or/ <a"*Anput;o!*?Entrar un va"or?#?Entrada?,, 9ota" / 9ota" M <a"or Ne t i ActiveCe"".Ran$e*?A3?,.<a"ue / 9ota" End Sub Una operaci%n &astante (a&itua" cuando se tra&aja con E!ce" es e" recorrido de ran$os de casi""as para ""enar"as con va"ores# mirar su contenido# etc. Las estructuras repetitivas son imprescindi&"es para recorrer $rupos de ce"das o ran$os. <ea "os si$uientes ejemp"os para ver ejemp"os de uti"izaci%n de estructuras repetitivas para recorrer ran$os de casi""as# o&serve "a uti"izaci%n de "as propiedades Cells ' Offset. Propiedad Cells1 >a conoce esta propiedad# sirve para referenciar una ce"da o un ran$o de ce"das s e$5n coordenadas de fi"a ' co"umna. Eje&plo << L"enar e" ran$o de "as casi""as A3..A2 con va"ores pares consecutivos empezando por e" 0. Sub Ejemp"o800*, 5i& Bi"a As .nte$er 5i& i As .nte$er Bi"a / 3 (or i/0 4o 3C Step 0 ActiveS(eet.Ce""s*Bi"a#3,.<a"ue / i Bi"a / Bi"aM3 Ne t i End Sub Eje&plo <=1
1@ 4 330

MACROS EN MS EXCELL

L"enar un ran$o de fi"as# empezando por una ce"da# que se de&e especificar desde tec"ado# con una serie de 3C va"ores corre"ativos *comenzando por e" 3,. Sub Ejemp"o801*, 5i& Casi""a8Anicia" As Strin$ 5i& i As .nte$er 5i& Bi"a As .nte$er# Co"umna As .nte$er Casi""a8Anicia" / Anput;o!*?Antroducir "a casi""a Anicia" F ?# ?Casi""a Anicia"?, ActiveS(eet.Ran$e*Casi""a8Anicia",.Activate

B +oger el #alor de fila de la celda acti#a sobre la #ariable @ila Bi"a / ActiveCe"".RoU B +oger el #alor de columna de la celda acti#a sobre la #ariable @ila Co"umna / ActiveCe"".Co"umn (or i / 3 4o 3C ActiveS(eet.Ce""s*Bi"a# Co"umna,.<a"ue / i Bi"a / Bi"a M 3 Ne t i End Sub Como (a&r) deducido de" ejemp"o anterior devue"ven "a fi"a ' "a co"umna de un o&jeto ran$e. En e" ejemp"o anterior se uti"iza&an concretamente para o&tener "a fi"a ' "a co"umna de "a casi""a activa. Otra forma de so"ucionar e" ejemp"o 01 seria. Sub Ejemp"o801*, 5i& Casi""a8Anicia" As Strin$ 5i& i As .nte$er 5i& Bi"a As .nte$er# Co"umna As .nte$er Casi""a8Anicia" / Anput;o!*?Antroducir "a casi""a Anicia" F ?# ?Casi""a Anicia"?, ActiveS(eet.Ran$e*Casi""a8Anicia",.Activate Bi"a / 3 (or i / 3 4o 3C ActiveS(eet.Ran$e*Casi""a8Anicia",.Ce""s*Bi"a# 3,.<a"ue / i Bi"a / Bi"a M 3 Ne t i End Sub

12 4 330

MACROS EN MS EXCELL

PP Recuerde que cuando uti"izamosCells como propiedad de un ran$o *O&jeto Ran$e,# Cells empieza a contar a partir de "a casi""a referenciada por Ran$e. Eje&plo <61 E" mismo con e" que introduc-amos e" tema *ejemp"o 0C,# pero uti"izando e" for ' propiedad Cells Sub Ejemp"o80@*, 5i&Nota As .nte$er 5i& Media As Sin$le 5i& Bi"a As .nte$er Media / C (or Bi"a / 3 4o 2 Nota/<a"*Anput;o!*?Entrar "a ? I Bi"a I ? Nota F ?# ?Entrar Nota?,, ActiveS(eet.Ce""s*Bi"a# 3, / Nota Media / Media M Nota Ne t Bi"a Media / Media L 2 ActiveS(eet.Ce""s*H# 3,.<a"ue / Media End Sub Esta propiedad es tam&i n mu' 5ti" a "a (ora de recorrer ran$o. Offset# que si$nifica desp"azamiento# es una propiedad de" o&jeto Ran$e ' se uti"iza para referenciar una casi""a situada a n Bi"as ' n Co"umnas de una casi""a dada. <ea "os ejemp"os si$uientes. Acti)eS#eet.Ran$e *?A3?,.Offset*0# 0,.%alue / ?:o"a? * +asilla +. C 'ola5 9 filas $ 9 columnas desde "-3 Acti)eCell.Offset*2#3,.%alue / ?:o"a? * 7 @ilas por debajo de la casilla "cti#a C 'ola Acti)eCell.Offset*0#0,.Acti)ate *"cti#ar la casilla 0ue estD 9 filas $ 9 columnas de la acti#a Eje&plo <31 E" mismo con e" que introduc-amos e" tema *ejemp"o 0C,# pero uti"izando e" (or ' propiedad Offset Sub Ejemp"o802*,

5i&Nota As .nte$er 5i& Media As Sin$le


1H 4 330

MACROS EN MS EXCELL

5i& Bi"a As .nte$er Media / C ActiveS(eet.Ran$e*?A3?,.Activate (or Bi"a / C 4o @ Nota/<a"*Anput ;o!*?Entrar "a ? I Bi"aM3 I ? Nota F ?# ?Entrar Nota?,, ActiveCe"".Offset*Bi"a# C,.<a"ue / Nota Media / Media M Nota Ne t Bi"a Media / Media L 2 ActiveCe"".Offset*H# 3,.<a"ue / Media End Sub Eje&plo <81 E" mismo con e" que introduc-amos e" tema *ejemp"o 0C,# pero uti"izando e" (or ' propiedad Offset. O&serve que a(ora vamos cam&iando de ce"da activa. Sub Ejemp"o80H*, 5i&Nota As .nte$er 5i& Media As Sin$le 5i& i As .nte$er Media / C ActiveS(eet.Ran$e*?A3?,.Activate (or i / 3 4o 2

Nota/<a"*Anput;o!*?Entrar "a ? I i I ? Nota F ?# ?Entrar Nota?,, ActiveCe"".<a"ue / Nota Media / Media M Nota B 'acer acti#a la casilla situada una fila por debajo de la actual ActiveCe"".Offset*3# C,.Activate Ne t Bi"a Media / Media L 2 ActiveCe"".<a"ue / Media End Sub O&serve "a diferencia entre "os ejemp"os 02 ' 0H# am&os uti"izan "a propiedad Offset de diferente forma# en e" ejemp"o 02 "a casi""a activa siempre es "a misma A3# Offset se uti"iza para referenciar una casi""a a
1J 4 330

MACROS EN MS EXCELL

partir de esta. En A0H se va cam&iando de casi""a activa cada vez de forma que# cuando termina "a ejecuci%n de" pro$rama "a casi""a activa es AH. Cuando uti"izar cada m todo# como casi siempre depende de "o que se pretenda (acer. Aqu- es &astante c"aro# si "e interesa que no cam&ie "a casi""a uti"ice Offset como en e" ejemp"o 02# en caso que interese que va'a cam&iando# (a$a como en e" Ejemp"o H. +or supuesto (a' muc(as variantes so&re e" esti"o de recorrer Ce"das# tanto con Cells como con Offset# so"o tiene que ir pro&ando '# como casi siempre# e" que m)s "e $uste. Estructura repetiti)a 5o !#ile11Loop A,acer Mientras?1 La estructura repetitiva for se adapta perfectamente a aque""as situaciones en que se sa&e previamente e" n5mero de veces que se (a de repetir un proceso# entrar veinte va"ores# recorrer cincuenta ce"das# etc. +ero (a' ocasiones o casos en "os que no se sa&e previamente e" n5mero de veces que se de&e repetir un proceso. +or ejemp"o# supon$a que (a de recorrer un ran$o de fi"as en "os que no se sa&e cuantos va"ores (a&r) *esto es# cuantas fi"as ""enas (a&r),# en ocasiones puede que (a'an veinte# en ocasiones treinta# en ocasiones nin$una# etc. +ara estos casos "a estructura for no es adecuada ' de&eremos recurrir a "a sentencia 5o !#ile..Loop en a"$una de sus formas. Esta estructura repetitiva est) contro"ada por una o varias condiciones# "a repetici%n de" &"oque de sentencias depender) de si se va cump"iendo "a condici%n o condiciones. ,acer Mientras *se cump"a "a condici%n, Sentencia3 Sentencia0 . . Sentencia N (in ,acer Mientras En <isua" ;asic 5o !#ile *se cump"a "a condici%n, Sentencia3 Sentencia0 . . Sentencia N Loop PP Los ejemp"os que veremos a continuaci%n so&re "a instrucci%n5o !#ile..Loop se (ar)n so&re una &ase de datos. Una &ase de datos en E!ce" es simp"emente un ran$o de ce"das en que cada fi"a representa un re$istro ' cada co"umna un campo de re$istro# "a primera fi"a es "a que da nom&re a "os campos. +ara nuestra &ase de datos uti"izaremos "os campos si$uientes# Nombre# +iudad# )dad# @ec a. +on$a estos t-tu"os en e" ran$o A3F.3 de "a :oja3 *En A3 pon$a Nom&re# en ;3 pon$a Ciudad# en C3 pon$a Edad ' en .3 Bec(a,# o&serve que "os datos se empezar)n a entrar a partir de A0. +ro$rama para entrar re$istros en "a &ase de datos. Cada campo se entra con Anput;o!. E" pro$rama va
1E 4 330

MACROS EN MS EXCELL

pidiendo datos mientras se entre un va"or en e" Anput;o! correspondiente a" nom&re# es decir cuando a" pre$untar e" nom&re no se entre nin$5n va"or# terminar) "a ejecuci%n de" &"oque encerrado entre 5o !#ile...Loop. O&serve "a uti"izaci%n de "a propiedad Offset para co"ocar "os datos en "as ce"das correspondientes. Sub Ejemp"o80J*, 5i&Nom&re As Strin$ 5i& Ciudad As Strin$ 5i&Edad As .nte$er 5i&fec(a As 5ate B "cti#ar oja6or7S(eets*?:oja3?,.Activate B "cti#ar casilla "9 ActiveS(eet.Ran$e*?A0?,.Activate Nom&re / Anput;o!*?Entre e" Nom&re *Return para 9erminar, F ?# ?Nom&re?, B Mientras la #ariable Nombre sea diferente a cadena #aca 5o !#ile Nom&re QN ?? Ciudad / Anput;o!*?Entre "a Ciudad F ?# ?Ciudad?, Edad / <a"*Anput;o!*?Entre "a Edad F ?# ?Edad?,, Bec(a/Cdate*Anput;o!*?Entra "a Bec(a F ?# ?Bec(a?,, B +opiar los datos en las casillas correspondientes !it# ActiveCe"" .<a"ue / Nom&re .Offset*C#3,.<a"ue / Ciudad .Offset*C#0,.<a"ue / Edad .Offset*C#1,.<a"ue / fec(a End !it# B'acer acti#a la celda de la fila siguiente a la actual ActiveCe"".Offset*3#C,.Activate Nom&re / Anput;o!*?Entre e" Nom&re *Return para 9erminar, F ?# ?Nom&re?, Loop End Sub Eje&plo <91 +reste especia" atenci%n a este ejemp"o 'a que se$uro que e" c%di$o que viene a continuaci%n "o uti"izar) en muc(as ocasiones. Antes que nada o&serve e" ejemp"o anterior# f-jese en que siempre empezamos a ""enar e" ran$o de "a (oja a partir de "a ce"da A0# esto tiene una nefasta consecuencia# "a se$unda vez que ejecute "a macro mac(acar) "os datos de A0F.0 ' si continua ejecutando mac(acar) "os datos de "os ran$os si$uientes. Una so"uci%n seria o&servar cua" es "a casi""a vac-a si$uiente ' cam&iar en "a instrucci%n
1K 4 330

MACROS EN MS EXCELL

Acti)eS#eet1Ran$eABA<B?1Acti)ate # "a referencia A< por "a que corresponde a "a primera casi""a vac-a de "a co"umna A. E" c%di$o que "e mostramos a continuaci%n (ar) esto por nosotros# es decir recorrer) una fi"a de ce"das a partir de A3 (asta encontrar una vac-a ' dejar) a esta como ce"da activa para que "a entrada de datos comience a partir de e""a. Sub Ejemp"o80E*, . . B "cti#ar oja6or7S(eets*?:oja3?,.Activate B "cti#ar casilla "9 ActiveS(eet.Ran$e*?A3?,.Activate B Mientras la celda acti#a no est; #aca 5o !#ile Not AsEmpt'*ActiveCe"", B 'acer acti#a la celda situada una fila por debajo de la actual ActiveCe"".Offset*3#C,.Activate Loop 1 1 End Sub Eje&plo <:1 Es "a uni%n de "os dos pro$ramas anteriores. Es decir (a&r) un &uc"e 5o !#ile que &uscar) "a primera casi""a vac-a de "a &ase da datos ' otro para pedir "os va"ores de "os campos (asta que se pu"se Enter en Nom&re. Sub Ejemp"o80E*, 5i&Nom&re As Strin$ 5i& Ciudad As Strin$ 5i&Edad As .nte$er 5i&fec(a As 5ate 6or7S(eets*?:oja3?,.Activate ActiveS(eet.Ran$e*?A3?,.Activate B Buscar la primera celda #aca de la columna " $ con#ertirla en acti#a 5o !#ile Not AsEmpt'*ActiveCe"", ActiveCe"".Offset*3#C,.Activate Loop Nom&re / Anput;o!*?Entre e" Nom&re *Return para 9erminar, F ?# ?Nom&re?, B Mientras la #ariable Nombre sea diferente a cadena #aca 5o !#ile Nom&re QN ?? Ciudad / Anput;o!*?Entre "a Ciudad F ?# ?Ciudad?, Edad / <a"*Anput;o!*?Entre "a Edad F ?# ?Edad?,,
@C 4 330

MACROS EN MS EXCELL

Bec(a/Cdate*Anput;o!*?Entra "a Bec(a F ?# ?Bec(a?,, !it# ActiveCe"" .<a"ue / Nom&re .Offset*C#3,.<a"ue / Ciudad .Offset*C#0,.<a"ue / Edad .Offset*C#1,.va"ue / fec(a End !it# ActiveCe"".Offset*3#C,.Activate Nom&re / Anput;o!*?Entre e" Nom&re *Return para 9erminar, F ?# ?Nom&re?, Loop End Sub Cuando se tienen que entrar desde e" tec"ado conjuntos de va"ores# a"$unos pro$ramadores ' usuarios prefieren "a f%rmu"a de que e" pro$rama pre$unte si se desean entrar m)s datos# "a t-pica pre$unta V.esea Antroducir m)s d atos W# si e" usuario contesta S-# e" pro$rama vue"ve a ejecutar "as instrucciones correspondientes a "a entrada de datos# si contesta que no se fina"iza e" proceso# o&serve como quedar-a nuestro &uc"e de entrada de datos con este sistema. Mas8datos / v&>es 5o !#ile Mas8.atos / v&>es Nom&re / Anput;o!*?Entre e" Nom&re *Return para 9erminar, F ?# ?Nom&re?, Ciudad / Anput;o!*?Entre "a Ciudad F ?# ?Ciudad?, Edad / <a"*Anput;o!*?Entre "a Edad F ?# ?Edad?,, Bec(a/Cdate*Anput;o!*?Entra "a Bec(a F ?# ?Bec(a?,, !it# ActiveCe"" .<a"ue / Nom&re .Offset*C#3,.<a"ue / Ciudad .Offset*C#0,.<a"ue / Edad .Offset*C#1,.va"ue / fec(a End !it# ActiveCe"".Offset*3#C,.Activate B Preguntar al usuario si desea entrar otro registro3 Mas8datos / Ms$;o!*?Otro re$istro W?# v&>esNoMv&Suestion#?Entrada de datos?, Loop PP O&serve que es necesaria "a "-nea anterior a" &uc"e MasCdatos D )bEes# para que cuando se eva"5e "a condici%n por vez primera esta se cump"a ' se ejecuten "as sentencias de dentro de" &uc"e# Mas8datos es
@3 4 330

MACROS EN MS EXCELL

una varia&"e de tipo .nte$er. <ea "a secci%n si$uiente donde se estudia una variante de "a estructura 5o !#ile que es m)s adecuada para este tipo de situaciones. Estructura 5o11Loop !#ile1 E" funcionamiento de esta estructura repetitiva es simi"ar a "a anterior sa"vo que "a condici%n se eva"5a a" fina"# "a inmediata consecuencia de esto es que "as instrucciones de" cuerpo de" &uc"e se ejecutaran a" menos una vez . O&serve que para nuestra estructura de entrada de datos vista en e" 5"timo apartado de "a secci%n anterior esta estructura es m)s conveniente# a" menos m)s e"e$ante# si vamos a entrar datos# a" menos uno entraremos# por tanto "as instrucciones de" cuerpo de" &uc"e se de&en ejecutar a" menos una vez# "ue$o 'a decidiremos si se repiten o no. 5o Nom&re / Anput;o!*?Entre e" Nom&re *Return para 9erminar, F ?# ?Nom&re?, Ciudad / Anput;o!*?Entre "a Ciudad F ?# ?Ciudad?, Edad / <a"*Anput;o!*?Entre "a Edad F ?# ?Edad?,, Bec(a/Cdate*Anput;o!*?Entra "a Bec(a F ?# ?Bec(a?,, !it# ActiveCe"" .<a"ue / Nom&re .Offset*C#3,.<a"ue / Ciudad .Offset*C#0,.<a"ue / Edad .Offset*C#1,.va"ue / fec(a End !it# ActiveCe"".Offset*3#C,.Activate Mas8datos / Ms$;o!*?Otro re$istro W?# v&>esNoMv&Suestion#?Entrada de datos?, BMientras Mas_Eatos C #b?es Loop!#ile Mas8.atos / v&>es O&serve que en este caso no es necesario "a "-nea Mas8.atos / v&>es antes de 5o para forzar "a entrada en e" &uc"e 'a que "a condici%n va a" fina". Estructura 5o11Loop 2ntil A,acer11 ,asta que se cu&pla la condici/n?1 Es otra estructura que eva"5a "a condici%n a" fina" o&serve que "a interpretaci%n es distinta 'a que e" &uc"e se va repitiendo ,AS4A que se cu&ple la condici/n# no MAEN9RAS se cump"e "a condici%n. Cua" de "os dos uti"izar# pues# no se sorprenda# "a que entienda mejor o "e $uste m)s. La entrada de datos con este &uc"e quedar-a 5o Nom&re / Anput;o!*?Entre e" Nom&re *Return para 9erminar, F ?# ?Nom&re?, Ciudad / Anput;o!*?Entre "a Ciudad F ?# ?Ciudad?, Edad / <a"*Anput;o!*?Ent re "a Edad F ?# ?Edad?, Bec(a/Cdate*?Anput;o!*?Entra "a Bec(a F ?# ?Bec(a?,
@0 4 330

MACROS EN MS EXCELL

!it# ActiveCe"" .<a"ue / Nom&re .Offset*C#3,.<a"ue / Ciudad .Offset*C#0,.<a"ue / Edad .Offset*C#1,.va"ue / fec(a End !it# ActiveCe"".Offset*3#C,.Activate M as8datos / Ms$;o!*?Otro re$istro W?# v&>esNoMv&Suestion#?Entrada de datos?, B'asta 0ue Mas_Eatos sea igual a #bNo Loop2ntil Mas8.atos/v&No Estructura (or Eac#1 Este &uc"e se uti"iza &)sicamente para ejecutar un $rupo de sentencias con "os e"ementos de una co"ecci%n o una matriz *pronto veremos "os que es,. Recuerde que una co"ecci%n es un conjunto de o&jetos# (ojas# ran$os# etc. <ea e" ejemp"o si$uiente que se uti"iza para cam&iar "os nom&res de "as (ojas de un "i&ro de tra&ajo. Eje&plo <:1 +ro$rama que pre$unta e" nom&re para cada (oja de un "i&ro de tra&ajo# si no se pone nom&re a "a (oja# queda e" que tiene. Sub Ejemp"o80K*, 5i& Nuevo8Nom&re As Strin$ 5i&:oja As !or"S#eet B Para cada oja del conjunto ForGS eets (or Eac# :oja An 6or7S(eets Nuevo8Nom&re/Anput;o!*?Nom&re de "a :oja F ? I :oja.Name#?Nom&rar :ojas?, .f Nueva8Nom&re QN ?? 4#en :oja.Name/Nuevo8nom&re End if Ne t End Sub PP :oja va referenciando cada una de "as (ojas de" conjunto 6or7S(eets a cada paso de &uc"e. Eje&plo =;1 Entrar va"ores para "as ce"das de" ran$o A3F;3C de "a (oja Activa. Sub Ejemp"o81C*, 5i&R As Ran$e B Para cada celda del rango "-(B-4 de la oja acti#a (or Eac# R in ActiveS(eet.Ran$e*?A3F;3C?, R.<a"ue / Anput;o!*?Entrar va"or para "a ce"da ? I
@1 4 330

MACROS EN MS EXCELL

R.Address# ?Entrada de va"ores?, Ne t End Sub PP O&serve que se (a dec"arado una varia&"e tipo Ran$e# este tipo de datos# como puede ima$inar ' (a visto en e" ejemp"o sirve para $uardar Ran$os de una o m)s casi""as# estas varia&"es pueden "ue$o uti"izar todas "as propiedades ' m todos propios de "os O&jetos Ran$e. 9en$a en cuenta que "a asi$naci%n de "as varai&"es que sirven para $uardar o referenciar o&jetos *Ran$e# 6or7S(eet# etc., de&en inicia"izarse muc(as veces a trav s de "a instrucci%n SE9 # esto se estudiar) en otro cap-tu"o. Se define como procedimiento iLo funci%n a un &"oque de c%di$o que rea"iza a"$una tarea. :asta a(ora# (emos construido "os pro$ramas uti"izando un 5nico procedimiento# pero a medida que "os pro$ramas *' "os pro&"emas, crecen se va (aciendo necesaria "a inc"usi%n de m)s procedimientos. +odr-a f)ci"mente caer en "a tentaci%n de uti"izar# como (asta a(ora# un 5nico procedimiento por pro$rama pero se dar) cuenta r)pidamente de que este m todo no es nada pr)ctico 'a que $randes &"oques de c%di$o imp"ican ma'or comp"icaci%n de" mismo# repetici%n de sentencias ' "o que es m)s $rave# ma'ores pro&"emas de se$uimiento a "a (ora de depurar errores# amp"iar funciona"idades o inc"uir modificaciones. La fi"osof-a de uti"izar procedimientos es "a anti$ua f%rmu"a de" ?divide ' vencer)s?# es decir# con "os procedimientos podremos tratar cada pro&"ema o tarea de forma m)s o menos ais"ada de forma que construiremos e" pro$rama paso a paso evitando tener que reso"ver o contro"ar m5"tip"es cosas a "a vez. Cada tarea "a rea"izar) un procedimiento# si esta tarea imp"ica "a ejecuci%n de otras tareas# cada una se imp"ementar) ' so"ucionar) en su correspondiente procedimiento de manera que cada uno (a$a una cosa concreta. As-# "os diferentes pasos que se de&en ejecutar para que un pro$rama (a$a a"$o# quedaran &ien definidos cada uno en su correspondiente procedimiento# si e" pro$rama fa""a# fa""ar) a partir de un procedimiento ' de esta forma podremos "oca"izar e" error m)s r)pidamente. Los procedimientos son tam&i n un eficaz mecanismo para evitar "a repetici%n de c%di$o en un mismo pro$rama e inc"uso en diferentes pro$ramas. Suponemos que (a&r) intuido que (a' muc(as tareas que se repiten en casi todos "os pro$ramas# veremos como "os procedimientos que ejecutan estas tareas se pueden inc"uir en un m%du"o de forma que este sea e!porta&"e a otros pro$ramas ' de esta manera $anar tiempo que# como dice e" t%pico# es precioso. 5efinir un procedi&iento1 >a "o (emos (ec (o unas cuantas veces# pero a(- va de nuevo. Sub Nom&re8+rocedimento Sentencias. End Sub. Lla&ar a un procedi&iento1 +ara ""amar un procedimiento desde otro se uti"iza "a instrucci%n Call Nombre_Procedimiento. Sub +8Uno
@@ 4 330

MACROS EN MS EXCELL

Sentencias. . Call +8.os . Sentencias . End Sub Las secuencias de" procedimiento P_Hno se ejecutan (asta ""e$ar a "a "-nea Call P_Eos# entonces se sa"ta a" procedimiento P_Eos# se ejecutan todas "as sentencias de este procedimiento ' e" pro$rama continua ejecut)ndose en e" procedimiento P_Hno a partir de "a sentencia que si$ue a Call P_Eos. Es e" mismo pro$rama que e" visto en e" ejemp"o 0K pero e" c%di$o que sa"ta casi""a (asta que se encuentra una vac-a se imp"ementa en un procedimiento ""amado# Saltar_+eldas_1lenas. O&serve que para entrar va"ores se (a sustituido .o 6(i"e..Loop por .o.. Loop 6(i"e. Sub Ejemp"o810*, 5i&Nom&re As Strin$ 5i& Ciudad As Strin$ 5i&Edad As .nte$er 5i&fec(a As 5ate

* 1lamada a la funcin Saltar_+eldas_1lenas5 el programa salta a0u a ejecutar las *instrucciones de este procedimiento $ luego #uel#e para continuar la ejecucin a partir de la *instruccin Eo Call Sa"tar8Ce"das8L"enas 5o Nom&re / Anput;o!*?Entre e" Nom&re *Return para 9erminar, F ?# ?Nom&re?, Ciudad / Anput;o!*?Entre "a Ciudad F ?# ?Ciudad?, Edad / <a"*Anput;o!*?Entre "a Edad F ?# ?Edad?,, Bec(a/Cdate*Anput;o!*?Entra "a Bec(a F ?# ?Bec(a?,, !it# ActiveCe"" .<a"ue / Nom&re .Offset*C#3,.<a"ue / Ciudad .Offset*C#0,.<a"ue / Edad .Offset*C#1,.va"ue / fec(a End !it# ActiveCe"".Offset*3#C,.Activate Mas8datos / Ms$;o!*?Otro re$istro W?# v&>esNoMv&Suestion#?Entrada de datos?,
@2 4 330

MACROS EN MS EXCELL

Loop!#ile Mas8.atos / v&>es End Sub * @uncin 0ue salta celdas de una misma columna3 Si r#e para encontrar la primera celda #aca de la * columna Sub Sa"tar8Ce"dad8L"enas*, 6or7S(eets*?:oja3?,.Activate ActiveS(eet.Ran$e*?A3?,.Activate 5o 6(i"e not AsEmpt'*ActiveCe"", ActiveCe"".Offset*3#C,.Activate Loop End Sub FeneraliGar una funci/n1 O&serve que para sa"tar un ran$o de casi""as ""enas s%"o necesitar) ""amar a "a funci%n Sa"tar8Ce"das8L"enas# pero# siempre ' cuando este ran$o est en una (oja ""amada ?:oja3? ' empiece en "a casi""a A3# e" procedimiento es poco pr)ctico 'a que su )m&ito de funcionamiento es "imitado. En "a si$uiente secci%n modificaremos e" procedimiento de manera que sirva para recorrer un ran$o que empiece en cua"quier casi""a de cua"quier (oja. Parmetros. Los par)metros son e" mecanismo por e" cua" un procedimiento puede pasar"e va"ores a otro ' de esta forma condicionar# mo"dear# etc. "as acciones que ejecuta. E" procedimiento ""amado $ana entonces en f"e!i&i"idad. La sinta!is de ""amada de un procedimiento es "a si$uiente# Call +rocedimiento*+ar)metro3# +ar)metro0#...# +ar)metroN, Los par)metros pueden ser va"ores o varia&"es. La sinta!is para e" procedimiento ""amado es "a si$uiente# Sub +rocedimiento*+ar)metro3 as 9ipo# +ar)metro0 As 9ipo#...# +ar)metro1 As 9ipo, O&serve que aqu- "os par)metros son varia&"es que reci&ir)n "os va"ores# evidentemente de&e (a&er coincidencia de tipo. +or ejemp"o# si e" primer par)metro es una varia&"e tipo Ante$er# e" primer va"or que se "e de&e pasar a" procedimiento cuando se ""ama tam&i n (a de ser de tipo Ante$er *recuerde que puede ser un va"or directamente o una varia&"e,. Eje&plo ==1 E" mismo pro$rama que en e" ejemp"o 10 pero a(ora "a funci%n Sa"tar8Ce"das8L"enas tiene dos par)metros :oja ' Casi""a8Anicia" que reci&en respectivamente "a (oja donde est) e" ran$o a recorrer ' "a casi""a inicia" de" ran$o.
@H 4 330

MACROS EN MS EXCELL

Sub Ejemp"o811*, 5i&Nom&re As Strin$ 5i& Ciudad As Strin$ 5i&Edad As .nte$er 5i&fec(a As 5ate * 1lamada a la funcin Saltar_+eldas_1lenas5 obser#ar 0ue mediante dos parDmetros se * "l procedimiento en 0ue oja estD el rango a saltar $ en la casilla donde debe empe!ar3 Call Sa"tar8Ce"das8L"enas*?:oja3?# ?A3?, 5o Nom&re / Anput;o!*?Entre e" Nom&re *Return para 9erminar, F ?# ?Nom&re?, Ciudad / Anput;o!*?Entre "a Ciudad F ?# ?Ciudad?, Edad / <a"*Anput;o!*?Entre "a Edad F ?# ?Edad?,, Bec(a/Cdate*Anput;o!*?Entre "a Bec(a F ?# ?Bec(a?,, !it# ActiveCe"" .<a"ue / Nom&re .Offset*C#3,.<a"ue / Ciudad .Offset*C#0,.<a"ue / Edad .Offset*C#1,.va"ue / fec(a End !it# ActiveCe"".Offset*3#C,.Activate Loop!#ile Mas8.atos / v&>es End Sub * * Procedimiento Saltar_+eldas_1lenas3 * Sir#e para Saltar celdas llenas de una columna asta encontrar una #aca 0ue se con#ierte en acti#a * ParDmetros ( * 'oja ( 'oja donde estD el rango a saltar3 * +asilla_2nicial ( +asilla 2nicial de la columna Sub Sa"tar8Ce"das8L"enas*:oja As Strin$ # Casi""a8Anicia" As Strin$, 6or7S(eets*:oja,.Activate ActiveS(eet.Ran$e*Casi""a8Anicia",.Activate 5o 6(i"e not AsEmpt'*ActiveCe"", ActiveCe"".Offset*3#C,.Activate Loop
@J 4 330

MACROS EN MS EXCELL

End Sub O&serve que a(ora e" procedimiento Sa"tar8Ce"das8L"enas sirve para recorrer cua"quier ran$o en cua"quier (oja. O&serve que a" procedimiento se "e pasan dos va"ores directamente# recuerde# ' esto es quiz)s "o m)s (a&itua"# que tam&i n pueden pasarse varia&"es# por ejemp"o. Sub Ejemp"o811 . . 5i&:oja As Strin$ 5i& Casi""a8Anicia" As Strin$ :oja / Anput;o!*?En que (oja est) "a &ase de datos F ?# ?Entrar Nom&re de :oja?, Casi""a8Anicia" / Anput;o!*?En que casi""a comienza "a &ase de datos?#?Casi""a Anicia"?, * :bser#e 0ue los parDmetros son dos #ariables cu$o #alor se a entrado desde teclado en * las dos instrucciones 2nputBo& anteriores3 Call Sa"tar8Ce"das8L"enas*:oja# Casi""a8Anicia", . . End Sub E" )m&ito de una varia&"e dec"arada dentro de una funci%n es "a propia funci%n# es decir no podr) uti"izares fuera de dic(a funci%n. As-# e" si$uiente pro$rama que de&er-a sumar "as cinco fi"as si$uientes a partir de "a casi""a activa ' $uardar e" resu"tado en "a se!ta es incorrecto. Sub A"$una8Cosa*, . .. Call Sumar8Cinco8Si$uientes ActiveCe"".Offset*H#C,.<a"ue / Suma . . End Sub Sub Sumar8Cinco8Si$uientes*, 5i& i As .nte$er 5i&Suma As Sin$le Suma/C (or i/3 4o 2 Suma / SumaMActiveCe"".Offset*i#C,.<a"ue Ne t i
@E 4 330

MACROS EN MS EXCELL

End Sub Es incorrecto porque tanto "as varia&"e i como "a varia&"e Suma est)n dec"aradas dentro de" procedimiento Sumar_+inco_Siguientes consecuentemente# su )m&ito de acci%n es este procedimiento. +or tanto# "a instrucci%n "cti#e+ell3:ffset,=54/3Value C Suma de" procedimiento "lguna_+osa# $enerar-a un error *con Option E!p"icit activado, 'a que "a varia&"e Suma no est) dec"arado dentro de ". Si piensa en dec"arar "a varia&"e Suma dentro de" procedimiento 'acer_"lgo# no so"ucionar) nada porque esta ser) "oca" a dic(o procedimiento# en este caso tendr-a dos varia&"es ""amadas Suma pero cada una de e""as "oca" a su propio procedimient o ' consecuentemente con e" )m&ito de acci%n restrin$ido a e""os. Una so"uci%n# que a nosotros no nos $usta# seria dec"arar suma como varia&"e $"o&a". Una varia&"e $"o&a" se dec"ara fuera de todos "os procedimientos ' es reconocida por todos "os procedimientos de" m%du"o# Option E plicit * Suma es una #ariable global reconocida por todos los procedimientos del mdulo3 5i& Suma As Sin$le Sub A"$una8Cosa*, . Call Sumar8Cinco8Si$uientes ActiveCe"".Offset*H#C,.<a"ue / Suma . End Sub Sub Sumar8Cinco8Si$uientes*, 5i& i As .nte$er Suma/C (or i/3 4o 2 Suma / SumaMActiveCe"".Offset*i#C,.<a"ue Ne t i End Sub Sub A"$una8Cosa*, 5i&Suma As Sin$le . . * 1lamada a la funcin Sumar_+inco_Siguientes pasDndole la #ariable Suma Call Sumar8Cinco8Si$uientes*Suma, ActiveCe"".Offset*H#C,.<a"ue / Suma . .
@K 4 330

MACROS EN MS EXCELL

End Sub Sub Sumar8Cinco8Si$uientes*S As Sin$le, 5i& i As .nte$er Suma/C (or i/3 4o 2 S / SMActiveCe"".Offset*i#C,.<a"ue Ne t i End Sub Esto "e funcionaria porque "a varia&"e par)metro S *' se "e (a cam&iado e" nom&re adrede, de Sumar_+inco_Siguientes es "a varia&"e Suma dec"arada en 'acer_"lgo. Buncionar) porque en visua" &asic# a menos que se indique "o contrario# e" paso de par)metros es por referencia# vea "a si$uiente secci%n. Paso por referencia / paso por *alor. No entraremos en deta""es so&re como funciona e" paso de par)metros por va"or ' e" paso de par)metros por referencia# s%"o indicar que e" paso por va"or si$nifica que "a varia&"e par)metro de" procedimiento reci&e e" va"or de "a varia&"e *o directamente e" va"or, de su par)metro correspondient e de "a instrucci%n de ""amada ' en e" paso por referencia# "a varia&"e par)metro de" procedimiento es "a misma que su par)metro correspondiente de "a instrucci%n de ""amada# es decir# "a dec"arada en e" procedimiento desde e" que se (ace "a ""amada. +or defecto# ' siempre que en "a instrucci%n de ""amada se uti"icen varia&"es# "as ""amadas son por referencia. Si desea que e" paso de par)metros sea por va"or# de&e anteponer a "a varia&"e par)metro "a pa"a&ra reservada +*%al # por ejemp"o# Sub Sa"tar8Ce"das8L"enas*+*%al :oja As Strin$# +*%al Casi""a8Anicia" As Strin$, Aunque "o e"e$ante ' efectivo por razones de memoria seria pasar siempre que sea posi&"e por va"or# es poco (a&itua" que as- se (a$a en visua" &asic# se$uramente por comodidad. Como suponemos que (ar) como "a ma'or-a# es decir# pasar por referencia# ten$a cuidado con "os *indesea&"es, efectos "atera"es. Copie ' ejecute este pro$rama ' descu&rir) que son "os efectos "atera"es. Antes de copiar e" pro$rama# active una (oja en &"anco ' pon$a va"ores de" 3 a" 32 distri&uidos de "a forma si$uiente# en e" ran$o A3FA2 va"ores de" 3 a" 2# en e" ran$o ;3F;2 va"ores de" H a" 3C# en e" ran$o C3FC2 va"ores de" 33 a" 32. E" si$uiente pro$rama de&e recorrer cada una de tres "as co"umnas de va"ores# sumar"os ' poner e" resu"tado en "as fi"as H de cada co"umna. Entonces# se$5n "os va"ores que (a entrado en cada una de "as co"umnas# cuando (a'a aca&ado "a ejecuci%n de" pro$rama de&e (a&er "os si$uientes resu"tados# AH / 32# ;H/@C# CH/H2. +ara ""evar a ca&o "a suma de "os va"ores de cada co"umna se ""ama a "a funci%n Recorrer_Sumar tres veces# una para cada co"umna# esta funci%n reci&e en e" par)metro @ e" va"or de "a fi"a donde de&e empezar a sumar# so&re e" par)metro + e" va"or de "a co"umna a sumar ' so&re e" par)metro I "a cantidad de fi"as que (a de recorrer. E" pro$rama uti"iza "a propiedad Cells para referenciar "as fi"as ' co"umnas de "os ran$os.
2C 4 330

MACROS EN MS EXCELL

O&serve atentamente "os va"ores que ir) co$iendo "a varia&"e @ila 'a que esta ser) "a que sufra e" efecto "atera". Sub Efecto8Latera"*, 5i& Bi"a As .nte$er Bi"a / 3 Call Recorrer8Sumar*Bi"a# 3#2, Call Recorrer8Sumar*Bi"a# 0#2, Call Recorrer8Sumar*Bi"a# 1#2, End Sub

* +olumna " T +olumna B T +olumna +

Sub Recorrer8Sumar*B As .nte$er# C As .nte$er# S As .nte$er, 5i& i As .nte$er 5i& 9ota" As .nte$er 9ota" / C (or i /3 4o S 9ota" / 9ota" M ActiveS(eet.Ce""s*B# C,.<a"ue B/BM3 * :J: con esta asignacin5 recuerde 0ue @ es la #ariable @ila declarada en * el procedimiento )fecto_1ateral Ne t i ActiveS(eet.Ce""s*B# C, / 9ota" End Sub Cuando ejecute e" pro$rama se producir) "a sa"ida si$uiente# en AH (a&r) un 32# (asta aqu- todo correcto# pero o&serve que en "a se$unda co"umna aparece un C en ;30 ' en "a tercera co"umna aparece un C en C3E# veamos que (a pasado. La primera vez que se ""ama "a funci%n# "a varia&"e @ va"e 3 'a que este es e" va"or que tiene su par)metro correspondiente * @ila, en "a instrucci%n Call. O&serve que @ se va incrementando una unidad a cada paso de &uc"e (or# RECUER.E que @ es rea"mente "a varia&"e @ila dec"arada en e" procedimiento )fecto_1ateral# por tanto cuando fina"iza e" procedimiento Recorrer_Sumar ' vue"ve e" contro" a" procedimiento )fecto_1ateral @ila va"e H# ' este es e" va"or que se pasar) a Recorrer_Suma "a se$unda vez que se ""ama# a partir de a(- todo ir) ma" 'a que se empezar) e" recorrido de fi"as por "a H. Una de "as so"uciones a este pro&"ema para (acer que cada vez que se ""ame Recorrer_Sumar "a varia&"e @ reci&a e" va"or 3# es uti"izar un paso por va"or# es decir que @ reci&a e" va"or de @ila# no que sea "a varia&"e @ila# o&serve que entonces# si @ no es "a varia&"e @ila# cuando incremente @ no se incrementar) @ila# esta siempre conservar) e" va"or 3. +ara (acer que @ sea un par)metro por va"or# simp"emente pon$a "a pa"a&ra +*%al antes de @ en "a dec"araci%n de" procedimiento. <ue"va a ejecutar e" pro$rama# ver) como a(ora funciona correctamente. PP +ara aca&ar# o&serve que en muc(as ocasiones "e (emos indicado que en e" paso por referencia "avaria&"e de" procedimiento ""amado es "a varia&"e dec"arada en e" procedimiento que ""ama. En este 5"timo ejemp"o# "e (emos dic(o que @ era "a varia&"e @ila# pues &ien# esto no es cierto @ila es una varia&"e
23 4 330

MACROS EN MS EXCELL

' @ es otra varia&"e# a(ora es "%$ico que se pre$unte por qu entonces @ act5a como si fuera @ila# este es un tema que no entra en e" )m&ito de este manua"# si a"$una vez pro$rama en C ' ""e$a a" tema de "os punteros entender) que es "o que sucede rea"mente en e" paso por par)metro ' en e" paso por va"or. Si 'a conoce "os punteros de C o +asca" entonces 'a (a&r) intuido que e" paso por va"or en nuestro ejemp"o equiva"dr-a a# Recorrer8Bi"a*B# C# S,G void Recorrer8Bi"a*int B# int C# int S, > un paso por referencia a Recorrer8Bi"a*IB# C# S,G <oid Recorrer8Bi"a*int PB# int C# int S, (unciones1 Una funci%n es "o mismo que un procedimiento con "a sa"vedad que este devue"ve un va"or a" procedimiento o funci%n que "o ""ama. <ea e" si$uiente ejemp"o# es una funci%n mu' senci""a 'a que simp"emente suma dos n5meros ' devue"ve e" resu"tado. Eje&plo =61 Bunci%n que devue"ve "a suma de dos va"ores que se "e pasan como par)metros. O&serve "as diferentes formas en como se ""ama "a funci%n. Sub Ejemp"o81@*, 5i&! As .nte$er 5i& n3 As .nte$er# n0 As .nte$er X / Suma*2# 2, n3/ <a" * Anput;o!*?Entrar un n5mero F ?# ?Entrada?,, n0/ <a" * Anput;o!*?Entrar otro n5mero F ?# ?Entrada?,, X/ suma*n3#n0, ActiveCe"".<a"ue / Suma*ActiveS(eet.Ran$e*?A3?,.<a"ue # ActiveS(eet.Ran$e*?A0?,.<a"ue, X / Suma*2# @, M Suma *n3# n0,

End Sub (unction Suma*<3 As .nte$er# <0 As .nte$er, As .nte$er 5i& 9ota" As .nte$er 9ota" / <3 M <0 Suma / 9ota" End (unction O&serve "a sinta!is de "a ca&ecera de funci%n# (unction Suma*<3
20 4 330

MACROS EN MS EXCELL

As .nte$er# <0 As .nte$er, As .nte$e r La estructura $enera" seria# (unctionNombre_@uncion*par3 As 4ipo# par0 As 4ipo#...# parN As 4ipo, As 4ipo.

La sinta!is es simi"ar a "a ca&ecera de un procedimiento# s%"o que una funci%n tiene tipo# esto tiene su "%$ica# 'a que una funci%n devue"ve un va"or# ese va"or ser) de un tipo determinado. As-# en nuestro ejemp"o de (unction Suma# esta funci%n es de tipo .nte$er# o dic(o de otra manera# "a funci%n ejecuta sus sentencias ' devue"ve un va"or (acia e" procedimiento o "a funci%n que "a ""am%# e" va"or devue"to se esta&"ece i$ua"ando e" nom&re de "a funci%n a a"$o# Nom&re8Bunci%n / .... En e" ejemp"o de (unction Suma# Suma / 9ota" O&serve tam&i n "a sinta!is de "a ""amada a "a funci%n# en e" ejemp"o (emos uti"izado unas cuantas formas de ""amar"a# "o que de&e tener siempre presente es que en cua"quier e!presi%n aritm tica o de c)"cu"o# e" ordenador rea"iza un m-nimo de dos operaciones# una de c)"cu"o ' otra de asi$naci%n. +or ejemp"o# A/ ;MC E" ordenador primero ca"cu"a e" resu"tado de sumar ;MC "ue$o asi$na ese resu"tado a "a varia&"e A. En cua"quier ""amada a una funci%n# cojamos por caso# X/ suma*n3#n0, +rimero se ejecutan todas "as sentencias de "a funci%n Suma# "ue$o se asi$na e" c)"cu"o de "a funci%n a "a varia&"e X. .e otro vistazo a "a funci%n de ejemp"o ' vea "o que rea"iza cada sentencia en "a que se ""ama a "a funci%n Suma. <eamos a continuaci%n unos cuantos ejemp"os de funciones. Antes recordar"e que todo "o referente a par)metros por va"or ' referencia# varia&"es "oca"es ' $"o&a"es# etc. que estudiamos en "os procedimientos es "o mismo para "as funciones.

Eje&plo =31 Bunci%n que devue"ve "a direcci%n de "a primera ce"da vac-a de un ran$o. La funci%n es de tipo Strin$ 'a que devue"ve "a casi""a en "a forma ?Bi"aCo"umna ?# por ejemp"o ?A3C?. Uti"izaremos "a propiedad Address de" o&jeto ran$e# esta propiedad devue"ve un strin$ que contiene "a referencia ?Bi"aCo"umna? de una casi""a o ran$o de casi""as. En e" caso de un ran$o devue"ve# ?Bi"aCo"umna8Anicia"FBi"aCo"umna8Bina"?# por ejemp"o ?A3FC3C? Sub Ejemp"o812*, 5i& Casi""a As Strin$ Casi""a / Casi""a8<acia*?A3?, ......
21 4 330

MACROS EN MS EXCELL

End Su& * @uncin +asilla_Vacia de Tipo String * Sir#e para Recorrer las filas de una columna asta encontrar una #aca3 * ParDmetros ( * +asilla_2nicio ( +asilla donde debe empe!ar a buscar3 * Ee#uel#e Hn string 0ue contiene la referencia de la primera casilla (unction Casi""a8<acia*Casi""a8Anicio As Strin$ , As Strin$ ActiveS(eet.Ran$e*Casi""a8Anicio,.Activate 5o !#ile Not AsEmpt'*ActiveCe"", ActiveCe"".Offset*3# C,.Activate Loop Casi""a8<acia / ActiveCe"".Address End (unction Eje&plo =81 Simi"ar a" anterior. Es "a t-pica &5squeda secuencia" de un va"or en un ran$o de casi""as# en esta funci%n so"o se avanzar) a trav s de una fi"a. La funci%n devue"ve "a direcci%n *address, de "a casi""a donde est) e" va"or &uscado# en caso que e" va"or no est en e" ran$o de fi"as# devue"ve una cadena vac-a *??,. Sub Ejemp"o81H*, 5i& Casi""a As Strin$ Casi""a / ;uscar8<a"or*?A3?# 02, * Si #alor no encontrado .f Casi""a / ?? 9(en ..... Else *Valor encontrado .... End if End Sub * @uncin Buscar de Tipo String * Sir#e para Recorrer las filas de una columna asta encontrar el #alor buscado o una de #aca3 * ParDmetros ( * +asilla_2nicial ( +asilla donde debe empe!ar a buscar3 * Valor_Buscado ( Valor 0ue se debe encontrar * Ee#uel#e Hn string 0ue contiene la referencia de la casilla donde se a encontrado el #alor3 * Tambi;n puede de#ol#er 88 en caso 0ue el #alor buscado no est;3 (unction ;uscar*Casi""a8Anicia" As Strin$# <a"or8;uscado As .nte$er, As Strin$ ActiveS(eet.Ran$e*Casi""a8Anicia",.Activate * Mientras casilla no #aca ? #alor de casilla diferente al buscado 5o !#ile Not AsEmpt'*ActiveCe"", And ActiveCe"".<a"ue QN <a"or8;uscado ActiveCe"".Offset*3# C,.Activate Loop
2@ 4 330

MACROS EN MS EXCELL

* Si la casilla donde se a detenido la b%s0ueda N: )STK V"+L" es 0ue se a encontrado *el #alor3 .f Not AsEmpt'*ActiveCe"", 4#en ;uscar / ActiveCe"".Address * Ee#ol#er la casilla donde se a encontrado el #alor Else * 1a casilla estD #aca5 N: se a encontrado el #alor buscado ;uscar/?? * Ee#ol#er una cadema #aca End if End (unction Simi"ar a" anterior. ;5squeda secuencia" de un va"or en un ran$o de casi""as# en esta funci%n se avanzar) a trav s de fi"as ' co"umnas. La funci%n devue"ve "a direcci%n *address, de "a casi""a donde est) e" va"or &uscado# en caso que e" va"or no est en e" ran$o# devue"ve una cadena vac-a *??,. Sub Ejemp"o81H*, 5i& Casi""a As Strin$ Casi""a / ;uscar8<a"or*?A3?# 02, .f Casi""a / ?? 4#en ..... Else .... End if End Sub (unction ;uscar*Casi""a8Anicia" As Strin$# <a"or8;uscado As .nte$er, As Strin$ 5i&Ancremento8Co"umna As .nte$er 5i& Continuar As +oolean ActiveS(eet.Ran$e*Casi""a8Anicia",.Activate Continuar / 9rue 5o !#ile Continuar Ancremento8Co"umna / C * Buscar el #alor por las columnas asta encontrarlo o encontrar una celda #aca3 5o !#ile Not AsEmpt'*ActiveCe"".Offset*C# Ancremento8Co"umna, And ActiveCe"". Offset*C# Ancremento8Co"umna.<a"ue QN <a"or8;uscado * Siguiente columna Ancremento8Co"umna / Ancremento8Co"umna M 3 Loop * Si no estD #aca la casilla entonces parar la b%s0ueda5 se a encontrado el #alor .f Not AsEmpt'*ActiveCe"".OffSet*C# Ancremento8Co"umna,, 4#en Continuar/Ba"se Else * 1a casilla estD #aca5 no se a encontrado el #alor ActiveCe"".Offset*3# C,.Activate * Saltar a una nue#a fila .f AsEmpt'*ActiveCe"", 4#en * Si la casilla de la nue#a fila estD #aca Continuar/Ba"se * Parar la b%s0ueda5 no a$ mDs casilla a recorrer End if
22 4 330

MACROS EN MS EXCELL

End if Loop * Si la casilla donde se a detenido la b%s0ueda N: )STK V"+L" es 0ue se a encontrado *el #alor3 .f Not AsEmpt'*ActiveCe"", 4#en ;uscar / ActiveCe""*C# Ancremento8Co"umna,.Address * Ee#ol#er la casilla donde se * a encontrado el #alor Else * 1a casilla estD #aca5 N: se a encontrado el #alor buscado ;uscar/?? * Ee#ol#er una cadema #aca End if End (unction +uede anteponer "a c")usu"a private a todos "os procedimientos ' funciones que sean ""amados s%"o desde e" mismo m%du"o# es una forma de a(orrar memoria ' (acer que e" pro$rama corra un poco m)s r)pido. Si necesita ""amar un procedimiento o funci%n desde otro m%du"o# nunca de&e preceder"o por "a c")usu"a private# recuerde que esta c")usu"a restrin$e e" )m&ito de uti"izaci%n de un procedimiento a su propio m%du"o. Supon$amos e" ejemp"o si$uiente. * Mdulo Sub Denera" .... End Sub Pri)ate Sub +rivado .... End Sub T Mdulo 9 Sub +rocedimiento8de8modu"o0 * )sto es correcto3 1lama al procedimiento General definido en MduloCall Denera" * )sto no es correcto3 1lama al procedimiento Pri#ado definido en Mdulo -5 este * procedimiento #a precedido pro la clDusula Pri#ate5 por tanto slo puede ser llamado * desde procedimientos de su propio mdulo Call +rivado End Sub <amos a ver a continuaci%n tres ejemp"os m)s so&re funciones. Es importante que "os cree en un "i&ro de
2H 4 330

MACROS EN MS EXCELL

tra&ajo nuevo ' "os pon$a en un mismo m%du"o# a" fina" de" cap-tu"o uti"izaremos "as opciones de e!portar e importar m%du"os de procedimientos ' funciones. En todos "os ejemp"os ver) e" procedimiento +rocedimiento8L"amador# es para mostrar de que forma se de&e ""amar a" procedimiento o funci%n. Los procedimientos imp"ementados son# por ""amar"o de a"$una manera# de tipo $enera"# es decir# son procedimientos que podr) uti"izar en muc(as ap"icaciones. Eje&plo =>1 +rocedimiento que a&re un cuador Ms$;o! ' muestra e" te!to que se "e paso como par)metro. Sub +rocedimiento8L"amador*, . . Call mAviso*?Esto es e" mensaje de aviso?# ?Esto es e" 9-tu"o?, . . End Sub * Procedimiento m"#iso * @uncin Mostrar el cuadro de funcin MsgBo&5 con el icono informacin $ el botn :M ,"ceptar/3 * Se utili!a para mostrar a#isos3 * ParDmetros( * Te&to C Te&to 0ue muestra el cuadro * Titulo C Ttulo del cuadro * Sub mAviso*9e!to As Strin$ # 9itu"o As Strin$ , Ms$;o! +romptF/9e!to# ;uttonsF/v&OROn"' M v&Anformation# 9it"eF/9itu"o End Sub Eje&plo =91 Bunci%n tipo ran$e que devue"ve un ran$o. O&serve como "a funci%n se i$ua"a a una varia&"e tipo Ran$e# recuerde que con esta varia&"e podr) acceder a todas "as propiedades e invocar todos "os m todos propios de "os o&jetos Ran$e. En este ejemp"o en concreto se uti"izan "as varia&"es para Copiar un $rupo de ce"das de un ran$o (acia otro# se uti"izan "os m todos Cop' ' +aste de" o&jeto Ran$e. Sub +rocedimiento8L"amador*, 5i& Ran$o8Ori$en As Ran$e 5i&Ran$o8.estino As Ran$e Set Ran$o8Ori$en/Co$er8Ran$o*A3#2#2, Ran$o8Ori$en.Cop'
2J 4 330

MACROS EN MS EXCELL

Set Ran$o8.estino/Co$er8Ran$o*D3#2#2, Ran$o8.estino.+aste +asteSpecia"F/!"+asteA""

End Sub (unction Co$er8Ran$o*Casi""a As Strin$# Bi"as As .nte$er# Co"umnas As .nte$er, As Ran$e * +asilla C casilla inicial del rango * * @ilas C n%mero* de filas +olumnas C n%mero de columnas del rango 5i& Casi""a8Bina" As Strin$ ActiveS(eet.Ran$e*Casi""a,.Activate ActiveCe"".Ce""s*Bi"as# Co"umnas,.Activate Casi""a8Bina" / ActiveCe"".Address ActiveS(eet.Ran$e*Casi""a I ?F? I Casi""a8Bina",.Se"ect Set Co$er8Ran$o / ActiveS(eet.Ran$e*Casi""a I ?F? I Casi""a8BAna", End (unction

Eje&plo =:1 Bunci%n para compro&ar e" tipo de datos. Es una funci%n de compro&aci%n que se puede uti"izar para va"idar "os datos que se entran desde un cuadro Anput;o! o desde "os cuadros de te!to de formu"arios. La funci%n es de tipo ;oo"eano# devue"ve 9rue *cierto, o Ba"se en funci%n de si e" dato pasado es correcto. En esta funci%n se eva"5an s%"o datos num ricos ' datos tipo Bec(a# puede amp"iar"a para que se comprue&en m)s tipos. Sub +rocedimiento8L"amador*, 5i&Cantidad As .nte$er 5i& Bec(a As 5ate 5i& .atos As Strin$ . . .atos / Anput;o!*?Entrar una Cantidad F ?# ?Entrar?, .f Not Compro&ar89ipo*.atos#?N?, 4#en mAviso*?Los datos introducido no son num ricos?# ?Error?, Else
2E 4 330

MACROS EN MS EXCELL

Cantidad / <a"*.atos, . . End .f . . .atos/Anput;o!*?Entrar Bec(a?#?Entrar?, .f Not Compro&ar89ipo*.atos#?B?, 4#en mAviso*?Los fec(a introducida no es correcta?# ?Error?, Else Bec(a / <a"*.atos, . . End .f . . End Sub * @uncin 0ue e#al%a si el tipo de datos 0ue se le pasan son correctos o no3 Si son correctos de#uel#e * TRH) 5 en caso contrario de#uel#e @"1S) * ParDmetros * Valor C#alor 0ue se debe comprobar5 de tipo String * Tipo C tipo a comprobar5 8N8 NNO Num;rico5 8@85 tipo fec a (unction Compro&ar89ipo*<a"or As Strin$# 9ipo As Strin$, As +oolean 5i& <a"ido As +oolean <a"ido / 4rue Select Case 9ipo * +omprueba si es un #alor num;rico #Dlido Case ?N? .f Not AsNumeric*<a"or, 4#en <a"ido / Ba"se End .f * +omprueba si es un #alor fec a #Dlido Case ?B? .f Not As.ate*<a"or, 4#en <a"ido / Ba"se End .f End Select Compro&ar89ipo / <a"ido
2K 4 330

MACROS EN MS EXCELL

End (unction

.&portar * E portar &/dulos1 Los 5"timos tres ejemp"os que (emos visto# como "e (emos indicado# son procedimientos que pueden ser uti"izados en mu"titud de ocasiones o situaciones# seria interesante tener"os disponi&"es en cua"quiera de "as (ojas que confeccionemos. +odr-a pensar en uti"izar "as opciones de copiar ' pe$ar para pasar procedimientos de una (oja a otra# es un m todo tota"mente v)"ido ' efectivo# pero "e proponemos a continuaci%n otro m todo m)s ?profesiona"?# por ""amar"o de otra manera# e i$ua" de efectivo. Este m todo consiste en $uardar "os procedimientos de un m%du"o en un arc(ivo aparte# es decir# independiente de cua"quier (oja de c)"cu"o# "ue$o# cuando en una nueva (oja necesite estas funciones# so"o de&er) importar este arc(ivo para incorporar"o. )xportar un mdulo. Guardar un mdulo en un archi*o. Como ejemp"o# a&ra "a (oja donde puso "os tres 5"timos procedimientos. 3. +ase a" editor de visua" &asic ' active e" m%du"o a e!portar. 0. Active opci%n de "a &arra de men5s Arc#i)o- E portar arc#i)o. Aparece un cuadro de di)"o$o. 1. En cuadro de edici%n No&bre de Arc#i)o# tec"ee e" nom&re para e" arc(ivo donde se $uardar) e" m%du"o# por ejemp"o ?Denera".;as?# o&serve que .;AS es "a e!tensi%n de estos arc(ivos. @. +u"se so&re e" &ot%n Fuardar. Si est) si$uiendo e" ejemp"o# cierre todos "os arc(ivos de E!ce" ' a&ra uno nuevo. 3. Active e" editor <isua" ;asic. 0. Active opci%n de "a &arra de men5s Arc#i)o- .&portar Arc#i)o. Aparece un cuadro de di)"o$o. 1. Se"eccione en "a "ista +uscar enH "a carpeta donde tiene u&icado e" arc(ivo a importar *"a carpeta donde est) Denera".;as si est) si$uiendo e" ejemp"o,. @. Una vez "oca"izada "a carpeta# se"eccione e" arc(ivo a importar *Denera".;as en e" ejemp"o, ' pu"se so&re Abrir. O&serve como en "a ventana de pro'ecto se (a incorporado un nuevo m%du"o que contiene todos "os procedimientos ' funciones de" arc(ivo importado.

9erminamos aqu- e" tema de procedimientos ' funciones# d jenos insistir de nuevo en que es mu' impor tante que constru'a sus pro$ramas uti"izando todas "as ventajas que "e ofrece "a pro$ramaci%n modu"ar. Como 5"timo consejo# a$rupe todas "as funciones que usted considere de uti"izaci%n $enera" en uno o dos m%du"os ' "ue$o uti"ice "as opciones de importaci%n ' e!portaci%n para incorporar"os a sus pro$ramas. Microsoft E!ce" ""eva inc"uida una uti"idad que sirve para re$istrar acciones que se ""evan a ca&o en un "i&ro de tra&ajo ' re$istrar"as en forma de macro. +odemos aprovec(ar esta uti"idad para $enerar c%di$o en$orroso por su sinta!is un tanto comp"icada de recordar# adem)s de a(orrar tiempo. Casi siempre despu s de&eremos modificar"o para adaptar"o a nuestros pro$ramas# sin em&ar$o eso resu"tar) sumamente senci""o. <ea e" ejemp "o si$uiente que sirve para poner &ordes a" ran$o de ce"das de A3 a DH# o&serve "os comentarios para sa&er que &ordes se ponen ' d%nde se ponen.
HC 4 330

MACROS EN MS EXCELL

Eje&plo 01 +oner &ordes a" ran$o que va de A3 a DH. Sub +oner8;ordes*, * Seleccionar el rango "-(G= Ran$e*?A3FDH?,.Se"ect * No a$ borde diagonal acia abajo Se"ection.;orders*!".ia$ona".oUn,.LineSt'"e / !"None * No a$ borde diagonal acia arriba Se"ection.;orders*!".ia$ona"Up,.LineSt'"e / !"None * Borde i!0uierdo de la seleccn !it# Se"ection.;orders*!"Ed$eLeft, .LineSt'"e / !"Continuous .6ei$(t / !"Medium .Co"orAnde! / !"Automatic *)stilo de linea continuo * "nc o de lnea Medio * +olor de lnea automDtico ,negro/ End !it# * Borde superior de la seleccin !it# Se"ection.;orders*!"Ed$e9op, .LineSt'"e / !"Continuous .6ei$(t / !"Medium .Co"orAnde! / !"Automatic End !it# * Borde inferior de la seleccin !it# Se"ection.;orders*!"Ed$e;ottom, .LineSt'"e / !"Continuous .6ei$(t / !"Medium .Co"orAnde! / !"Automatic End !it# * Borde derec o de la seleccin !it# Se"ection.;orders*!"Ed$eRi$(t, .LineSt'"e / !"Continuous .6ei$(t / !"Medium .Co"orAnde! / !"Automatic End !it# * Bordes #erticales interiores de la seleccin !it# Se"ection.;orders*!"Anside<ertica",
H3 4 330

MACROS EN MS EXCELL

.LineSt'"e / !"Continuous .6ei$(t / !"9(in T Anc(o Simp"e. .Co"orAnde! / !"Automatic End !it# * No a$ bordes oriontales interiores en la seleccin Se"ection.;orders*!"Anside:orizonta",.LineSt'"e / !"None * Seleccionar rango "-(GRan$e*?A3FD3?,.Se"ect * No a$ borde diagonal acia arriba Se"ection.;orders*!".ia$ona".oUn,.LineSt'"e / !"None * No a$ borde diagonal acia arriba Se"ection.;orders*!".ia$ona"Up,.LineSt'"e / !"None * Borde i0uierdo de la seleccin !it# Se"ection.;orders*!"Ed$eLeft, .LineSt'"e / !"Continuous .6ei$(t / !"Medium .Co"orAnde! / !"Automatic End !it# * Borde superior de la seleccin !it# Se"ection.;orders*!"Ed$e9op, .LineSt'"e / !"Continuous .6ei$(t / !"Medium .Co"orAnde! / !"Automatic End !it# * Borde inferior de la seleccin !it# Se"ection.;orders*!"Ed$e;ottom, * Eoble lnea .LineSt'"e / !".ou&"e .6ei$(t / !"9(ic7 .Co"orAnde! / !"Automatic End !it# * Borde derec o de la seleccin !it# Se"ection.;orders*!"Ed$eRi$(t, .LineSt'"e / !"Continuous .6ei$(t / !"Medium .Co"orAnde! / !"Automatic End !it# End Sub 3. 3. Active "a $ra&adora de macros. ,erra&ientas- Macro- Fra)ar nue)a &acro. Aparece "a ventana si$uiente. 0. 0. En No&bre de Macro# pon$a Poner_1neas. En Fuardar Macro en# deje "a opci%n Libro
H0 4 330

MACROS EN MS EXCELL

Acti)o . En 5escripci/n# pon$a# macro para bordes a un rango de celdas. 1. 1. +u"se so&re e" &ot%n Aceptar. 3. @. Ejecute "os pasos si$uientes. Son para poner "os &ordes 3. @.3 Se"eccione e" ran$o A3FDH. 0. @.0 Active Opci%n (or&ato- Celdas. Se"eccione fic(a +ordes. 0. @.1 +on$a "-nea a"rededor de "a se"ecc%n 3. @.1.3 En cuadro Estilos# se"eccione "a pen5"tima o antepen5"tima "-nea. 0. @.1.0 +u"se so&re e" &ot%n que representa un cuadrado. 1. @.@ +on$a "as "-neas vertica"es. 3. @.@.3 Se"eccione de" cuadro esti"o "a 5"tima "-nea de "a primera co"umna. 0. @.@.0 +u"se so&re e" &ot%n que representa "as "-neas interiores de "a se"ecci%n *e" situado en e" centro de "a "-nea inferior de &otones,.

3. 0. 1. 3. 3. 0. @. 2.

@. +u"se so&re e" &ot%n Aceptar. 2. Se"eccione e" ran$o A3FD3 H. Active de nuevo "a opci%n (or&ato-Celdas ' se"eccione "a fic(a +ordes. J. +on$a "-nea inferior do&"e. J.3 Se"eccione de" cuadro Esti"o "a 5"tima "-nea de "a se$unda co"umna. J.0 +u"se so&re e" &ot%n que representa "a "-nea inferior de "a se"ecci%n. E. +u"se so&re e" &ot%n Aceptar. K. .eten$a "a $ra&adora de Macros pu"sando so&re e" &ot%n o &ien a3active ,erra&ientas- Macros - 5etener Frabaci/n.

> >a est). A(ora a&ra e" Editor de <isua" ;asic ' comprue&e como "a $ra&adora (a (ec(o todo e" tra&ajo pro usted. A(ora 'a s%"o nos queda modificar "a macro de forma que este formato de &ordes sea ap"ica&"e a cua"quier ran$o. <ea e" ejemp"o si$uiente. En es te ejemp"o modificaremos "a macro de manera que sirva para dar ese formato a cua"quier ran$o de "a (oja. O&serve en este ejemp"o simp"emente pasamos como par)metro e" ran$o a formatear de manera que "a ca&ecera de" procedimiento quedaria. * Procedimiento Poner_Bordes3 * Procedimiento 0ue pone bordes a un rango3 +oncretamente lo encierra en un cuadrado5 le pone lneas * #erticales $ pone una doble lnea inferior en la primera fila3 * ParDmetros( * Nombre_'oja( Nombre de la oja donde estD el rango3 * Rango_Total ( Rango al 0ue se le aplica el formato3 * Rango_Primera_@ila ( Rango de la primera fila al 0ue se debe aplicar doble lnea inferior3
H1 4 330

MACROS EN MS EXCELL

Sub +oner8;ordes *Nom&re8:oja As Strin$# Ran$o89ota" As Strin$# Ran$o8+rimera8Bi"a As Strin$, * Seleccionamos la oja en la 0ue se encuantra en rango 6or7S(eets*Nom&re8:oja,.Activate * Seleccionamos en rango ActiveS(eet.Ran$e*Ran$o89ota",.Se"ect * 'acemos cuadro $ lneas #erticales3 ....... ....... * Seleccin de la primera fila ActiveS(eet.Ran$e*+rimera8Bi"a,.Se"ect * 'acemos lnea inferior doble ......... End Sub Refinamiento de "a macro de" ejemp"o anterior. En este ejemp"o todav-a perfeccionaremos m)s "a macro de" ejercicio anterior. So&re todo en "o referente a "os par)metros. ;)sicamente cam&iaremos e" tipo de par)metros# as- en "u$ar de" nom&re de "a (oja pasaremos e" n5mero ' en "u$ar de "os par)metros Ran$o89ota" ' Ran$o8+rimera8Bi"a# simp"emente pasaremos e" ran$o de "a casi""a inicia"# "a macro se encar$ar) de se"eccionar todas "as casi""as ad'acentes ' de &uscar "a primera fi"a. En esta macro adem)s se (an inc"uido funciona"idades como &orrar "os formatos antes de ap"icar "as "-neas# ajustar e" anc(o de "as co"umnas# etc. Lea "os comentarios para ver que (ace cada secci%n de "a macro. O&serve "a propiedad CurrentRe$ion de" o&jeto Ran$e# esta propiedad devue"ve e" ran$o de "as casi""as ""enas ad'acentes a una dada. +or ejemp"o ima$ine una (oja con e" ran$o A3F;3C ""eno de va"ores# "a instrucci%n ActiveS(eet.Ran$e*?A3?,.CurrentRe$ion.Se"ect Se"eccionaria e" ran$o correspondiente a A3F;3C. * @uncin Poner_1neas_Seleccin3 * )sta funcin sir#e para poner bordes a un rango3 Pone cuadro al rango5 separa las columnas con * una lnia $ pone doble lnea inferior en la * primera fila3 * *ParDmetros( * Num_'oja C N%mero de oja donde estD el rango a formatear3 * +asilla C +asilla inicial ,superior i!0uierda/ del rango a formatear Sub +oner8Lineas8Se"eccion*Numero8:oja As .nte$er# Casi""a As Strin$, 5i&! As .nte$er
H@ 4 330

MACROS EN MS EXCELL

5i& Casi""a8Anicia" As Strin$ 5i& Casi""a8BAna" As Strin$

6or7s(eets*Numero8:oja,.Activate ActiveS(eet.Ran$e*Casi""a,.Activate * Seleccionar el rango de celdas con #alores ad$acentes a la acti#a ActiveCe"".CurrentRe$ion.Se"ect * Borrar los bordes actuales de la seleccin actuales !it# Se"ection .;orders*!".ia$ona".oUn,.LineSt'"e / !"None .;orders*!".ia$ona"Up,.LineSt'"e / !"None .;orders*!"Ed$eLeft,.LineSt'"e / !"None .;orders*!"Ed$e9op,.LineSt'"e / !"None .;orders*!"Ed$e;ottom,.LineSt'"e / !"None .;orders*!"Ed$eRi$(t,.LineSt'"e / !"None .;orders*!"Anside<ertica",.LineSt'"e / !"None .;orders*!"Anside:orizonta",.LineSt'"e / !"None End !it# * 1ineas del recuadro !it# Se"ection.;orders*!"Ed$eLeft, .LineSt'"e / !"Continuous .6ei$(t / !"Medium .Co"orAnde! / !"Automatic End !it# !it# Se"ection.;orders*!"Ed$e9op, .LineSt'"e / !"Continuous .6ei$(t / !"Medium .Co"orAnde! / !"Automatic End !it# !it# Se"ection.;orders*!"Ed$e;ottom, .LineSt'"e / !"Continuous .6ei$(t / !"Medium .Co"orAnde! / !"Automatic End !it# !it# Se"ection.;orders*!"Ed$eRi$(t, .LineSt'"e / !"Continuous .6ei$(t / !"Medium .Co"orAnde! / !"Automatic End !it# * 1inieas #erticales interiores5 si en el * rango a$ mDs de una columna3 .f Se"ection.Co"umns.Count N 3 4#en !it# Se"ect ion.;orders*!"Anside<ertica", .LineSt'"e / !"Continuous
H2 4 330

MACROS EN MS EXCELL

.6ei$(t / !"9(in .Co"orAnde! / !"Automatic End !it# End .f * "justar anc o de columnas Se"ection.Co"umns.AutoBit * 1nea doble inferior de primera fila * P"ra este proceso se selecciona la casilla inicial pasada a la macro5 luego se busca * la %ltima casilla con datos3 Se constru$e un rango combinando las direcciones de ambas * casillas $ se utili!a el objeto Range junto con el m;todo Select para acer la seleccin * * R"NG),2nicial(@inal/3Select * Seleccionar primera casilla ActiveS(eet.Ran$e*Casi""a,.Se"ect * Buscar primera casilla #acia de misma fila recorriendo las columnas ! / C 5o !#ile Not AsEmpt'*ActiveCe"".Offset*C# !,, ! / ! M 3 Loop * Recoger las direcciones de la casilla inicial ? la casilla final5 es decir las referencias * @ila+olumna ,"-5 "953333/ Casi""a8Anicia" / ActiveCe"".Address Casi""a8BAna" / ActiveCe"".Offset*C# ! 4 3,.Address * Seleccionar el rango de la fila3 :bser#ar la concatenacin de las cadenas de * +asilla_2nicial $ casilla_final 0ue representan las direcciones del rango a seleccionar ActiveS(eet.Ran$e*Casi""a8Anicia" I ?F? I Casi""a8BAna",.Se"ect * Poner doble lnea !it# Se"ection.;orders*!"Ed$e;ottom, .LineSt'"e / !".ou&"e .6ei$(t / !"9(ic7 .Co"orAnde! / !"Automatic End !it# ActiveS(eet.Ran$e*Casi""a,.Activate End Sub ;ueno# este se$undo ejemp"o# un poco m)s sofisticado es s%"o para que vea (asta que punto se puede refinar una macro. +rimero construimos una macro con "a $ra&adora que ponia formato a un ran$o de casi""as que siempre era e" mismo# despu s modificamos esta macro de manera que e" ran$o de casi""as que pudiera formatear fuera cua"quiera# como tercer paso# adem)s de conse$uir "o mismo que "a se$unda versi%n pero con menos par)metros "e (emos a=adido nuevas funciona"idades como ajustar e" anc(o de "as ce"das# &orrar "os formatos previos# etc. > esta macro todavia podr-a refinarse m)s# poner co"or de fondo a "a primera fi"a# poner co"or a "os datos num ricos# etc. Lo que intentamos decir"e es que aprovec(e a" m)!imo "a uti"idad de "a $ra&adora de macros# ten$a pero en cuenta que casi siempre tendr) que a=adir c%di$o usted mismo si quiera amp"iar "a funciona"idad de "a macro# so&re todo si quiere ap"icar"e cierta
HH 4 330

MACROS EN MS EXCELL

$enera"idad. * Procedimiento Grafico3 * Procedimiento 0ue representa grDficamente los #alores de un rango3 * ParDmetros( * 'oja_Eatos ( 'oja donde estD el rango de #alores3 * Rango_Eatos ( Rango de #alores a representar grDficamente3 * Titulo ( Titulo para el grDfico3 * )je_< ( Ttulo para el eje < * )je_? ( Ttulo para el eje ? Sub Drafico*:oja8.atos As Strin$# Ran$o8.atos As Strin$#9itu"o As Strin$# Eje8X As Strin$# Eje8> As Strin$, * "Padir el grDfico C(arts.Add * Tipo de grDficoNO &l+olumn+lustered ,+olumnas agrupadas/ ActiveC(art.C(art9'pe / !"Co"umnC"ustered * Eefinir el origen de datos $ representar las series,PlotB$/ por filas ,&lRoQs/ ActiveC(art.SetSource.ata SourceF/S(eets*:oja8.atos,.Ran$e*Ran$o8.atos,# +"ot;'F/ 8 !"RoUs * )l grDfico debe ponerse en una oja nue#a ActiveC(art.Location 6(ereF/!"LocationAsNeUS(eet !it# ActiveC(art * Tiene ttulo .:as9it"e / 9rue * Poner ttulo .C(art9it"e.C(aracters.9e!t / ?<entas de Brutas? * Tiene ttulo para el eje < .A!es*!"Cate$or'# !"+rimar',.:as9it"e / 9rue * Ttulo para el eje < .A!es*!"Cate$or'# !"+rimar',.A!is9it"e.C(aracters.9e!t / ?Meses? * Tiene ttulo para el eje ? principal .A!es*!"<a"ue# !"+rimar',.:as9it"e / 9rue * Ttulo para el eje ? principal .A!es*!"<a"ue# !"+rimar',.A!is9it"e.C(aracters.9e!t / ?Cantidades? End !it# * Poner lneas de di#isin para el eje de categorias < , ori!ontales/ !it# ActiveC(art.A!es*!"Cate$or', * Poner 1ineas de di#isin primarias .:asMajorDrid"ines / 9rue * No poner lineas de di#isin secundarias .:asMinorDrid"ines / Ba"se End !it# * Poner lneas de di#isin para el eje ? ,#erticales/
HJ 4 330

MACROS EN MS EXCELL

!it# ActiveC(art.A!es*!"<a"ue, .:asMajorDrid"ines / 9rue .:asMinorDrid"ines / Ba"se End !it# * Tiene le$enda ActiveC(art.:asLe$end / 9rue * Seleccionar le$enda ActiveC(art.Le$end.Se"ect * Situar la le$enda en la parte inferior Se"ection.+osition / !";ottom ActiveC(art.App"'.ataLa&e"s 9'peF/!".ataLa&e"sS(oUNone# Le$endRe'F/Ba"se End Su&

+ara fina"izar# se$uro que cuando uti"ice "a $ra&adora apareceran muc(as propiedades ' m todos que desconoce# s%"o de&e (acer c"ic so&re estas propiedades o m todos ' pu"sar B3# autom)ticamente se activar) "a a'uda so&re esa propiedad o m todo concreto.

.nsertar funciones de Microsoft E cel desde %isual +asic1 Copie e" si$uiente procedimiento ' ejec5te"o. Es un procedimiento que senci""amente va pidiendo n5meros ' "os va co"ocando en "as ce"das de "a co"umna A partir de A3# a" fina" co"oca "a funci%n /SUMA para sumar "os va"ores introducidos ' "a funci%n /+ROME.AO para (acer e" promedio de "os mismos va"ores.

Sub Sumar*, 5i& <a"or As .nte$er 5i& Casi""a8Anicia" As Strin$ 5i& Casi""a8Bina" As Strin$ * 'acer acti#a la casilla "- de la oja acti#a ActiveS(eet.Ran$e*?A3?,.Activate 5o * )ntrar un #alor $ con#ertirlo a num;rico <a"or / <a"*Anput;o!*?Entrar un va"or?# ?Entrada?,, * Si el #alor es distinto de 4 .f <a"or QN C 4#en * Guardar el #alor en la casilla acti#a ActiveCe"".<a"ue / <a"or * 'acer acti#a la casilla de la fila siguiente
HE 4 330

MACROS EN MS EXCELL

ActiveCe"".Offset*3# C,.Activate End .f Loop2ntil <a"or / C * )stablecer la casilla inicial del rango a sumar Casi""a8Anicia" / ?A3? * )stablecer la casilla final del rango a sumar3 * +oger la direccin de la casilla acti#a5 la %ltima

Casi""a8Bina" / ActiveCe"".Address ActiveCe"".Offset*3# C,.Activate

* Poner en la casilla acti#a la funcin SHM" ActiveCe"".Bormu"a / ?/Suma*? I Casi""a8Anicia" I ?F? I Casi""a8Bina" I ?,? ActiveCe"".Offset*3# C,.Activate

* Poner en la casilla acti#a la funcin promedio ActiveCe"".Bormu"a / ?/+romedio*? I Casi""a8Anicia" I ?F? I Casi""a8Bina" I ?,? End Sub

Una vez (a'a ejecutado "a macro# o&serve que en "as ce"das donde se (an co"ocado respectivamente "as funciones /SUMA# /+ROME.AO aparece VNOM;REW *es posi&"e que aparezca XXXX# en es caso amp"-e "a co"umna,# esto si$nifica que E!ce" no reconoce e" nom&re de "a funci%n# que no e!iste. Sin em&ar$o# estas funciones si e!isten ' funcionan perfectamente cuando se tec"ean directamente so&re "a (oja de c)"cu"o# se pre$untar) e" porqu cuando se co"ocan desde una macro no funcionan. +ues resu"ta que para que cua"quier funci%n de E!ce" insertada desde una macro NO de error de&e ponerse con su nom&re en An$" s# "a traducci%n se (ace "ue$o de forma autom)tica. Es decir en "a macro de&e poner"a en in$" s ' "ue$o cuando esta se inserte en "a (oja aparecer) con su nomenc"atura en e" idioma que corresponda. Modifique e" procedimiento de" ejemp"o ' en "u$ar de poner ActiveCe"".Bormu"a / ?/Suma*? I Casi""a8Anicia" I ?F? I Casi""a8Bina" I ?,? +on$a ActiveCe"".Bormu"a / ?/Sum*? I Casi""a8Anicia" I ?F? I Casi""a8Bina" I ?,? > a(ora# en "u$ar de ActiveCe"".Bormu"a / ?/+romedio*? I Casi""a8Anicia" I ?F? I Casi""a8Bina" I ?,? +on$a ActiveCe"".Bormu"a / ?/Avera$e*? I
HK 4 330

MACROS EN MS EXCELL

Casi""a8Anicia" I ?F? I Casi""a8Bina" I ?,? Ejecute "a macro ' comprue&e que a(ora todo funciona correctamente. O&serve que en "a (oja# "as funciones se (an insertado con su nom&re correcto se$5n e" idioma# es decir SUMA ' +ROME.AO. A continuaci%n "e e!p"icaremos como puede averi$uar e" nom&re de cua"quier funci%n en in$" s. Uti"izaremos "a $ra&adora de macros. Como ejemp"o o&tendremos e" nom&re de "as funci%n /+ROME.AO. .e&er) se$uir "os mismos pasos para o&tener e" nom&re de cua"quier funci%n. 3. Active "a $ra&adora de macros. 0. <a'a a una casi""a cua"quiera# C3 por ejemp"o ' tec"ee "a funci%n ta" como "o (ar-a en su idioma. +or ejemp"o# pon$a /+ROME.AO*A3FA3C, o e"nom&re de cua"quier otra funci%n E!ce". 1. .eten$a "a ejecuci%n de "a macro. @. Edite "a macro ' o&serve e" nom&re que se (a puesto# 'a s%"o de&e apunt)rse"o ' pasar"o a su procedimiento. Es posi&"e que "a funci%n que vea ten$a una nomenc"atura que "e suene rara ' es que "a $ra&adora de macros uti"iza referencias tipo RC *roU co"umn, A medida que "os pro$ramas van creciendo "a pro&a&i"idad de cometer errores tam&i n va creciendo. Los errores se c"asifican norma"mente en tres cate$or-as. Errores en tie&po de co&pilaci/n1 Son "os t-picos errores que impiden (acer funcionar e" pro$rama de&ido# por ejemp"o# a errores de sinta!is en "as instrucciones# ""amadas a funciones que no e!isten o ""amadas con e" tipo o e" n5mero de par)metros incorrectos# etc. Este tipo de errores no dan demasiados pro&"emas# primero porque e" compi"ador avisa de donde se (an producido ' "ue$o porque simp"emente revisando "a sinta!is se so"ucionan r)pidamente. Errores en tie&po de ejecuci/n. Estos errores se producen por una ma"a pro$ramaci%n de" c%di$o a" no (a&er previsto determinados casos concretos o especia"es# como por ejemp"o intentar a&rir un arc(ivo que no e!iste# imprimir sin compro&ar que "a impresora est) conectada# definir ma" "a dimensi%n de un arra' e intentar acceder a miem&ros que no e!isten# etc. Cuando se produce este tipo de errores se detiene "a ejecuci%n de" pro$rama ' norma"mente se informa de" tipo de error que se (a producido. Muc(os de estos errores se pueden so"ucionar mediante rutinas o funciones de tratamiento de errores# estudiaremos este tipo de rutinas un poco m)s ade"ante. Errores de funci/n. Son "os m)s comp"icados de detectar 'a que ni se detectan en "a fase de ejecuci%n# ni provocan "a detenci%n de" pro$rama# son de&idos a "a incorrecta pro$ramaci%n de a"$5n proceso ' como resu"tado se o&tienen datos err%neos. Errores de este tipo son c)"cu"os ma" (ec(os# &uc"es infinitos# devo"uci%n de va"ores incorrectos# etc. Como ni "os detecta e" compi"ador# ni provocan "a interrupci%n de" pro$rama de&en revisarse a mano# ' c"aro# si e" pro$rama es e!tenso ' trata muc(os datos# su detecci%n puede resu"tar dificu"tosa. <isua" ;asic# ' todos "os entornos de pro$ramaci%n incorporan (erramientas para faci"itar "a detecci%n de este tipo de errores# son "as (erramientas de depuraci%n. Antes de comenzar a descri&ir como funcionan estas (erramientas# "e recomendamos# una vez m)s# que modu"arice su pro$rama uti"izando procedimientos cortos que rea"icen tra&ajos concretos ' precisos# de esta forma conse$uir)# adem)s de que e" pro$rama quede m)s e"e$ante ' en un futuro sea m)s senci""o modificar"o# evitar e" tener que revisar $randes &"oques de c%di$o para detectar errores de este tipo. ,erra&ientas de depuraci/n1
JC 4 330

MACROS EN MS EXCELL

Como se aca&a de indicar# estas (erramientas son mu' 5ti"es a "a (ora de testear paso a paso e" funcionamiento de" pro$rama ' detectar "os procesos que provocan un ma" funcionamiento de" mismo. Copie "os datos si$uientes en "a primera (oja de un "i&ro de tra&ajo# estos datos ser)n uti"izados por "as funciones que uti"izaremos para e!p"icar e" funcionamiento de "as (erramientas de depuraci%n. , 1 3 4 5 6 7 8 9 1 3 4 5 6 7 8 9 :_ 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 )nero 340 6 275 4 364 6 254 6 380 5 270 9 224 8 290 6 382 7 B # Fe"rer o 3336 2807 3704 4275 3533 4509 4293 4530 0 .ar( o 3135 3945 3140 4370 4409 3153 3171 3336 ) F G 2uni o 4891 3946 2052 2670 4917 3454 3258 4141

,"ri .a/ l o 2402 4345 4780 3352 3236 2640 3193 2710 3227 3458 4894 4801 3834 3596 4770 2212

3538

3748

4800 3869

4896

J3 4 330

MACROS EN MS EXCELL

88 81 ; 11 13

1 ;

389 7

4052

4189

3132 4016

3593

Copie e" c%di$o si$uiente# es e" que uti"izaremos para estudiar ' ver ejemp"os so&re "as (erramientas de depuraci%n. La primera *Sub Prueba, recorre "os datos de "as co"umnas (asta encontrar una vac-a# esta funci%n va ""amando a Recorrer_+olumna# sirve para recorrer "as fi"as de una co"umna (asta encontrar una vac-a# va sumando "os va"ores que encuentra en "as fi"as ' va contando cuantas (a' de ""enas# a" fina" ""ama a "a funci%n +Dlculos# esta funci%n co"oca en respectivas casi""a# "a suma de "os va"ores de "a co"umna# "a cantidad de ce"das ""enas que (a encontrado# ' "a media. Una vez (a'a copiado "as funciones ejec5te"as para compro&ar su correcto funcionamiento antes de proceder a" estudio de "as (erramientas de depuraci%n. Sub +rue&a*, 6or7s(eets*3,.Ran$e*?;0?,.Activate T Recorrer "as casi""as de una fi"a (asta que se encuentre una vac-a 5o !#ile Not AsEmpt'*ActiveCe"", Ca"" Recorrer8Co"umna ActiveCe"".Offset*C# 3,.Activate Loop End Sub Pri)ate Su& Recorrer8Co"umna*, 5i& Suma8Co"umna As Lon$ *Suma de los #alores de la columna 5i&Ma'or8Sue8Cero As .nte$er * +ontar casillas con #alores ma$ores 0ue cero 5i& .esp8Bi"a As .nte$er * 2ncremento de @ila Suma8Co"umna / C Ma'or8Sue8Cero / C .esp8Bi"a / C * Recorrer las filas de una columna asta 0ue se encuentre una #aca 5o !#ile Not AsEmpt'*ActiveCe"".Offset*.esp8Bi"a# C,, .f ActiveCe"".Offset*.esp8Bi"a# C,.<a"ue N C 4#en Suma8Co"umna / Suma8Co"umna M ActiveCe"".Offset*.esp8Bi"a# o,.<a"ue Ma'or8Sue8Cero / Ma'or8Sue8Cero M 3
J0 4 330

MACROS EN MS EXCELL

End .f .esp8Bi"a / .esp8Bi"a M 3 Loop Call Ca"cu"ar*Suma8Co"umna# Ma'or8Sue8Cero# .esp8Bi"a, End Sub Pri)ate Sub Ca"cu"ar*Suma As Lon$# S As Ante$er# B As Ante$er, ActiveCe"".Offset*B M 0# C,.<a"ue / Suma ActiveCe"".Offset*B M 1# C,.<a"ue / S ActiveCe"".Offset*B M @# C,.<a"ue / Suma L S End Sub .odo )jecucin paso a paso por instrucciones. E" modo paso a paso permite "a ejecuci%n de" pro$rama instrucci%n por instrucci%n# de esta forma es posi&"e ver que e" funcionamiento de" pro$rama es e" correcto# es decir que "a ejecuci%n de instrucciones

so&re e" &ot%n # activar "a opci%n de men5 5epuraci/n -Paso a Paso por .nstrucciones o ir pu"sando "a tec"a (9# que se$uramente es "o m)s c%modo. Eje&plo1 3. 3. Sit5e e" cursor dentro de" procedimiento +rue&a. 0. 0. <a'a pu"sando "a tec"a (9 ' ver) como se ejecuta ejecuta una so"a instrucci%n por cada pu"saci%n. +uede ir a"ternando con "a (oja de c)"cu"o para ver que es "o que ocurre cada vez que se ejecuta una instrucci%n. Cuando est ejecutando paso a paso puede uti"izar "os &otones si$uientes para ""evar a ca&o determinadas acciones.

Sirve para detener "a ejecuci%n de" pro$rama. Sirve para ejecutar e" resto de" pro$rama. Sirve para ejecutar todo un procedimiento. Cuando en "a ejecuci%n de un procedimiento# se ""e$a a una "-nea que ""ama a otro procedimiento o funci%n# pu"sando este &ot%n se puede provocar "a ejecuci%n de todo e" c%di$o de esta funci%n para "ue$o continuar con e" modo paso a paso.
J1 4 330

MACROS EN MS EXCELL

Eje&plo1 3. 0. 3. 0. Sit5e e" cursor dentro de" procedimiento Prueba. <a'a ejecutando paso a paso (asta "a "-nea

+all Recorrer_+olumna 1. En este punto pu"se e" &ot%n # o&serve como se ejecuta toda e" procedimiento Recorrer_+olumna para "ue$o continuar con "a ejecuci%n norma" de +aso a +aso. +ara activar esta opci%n# tam&i n puede activar "a opci%n 5epuraci/n- Paso a paso por procedi&ientos# o &ien pu"sar "a com&inaci%n MAEI(9. Sirve para ejecutar todas "as instrucciones de" procedimiento activo ' vo"ver *o terminar,. Eje&plo1 3. 0. 3. 0. Sit5e e" cursor dentro de" procedimiento Prueba. <a'a ejecutado paso a paso (asta "a instrucci%n

Ma$or_Iue_+ero C Ma$or_Iue_+ero R >a dentro de" procedimientoRecorrer_+olumna. 1. +u"se so&re e" &ot%n ver) como se termina "a ejecuci%n de este procedimiento ' se vue"ve a" procedimiento +rue&a para continuar con "a ejecuci%n paso a paso. +ara activar esta opci%n# tam&i n puede "a opci%n .epuraci%nL +aso a paso para sa"ir# o &ien pu"sar "a com&inaci%n CON9ROLM MA>M BE. )l modo nterrupcin. En pro$ramas "ar$os resu"ta fastidioso tener que ejecutar"os paso a paso# so&retodo si sa&emos que e" error se produce en una parte avanzada de" pro$rama. E" modo interrupci%n# permite "a ejecuci%n de" pro$rama (asta una instrucci%n determinada para# a partir de esta# ejecutar paso a paso ' as- poder detectar e" error. 5efinir puntos de interrupci/n1 3. 3.

0. 0. +u"se so&re e" &ot%n . 9am&i n puede activar "a opci%n 5epuraci/n- Alternar punto de interrupci/n# pu"sar "a tec"a BK o &ien (acer un c"ic en "a parte izquierda de "a ventana de" m%du"o *"a franja vertica" en co"or $ris,. Para desacti#ar un punto de interrupcin siga los mismos pasos3
J@ 4 330

MACROS EN MS EXCELL

Solucionar los errores. 9odo "o dic(o anteriormente no servir-a de $ran cosa si no fuera posi&"e revisar "os va"ores que "as varia&"es van co$iendo a medida que vamos avanzando o si no tuvi ramos ocasi%n de eva"uar "as e!presiones de" pro$rama. En "as si$uientes secciones veremos como ""evar a ca&o estas acciones. nspecciones rpidas de *aria"les. Estas opciones sirven para revisar e" va"or de "as varia&"es a medida que se va ejecutando e" pro$rama. +ara ver "os va"ores que van tomando "as varia&"es es visi&"e "a %entana de inspecci/n# para activar"a %er- %entana de .nspecci/n o pu"se so&re e" &ot%n .

A7adir una )ariable a la )entana de inspecci/n1 Aunque no es necesario estar ejecutando e" pro$rama en modo paso a pas o# es conveniente. 3. 3. Se"eccione "a varia&"e que desee a=adir a "a ventana (aciendo un c"ic so&re e""a.

0. 0. +u"se so&re e" &ot%n # tam&i n puede activar 5epuraci/n- .nspecci/n rpida o pu"sar "a com&inaci%n MaEI(:. Aparece un cuadro de di)"o$o donde se muestra e" va"or actua" de "a varia&"e. Si no est) ejecutando e" pro$rama paso a paso# aparecer) e" va"or (uera de Conte to. 1. 1. +u"se so&re e" &ot%n A$re$ar para a=adir "a varia&"e a "a ventana de inspecci%n. .e&e tener en cuenta que para revisar "as varia&"es "as e!presiones que "es asi$nan va"ores de&en de ejecutarse a" menos una vez. 3. Sit5e un punto de interrupci%n en "a "-nea. Ma$or_Iue_+ero C Ma$or_Iue_+ero R 3. 0. 0. 1. +u"se so&re e" &ot%n . 1. @. +u"se so&re e" &ot%n A$re$ar para que "a varia&"e se inserte en "a ventana Anspecciones. Repita "os pasos anteriores para "as varia&"es Ma$or_Iue_+ero ' Eesp_@ila @. 2. <a'a ejecutando e" pro$rama paso a paso ' o&serve como va cam&iando e" va"or de "as varia&"es en "a ventana de inspecci%n.

Recuerde que puede a$re$ar una varia&"e a "a ventana de inspecci%n aunque no est ejecutando e" pro$rama. AA Suponemos 0ue $a se abrD dado cuenta 0ue cuando ejecuta el programa paso a paso5 si sit%a el puntero de ratn sobre una #ariable5 se muestra el #alor de la misma3

J2 4 330

MACROS EN MS EXCELL

+orrar una )ariable de la )entana de .nspecci/n1 S%"o de&e se"eccionar"a en "a ventana de inspecci%n ' pu"sar so&re "a tec"a S2PR.

Modificar el )alor de una )ariable en tie&po de ejecuci/n1 A veces resu"ta interesante cam&iar e" va"or de a"$una varia&"e cuando se est) ejecutando e" pro$rama# para ver que ocurre si co$e determinados va"ores# para terminar un &uc"e# etc. Eje&plo1 3. Sit5e un punto de interrupci%n en "a "-nea. Ma$or_Iue_+ero C Ma$or_Iue_+ero R 3. 0. A$re$ue a "a ventana de inspecci%n *si no est), "a varia&"e Suma_+olumna. 0. 1. Ejecute e" pro$rama# a" detenerse# o&serve en "a %entana de .nspecci/n que "a varia&"e Suma_+olumna tiene un va"or que a(ora cam&iaremos. 1. @. :a$a do&"e c"ic so&re e" va"or de Suma_+olumna dentro de "a ventana de inspecci%n. @. 2. ;orre e" va"or que tiene# c)m&ie"o por otro ' pu"se EN4ER. 2. H. A(ora puede continuar con "a ejecuci%n norma" de" pro$rama. )xpresiones de Re*isin. Adem)s de permitir a=adir una varia&"e o e!presi%n dentro de "a %entana .n&ediato# una E presi/n de Re)isi/n permite interrumpir "a ejecuci%n de" pro$rama cuando una varia&"e co$e determinado va"or. +iense que muc(as veces un pro$rama deja de funcionar# o funciona ma" cuando una varia&"e co$e determinados va"ores. Con una e!presi%n de revisi%n# podremos detener "a ejecuci%n de" pro$rama cuando una varia&"e contiene determinado va"or * a partie de determinado va"or,# "ue$o# podremos continuar con "a ejecuci%n paso a paso para ver que ocurre a partir de este punto. En e" ejemp"o que veremos a continuaci%n# (aremos que e" pro$rama se interrumpa cuando "a varia&"e Suma_+olumna a"cance un va"or superior a 1CCCC. 3. 3. Sit5e e" cursor so&re e" nom&re de "a varia&"e Suma_+olumna5 puede esco$er cua"quier posici%n donde aparece "a varia&"e. 0. 0. Active "a opci%n 5epuraci/n- A$re$ar .nspecci/n. Aparece e" si$uiente cuadro de di)"o$o#

JH 4 330

MACROS EN MS EXCELL

E presi/n F <aria&"e o e!presi%n que se desea eva"uar. Procedi&ientoF Aqu- se descri&e e" procedimiento donde de&e eva"uarse "a varia&"e# esto si$nifica que e" )m&ito de compro&aci%n de "a varia&"e es s%"o dentro de este procedimiento. Ama$ine que tiene dos o m)s procedimientos donde uti"iza una varia&"e con e" mismo nom&re# o &ien que tiene una varia&"e $"o&a"# aqu- se indica en que procedimiento de&e (acerse "a eva"uaci%n. M/dulo. Lo mismo que en apartado procedimiento pero a nive" m%du"o. E presi/n de inspecci/n. Activando esta opci%n# indicamos que "o 5nico que deseamos (acer es inc"uir "a varia&"e o e!presi%n dentro de "a ventana de e!presi%n. Modo de interrupci/n cuando el )alor sea )erdadero. Andicamos que cuando "a e!presi%n indicada en cuadro de te!to E!presi%nF sea cierta# de&e detenerse e" pro$rama. Modo de interrupci/n cuando el )alor ca&bie. E" pro$rama se detendr) cuando "a e!presi%n cam&ie de va"or. +ara nuestro ejemp"o re""ene con "os datos si$uientes. E presi/n F Suma8Co"umna N 1CCCC Procedi&ientoH Recorrer8Co"umna M/duloF M%du"o3 *o como se ""ame su m%du"o,. Active Modo de interrupci/n cuando el )alor sea )erdadero. 1. +u"se so&re &ot%n Aceptar. Ejecute e" pro$rama. O&serve que e" pro$rama se interrumpe cuando Suma8+olumna co$e un va"or superior a 1CCCC# a partir de este podr-amos continuar con "a ejecuci%n paso a paso ' ver como evo"uciona e" va"or de "a varia&"e o varia&"es. Es otra forma de inspeccionar varia&"es cuando e" pro$rama est) en modo interrupci%n *ejecut)ndose paso a paso,# pero adem)s# ofrece "a posi&i"idad de cam&iar va"ores de "as varia&"es e inc"uso ejecutar o eva"uar e!presiones. +ara ver e" va"or de una varia&"e en "a ventana inmediato de&e anteponer"e un W ' "ue$o pu"sar Enter.
JJ 4 330

MACROS EN MS EXCELL

+ara activar "a ventana Anmediato# active opci%n %er-.n&ediato# o pu"se "a com&inaci%n CON4ROLIF. Eje&plo. En e" si$uiente ejemp"o# uti"izaremos "a ventana Anmediato para ver e" va"or de "as varia&"es Suma_+olumna# Ma$or_Iue_+ero ' Eesp_@ila. 9am&i n cam&iaremos e" va"or de una de e""as ' compro&aremos una e!presi%n. 3. 0. 01 0. Active "a ventana de Anmediato. %er- %entana .n&ediato1 Sit5e un punto de interrupci%n en "a instrucci%n

+all +alcular,Suma_+olumna5 Ma$or_Iue_+ero5 Eesp_@ila/ 3. 0. 1. @. Ejecute e" pro$rama# este de&e detenerse cuando ""e$ue a "a instrucci%n indicada en paso 0. Entre en "a ventana inmediato# (a$a "as prue&as si$uientes. Escri&a

S Suma_+olumna S Ma$or_Iue_+ero S Eesp_@ila +rue&e "a e!presi%n si$uiente. En este caso concreto so"o sirve para ver que es una posi&i"idad. < C Suma_+olumna T Ma$or_Iue_+ero S< +ara terminar# cam&iaremos e" va"or de "a varia&"e Suma_+olumna ' continuaremos "a ejecuci%n norma" de" pro$rama. 2. Suma_+olumna C N9.74444 Suite e" punto de interrupci%n ' termine "a ejecuci%n de" pro$rama.

La instruccin 0e"ug.Print. Esta instrucci%n# que se uti"iza directamente so&re e" c%di$o de" pro$rama# permite ver todos "os va"ores que (a ido co$iendo una varia&"e o e!presi%n durante "a ejecuci%n de" pro$rama. Los va"ores se mostrar)n en "a ventana Anmediato una vez fina"izado e" pro$rama. Esta e!presi%n resu"ta 5ti" en una fase avanzada de depuraci%n 'a que permite ir viendo "a evo"uci%n de una varia&"e o e!presi%n sin necesidad de poner puntos de interrupci%n. Evidentemente cuando e" pro$rama est "isto de&en de sacarse. Eje&plo1 Mediante "a instrucci%n 5ebu$1Print veremos "a evo"uci%n de "a varia&"e Suma_+olumna3

3. Sit5e e" cursor despu s de "a instrucci%n


JE 4 330

MACROS EN MS EXCELL

Suma_+olumna C Suma_+olumna R "cti#e+ell3:ffset,Eesp_@ila5 4/3Value Escri&aF Eebug3Print 8Eentro del Bucle ( 8 U Suma_+olumna3 0. Sit5e e" cursor despu s de "a instrucci%n Loop ' escri&a Eebug3Print 8 @uera del Bucle ( 8 U Suma_+olumna3 1. Ejecute e" pro$rama *sin puntos de interrupci%n,. Una vez terminada "a ejecuci%n# o&serve "o que (a' escrito en "a ventana inmediato. A veces# resu"ta interesante contro"ar en que pasos "a varia&"e (a ido co$iendo determinados va"ores# para (acer esto de&er)n dec"ararse "as correspondientes varia&"es que (a$an "as funciones de contador. Eje&plo1 :aremos "o mismo que en e" ejemp"o anterior pero indicando "os pasos de &uc"e ' "as ""amadas a" procedimiento Recorrer_+olumna. 3. 0. 4.ec"are a nive" $"o&a" a" varia&"e +ontar_1lamadas de tipo Ante$er. 4.ec"are dentro de" +rocedimiento Recorrer_+olumna "a varia&"e Pasos_Ee_Bucle de tipo Ante$er.

3. 4 Anicia"ice a 3 "a varia&"e +ontar_1lamadas dentro de "a funci%n Prueba# ()$a"o antes de "a instrucci%n Eo F ile. 0. 4 .e&ajo de "a instrucci%n "cti#e+ell3:ffset,45 -/3"cti#ate pon$a +ontar_1lamadas C +ontar_1lamadasR1. 4 Anicia"ice a 3 "a varia&"e Pasos_Ee_Bucle dentro de" procedimiento Recorrer_+olumna5 ()$a"o antes de "a instrucci%n Eo F ile. @. 4 .e&ajo de "a instrucci%n Eesp_@ila C Eesp_@ila R -# pon$a Pasos_Ee_Bucle C Pasos_Ee_BucleR2. 4 Cam&ie "as e!presiones .e&u$.+rint por# Eebug3Print 8Paso de Bucle( 8 U Paso_Ee_Bucle U 8 Suma_+olumna C 8 U Suma_+olumna Eebug3Print 8 1lamada ( 8 U +ontar_1lamadas U 8 Suma_+olumna C 8 U Suma_+olumna 4 Ejecute e" pro$rama ' o&serve "a sa"ida en "a ventana Anmediato. +or supuesto cuando e" pro$rama est terminado ' compro&ado de&er) quitar todas "as instrucciones .e&u$.+rint > con esto terminamos e" tema de "a depuraci%n. Ansistimos en "a importancia de estas (erramientas no s%"o a "a (ora de "oca"izar errores de pro$ramaci%n sino tam&i n a "a (ora de compro&ar "a evo"uci%n de" pro$rama cuando se dan determinadas condiciones. . jenos aca&ar e" tema insistiendo de nuevo en "a importancia que modu"arice sus pro$ramas# o&serve que si "o (ace# tam&i n "e resu"tar) muc(o m)s
JK 4 330

MACROS EN MS EXCELL

senci""o detectar errores de pro$ramaci%n. Es imposi&"e e!c"uir de" todo "os errores en "os pro$ramas. Si adem)s# ' como es de desear# e" pro$rama ser) uti"izado por usuarios que no (an tenido nada que ver en e" proceso de desarro""o e imp"ementaci%n posi&"emente *se$uramente, se producir)n errores de&ido a su incorrecta uti"izaci%n. Estos errores son "os que se de&en prevenir. Errores de este tipo son# por ejemp"o# intentar acceder a un arc(ivo ine!istente# entrar va"or es incorrectos a trav s de un cuadro de di)"o$o o formu"ario *datos tipo Strin$ cuando se requieren n5meros#...,. 9am&i n entrar-an en este tipo de errores aque""os casos e!cepciona"es pero que de&en ser previstos por e" pro$ramador# como por ejemp"o que se ""ene "a unidad de disco# que "a impresora se quede sin pape" *este 'a no es tan e!cepciona",# etc. <isua" ;asic ' "a ma'or-a de "en$uajes de pro$ramaci%n permiten imp"ementar rutinas de tratamiento de errores cu'a fina"idad es interceptar determinados tipo de errores que se producen en tiempo de ejecuci%n. La fina"idad de estas rutinas es que e" pro$rama no se deten$a# o a" menos si se detiene# informar so&re "a posi&"e causa de" error e intentar contro"ar"o de a"$una forma. Estudiaremos a continuaci%n como se rea"iza esto en visua" &asic. Copie e" m%du"o si$uiente# ser) e" que uti"izaremos en "os ejemp"os. Es un simp"e procedimiento que pide dos va"ores a" usuario# "os suma ' "os $uarda en "a ce"da A3 de :oja0.

Option E plicit Sub +rue&a*, 5i& n3 As .nte$er 5i& n0 As .nte$er 5i&tota" As .nte$er n3 / Anput;o!*?Entrar un va"or?# ?Entrada?, n0 / Anput;o!*?Entrar otro va"or ?# ?Entrada?, tota" / n3 M n0 6or7s(eets*?:oja0?,.Ran$e*?A3?,.<a"ue / tota" End Sub Denera"mente una rutina de tratamiento de errores reacciona ante casos esperados por e" pro$ramador. En e" ejemp"o que nos ocupa# podr-a ser que e" usuario entrara caracteres en "u$ar de n5meros por "o que e" pro$rama $enerar-a e" error si$uiente.

EC 4 330

MACROS EN MS EXCELL

Mediante una rutina de tratamiento de errores informaremos de" error que se (a producido ' direccionaremos "a ejecuci%n de" pro$rama (acia donde interese. En visua" &asic e" tratamiento de errores es una parte norma" de "a ejecuci%n de" pro$rama. La instrucci%n para e" tratamiento de errores es ON ERROR FO4O "0neaJ "-nea es una etiqueta o marca de "-nea que indica (acia donde de&e diri$irse e" pro$rama en caso de error. E" formato $enera" de un procedimiento o funci%n donde se imp"ementa una rutina de tratamiento de errores es "a si$uiente. Sub prue&a*, On Error FO4O 9ratar8errores * 2nstrucciones del procedimiento E it Sub * Salir del procedimiento 9ratar8ErroresF * 2nstrucciones de tratamiento de error End Sub1 Con On Error FO4O ,ratar'#rrores # indicamos a" pro$rama que en caso que se produzca un error en tiempo de ejecuci%n va'a a ejecutar "as "-neas que si$uen a "a etiqueta o marca de "-nea Tratar_)rrores. O&serve que antes de "a etiqueta Tratar_)rrores (a' "a instrucci%n E it Sub# sirve para que si e" procedimiento se (a desarro""ado correctamente# sa"$a en ese punto# ten$a en cuenta que si no se pusiera esta "-nea "a ejecuci%n continuar-a secuencia"mente ' se ejecutar-an "as "-neas de "a rutina Tratar_)rrores. Si "a rutina de tratamiento de errores se imp"ementa en una funci%n de&e poner E it (unction en "u$ar de E it Sub. En este primer ejemp"o (aremos a"$o mu' simp"e# mostrar informaci%n so&re e" tipo de error que se (a producido ' detener "a ejecuci%n de" pro$rama. <a"e# esto es "o que (ace 'a <isua" ;asic sin necesidad de imp"ementar nada# pero nos servir) para introducir e" o&jeto Err. #" objeto #rr. Siempre que se produce un error en tiempo de ejecuci%n <isua" ;asic $enera *o disp ara como dicen a"$unos autores, un o&jeto tipo Err# estudiaremos dos propiedades de este o&jeto Nu&ber ' 5escription. Nu&ber es un n5mero indicativo so&re e" tipo de error que se (a producido# dic(o de otra forma# cuando
E3 4 330

MACROS EN MS EXCELL

visua" &asic dispara un o&jeto Err en tiempo de ejecuci%n# podemos revisar su propiedad Nu&ber para sa&er que es "o que (a causado e" error. 5escription es e" mensaje asociado a" n5mero de error ' es una cadena de te!to que descri&e &revemente e" error. A(ora en nuestro ejemp"o# imp"ementaremos una rutina de error que muestre e" n5mero de error ' su descripci%n# insistimos que es "o que (ace visua" &asic por si s%"o# pero "ue$o veremos como $racias a" n5mero de error podremos determinar "a causa de" error ' contro"ar "a ejecuci%n de" pro$rama como m)s conven$a. E" procedimiento quedar-a de "a si$uiente manera. Sub +rue&a*, On Error Fo4o 9ratar8Errores 5i& n3 As .nte$er 5i& n0 As .nte$er 5i&tota" As .nte$er n3 / Anput;o!*?Entrar un va"or?# ?Entrada?, n0 / Anput;o!*?Entrar otro va"or ?# ?Entrada?, tota" / n3 M n0 6or7s(eets*?:oja0?,.Ran$e*?A3?,.<a"ue / tota" E it Sub 4ratarCErroresH Ms$;o! *?N5mero de Error F ? I Err.Num&er I C(r*31, I ?.escripci%n F ? I Err..escription, End Sub Ejecute e" procedimiento anterior ' cuando se "e pida e" primer n5mero entre e" 9e!to ?:o"a?. O&serve que como se (a producido un error# e" pro$rama sa"ta (acia "a rutina de tratamiento de errores ' muestra e" n5mero de error ' su descripci%n asociada. Continuar el pro$ra&a despus de la ejecuci/n de la rutina de trata&iento de errores1 En "a ma'or-a de "os casos# "as rutinas de tratamiento de errores son para que e" pro$rama no se deten$a. E" proceso (a&itua" cuando se produce e" error es tratar de corre$ir"o ' continuar "a ej ecuci%n de" pro$rama. La continuaci%n de" pro$rama se consi$ue mediante "a instrucci%n Resu&e. Esta instrucci%n da tres posi&i"idades# Ejecutar otra vez "a instrucci%n que (a causado e" error# continuar por "a instrucci%n si$uiente a "a que (a causado e" error o diri$ir "a ejecuci%n (acia una "-nea marcada con una etiqueta. Esto# en nuestro caso# ser-a vo"ver a pre$untar de nuevo e" va"or. La rutina de tratamiento de errores quedar-a. 4ratarCErroresH
E0 4 330

MACROS EN MS EXCELL

Ms$;o! *?N5mero de Error F ? I Err.Num&er I C(r*31, I ?.escripci%n F ? I Err..escription, Resu&e +odr-amos cam&iar e" mensaje que ve e" usuario para (acer"o m)s compresivo. La rutina quedar-a. 4ratarCErroresH Ms$;o! *?.e&e entrar un va"or num rico?, Resu&e Resu&e Ne t1 Continuar e" pro$rama por "a instrucci%n si$uiente a "a que (a causado e" error. 4ratarCErroresH Ms$;o! *?.e&e entrar un va"or num rico?, Resu&e Ne t En este caso e" pro$rama informar-a de "a causa de" error pero continuar-a "a ejecuci%n por "a "-nea si$uiente a "a que (a causado e" error. No es una &uena so"uci%n para este caso pero "os (a' en "os que es "a mejor. Resu&e E4.K2E4A. Continuar por "a instrucci%n que si$ue a "a )T2IH)T". :aremos que e" pro$rama vue"va a" principio cuando se produzca un error. +ara e""o de&emos poner una etiqueta o marca de "-nea mediante "a cua" indicaremos en que punto de&e continuar "a ejecuci%n de" pro$rama. O&serve que (emos puesto "a etiqueta AnicioF a" principio de" procedimiento. Evidentemente no siempre tiene que empezar desde e" principio# puede diri$irse "a ejecuci%n (acia donde m)s conven$a. Sub +rue&a*, On Error Fo4o 9ratar8Errores 5i& n3 As .nte$er 5i& n0 As .nte$er 5i&tota" As .nte$er .nicioH *"0u #uel#e el programa si se produce un error n3 / Anput;o!*?Entrar un va"or?# ?Entrada?, n0 / Anput;o!*?Entrar otro va"or ?# ?Entrada?, tota" / n3 M n0 6or7s(eets*?:oja0?,.Ran$e*?A3?,.<a"ue / tota" E it Sub
E1 4 330

MACROS EN MS EXCELL

9ratar8ErroresF Ms$;o! *?.e&e entrar un va"or num rico?, Resu&e Anicio End Sub L"e$ados a este punto 'a sa&emos como contro"ar errores simp"es ' como rediri$ir "a ejecuci%n de" pro$rama. A(ora# prue&e "o si$uiente# ejecute e" pro$rama ' cuando se "e pida e" primer va"or# pon$a 2CCCC. Efectivamente# se produce un error# 2CCCC no es un va"or v)"ido para datos tipo Ante$er# recuerde que e" ran$o para "os datos tipo Ante$er es de 410JHE a 10JHJ. O&serve que "a rutina continua tratando e" error ' pidiendo de nuevo "os datos# pero e" mensaje que ver) e" usuario continuar) siendo 8Eebe entrar un #alor num;rico 8# cosa que se$uramente "e dejar) perp"ejo. Con esto (emos pretendido que vea que puede (a&er m)s de una causa que provoque error# consecuentemente "as rutinas de tratamiento de errores de&er)n prevenir m)s de un error. En este nuevo caso e" error "o produce un des&ordamiento# cu'o n5mero de error es e" H. Suponemos que a(ora 'a se (a&r) dado cuenta de "a importancia de" n5mero de error 'a que este nos permitir) tratar dentro de "a rutina diferentes casos de error con "a instrucci%n Select Case. Nuestro eje&plo quedar@a1 Sub +rue&a*, On Error Fo4o 9ratar8Errores 5i& n3 As .nte$er 5i& n0 As .nte$er 5i&tota" As .nte$er n3 / Anput;o!*?Entrar e" primer va"or?# ?Entrada?, n0 / Anput;o!*?Entrar e" se$undo va"or ?# ?Entrada?, tota" / n3 M n0 6or7s(eets*?:oja0?,.Ran$e*?A3?,.<a"ue / tota"

E it Sub 9ratar8ErroresF Select Case Err.Num&er Case 31F Ms$;o! *?.e&e introducir va"ores num ricos?, Case HF Ms$;o! *?E" va"or es demasiado $rande o demasiado peque=o. ? I 8 ?E" n5mero ?de&e estar comprendido entre 410JHE ' 10JHJ?, End Select Resu&e End Sub Se estar) pre$untando si todav-a se pueden producir m)s errores. La respuesta es que por supuesto que s- # por ejemp"o# va' a a" procedimiento ' prue&e poner :oja00 en "u$ar de :oja0 en ForGS eets,33/. Recomendamos que termine siempre "a rutina de errores con un case e"se de "a forma si$uiente# Select Case Err.Num&er Case 31F Ms$;o! *?.e&e introducir va"ores num ricos?,
E@ 4 330

MACROS EN MS EXCELL

Case HF Ms$;o! *?E" va"or es demasiado $rande o demasiado peque=o. ? I 8 E" n5mero de&e estar comprendido entre 410JHE ' 10JHJ?, Case Else Ms$;o! *?Error no previsto. L"ame a" responsa&"e faci"itando "a ? I 8 ?informaci%n que si$ue ? I C(r*31, I ?N5mero de Error F ? I 8 Err.Num&er I C(r*31, I ?.escripci%n F ? I Err..escription, E it Sub * : lo 0ue sea End Select Resu&e * : lo 0ue sea Es decir# si se produce cua"quier otro error no previsto# se informa a" usuario que avise a quien proceda informando de" n5mero de error ' su descripci%n. ...No se va'an todav-a# a5n (a' m)s. La cosa se comp"ica cuando en un pro$rama se definen m5"tip"es procedimientos ' funciones# cada una de e""as puede tratar sus propios errores# pero VSu pasa si e" error se provoca de&ido a "os va"ores que pasa "a funci%n que ""ama W o VC%mo continuar "a ejecuci%n fuera de" procedimientoW# es decir en e" procedimiento que ""ama a" que (a provocado e" error. Copie "os procedimientos si$uientes mediante "os cua"es estudiaremos diferentes casos. Sub +rue&a*, On Error Fo4o 9ratar8Errores 5i& n3 As .nte$er 5i& n0 As .nte$er 5i& 9ota" As .nte$er n3 / Anput;o!*?Entrar e" primer va"or?# ?Entrada?, n0 / Anput;o!*?Entrar e" se$undo va"or ?# ?Entrada?, Call +oner8Ca"cu"o*n3# n0# 0, E it Sub 9ratar8ErroresF Select Case Err.Num&er Case 31F Ms$;o! *?.e&e introducir va"ores num ricos?, Case HF Ms$;o! *?E" va"or es demasiado $rande o demasiado peque=o. ? I 8 E" n5mero de&e estar comprendido entre 410JHE ' 10JHJ?, Case Else Ms$;o! *?Error no previsto. L"ame a" responsa&"e faci"itando "a ? I 8 ?informaci%n que si$ue ? I C(r*31, I ?N5mero de Error F ? I 8 Err.Num&er I C(r*31, I ?.escripci%n F ? I Err..escription, E it Sub * : lo 0ue sea
E2 4 330

MACROS EN MS EXCELL

End Select Resu&e * : lo 0ue sea End Sub 5i& 9ota" As .nte$er 9ota" / n3 M n0 6or7s(eets*Numero8:oja,.Ran$e*?A3?,.<a"ue / 9ota" End Sub Una vez entrados "os va"ores en e" procedimiento Prueba se ""ama a Poner_+alculo# simp"emente suma "os dos va"ores ' "os asi$na a una (oja de" "i&ro de tra&ajo *o&serve que "a (oja viene indicada por e" par)metro Numero_'oja,. O&serve que e" procedimiento Poner_+alculo no tiene rutina de tratamiento de errores# puede pensar que si se produce un error dentro de " se detendr) e" pro$rama# pero no es as-. Si se produce un error dentro de" procedimiento Poner_+alculo e" pro$rama pasa a ejecutar "a rutina de tratamiento de errores definida dentro de Prueba# esto a"$unas veces *pocas, puede ser "o que conviene# pero comprue&e e" efecto indesea&"e que ocurre aqu-. Ejecute e" pro$rama e introduzca "os va"ores si$uientes n3/02CCC ' n0/0CCCC# "os dos va"ores entran dentro de" ran$o de "os datos Ante$er# pero su suma @2CCC no# se producir) un error de des&ordamiento en "a instrucci%n 9ota" / n3 M n0 de" procedimiento Poner_+alculo ' se proceder) a ejecutar "as instrucciones de "a rutina de error definida en e" procedimiento PruebaV aqu-# despu s de mostrar e" error# se vue"ve a ejecutar "a instrucci%n Total C n-Rn9 de&ido a "a instrucci%n Resume ' e" pro$rama entra en un &uc"e infinito 'a que no es posi&"e cam&iar "os va"ores de n3 ' n0. La so"uci%n aqu- es senci""a# s%"o de&e cam&iar Resume por Resume Ne&t o Resume )ti0ueta. Otra posi&i"idad es imp"ementar una rutina de tratamiento de errores dentro de" procedimiento Poner_+alculo# o simp"emente desactivar "a rutina de tratamiento de errores antes de ""amar a" procedimiento mediante "as instrucci%n On Error Foto ;. On Error Foto C * Eesacti#ar el tratamiento de errores Call +oner8Ca"cu"o*n3# n0# 0, Esto 5"timo con""eva "a consecuencia que si se produce un error dentro de" procedimiento Poner_+alculo e" pro$rama se detendr). Muc(as veces este tipo de errores se pueden contro"ar mejor uti"izando una varia&"e $"o&a". Esta varia&"e permitir) reco$er e" error que se (a producido en "a funci%n para "ue$o tratar"o cuando "a ejecuci%n de" pro$rama vue"va a "a funci%n ""amadora. O&serve como quedar-a nuestro ejemp"o. Option E plicit 5i& $Error As .nte$er *Variable 0ue recogerD n%meros de error Sub +rue&a*, On Error Fo4o 9ratar8Errores 5i& n3 As .nte$er

EH 4 330

MACROS EN MS EXCELL

5i& n0 As .nte$er 5i& 9ota" As .nte$er n3 / Anput;o!*?Entrar e" primer va"or?# ?Entrada?, n0 / Anput;o!*?Entrar e" se$undo va"or ?# ?Entrada?, Call +oner8Ca"cu"o*n3# n0# 0, .f $Error QN C 4#en * Si al #ol#er de la funcin g)rror WO 4 NNO )rror dentro de la funcin Ms$;o! *?Error en "a Bunci%n +oner C)"cu"o.? I C(r*31, I $Error, E it Sub * : lo 0ue sea End .f E it Sub 9ratar8ErroresF Select Case Err.Num&er Case 31F Ms$;o! *?.e&e introducir va"ores num ricos?, Case HF Ms$;o! *?E" va"or es demasiado $rande o demasiado peque=o. ? I 8 E" n5mero de&e estar comprendido entre 410JHE ' 10JHJ?, Case Else Ms$;o! *?Error no previsto. L"ame a" responsa&"e faci"itando "a ? I 8 ?informaci%n que si$ue ? I C(r*31, I ?N5mero de Error F ? I 8 Err.Num&er I C(r*31, I ?.escripci%n F ? I Err..escription, E it Sub * : lo 0ue sea End Select Resu&e * : lo 0ue sea

End Sub Pri)ate Sub +oner8Ca"cu"o*n3 As .nte$er# n0 As .nte$er# Numero8:oja As .nte$er, On Error Fo4o 9ratar8Errores0 5i& 9ota" As .nte$er $Error / C 9ota" / n3 M n0 6or7s(eets*Numero8:oja,.Ran$e*?A3?,.<a"ue / 9ota" E it Sub 9ratar8Errores0F Error / Err.Num&er * Si a$ error g)rror recoge el n%mero de error End Sub
EJ 4 330

MACROS EN MS EXCELL

E" funcionamiento aqu- es &astante simp"e. Se constru'e una rutina de tratamiento de errores dentro de "a funci%n que simp"emente asi$na e" n5mero de error a "a varia&"e g)rror# cuando se devue"ve e" contro" a" procedimiento ""amador se inspecciona esta varia&"e ' si su va"or es distinto de C se de&e tratar e" error *en e" ejemp"o simp"emente se termina e" pro$rama# por supuesto e" tratamiento podr-a se diferente,. <isua" ;asic incorpora "a instrucci%n Error con "a que es posi&"e definir o $enerar errores propios. +uede que se est pre$untando para que quiere definirse errores propios# dic(o de otra forma# para que provocar errores propios. ;ueno# pues por ejemp"o# para un ma'or contro" en pro$ramas "ar$os ' comp"ejos# para va"idar datos# ' a"$unos procesos m)s. +ara provocar un error simp"emente tiene que uti"izar "a instrucci%n Error*Numero_Ee_)rror,# Numero_Ee_)rror de&e ser un va"or comprendido entre C ' H2212# es decir de&e estar dentro de" ran$o de errores definidos por <isua" ;asic# a(ora &ien# uti"ice siempre va"ores a"tos 'a que si no# corre e" ries$o de modificar un va"or 'a esta&"ecido por <isua" ;asic. Le recomendamos que empiece a partir de" va"or H2212 ' va'a &ajando# estos va"ores tan e"evados nunca ser)n uti"izados por <isua" ;asic. <ea e" si$uiente ejemp"o# es un caso en "os que puede resu"tar interesante provocar un error. Es e" ejemp"o que (emos uti"izado en "a secci%n# e" pro$rama pide tres va"ores# "ue$o ""ama a "a funci%n Poner_+alculo donde se suman n3 ' n0 ' e" resu"tado se divide por n1. O&serve que se (a definido una rutina de tratamiento de errores que se$5n e" error que se (a'a producido dentro de "a funci%n# asi$na un va"or a "a varia&"e $"o&a" g)rror *a(ora definida como tipo Lon$,. Cuando e" pro$rama vue"ve a" procedimiento Prueba se comprue&a e" va"or de g)rror# si es distinto de C# se provocar un error ErrorAg#rror?# e" pro$rama sa"ta entonces a "a rutina de tratamiento de errores definida dentro de" procedimiento donde $racias a "os va"ores de error asi$nados sa&emos que tipo de error se (a producido ' en que funci%n o procedimiento se produjo.

Option E plicit 5i& $Error As Lon$ *Variable 0ue recogerD n%meros de error Sub +rue&a*, On Error Fo4o 9ratar8Errores 5i& n3 As .nte$er 5i& n0 As .nte$er 5i& n1 As .nte$er 5i& 9ota" As .nte$er n3 / Anput;o!*?Entrar e" primer va"or?# ?Entrada?, n0 / Anput;o!*?Entrar e" se$undo va"or ?# ?Entrada?, n1 / Anput;o!*?Entrar e" 9ercer va"or ?# ?Entrada?,

Call +oner8Ca"cu"o*n3# n0# n1# 02, .f $Error QN C 4#en * Si al #ol#er de la funcin g)rror WO 4 NNO )rror dentro de la funcin
EE 4 330

MACROS EN MS EXCELL

Error *$Error, L Fenerar Error End .f E it Sub Select Case Err.Num&er Case 31F Ms$;o! *?.e&e introducir va"ores num ricos?, Case HF Ms$;o! *?E" va"or es demasiado $rande o demasiado peque=o. ? I 8 ?E" n5mero de&e estar comprendido entre 410JHE ' 10JHJ?, Case H2212F Ms$;o! *?Se produjo un error en "a funci%n +oner Ca"cu"o. ? I 8 ?N5mero demasiado $rande para un entero?, Case H221@F Ms$;o! *?Se produjo un error en "a funci%n +oner Ca"cu"o. ? I 8 ?.ivisi%n por cero?, Case H2211F Ms$;o! *?Se produjo un error en "a funci%n +oner Ca"cu"o. ? I 8 ?N5mero de :oja no e!iste?, Case Else Ms$;o! *?Error no previsto. L"ame a" responsa&"e faci"itando ? I 8 "a informaci%n que si$ue ? I C(r*31, I ?N5mero de Error F ? I 8 Err.Num&er I C(r*31, I ?.escripci%n F ? I Err..escription, E!it Su& * : lo 0ue sea End Select Resu&e Ne t * : lo 0ue sea End Sub Pri)ate Su& +oner8Ca"cu"o*n3 As .nte$er# n0 As .nte$er# n1 As .nte$er# Numero8:oja As .nte$er, On Error Fo4o 9ratar8Errores0 5i& 9ota" As .nte$er $Error / C 9ota" / n3 M n0 9ota" / 9ota" L n1 6or7s(eets*Numero8:oja,.Ran$e*?A3?,.<a"ue / 9ota" E it Sub 9ratar8Errores0F Select Case Err.Num&er * Valor demasiado grande Case HF $Error / H2212 * Ei#isin por cero Case 33F $Error / H221@

EK 4 330

MACROS EN MS EXCELL

* Subndice fuera del inter#alo ,N%mero de oja no e&iste/ Case KF $Error / H2211 * :tro )rror Case Else $Error / Err.Num&er End Select End Sub > con esto terminamos e" cap-tu"o de depuraci%n de pro$ramas ' tratamiento de errores. Uti"ice estos mecanismos siempre que sus pro$ramas va'an a ser usados por otras personas. Con "a depuraci%n podr)# adem)s de detectar errores m)s f)ci"mente# compro&ar como e" pro$rama en situaciones e!tremas *' cr anos# si "o (an de uti"izar diferentes usuarios se producir)n,. Con "as rutinas de tratamiento de errores podr) contro"ar muc(os de e""os# ' si se produce uno de imprevisto# a" menos "e ser) m)s f)ci" "oca"izar"o o sa&er "as causas que "o (an provocado. Bina"mente ' como opini%n persona"# si conoce "en$uajes como .e"p(i o Yava o a"$5n d-a tra&aja con e""os compro&ar ) que e" contro" de errores est) muc(o mejor aca&ado que con <isua" &asic. Con visua" a uno siempre "e queda "a sensaci%n de que a"$o queda sue"to# ' cosas como "os sa"tos de Resume Etiqueta dejan siempre cierta intranqui"idad. Controles de for&ulario en la #oja de clculo1 En este tema estudiaremos como insertar contro"es *&otones# cuadros de te!to# cuadros de "ista# &otones de radio# etc. , dentro de una (oja de c)"cu"o. Se$uramente es m)s (a&itua" uti"izar este tipo de contro"es dentro de formu"arios ' a trav s de e""os $estionar datos de una o varias (ojas# sin em&ar$o resu"ta conveniente muc(as veces inc"uir directamente estos contro"es dentro de una misma (oja# so&re todo cuando s%"o se requiere procesos simp"es como e"e$ir datos de una "ista o act ivar una macro desde un &ot%n# etc. No estudiaremos en profundidad estos contro"es# simp"emente uti"izaremos "as propiedades m)s (a&itua"es *concretamente "as que necesitemos,# dejaremos un estudio m)s comp"eto para e" tema de "os formu"arios. Aplicaci/n de eje&plo1 +ara ver e" funcionamiento de "os distintos contro"es# construiremos una peque=a ap"icaci%n que nos sirva para $estionar una peque=a ta&"a de re$istros# &)sicamente e!traer datos que cump"an una determinada condici%n. La ma'or-a de funciones que ap"icaremos pueden (acerse directamente desde "as uti"idades de" men5 5atos- (iltro a)anGado que ""eva incorporado e" propio E!ce" pero creemos que ser) un &uen ejemp"o para ver "as posi&i"idades de "os contro"es. A&ra su ap"icaci%n E!ce" ' active "a (oja de c)"cu"o 1ista>3&ls que de&i% &ajar junto a este documento# en "a primera (oja est) "a "ista de re$istros que uti"izaremos en "os ejemp"os que veremos a continuaci%n. En "a :oja0 se encuentrar a"$unos datos necesarios para "os contro"es.

KC 4 330

MACROS EN MS EXCELL

.ostrar la "arra de herramientas para cuadros de control. O&viamente para insertar contro"es en "a (oja de&er) tener activada "a &arra de contro"es. Active %er- +arras de ,erra&ientas- Cuadro de Controles. .e&er) activarse una &arra como "a si$uiente.

Lo primero que (aremos es a"$o mu' senci""o# simp"emente copiaremos en :oja0# "os datos correspondientes a "os re$istros de :oja3 cu'os datos correspondientes a "a co"umna Nombre coincidan con e" que tec"earemos en una cuadro de te!to que insertaremos en :oja0. Los datos se copiaran a partir de "a ce"da A3H. E" &ot%n simp"emente servir) para invocar "a macro que copiar) "os datos. nsertar el cuadro de texto. S%"o tiene que se"eccionar e" e"emento de "a &arra de contro"es ' di&ujar"o so&re "a (oja *:oja 0 en nuestro ejemp"o# procure que coja m)s o menos e" ran$o correspondiente a "as ce"das C0 ' .0. nsertar una eti<ueta. Las etiquetas sirven &)sicamente para acompa=ar "os contro"es con te!to descriptivo. Se"eccione e" &ot%n ' di&uje en "a (oja e" rect)n$u"o para insertar "a etiqueta# p%n$a"o a" "ado de" contro" cuadro de te!to.

K3 4 330

MACROS EN MS EXCELL

Los &otones se uti"izan &)sicamente para invocar "as macros que rea"izar)n "as accio nes. No es e" 5nico contro" que puede invocar macros# cua"quiera de "os contro"es puede invocar"a# pero es e" m)s (a&itua". Ca&biar las propiedades de los objetos1 A continuaci%n desp"e$aremos "a ventana de propiedades para cam&iar a"$unas de "os o&jetos aca&ados de incrustar. .e&e estar en modo dise=o# e" &ot%n de estar activado.

Ca&biar el te to del control Label1 Propiedad Caption1 3. 0. 1. @. 3. Se"eccione e" contro" Etiqueta . 0. +u"se so&re e" &ot%n de "a &arra de contro"es# se activa "a ventana de Propiedades. 1. En "a propiedad Caption# cam&ien e" te!to /abe"1 por -atos a Buscar. @. Ajuste "a posici%n ' e" tama=o de" contro".

Ca&biar el no&bre del control Cuadro de 4e to1 Propiedad Na&e1 No es necesario cam&iar e" nom&re de "os contro"es pero si mu' conveniente# ten$a en cuenta que a trav s de "os nom&res de un contro" ser) como se refiera a e""os a trav s de "as macros. Siempre es mejor ""amar a un contro" por un nom&re descriptivo que por 9e!t3 o Command3# etc. A" contro" cuadro de te!to "e pondremos e" nom&re -atos'Buscar. 3. 0. 1. 3. Se"eccione e" contro" Cuadro de 9e!to. 0. Si no tiene activada "a ventana de propiedades# act-ve"a. 1. En "a propiedad Na&e # cam&ie e" te!t3 por -atos'Buscar.

. Cam&ie "a propiedad Capti/n de" ;ot%n pro Copiar -atos ' su propiedad Na&e por Copiar'-atos *de&e poner e" $ui%n &ajo 'a que "a propiedad Na&e no permite espacios en &"anco,. Establecer la acci/n de copiar datos cuando se pulse el bot/n1 A continuaci%n crearemos "a macro que ser) invocada cuando se pu"se e" &ot%n. La macro simp"emente de&e &uscar en "a co"umna A de "a "ista de :oja3 e" nom&re que coincida con e" tec"eado en e" cuadro de te!to ' "ue$o copiar"o (acia :oja0 a partir de "a casi""a A3H. La macro contro"ar) que (a'a a"$o en e" cuadro de te!to. Se copiaran todas "as coincidencias# es decir si (a' dos nom&res Ram%n se copiar)n "os dos. Si no (a' nin$una coincidencia se mostrar) un mensaje avisando de e""o. Los e*entos. Cuando se pro$raman contro"es &ien sea directamente en "a (oja como estamos (aciendo a(ora o desde un formu"ario# de&e tener en cuenta "os eventos. Un evento en cuando ocurre a"$o so&re un o&jeto# en entornos 6indoUs constantemente se est)n produciendo eventos. C"ic7s con e" rat%n so&re un contro"# tec"ear so&re un cuadro de te!to# etc. provocan eventos que son reco$idos por e" sistema. +ro$ramar un evento si$nifica (acer que se ejecuten determinadas instrucciones cuando ocurra dic(o evento. En e" caso
K0 4 330

MACROS EN MS EXCELL

que nos ocupa a(ora# (aremos que "as acciones necesarias para copia r "os datos se ejecuten cuando se (a$a un c"ic so&re e" &ot%n Copiar'-atos. En $enera"# todos "os contro"es son capaces de capturar diferentes eventos. E" sistema de eventos es &astante m)s comp"ejo de "o que estudiaremos aqu-# nosotros simp"emente tendremos en cuenta que evento de&emos e"e$ir para "anzar "a ejecuci%n de determinado c%di$o. <eamos en "a si$uiente secci%n como asociar e" c%di$o necesario para copiar datos cuando ocurre e" evento c"ic7 *Zpu"sar e" &ot%n ' so"tar"o, so&re e" &ot%n Copiar'-atos. .e&er) estar en modo 5ise7o# ase$5rese que e" &ot%n est) pu"sado. 3. :a$a do&"e c"ic7 so&re e" &ot%n# o&serve que se activa autom)ticamente "a ventana de <isua" ;asic ' aparece un esque"eto de funci%n Sub Copiar8.atos8C"ic7*, End Sub Es "o que se ""ama procedimiento de evento# es decir# este procedimiento est) asociado a" evento C"ic7 de" ;ot%n Copiar'-atos# o&serve que e" procedimiento ""eva un nom&re compuesto por e" nom&re de" contro" ?Copiar8.atos?# un $ui%n &ajo ' e" nom&re de" evento ?C"ic7?# en $enera" todos "os procedimientos de evento se nom&ra de esta forma# No&bre5eControlCNo&bre5eE)ento O&serve "a "ista de "a parte superior derec(a# "a que tiene e" e"emento Clic". Es "a "ista de eventos# si "a desp"ie$a ver) que adem)s de" e"emento C"ic7 aparecen unos cuantos m)s 5blClic" *.o&"e C"ic7, Fotfocus *Co$er e" foco,# etc. todos e""os son eventos pro$rama&"es de" contro" &ot%n# es decir# podemos inc"uir c%di$o que se ejecutar) cuando ocurren dic(os eventos. +or otra parte# todos "os contro"es tienen un evento 8por defecto8# dic(o de otra forma# cuando se pro$rama un evento de" contro" casi siempre ser) ese. En e" caso de nuestro &ot%n *' de todos "os &otones,# e" evento por defecto es Clic"# o&serve que "o (a&itua" es que queramos que e" c%di$o se ejecute cuando se (ace c"ic7 so&re e" &ot%n# no cuando este co$e e" foco o cuando e" puntero de rat%n pasa so&re "# etc. E" evento por defecto de un contro" es e" que aparece cuando# en modo dise=o# se (ace do&"e c"ic so&re "# o&viamente este se puede cam&iar# por e" que m)s nos conven$a. 0. 9ec"ear e" c%di$o para ""evar a ca&o "as acciones. Recuerde que "o que se desea (acer es copiar (acia (oja0 todos "os nom&res que coincidan con e" que est) en e" cuadro de te!to. E" c%di$o ser) e" que si$ue# o&serve "os comentarios. Option E plicit * Numero de columnas,campos/ de las 0ue consta cada registro Const Num8Co"umnas / H Pri)ate Sub Copiar8.atos8C"ic7*, 5i&r3 As Ran$e # r0 As Ran$e 5i& encontrado As +oolean
K1 4 330

MACROS EN MS EXCELL

* Si el cuadro de te&to estD #aco5 no se busca nada .f Len*.atos8;uscar.<a"ue, / C 4#en Ms$;o! *?No (a' datos que &uscar?, Else * Borrar los datos actuales Call &orrar8datos * "cti#ar +asilla "-= de 'oja9 $ referenciarla con r95 )s la casilla donde se copiarDn *los datos en caso 0ue se encuentren 6or7s(eets*0,.Ran$e*?A3H?,.Activate Set r0 / ActiveCe"" * "cti#ar casilla "9 de 'oja- $ referenciarla con r6or7s(eets*3,.Activate 6or7s(eets*3,.Ran$e*?A0?,.Act ivate * Recorrer todo el rango de datos de 'ojaencontrado / Ba"se 5o !#ile Not AsEmpt'*ActiveCe"", * Si la casilla acti#a C Eatos_Buscados .f ActiveCe"".<a"ue / .atos8;uscar.9e!t 4#en encontrado / 9rue * Referenciar con r- la celda donde estDn os datos Set r3 / ActiveCe"" * +opiar los datos Ca"" Copiar8.atos8:ojas*r3# r0, * Referenciar con r9 la casilla donde se copiaran los pr&imos datos Set r0 / r0.Offset*3# C, End .f ActiveCe"".Offset*3# C,.Activate Loop 6or7s(eets*0,.Activate .f encontrado 4#en Ms$;o! *?.atos Copiados?, Else Ms$;o! *?Nin$una coincidencia?, End .f End .f End Sub * Procedimiento para borrar los datos de 'oja9 se llama antes de proceder a la nue#a copia Pri)ate Sub &orrar8datos*,
K@ 4 330

MACROS EN MS EXCELL

5i& i As .nte$er 6or7s(eets*0,.Ran$e*?A3H?,.Activate 5o !#ile Not AsEmpt'*ActiveCe"", (or i / C 4o Num8Co"umnas 4 3 ActiveCe"".Offset*C# i,.<a"ue / ?? Ne t i ActiveCe"".Offset*3# C,.Activate Loop End Sub * Procedimiento para copiar los datos de 'oja- a 'oja. * ParDmetros3 * r- C +elda :rigen * r9 C +elda Eestino Pri)ate Sub Copiar8.atos8:ojas*r3 As Ran$e # r0 As Ran$e , 5i& i As .nte$er 5i& .atos As %ariant * Recorrer las columnas del registro $ copiar celda a celda (or i / C 4o Num8Co"umnas 4 3 .atos / r3.Offset*C# i,.<a"ue r0.Offset*C# i,.<a"ue / .atos Ne t i End Sub Cuadros Co&binados ACo&bo+o ?

Con "o (ec(o (asta a(ora podemos e!traer de "a ta&"a "os re$istros cu'o nom&re coincida con e" tec"eado en e" cuadro de te!to. A continuaci%n (aremos que se pueda esco$er e" campo# es decir# podremos e!traer coincidencias de" Nombre# "os "pellidos# "a +iudad# etc. +ara e""o inc"uiremos un cuadro com&inado que permita esco$er en que campo o co"umna tiene que &uscarse "a coincidencia. La "ista# por supuesto# mostrar) "os nom&res de "as co"umnas. Anc"u'a un cuadro com&inado en :oja0 ' p%n$a"e por nom&re *propiedad Na&e ,. /ista'Campos Propiedad ListFillRange. Con esta propiedad de&eremos definir "os e"ementos que de&e mostrar "a "ista# de&e especificarse e" ran$o que contiene "os e"ementos a mostrar# e" ran$o de&e ser una co"umna *o dos # o tres# etc.,. En nuestro caso e" ran$o ser) Y3FYH de :oja0 *O&serve que en este ran$o est)n especificados "os nom&res de "as co"umnas,.
K2 4 330

MACROS EN MS EXCELL

Propiedad Lin=ed#ell. En esta propiedad de&e especificar en que ce"da de&e copiarse e" e"emento se"eccionado de "a "ista. En esta "ista no uti"izaremos esta propiedad. +uidado con esta propiedad5 tenga en cuenta 0ue los elementos de la lista son tratados como datos de tipo *tring aun0ue contenga n%meros o fec as5 por lo 0ue en estos casos5 a #eces serD necesario aplicar funciones de con#ersin de datos antes 0ue el dato se copie en la oja3 Por ejemplo5 si alguna #e! constru$e una lista con n%meros #erD 0ue el dato seleccionado se alinea a la derec a5 si son fec as5 no se muestra con el formato correspondiente3 Propiedad List ndex. Mediante esta propiedad podremos sa&er que e"emento de "a "ista es e" se"eccionado por su n5mero de orden. Es decir# si est) se"eccionado e" primero# ListAnde! va"dr) C# si est) se"eccionado e" se$undo va"dr) 3# etc. Si no (a' nin$5n e"emento se"eccionado va"dr) 43. 9en$a en cuenta que esta propiedad s%"o est) disponi&"e en tiempo de ejecuci%n# es decir "a podremos "eer mientras est funcionando e" pro$rama# no se puede esta&"ecer en modo dise=o# o&serve que no aparece en "a ventana propiedades de" cuadro com&inado. ;ien# 'a sa&emos como funcionan "as propiedades que uti"izaremos para (acer que se e!trai$an de "a ta&"a "os e"ementos que coincidan con e" va"or de" cuadro de te!to ' cu'a co"umna o campo sea e" se"eccionado de "a "ista# veamos como quedar) "a macro. En primer "u$ar cree un procedimiento ""amado Proceder donde de&er) copiar todo e" c%di$o que a(ora est) en Copiar'-atos. .e&emos (acer esto porque antes de proceder se de&en (acer ciertas compro&aciones que 'a iremos viendo conforme avanzamos# por e" momento "a compro&aci%n a (acer es "a de ver so&re que campo o co"umna se de&en &uscar "as coincidencias con "os datos tec"eados en e" cuadro de te!to. La funci%n Copiar'-atos quedar) de "a forma si$uiente. 5i& i As .nte$er * Recoger el elemento seleccionado de la lista i / Lista8Campos.ListAnde! * Si i W 4 es 0ue no a$ ning%n elemento seleccionado3 .f i Q C 4#en Ms$;o! *?.e&e Se"eccionar un campo de "a "ista?, Else * 1lamar a proceder para iniciar la copia3 Call +roceder*i, End .f End Sub La ca&ecera de "a funci%n proceder quedar) de "a forma si$uiente. * Procedimiento Proceder * 2nicia la copia de los datos coincidentes * ParDmetros( * +olumna C )lementos
KH 4 330

MACROS EN MS EXCELL

seleccionado de la lista 0ue coincidirD con la columna sobre la 0ue se * debe buscar Pri)ate Sub +roceder*Co"umna As Ante$er, ..... A(ora# dentro de" procedimiento +roceder cam&ie "a "-nea .f ActiveCe"".<a"ue / .atos8;uscar.9e!t 4#en +or .f ActiveCe"".Offset*C# Co"umna,.<a"ue / .atos8;uscar.9e!t 4#en E plicaci/n del proceso. Cuando se se"ecciona un e"emento de "a "ista# su propiedad /ist!nde+ es i$ua" a" orden que ocupa dic(o e"emento en "a "ista# supon$amos que esco$emos +iudad# /ist!nde+ va"dr) 0. Este va"or se pasa a Proceder ' es reco$ido por e" par)metro Co"umna. A(ora o&serve "a "-nea .f ActiveCe"".Offset*C# Co"umna,.<a"ue / .atos8;uscar.9e!t 4#en Es decir "a coincidencia con e" va"or de" cuadro de te!to -atos'Buscar se &usca respecto a "a casi""a que est) a "a derec(a * offset , de "a activa# tantas co"umnas como "as e!presadas por e" va"or de "a varia&"e Co"umna . O&serve que en este caso "a casi""a activa siempre corresponde a una de "a co"umna A# si "a varia&"e Co"umna va"e 0 "a coincidencia se &uscar) respecto a" va"or de "a co"umna C *0 m)s (acia "a derec(a, ' que coincide con "a co"umna correspondiente a "a Ciudad. A(ora crearemos una "ista donde sea posi&"e esco$er "a re"aci%n de comparaci%n. :asta a(ora "a e!tracci%n se rea"iza&a con aque""os e"ementos i$ua"es a" va"or entrado en e" cuadro de te!to -atos'Buscar# esta se$unda "ista permitir) esco$er si "os e"ementos a e!traer de&en ser 2guales5 Menores5 Ma$ores5 Menores 2guales o Ma$ores 2guales que e" va"or de -atos'Buscar. +ara e""o de&e construir una se$unda "ista con "as propiedades si$uientes. Na&e / Lista8Comparaci%n. List(illRan$e / L3FL2 O&serve que en este ran$o est)n "os va"ores correspondientes a "a operaci%n re"aciona" que se desea rea"izar *A$ua"# Menor# etc., O&viamente de&eremos modificar "as funciones para rea"izar "as operaciones con respecto a" e"emento se"eccionado en e" cuadro de "ista /ista'Comparacin. .ejaremos e" procedimiento Proceder de "a forma si$uiente ' crearemos una funci%n que (a$a "as comparaciones# esta funci%n a "a que (emos ""amado Comparar devue"va e" va"or 9rue si e" resu"tado de "a comparaci%n es Cierto ' Ba"se si es fa"so. * Procedimiento Proceder * 2nicia la copia de los datos coincidentes * ParDmetros( * +olumna C )lementos seleccionado de la lista 0ue coincidirD con la columna sobre la 0ue se debe * buscar Pri)ate Sub +roceder*Co"umna As Ante$er, 5i&r3 As Ran$e # r0 As Ran$e 5i& encontrado As +oolean 5i& <a"or8Comparacion As +oolean * Si el cuadro de te&to estD #aco5 no se busca nada .f Len*.atos8;uscar.<a"ue, / C 4#en
KJ 4 330

MACROS EN MS EXCELL

Ms$;o! *?No (a' datos que &uscar?, Else * Borrar los datos actuales Call &orrar8datos * "cti#ar +asilla "-= de 'oja9 $ referenciarla con r9* )s la casilla donde se copiarDn * los datos en caso 0ue* se encuentren 6or7s(eets*0,.Ran$e*?A3H?,.Activate Set r0 / ActiveCe"" * "cti#ar casilla "9 de 'oja- $ referenciarla con r6or7s(eets*3,.Activate 6or7s(eets*3,.Ran$e*?A0?,.Activate encontrado / (alse T Recorrer todo e" ran$o de datos de :oja3 5o !#ile Not AsEmpt'*ActiveCe"",

<a"or8Comparacion / Comparar*ActiveCe"".Offset*C# Co"umna,.<a"ue# 8 .atos8;uscar.<a"ue# Lista8Comparacion.ListAnde!, .f <a"or8Comparacion / 9rue 4#en encontrado / 9rue * Referenciar con r- la celda donde estDn os datos Set r3 / ActiveCe"" * +opiar los datos Call Copiar8.atos8:ojas*r3# r0, * Referenciar con r9 la casilla donde se copiaran los pr&imos datos Set r0 / r0.Offset*3# C, End .f ActiveCe"".Offset*3# C,.Activate Loop 6or7s(eets*0,.Activate .f encontrado 4#en Ms$;o! *?.atos Copiados?, Else Ms$;o! *?Nin$una coincidencia?, End .f End .f End Sub * @uncin 0ue compara dos #alores con un operador relacional C5 O5 W5 etc3
KE 4 330

MACROS EN MS EXCELL

* 1a funcin de#uel#e True o @alse en funcin de la comparacin3 * ParDmetros3 * Valor- $ Valor9 C Valores 0ue se comparan * Signo C #ariable 0ue sir#e para escoger el operador relacional * en funcin de su #alor5 #er estructura Select +ase Pri)ate (unction Comparar*<a"or3 As %ariant# <a"or0 As %ariant# Operador As .nte$er, As +oolean 5i&q As +oolean Select Case Operador Case CF q / <a"or3 / <a"or0 Case 3F q / <a"or3 N <a"or0 Case 0F q / <a"or3 Q <a"or0 Case 1F q / <a"or3 N/ <a"or0 Case @F q / <a"or3 Q/ <a"or0 End Select Comparar / q End (unction O&serve "a "-nea que ""ama a "a funci%n Comparar# <a"or8Comparacion / Comparar*ActiveCe"".Offset*C# Co"umna,.<a"ue# 8 .atos8;uscar.<a"ue# Lista8Comparacion.ListAnde!, 2cti eCe"".O$$set34,Co"umna5 ser)n "os va"ores que se comparar)n con e" va"or de" cuadro de te!to. -atos'Buscar. a"ue es e" va"or de" cuadro de te!to. /ista'Comparacin./ist!nde+ devue"ve e" -ndice de" e"emento se"eccionado de "a "ista# o&serve como se uti"iza este va"or en "a estructura Select Case de Comparar para determinar que operador uti"izar. +rue&e "o si$uiente. En e" cuadro de te!to escri&a Madrid * o simp"emente M,. Se"eccione de "a "ista de Campos +iudad. Se"eccione de "a "ista de operadores Ma$or. +u"se so&re e" &ot%n ' o&serve que se copian todos "os re$istros cu'o campo Ciudad sea superior a Madrid *o a "a M,. :asta aqu- todo correcto.
KK 4 330

MACROS EN MS EXCELL

A(ora prue&e "o si$uiente. En e" cuadro de te!to escri&a 3CCCCC Se"eccione de "a "ista de Campos +antidad. Se"eccione de "a "ista de operadores Ma$or. +u"se so&re e" &ot%n ' o&serve que no se copia nada a pesar que en cantidad (a' re$istros con e" va"or superior a 3CCCCC. Recuerde que "os va"ores de un cuadro de te!to son siempre datos tipo Strin$# entonces en este caso estar)n compar)ndose va"ores Strin$ *"os de" cuadro de te!to, con va"ores num ricos# *"os reco$idos de "a co"umna +antidad,. 9en$a en cuenta siempre esta circunstancia cuando tra&aje con e"ementos de formu"ario. <ea "a secci%n si$uiente donde se so"ucionar) este pro&"ema ' de paso se ver) como construir Lista con m)s de una co"umna. Listas con &s de una colu&na1 +ara so"ucionar e" pro&"ema de" apartado anterior uti"izaremos una se$unda co"umna cu'os e"ementos indicar)n e" tipo de datos de" campo. O&serve e" ran$o R3FRH de :oja0# "as "etras si$nifican "o si$uiente T campo tipo te&to o string5 N campo Num;rico5 @ campo fec a. +ara inc"uir esta se$unda co"umna en "a "ista de&er) cam&iar "as propiedades si$uientes. List(illRan$e # Y3FRH Colu&nCount # 0 *Andicamos e" n5mero de co"umnas de "a "ista. Adem)s especificaremos e" anc(o de cada co"umna mediante "a propiedad# Colu&n!idt#s# @ptGCpt .e&e separar e" anc(o de cada co"umna mediante un punto ' coma. O&serve que "a se$unda co"umna no se mostrar) de&ido a que (emos especificado e" anc(o a C. Colu&n+ound# 3 si$nifica que e" dato que reco$er) "a propiedad <a"ue corresponde a" e"emento se"eccionado de "a primera co"umna. Si desea reco$er datos "e "a se$unda co"umna de&er) uti"izar "a propiedad Colu&n*Numero de +olumna# 2ndice del elemento seleccionado, Las co"umnas empiezan a numerarse a partir de "a C. La funci%n Comparar ' su correspondiente ""amada quedar)n de "a forma si$uiente. O&serve que se (an inc"uido varia&"es que reco$en "os va"ores de /ista'Comparacin ' /ista'Campos# simp"emente "o (emos (ec(o para que quede m)s c"aro. ............ 5o !#ile Not AsEmpt'*ActiveCe"",

3CC 4 330

MACROS EN MS EXCELL

* Recoger el Signo de comparacin Si$no / Lista8Comparacion.ListAnde! * Recoger el tipo de datos 9ipo8.atos / Lista8Campos.Co"umn*3# Co"umna, <a"or8Comparacion / Comparar*ActiveCe"".Offset*C# Co"umna,.<a"ue# 8 .atos8;uscar.<a"ue# Si$no# 9ipo8.atos, La funci/n Co&parar1 Pri)ate (unction Comparar*<a"or3 As %ariant# <a"or0 As %ariant# Operador As .nte$er# 9ipo As Strin$, As +oolean 5i&q As +oolean * +on#ersin del tipo de datos de las #ariables Select Case 9ipo Case ?N?F T Convertir a n5mero <a"or0 / <a"*<a"or0, Case ?B?F T Convertir a Bec(a <a"or0 / C.ate*<a"or0, End Select

Select Case Operador Case CF q / <a"or3 / <a"or0 Case 3F q / <a"or3 N <a"or0 Case 0F q / <a"or3 Q <a"or0 Case 1F q / <a"or3 N/ <a"or0 Case @F q / <a"or3 Q/ <a"or0 End Select Comparar / q End (unction Control Nu&rico

Anserte un contro" de n5mero ' p%n$a"e por nom&re *propiedad Na&e , 6umero. Esta&"ezca su propiedad Orientation a $mOrientatiom.ertica" para que se a"inee vertica"mente.
3C3 4 330

MACROS EN MS EXCELL

Este contro" se uti"iza norma"mente para aumentar ' disminuir va"ores num ricos de un cuadro de te!to# aunque por supuesto puede uti"izarse para otras funciones. Uti"izaremos un contro" de este tipo para aumentar "os va"ores de" Cuadro de 9e!to -atos'Buscar pero s%"o si e" campo se"eccionado de /ista'Campos es de tipo num rico. +ara e""o activaremos este contro" 5nicamente cuando e" campo se"eccionado sea de este tipo. +ara activar o desactivar un contro" se uti"iza "a propiedad Enabled# si est) a true e" contro" estar) activado ' sino estar) desactivado. O&serve que "a acci%n de activar o desactivar e" contro" de n5mero de&eremos (acer"o cuando se se"eccione un e"emento de /ista'Campos. Es decir e" c%di$o de&eremos insertar"o en e" evento C#an$e *cam&io, de /ista'Campos. :a$a do&"e c"ic so&re e" e"emento /ista'Campos para desp"e$ar su procedimiento de evento. E" c%di$o para contro"ar "a activaci%n de" contro" es e" que si$ue# Pri)ate Sub Lista8Campos8C(an$e*, 5i& i As .nte$er 5i& 9ipo8.atos As Strin$ i / Lista8Campos.ListAnde! .f i N/ C 4#en 9ipo8.atos / Lista8Campos.Co"umn*3# i, .f 9ipo8.atos / ?N? 4#en Numero.Ena&"ed / 9rue Else Numero.Ena&"ed / Ba"se End .f End .f End Sub )sta"lecer los *alores del control de n>mero. +ara esta&"ecer "os va"ores que puede devo"ver un contro" de n5mero se de&en modificar "as propiedades si$uientes. Ma # esta&"ece e" va"or m)!imo que puede tener e" contro". Min# esta&"ece e" va"or m-nimo que puede tener e" contro". S&allc#an$e# esta&"ece e" incremento o decremento para "a propiedad va"ue cada vez que se pu"se so&re a"$uno de "os dos &otones. Estos va"ores se pueden esta&"ecer en tiempo de dise=o# pero "o que (aremos a continuaci%n ser) esta&"ecer"os en tiempo de ejecuci%n dependiendo de" campo que s e se"eccione en /ista'Campos. Esta&"eceremos "os va"ores si$uientes. +ara campo #dad. Ma / KK Min / 3E
3C0 4 330

MACROS EN MS EXCELL

S&allC#an$e / 3 Ma / 2CC.CCC Min / 3C.CCC S&alC#an$e / 3.CCC

.e&eremos modificar e" c%di$o de" procedimiento de evento /ista'Campos'Change de "a forma si$uiente. Pri)ate Sub Lista8Campos8C(an$e*, 5i& i As .nte$er 5i& 9ipo8.atos As Strin$ i / Lista8Campos.ListAnde! .f i N/ C 4#en 9ipo8.atos / Lista8Campos.Co"umn*3# i, .f 9ipo8.atos / ?N? 4#en Numero.Ena&"ed / 9rue .f Lista8Campos.<a"ue / ?Edad? 4#en Numero.Min / 3E Numero.Ma! / KK Numero.Sma""C(an$e / 3 .atos8;uscar.<a"ue / C Numero.<a"ue/C End .f .f Lista8Campos.<a"ue / ?Cantidad? 4#en Numero.Min / 3CCCC Numero.Ma! / 2CCCCC Numero.Sma""C(an$e / 3CCC .atos8;uscar .<a"ue/ C Numero.<a"ue/C End .f Else Numero.Ena&"ed / Ba"se End .f End .f End Sub > para terminar 'a s%"o de&emos codificar e" evento C#an$e de" contro" de n5mero para que e" Cuadro de te!to va'a incrementando o decrementando su va"or cada vez que se (a$a c"ic so&re e" contro". Pri)ate Sub Numero8C(an$e*, .atos8;uscar.<a"ue / Numero.<a"ue End Sub +ero adem)s de&emos (acer que cuando se cam&ie e" va"or de" cuadro de te!to tam&i n se cam&ie e" de"
3C1 4 330

MACROS EN MS EXCELL

contro" de n5mero de forma que cuando se pu"se so&re "# incremente o decremente a partir de" va"or que (a' en e" cuadro de te!to. Si no se (ace as-# e" incremento o decremento se (ar) en funci%n de" va"or que ten$a e" contro" de n5mero no e" que est) en e" cuadro de te!to. Modificaremos e" evento C#an$e de" cuadro de te!to. O&serve que se contro"a que s%"o se ejecute "a acci%n si e" contro" de n5mero est) activado# adem)s se de&e contro"ar tam&i n e" va"or m)!imo ' m-nimo que puede contener e" cuadro de te!to# si no se (iciera as- se $enerar-a un error a" poner un va"or ma'or o menor que "os definidos en "as propiedades Ma! ' Min de" contro" de n5mero. Pri)ate Sub .atos8;uscar8C(an$e*, * Si el numero de control estD acti#ado .f Numero.Ena&"ed 4#en * No permite coger #alores superiores a la propiedad Ma& .f <a"*.atos8;uscar.<a"ue, N Numero.Ma! 4#en Ms$;o! *?<a"or demasiado $rande?, .atos8;uscar.<a"ue / Numero.Ma! Else * No permite coger #alores inferiores a la propiedad Min .f <a"*.atos8;uscar.<a"ue, Q Numero.Min 4#en Ms$;o! *?<a"or demasiado peque=o?, .atos8;uscar.<a"ue / Numero.Min Else Numero.<a"ue / <a"*.atos8;uscar.<a"ue, End .f End .f End .f End Sub Antes de proceder con e" si$uiente contro" d jenos remarcar que "a pro$ramaci%n de contro"es imp"ica que muc(as veces unos dependan de otros por "o que de&e ser e!tremadamente cuidadoso en "a e"a&oraci%n de" c%di$o de "os eventos. O&serve "as 5"timas operaciones que (emos rea"izado de&ido a "a interdependencia de dos contro"es . Casillas de )erificaci/n AC#ec"+o ?

Estos con tro"es se sue"en uti"izar para activar o desactivar "a ejecuci%n de determinadas acciones. Casi siempre imp"ican una estructura condiciona" a "a (ora de (acer a"$una cosa# Si "as casi""a est) activada Entonces Acciones .... (in Si A continuaci%n uti"izaremos una casi""a de verificaci%n que si est) activada provocar) que "os datos tipo te!to se conviertan a ma'5scu"a antes de copiarse# se uti"izar) "a funci%n 2case. Simp"emente se de&er) compro&ar que "a casi""a est activada ' si "o est) proceder a "a conversi%n *s%"o si e" dato es tipo te!to,.
3C@ 4 330

MACROS EN MS EXCELL

Anserte un contro" casi""a de verificaci%n. Esta&"ezca "as si$uientes propiedades. Na&e # Ma'uscu"as. Capti/n# Ma'5scu"as. +ara compro&ar si "a casi""a est) activada o no simp"emente de&e mirarse su propiedad %alue. Si va"e true es que est) activada# sino va"dr) Ba"se. <ea como quedar) e" procedimiento Copiar'-atos'7ojas# o&serve que adem)s de compro&ar que "a casi""a est activada se uti"iza "a funci%n 4*peNa&e para compro&ar si "os datos que se van a copiar son de" tipo Strin$# si no "o fueran# "a funci%n 2case provocar-a un error. 4*peNa&e*)&presin , devue"ve una cadena que indica e" tipo de datos de "a e!presi%n. Pri)ate Sub Copiar8.atos8:ojas*r3 As Ran$e # r0 As Ran$e , 5i& i As .nte$er 5i& .atos As %ariant * recorrer las columnas del registro $ copiar celda a celda (or i / C 4o Num8Co"umnas 4 3 * Si la casilla Ma$%sculas estD acti#ada $ el tipo de datos es String .f Ma'uscu"as.<a"ue / 9rue And 9'peName*r3.Offset*C# i,.<a"ue, / ?Strin$? 4#en .atos / UCase*r3.Offset*C# i,.<a"ue, Else .atos / r3.Offset*C# i,.<a"ue End .f r0.Offset*C# i,.<a"ue / .atos Ne t i

End Sub +otones de Opci/n AOption +utton?

Los &otones de opci%n se uti"izan para e"e$ir una 5nica opci%n entre una serie de e""as# es decir# de un $rupo de opciones s%"o permitir)n que se escoja una. .e "a misma forma que "as casi""as de verificaci%n# casi siempre imp"ican una estructura condiciona" para compro&ar cua" de e""as est) activada. E" &ot%n activado tendr) su propiedad %alue i$ua" a true. Como ejemp"o de su uti"izaci%n crearemos dos &otones de opci%n que sirvan para que a "a (ora de copiar datos (acia "a (oja# se copie s%"o "os va"ores de Nombre ' "pellidos o todos como (asta a(ora. Anc"u'a dos &otones de opci%n ' esta&"ezca "as si$uientes propiedades.
3C2 4 330

MACROS EN MS EXCELL

;ot%n3. Na&e # 9odo. Caption# 9odo. ;ot%n0. Na&e # So"o8Nom&re. Caption# Nom&re ' Ape""idos. Si est) activado e" primer &ot%n de&er)n copiarse todos "os datos mientras que si est) activado e" se$undo so"o se copiar)n e" Nombre ' "os "pellidos. E" procedimiento Copiar'-atos'7ojas quedar) de "a forma si$uiente. 5i& i As .nte$er 5i& .atos As %ariant 5i&Bina" As .nte$er * Si Botn Todo "cti#ado5 se copian todas las columnas .f 9odo.<a"ue / 9rue 4#en Bina" / Num8Co"umnas 4 3 Else * Slo se copian las dos primera columnas Bina" / 3 End .f * recorrer las columnas del registro $ copiar celda a celda (or i / C 9o (inal * Si la casilla Ma$%sculas estD acti#ada $ el tipo de datos es String .f Ma'uscu"as.<a"ue / 9rue And 9'peName*r3.Offset*C# i,.<a"ue, / ?Strin$? 4#en .atos / UCase*r3.Offset*C# i,.<a"ue, Else .atos / r3.Offset*C# i,.<a"ue End .f r0.Offset*C# i,.<a"ue / .atos Ne t i End Sub > aqu- terminamos e" estudio de c%mo se pueden uti"izar "os contro"es de formu"ario dentro de una (oja de c)"cu"o. Recordar"e para terminar que de&e ser e!tremadamente cuidadoso con e" c%di$o que uti"ice en "os procedimientos de evento so&re todo si "os contro"es se interre"acionan entre e""os. E" si$uiente Listado inc"u'e todo e" c%di$o que se (a uti"izado. +uede pro&ar su funcionamiento car$ando e" arc(ivo Lista>C<1 ls que de&i% descar$arse junto a este tema. * Numero de columnas,campos/ de las 0ue consta cada registro
3CH 4 330

MACROS EN MS EXCELL

Const Num8Co"umnas / H Pri)ate Sub Copiar8.atos8C"ic7*, 5i& i As .nte$er 5i&! As .nte$er * Recoger el elemento seleccionado de la lista i / Lista8Campos.ListAnde! * Si i W 4 no estD seleccionado ning%n elemento .f i Q C 4#en Ms$;o! *?.e&e Se"eccionar un campo de "a "ista?, Else ! / Lista8Comparacion.ListAnde! .f ! Q C 4#en Ms$;o! *?.e&e Se"eccionar uno operador de Comparaci%n?, Else * llamar a proceder Call +roceder*i, End .f End .f End Sub * Procedimiento Proceder * 2nicia la copia de los datos coincidentes * ParDmetros( * +olumna C )lementos seleccionado de la lista 0ue coincidirD * con la columna sobre la 0ue se debe buscar Pri)ate Sub +roceder*Co"umna As Ante$er, 5i&r3 As Ran$e # r0 As Ran$e 5i& encontrado As +oolean 5i& <a"or8Comparacion As +oolean 5i&Si$no As .nte$er 5i& 9ipo8.atos As Strin$ * Si el cuadro de te&to estD #aco5 no se busca nada .f Len*.atos8;uscar.<a"ue, / C 4#en Ms$;o! *?No (a' datos que &uscar?, Else * Borrar los datos actuales Call &orrar8datos * "cti#ar +asilla "-= de 'oja9 $ referenciarla con r9 * )s la casilla donde se copiarDn los datos en caso 0ue se encuentren 6or7s(eets*0,.Ran$e*?A3H?,.Activate Set r0 / ActiveCe"" * "cti#ar casilla "9 de 'oja- $ referenciarla con r3CJ 4 330

MACROS EN MS EXCELL

6or7s(eets*3,.Activate 6or7s(eets*3,.Ran$e*?A0?,.Activate * Recorrer todo el rango de datos de 'ojaencontrado / Ba"se .o 6(i"e Not AsEmpt'*ActiveCe"", * Recoger el Signo de comparacin Si$no / Lista8Comparacion.ListAnde! * recoger el tipo de datos 9ipo8.atos / Lista8Campos.Co"umn*3# Co"umna, <a"or8Comparacion / Comparar*ActiveCe"".Offset*C# Co"umna,.<a"ue# 8 .atos8;uscar.<a"ue# Si$no# 9ipo8.atos, .f <a"or8Comparacion / 9rue 4#en encontrado / 9rue * Referenciar con r- la celda donde estDn os datos Set r3 / ActiveCe"" * +opiar los datos Call Copiar8.atos8:ojas*r3# r0, * Referenciar con r9 la casilla donde se copiaran los pr&imos datos Set r0 / r0.Offset*3# C, End .f ActiveCe"".Offset*3# C,.Activate Loop 6or7s(eets*0,.Activate .f encontrado 4#en Ms$;o! *?.atos Copiados?, Else Ms$;o! *?Nin$una coincidencia?, End .f End .f End Sub * @uncin 0ue compara dos #alores con un operador relacional C5 O5 W5 etc3 * 1a funcin de#uel#e True o @alse en funcin de la comparacin3 * ParDmetros3 * Valor- $ Valor9 C Valores 0ue se comparan * Signo C #ariable 0ue sir#e para escoger el operador relacional * en funcin de su #alor5 #er estructura Select +ase Pri)ate (unction Comparar*<a"or3 As %ariant# <a"or0 As %ariant# Operador As .nte$er# 9ipo As Strin$, As +oolean 5i&q As +oolean Select Case 9ipo Case ?N?F T Convertir a n5mero <a"or0 / <a"*<a"or0,
3CE 4 330

MACROS EN MS EXCELL

Case ?B?F T Convertir a Bec(a <a"or0 / C.ate*<a"or0, End Select

Select Case Operador Case CF q / <a"or3 / <a"or0 Case 3F q / <a"or3 N <a"or0 Case 0F q / <a"or3 Q <a"or0 Case 1F q / <a"or3 N/ <a"or0 Case @F q / <a"or3 Q/ <a"or0 End Select Comparar / q End (unction

* Procedimiento para borrar los datos de 'oja9 se llama antes de proceder a la nue#a copia Pri)ate Sub &orrar8datos*, 5i& i As .nte$er 6or7s(eets*0,.Ran$e*?A3H?,.Activate 5o !#ile Not AsEmpt'*ActiveCe"", (or i / C 4o Num8Co"umnas 4 3 ActiveCe"".Offset*C# i,.<a"ue / ?? Ne t i ActiveCe"".Offset*3# C,.Activate

Loop End Sub * Procedimiento para copiar los datos de 'oja- a 'oja. * ParDmetros3 * r- C +elda :rigen * r9 C +elda Eestino Pri)ate Sub Copiar8.atos8:ojas*r3 As Ran$e # r0 As Ran$e , 5i& i As .nte$er 5i& .atos As %ariant
3CK 4 330

MACROS EN MS EXCELL

5i&Bina" As .nte$er * Si Botn Todo "cti#ado5 se copian todas las columnas .f 9odo.<a"ue / 9rue 4#en Bina" / Num8Co"umnas 4 3 Else * Slo se copian las dos primera columnas Bina" / 3 End .f * recorrer las columnas del registro $ copiar celda a celda (or i / C 9o (inal * Si la casilla Ma$%sculas estD acti#ada $ el tipo de datos es String .f Ma'uscu"as.<a"ue / 9rue And 9'peName*r3.Offset*C# i,.<a"ue, / ?Strin$? 4#en .atos / UCase*r3.Offset*C# i,.<a"ue, Else .atos / r3.Offset*C# i,.<a"ue End .f r0.Offset*C# i,.<a"ue / .atos Ne t i End Sub * Si el numero de control estD acti#ado .f Numero.Ena&"ed 4#en * No permite coger #alores superiores a la propiedad Ma& .f <a"*.atos8;uscar.<a"ue, N Numero.Ma! 4#en Ms$;o! *?<a"or demasiado $rande?, .atos8;uscar.<a"ue / Numero.Ma! Else * No permite coger #alores inferiores a la propiedad Min .f <a"*.atos8;uscar.<a"ue, Q Numero.Min 4#en Ms$;o! *?<a"or demasiado peque=o?, .atos8;uscar.<a"ue / Numero.Min Else Numero.<a"ue / <a"*.atos8;uscar.<a"ue, End .f End .f End .f End Sub

Pri)ate Sub Lista8Campos8C(an$e*, 5i& i As .nte$er 5i& 9ipo8.atos As Strin$ i / Lista8Campos.ListAnde!


33C 4 330

MACROS EN MS EXCELL

.f i N/ C 4#en 9ipo8.atos / Lista8Campos.Co"umn*3# i, .f 9ipo8.atos / ?N? 4#en Numero.Ena&"ed / 9rue .f Lista8Campos.<a"ue / ?Edad? 4#en Numero.Min / 3E Numero.Ma! / KK Numero.Sma""C(an$e / 3 .atos8;uscar.<a"ue / C Numero.<a"ue/C End .f .f Lista8Campos.<a"ue / ?Cantidad? 4#en Numero.Min / 3CCCC Numero.Ma! / 2CCCCC Numero.Sma""C(an$e / 3CCC .atos8;uscar .<a"ue/ C Numero.<a"ue/C End .f Else Numero.Ena&"ed / Ba"se End .f End .f Pri)ate Sub Numero8C(an$e*, .atos8;uscar.<a"ue / Numero.<a"ue End Sub

333 4 330

Вам также может понравиться