! Macros Con MS EXCEL

download ! Macros Con MS EXCEL

of 36

Transcript of ! Macros Con MS EXCEL

  • 8/20/2019 ! Macros Con MS EXCEL

    1/93

     MACROS EN MS EXCEL

    ¿Que es una macro?

    Una macro son un conjunto de instrucciones de código escritos en un lenguaje de programación denominado VBA

    (Visual Basic para Aplicaciones) y que sirven para automatizar procesos y realizar una determinada tarea. La macros permiten expandir las posiilidades de un programa. !e"iri#ndonos a $xcel% supongamos que realizamos "recuentemente

    la acción de seleccionar un rango para aplicarle negrita% camio de "uente y centrado. $n lugar de &acer estas acciones

    manualmente% se puede elaorar una macro e invocarla para que ejecute los tres procesos autom'ticamente. Los

     progtamas que con"orman s *""ice+ ya traen incorporado el editor de VBA% que es donde programaremos yescriiremos las instrucciones y el código necesario para la ejecución de estos procesos automatizados.

    ¿En se aplican las macros?

    ,nicialmente se puede decir que las macros se aplican en las siguientes tareas-

    • Automatización de procesos. uando se ejecutan tareas repetitivas con muc&a "recuencia resulta tedioso su

    realización% las macros pueden reproducir dic&as tareas un n/mero in"inito de veces% lo que signi"ica un a&orro

    signi"icativo de tiempo e incremento de la productividad.

    • reación de nuevas "unciones (U012s User Defined Functions). Uno de los principales "undamentos del $xceles el c'lculo% para lo cual usamos la "unciones incorporadas con este. Las "unciones de"inidas por el usuario

    (U01) son "unciones personalizadas que ampl3an las capacidades de c'lculo% son "unciones a medida que &acen

    exactamente lo que queremos. $stas "unciones se compartaran de la misma manera que las "unciones propias.Los programadores crean paquetes personalizados de c'lculo para proporcionar%

    o 1unciones que no est'n integradas en $xcel (nuevas "unciones)

    o ,mplementaciones personalizadas para "unciones integradas.

    • onstrucción de nuevos men/s y comandos. Los programas vienen con sus propios menus y comandos% el

    mayor o menor uso que un usuario le de a estos comandos depender' de las necesidades de cada usuario en

     particular. La posiilidad de personalizar+ una determinada aplicación permitir' a cada usuario &acer sustadeas cotidianas en "orma mas comoda y e"iciente% comandos que no so &aituales para algunos usuarios

     pueden serlo para otros% las macros nos dan esa posiilidad.

    • reación de omplementos. Los complementos son programas que amplian la "uncionalidad de un programa%

    ya sea con comandos o "unciones que normalmente no poseen% podemos &acer nuestros propios complementos%conseguir algunos que se distriuyen en "orma gratuita en internet y tami#n existen algunos complementos de

     pago% los cuales tienen "ines muy espec3"icos y que son utiles (generalemente) para tareas mas especializadas.

    • reación de aplicaciones a la medida. $l VBA es un programa para &acer programas+% lo cual permite la

    creación de aplicaciones para cualquier uso% una aplicación no es solo una &oja de claculo con "ormulas y"unciones% pueden incluir "ormularios para la introducción de datos% comandos para la creación de reportes%

    muc&as de estas aplicaciones no requieren que el usuario tenga que acceder a los modulos de programación%

    vienen listos para que los usemos sin necesidad de tener que ser expertos en $xcel.

    Objetos, propiedades m!todos"

    A la &ora de traajar con macros en $xcel (en genral programación con VBA)% deen tenerse claros ciertos conceptos de

    lo que se llama  programación orientada a objetos (**4). 5o nos extenderemos demasiado sore la **4% pero side"iniremos a continuación tres conceptos que es necesario entender% estos son Objeto% Propiedades y Métodos.

    Objeto"

    uando en el mundo real nos re"erimos a ojeto signi"ica que &alamos de algo m's o menos astracto que puede ser cualquier cosa. 6i decidimos concretar un poco m's podemos re"erirnos a ojetos coc&e% ojetos silla% ojetos casa% etc.

    $n $xcel pr'cticamente cualquier cosa es un ojeto% un liro de $xcel% cada &oja contenida en el liro% la misma

    etiqueta% una "ila o una columna% una celda es un ojeto% lo mismo que un menu% una tala din'mica% un gr'"ico% para no

    citarlos todos y resumiendo% cada elemento identi"icale es un ojeto. $n la  programación orientada a objetos (**4)%la generalización (o de"inición) de un ojeto se llama Clase% as3 la clase coc&e seria como la representante de todos los

    coc&es del mundo% mientras que un ojeto coc&e seria un coc&e en concreto. 0e momento% no de"iniremos ni

    estudiaremos las clases sino que nos concentraremos en los ojetos% tenga en cuenta pero que cualquier objeto estádefinido por una clase.

    uando decimos que la clase coc&e representa a todos los coc&es del mundo signi"ica que de"ine como es un coc&e%

    cualquier coc&e. 0ic&o de otra "orma y para aproximarnos a la de"inición in"orm'tica% la clase coc&e de"ine algo que

     #$%ina & de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    2/93

     MACROS EN MS EXCELtiene cuatro ruedas% un motor% un c&asis% entonces% cualquier ojeto real de cuatro ruedas% un motor% un c&asis% es un

    ojeto de la clase coc&e.

     #ropiedades"

    ualquier ojeto tiene caracter3sticas o propiedades como por ejemplo el color% la "orma% peso% medidas% etc. $stas

     propiedades se de"inen en la clase y luego se particularizan en cada ojeto. As3% en la clase coc&e se podr3an de"inir las

     propiedades olor% Anc&o y Largo % luego al de"inir un ojeto concreto como coc&e ya se particularizar3an estas

     propiedades a% por ejemplo% olor 7 !ojo% Anc&o 7 8 metros y Largo 7 9%: metros. 4ara entender este concepto en $xcelse pueden mencionar algunas propiedades ya conocidas de algunos de ojetos claramente identi"icales% por ejemplo% el

    ojeto celda tiene algunas propiedades% altura% color de "ondo% alto de la misma% una propiedad puede ser el estar vacia% ocontener un texto o un n/mero% o una "órmula% otro ejemplo es una &oja de c'lculo% una propiedad es tener l3neas de

    división o por el contrario no tenerlas% o estar visile o estar oculta% tener o no etiqueta% se puede decir entonces que lascaracter3sticas que di"erencian un ojeto de otro son las propiedades del ojeto.

     M!todos"

    La mayor3a de ojetos tienen comportamientos o realizan acciones% o podemos realizar acciones sore sus di"erentes propiedades% por ejemplo% una acción evidente de un ojeto coc&e es el de moverse o lo que es lo mismo% trasladarse de

    un punto inicial a un punto "inal. ualquier proceso que implica una acción o pauta de comportamiento por parte de un

    ojeto se de"ine en su clase para que luego pueda mani"estarse en cualquiera de sus ojetos. As3% en la clase coc&e se

    de"inir3an en el m#todo mover todos los procesos necesarios para llevarlo a cao (los procesos para desplazar de un

     punto inicial a un punto "inal)% luego cada ojeto de la clase coc&e simplemente tendr3a que invocar este m#todo paratrasladarse de un punto inicial a un punto "inal% cualesquiera que "ueran esos puntos. $n $xcel los m#todos que podemos

    realizar sore un ojeto &oja pueden ser copiar% orrar mover% ocultar% eliminar l3neas de división etc.% puese queacciones podemos realizar sore una celda o rango de celdas en particular% esas acciones son los m#todos que a"ectaran

    y;o camiaran las propiedades de los ojetos.

    La **4 se asa en lo anterior% lo mismo que las macros en $xcel% y es aplicar métodos a las propiedades conocidas delos objetos% es ueno aclarar que adem's de los ojetos propios del $xcel% el programador tami#n se puede crear nuevosojetos% usando el lenguaje de programación del $xcel el VBA y de"inir que propiedades tendr' el ojeto y aplica

    di"erentes m#todos sore los mismos.

    !epasemos a continuación todos estos conceptos pero a&ora desde el punto de vista de algunos de los ojetos que nos

    encontraremos en Excel como WorkSheet (*jeto &oja de c'lculo) o Rane (*jeto casilla o rango de casillas)% o Cell

    (*jeto celda)% o Workbook  (*jeto Liro).

    Un ojeto Rane est' de"inido por una clase donde se de"inen sus propiedades% recordemos que una propiedad es una

    caracter3stica% modi"icale o no% de un ojeto. $ntre las propiedades de un ojeto Rane est'n !alue % que contiene el

    valor de la casilla % Colu"n y Ro# que contienen respectivamente la "ila y la columna de la casilla% $ont que contiene

    la "uente de los caracteres que muestra la casilla% etc.

    Rane% como ojeto% tami#n tiene m#todos% recordemos que los m#todos sirven llevar a cao una acción sore un

    ojeto. 4or ejemplo el m#todo %cti&ate% &ace activa una celda determinada% Clear% orra el contenido de una celda o

    rango de celdas% Cop'% copia el contenido de la celda o rango de celdas en el portapapeles%...

    $n el cuadro siguiente puede entender mejor los conceptos mencionados% el ojetivo es realizar o ejecutar m#todos a las

     propiedades de los *jetos que est'n dentro del $xcel% para lo cual emplearemos el VBA

    *Bor?oo? Liro Value Valor opy opiar  

    >or?6&eet @oja olor olor ut ortar  

    !o 1ila >idt& Anc&o !eplace !eemplazar  

    olumn olumna @eig&t Altura 6ort *rdenar 

    !ange !ango 1ormat 1ormato ove over  

    ell elda 6ize =amao 0elete Borrar  

     #$%ina ) de '(

    http://ms-help//MS.EXCEL.DEV.12.3082/EXCEL.DEV/content/HV10068022.htmhttp://ms-help//MS.EXCEL.DEV.12.3082/EXCEL.DEV/content/HV10068022.htm

  • 8/20/2019 ! Macros Con MS EXCEL

    3/93

     MACROS EN MS EXCELConjuntos"

    Un conjunto es una colección de ojetos del mismo tipo% para los que conozcan alg/n lenguaje de programación es un

    array de ojetos (arreglo de ojetos). 4or ejemplo% dentro de un liro de traajo puede existir m's de una &oja

    (WorkSheet)% todas las &ojas de un liro de traajo "orman un conjunto% el conjunto WorkSheets.

    ada elemento individual de un conjunto se re"erencia por un 3ndice% de esta "orma% la primera% segunda y tercera &oja

    de un liro de traajo% se re"erenciar'n por >or?6&eets(C)% >or?6&eets(8) y >or?6&eets(9).

    Objetos de Objetos"

    $s muy &aitual que una propiedad de un ojeto sea otro ojeto. Una celda es un ojeto que tiene propiedades% a la vez

    la celda &ace parte de una columna% que tami#n es un ojeto que tiene tami#n sus propiedades% y la columna &ace

     parte de la &oja% que es un ojeto que pertenece al liro% algunos recordaran la teor3a de conjuntos% un suconjunto &ace parte de un conjunto mas grande. 6iguiendo con el coc&e% una de las propiedades del coc&e es el motor% y el motor es un

    ojeto con propiedades como cuicaje% caallos% n/mero de v'lvulas% etc. y m#todos% como aumentarDrevoluciones%

    cogerDcomustile% moverDpistones% etc.

    $n $xcel% el ojeto WorkSheets tiene la propiedad Rane que es un ojeto% Rane tiene la propiedad $ont que es

    tami#n un ojeto y $ont tiene la propiedad (old (negrita). =enga esto muy presente ya que utilizaremos

    "recuentemente 4ropiedades de un ojeto que ser'n tami#n *jetos. 0ic&o de otra "orma% &ay propiedades que

    devuelven ojetos% por ejemplo% la propiedad Rane de un ojeto WorkSheet devuelve un ojeto de tipo Rane.

     #ro%ramaci*n Orientada a Objetos o #ro%ramaci*n +asada en Objetos"

    @ay una sutil di"erencia entre las de"iniciones del t3tulo. 4rogramación orientada a *jetos% signi"ica que el programador traaja con ojetos "aricados por #l mismo% es decir% el programador es quien implementa las clases para luego crear 

    ojetos a partir de ellas. Lo que &aremos nosotros% por el momento% ser' utilizar ojetos ya de"inidos por la aplicación

    $xcel (>or?6&eets% !ange%...) sin implementar ninguno de nuevo% por lo que en nuestro caso seria m's correcto &alar 

    de programación asada en ojetos. *serve que esta es una de las grandes ventajas de la **4% utilizar ojetos de"inidos por alguien sin tener que conocer nada sore su implementación% sólo deemos conocer sus propiedades y m#todos y

    utilizarlos de "orma correcta.

    Bueno% despu#s de esta extensa pero necesaria introducción pasemos ya a &acer alguna cosa en $xcel. 5o es necesarioque se aprenda lo anterior al pi# de la letra y tampoco es necesario que lo comprenda al cien por cien% sólo t#ngalo

     presente para las de"iniciones que vienen a continuación y ver' como va asimilando los conceptos de *jeto%

     propiedades% m#todos% etc.

    Editor de !isual (asic)$l editor de visual Basic es la aplicación que utilizaremos para construir las macros que interactuaran junto con los

    liros de traajo. A continuación prepararemos un arc&ivo en el que escriiremos las primeras instrucciones en Visual

    Basic% el acceso al editor de visual Basic en $xcel 8EEF y en $xcel 8EE9 y versiones anteriores es di"erente% se explicara

    el acceso en las dos versiones.

     #reparar un arci-o nue-o . E/cel )00(

    4ara entrar en el editor de Visual Basic ($xcel 8EE9) ejecute los pasos siguientes.

    • Active opción *erra"ientas+ Macro+ Editor de !isual (asic. 6e arir' la ventana siguiente.

     #$%ina ( de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    4/93

  • 8/20/2019 ! Macros Con MS EXCEL

    5/93

     MACROS EN MS EXCEL

    $n esta l3nea estamos indicando que traajamos con un ojeto Rane) 4ara indicarle que nos re"erimos a la casilla AC%

    encerramos entre par#ntesis esta re"erencia (m's adelante ver' otra "orma de re"erirnos a las casillas). 0e este ojeto%

    indicamos que queremos estalecer un nuevo valor para la propiedad !alue% oserve que para separar el ojeto de su propiedad utilizamos la notación punto.

    !ecuerde que el conjunto Rane es un ojeto que pende del ojeto WorkSheets% as3 por ejemplo el siguiente código

    &ar3a lo mismo que el anterior.

    WorkSheets(C).Rane(HACH).!alue 7 H@olaH

    Bueno% de &ec&o no &ace lo mismo% en la primera opción% el texto H@olaH se pone dentro de la casilla AC de la &ojaactiva% mientras que en el segundo es en la casilla AC de primera &oja ( del conjunto de &ojas). La segunda notación es

    m's larga% pero tami#n m's recomendale ya que se especi"ican todos los ojetos. $n muc&as ocasiones se pueden

    omitir algunos ojetos precedentes% no le aconsejamos &acerlo% sus programas perder'n claridad y concisión.

    6i desea &acer re"erencia a la &oja activa puede utilizar %cti&eSheet% as3% el primer ejemplo lo dejaremos de la manera

    siguiente.

    Sub Primero()

    Active6&eet.!ange(HACH).Value 7 H@olaHEnd Sub

    6i desea poner H@olaH (o cualquier valor) en la casilla activa% puede utilizar la propiedad (ojeto) %cti&ecell de

    WorkSheets. As3 para poner H@olaH en la casilla activa de la &oja activa seria%

    Sub Primero()Active6&eet.Activeell.Value 7 H@olaH

    End Sub

    4ara terminar con este primer ejemplo. WorkSheets est'n dentro del *jeto Work(ooks (liros de traajo) yWork(ooks est'n dentro de %pplication. %pplication es el ojeto superior% es el que representa la aplicación $xcel.

    As3% el primer ejemplo% siguiendo toda la jerarqu3a de ojetos quedar3a de la "orma siguiente.

    Sub Primero()Application.>or?Boo?s(C).>or?6&eets(C).!ange(HACH).Value 7 H@olaH

    End Sub

    ,nsistiendo con la nomenclatura% %pplication casi nunca es necesario especi"icarlo% piense que todos los ojetosdependen de este% Work(ooks ser' necesario implementarlo si en las macros se traaja con di"erentes liros de traajo

    (di"erentes arc&ivos)% a partir de WorkSheets% es aconsejale incluirlo en el código% sore todo si se quiere traajar con

    di"erentes &ojas% ver'% sin emargo% que en muc&as ocasiones no se aplica.

     Ejecutar un procedimiento o 3unci*n"

    4ruee ejecutar el primer procedimiento de ejemplo.

    C. 6it/e el cursor dentro del procedimiento.8. Active opción de la arra de men/s Ejecutar+ Ejecutar Sub /serfor". =ami#n puede &acer clic sore el otón I

    o pulsar la tecla $0.

    Para ejecutar el procedi"iento desde la hoja de cálculo)

    0ee estar en una &oja% no en el editor de Visual Basic

    C. Active opción de la arra de men/s *erra"ientas+ Macro+ Macros. 6e despliega una ventana que muestra una lista

    donde est's todas las macros incluidas en el liro de traajo.8. 6eleccione la macro de la lista y pulse sore el otón Ejecutar.

     #$%ina 4 de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    6/93

     MACROS EN MS EXCEL

      Eje"plo 1

    $n este segundo ejemplo simplemente ampliaremos la "uncionalidad de la macro del ejemplo C. Adem's de escriir H@olaH en la casilla AC de la @oja C% la pondremos en negrita y le daremos color al texto. 4ara ello utilizaremos las

     propiedades (old y Color del ojeto $ont.

    Sub 6egundo()Active6&eet.!ange(HACH).Value 7 H@olaH

    Active6&eet.!ange(HACH).1ont.Bold 7 TrueActive6&eet.!ange(HACH).1ont.olor 7 R!(8::%E%E)

    End Sub

    2rue)

    2rue% que traducido es verdadero% simplemente indica que la propiedad (old est' activada. 6i se deseara desactivar%

     astar3a con igualarla al valor $alse.

    3a funci-n R4()

    *serve que para estalecer el color de la propiedad se utiliza la "unción  R5+(!ed% Jreen% Blue)% los tres argumentos

     para esta "unción son valores del E a 8:: que corresponden a la intensidad de los colores !ojo% Verde y Azulrespectivamente.

    Referenciar un rano de celdas)

    6ólo tiene que camiar a la "orma Casilla61nicial7Casilla68inal . 4or ejemplo aplicar el /ltimo ejemplo al rango decasillas que va de la AC a la AK% ponga.

    Sub "egundo()Active6&eet.!ange(HACAKH).Value 7 H@olaHActive6&eet.!ange(HACAKH).1ont.Bold 7 TrueActive6&eet.!ange(HACAKH).1ont.olor 7 R!(8::%E%E)

    End Sub

    9ariables"

    A continuación vamos a repetir el programa $jemploC% pero en lugar de poner H@olaH en la casilla AC de la &oja activa%

    dejaremos que el usuario entre un texto desde teclado y a continuación guardaremos ese valor en esa casilla. *serveque el valor que entre del usuario dee guardarse en alg/n lugar para poder ponerlo despu#s en la casilla AC- pues ien%

    ese valor se guardar' en una variale. Una variale es simplemente un trozo de memoria que la "unción o procedimineto

    se reserva para guardar datos% la "orma general de declarar una variale es

    5,M variale %S tipo.

    6iendo variale el nomre que se asigna a la misma y 2ipo el tipo de datos que se guardar'n (n/meros% texto% "ec&a%

     oleanos%...). $n nuestro ejemplo% declararemos la variale de tipo  Strin% (tipo texto)% y lo &aremos de la "ormasiguiente.

    5i" =exto %s Strin% 

    on esto estamos indicando que se reserve un trozo de memoria (el que sea) % que se llama =exto y que el tipo de datosque se guardar'n a&3 ser'n caracteres.

    3a $unci-n 1nput+o/ )

    $sta "unción muestra una ventana para que el usuario pueda teclear datos. uando se pulsa sore %ceptar% los datos

    entrados pasan a la variale a la que se &a igualado la "unción. Vea la l3nea siguiente.

    =exto 7 1nput+o/ (H,ntroduzca el textoH% H$ntrada de datosH).

     #$%ina : de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    7/93

     MACROS EN MS EXCEL6i en la ventana que muestra ,nputBox pulsa sore el otón Aceptar% los datos tecleados se guardar'n el la variale

    =exto.

    Sintaxis de ,nput(ox)

     1nput+o/ ( #ensaje% T$tulo% %alor por defecto%  Posición &ori'ontal %  Posición %ertical %  rc&io a*uda%  N+mero deconte,to para la a*uda).

     #ensaje $s el mensaje que se muestra en la ventana. 6i desea poner m's de una l3nea ponga &r(C9) para cadanueva l3nea% vea el ejemplo siguiente.

    T$tulo $s el t3tulo para la ventana 1nput+o/ . $s un par'metro opcional.

    %alor por defecto $s el valor que mostrar' por de"ecto el cuadro donde el usuario entra el valor. 4ar'metroopcional.

     Posición -ori'ontal  La posición M de la pantalla donde se mostrar' el cuadro% concretamente es la posición para la parte izquierda. 6i se omite el cuadro se presenta &orizontalmente centrado a la pantalla.

     Posición %ertical  La posición G de la pantalla donde se mostrar' el cuadro% concretamente es la posición para

    la parte superior. 6i se omite el cuadro se presenta verticalmente centrado a la pantalla.

     rc&io *uda. $s el arc&ivo que contiene la ayuda para el cuadro. 4ar'metro opcional.

     N+mero de conte,to para la a*uda.  5/mero asignado que corresponde al identi"icador del arc&ivo de ayuda%sirve para localizar el texto que se dee mostrar. 6i se especi"ica este par'metro% dee especi"icarse

    oligatoriamente el par'metro Arc&ivo Ayuda.

      Eje"plo 6

    Sub /ntrar  D %alor()

    5i" =exto %s Strin

    0 1&r(23) sire para 4ue el mensaje se muestre en dos 5$neas=exto 7 ,nputBox(H,ntroducir un texto H N &r(C9) N H4ara la casilla ACH% H$ntrada de datosH)

    Active6&eet.!ange(HACH).Value 7 =extoEnd Sub

    $ste ejemplo tami#n se puede &acer sin variales.

    Sub /ntrar_%alor()Active6&eet.!ange(HACH).Value 7  6nput!o,(H,ntroducir un texto H N &r(C9) N H4ara la casilla ACH%H$ntrada de datosH)

    End Sub

      Eje"plo 7!epetiremos el ejemplo 9% pero en lugar de entrar los valores sore la casilla AC% &aremos que el usuario pueda elegir en

    que casilla quiere entrar los datos% es decir% se le preguntar' al usuario mediante un segundo ,nputox sore que casilla

    quiere entrar el valor del primer ,nputox. 6er'n necesarias dos variales% una para guardar la casilla que escoja elusuario y otra para guardar el valor.

    Option Explicit

    Sub /ntrar_%alor 

     #$%ina ; de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    8/93

     MACROS EN MS EXCEL5i" asilla %s Strin

    5i" =exto %s Strin

    asilla 7 ,nputBox(H$n que casilla quiere entrar el valorH% H$ntrar asillaH)=exto 7 ,nputBox(H,ntroducir un texto H N &r(C9) N H4ara la casilla H N asilla % H$ntrada de datosH)

    Active6&eet.!ange(asilla).Value 7 =exto

    End Sub

     La sentencia Option E/plicit"

    $n visual Basic no es necesario declarar las variales% por ejemplo% en el programa anterior se &uiera podido prescindir 

    de las l3neas

    5i" asilla %s Strin% 

    5i" =exto %s Strin% 

    A pesar de ello% le recomendamos que siempre declare las variales que va a utilizar% de esta "orma sar' cuales utiliza el

     procedimiento y que tipo de datos guarda cada una% piense que a medida que vaya aprendiendo% crear' procedimientos

    cada vez m's complicados y que requerir'n el uso de m's variales% si no declara las variales al principio del

     procedimiento ocurrir'n dos cosas. 4rimero% las variales no declaradas son asumidas como tipo !ariant (este es un tipo

    de datos que puede almacenar cualquier valor% n/mero% "ec&as% texto% etc. pero tenga en cuenta que ocupa 8E Bytes y para guardar una re"erencia a una casilla% la edad de alguien% etc. no son necesarios tantos ytes)- segundo% reducir'

    consideralemente la legiilidad de sus procedimient os ya que las variales las ir' colocando a medida que las necesite%esto% a la larga complicar' la corrección o modi"icación del procedimiento.

    Bueno% pues toda la explicación anterior es para que declare todas las variales que va a utilizar. La sentencia OptionExplicit al principio del módulo "uerza a que se declaren todas las variales. 6i al ejecutar el programa% se encuentraalguna variale sin declarar se producir' un error y no se podr' ejecutar el programa &asta que se declare.

    6i todav3a no se &a convencido sore la conveniencia de declarar las variales y utilizar Option Explicit% pruee el

     procedimiento siguiente% cópielo tal cual (=exto y =esto est'n puestos adrede simulando que nos &emos equivocado alteclear).

    Sub $ntrarDValor =exto 7 ,nputBox(H,ntroducir un texto H N &r(C9) N H4ara la casilla ACH% H$ntrada de datosH)Active6&eet.!ange(HACH).Value 7 =esto

    End Sub

    *serve que el programa no &ace lo que se pretend3a que &iciera. $"ectivamente% =exto y =esto son dos varialesdi"erentes% como no se &a declarado ninguna ni se &a utilizado Option Explicit Visual Basic no da ning/n tipo de error y

    ejecuta el programa. 4ruee el siguiente módulo e intente ejecutarlo.

    Option Explicit

    Sub $ntrarDValor 

    5i" =exto %s Strin

    =exto 7 ,nputBox(H,ntroducir un texto H N &r(C9) N H4ara la casilla ACH% H$ntrada de datosH)

    Active6&eet.!ange(HACH).Value 7 =esto

    End Sub

    *serve que el programa no se ejecuta% al poner Option Explicit% "orzamos a que se declaren todas las variales. Visual

    Basic detecta que la variale Testo no &a sido declarada y as3 lo indica mostrando $rror% entonces es cuando es m's "'cildarnos cuenta del error que &emos cometido al teclear y camiamos =esto por =exto. A&ora imagine que el error se

     produce en un programa de cientos de l3neas que necesita otras tantas variales.

     #$%ina < de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    9/93

     MACROS EN MS EXCEL

    2ipos de datos en !isual (asic para Excel . (=ala copiada de la ayuda en l3nea de Visual Basic

     para $xcel).

    2ipo de datos

    ('te

    (oolean

    ,nteer

    3on

    (entero largo)

    Sinle

    (coma "lotante; precisión simple)

    5ouble

    (coma "lotante; precisión dole)

    Currenc'

    (entero a escala)

    5eci"al

    5ate

    Object

    Strin 

    (longitud variale)

    Strin

    (longitud "ija)

    !ariant

    (con n/meros)

    !ariant

    (con caracteres)

    0e"inido por el

    (utilizando 2'pe)

    Con-ersi*n de =ipos de datos"

    opie el siguiente $jemplo. 6implemente se piden dos n/meros% se suman y se guardan el la casilla AC de la &oja activa.

      Eje"plo 0

    Option Explicit

    Sub 6umar()

    5i" 5umeroC %s ,nteer

    5i" 5umero8 %s ,nteer

     #$%ina ' de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    10/93

     MACROS EN MS EXCEL 5umeroC 7 ,nputBox(H$ntrar el primer valorH% H$ntrada de datosH)

     5umero8 7 ,nputBox(H$ntrar el segundo valorH% H$ntrada de datosH)

    Active6&eet.!ange(HACH).Value 7 5umeroC O 5umero8

    End Sub

    $jecute el procedimiento y ponga respectivamente los valores 8: y 8:. *serve que todo &a ido correctamente y en lacasilla AC de la &oja activa aparece un :E.

    A&ora% vuelva a ejecutar el programa y cuando se le pide el primer valor teclee H@olaH. *serve que el programa se

    detiene indicando un error en el tipo de datos. $"ectivamente% oserve que la "unción ,nputBox devuelve siempre datos

    tipo Strin% % en el primer ejemplo no &a &aido ning/n prolema% al entrar caracteres num#ricosC% estos pueden asignarse

    a variales tipo 1nte%er porque Visual Basic &ace autom'ticamente la conversión% pero al entrar texto e intentarlo asignar a una variale 1nte%er Visual Basic muestra un error indicando que la variale no es adecuada para los datos que se

    desean guardar.

    4ara solucionar estos prolemas se deen utilizar "unciones de conversión de tipo. $stas "unciones% como su nomreindica% convierten datos de un tipo a otro% de  Strin% a  1nte%er % de  1nte%er a  Strin% % de  >ate a  Strin% %... As3 el

     procedimiento anterior quedar3a.

    Option Explicit

    Sub "umar ()

    5i" 5umeroC %s ,nteer5i" 5umero8 %s ,nteer

     5umeroC 7 Val(,nputBox(H$ntrar el primer valorH% H$ntrada de datosH))

     5umero8 7 Val(,nputBox(H$ntrar el primer valorH% H$ntrada de datosH))

    Active6&eet.!ange(HACH).Value 7 5umeroC O 5umero8

    End Sub

    La "unción 9al (0ato 6tring)% convierte una cadena de caracteres a valor num#rico. 6i la cadena a convertir contiene

    alg/n car'cter no num#rico devuelve E. As3% si al pedir un valor se teclea H@olaH% la "unción Val% devolver' un cero.

    8unciones de con-ersi*n de tipos" (Tabla copiada de la a*uda en l$nea de %isual !asic para /,cel)7

    9al (adena). onvierte la cadena a un valor num#rico.

     Str (5/mero). onvierte el n/mero a una expresión cadena.

    Las siguientes "unciones tienen la "orma 8unci*n($xpresión).

    $unci-n

    C(ool

    C =enga en cuenta que para los ordenadores no es lo mismo el n/mero C que el car'cter HCH. $n los

    lenguajes de programación actuales la conversión de car'cter HCH a n/mero C se &aceautom'ticamente en muc&os casos% esto es ueno y es malo. $s ueno porque nos a&orra tener que

    &acer las conversiones y es malo porque es m's di"3cil controlar ciertos casos. 6iga con los ejemplos

    y entender' de lo que estamos &alando. 6ólo para su in"ormación% el ordenador guarda el n/mero C

    de la siguiente manera EEEEEEEC% mientras que el car'cter HCH se guarda como EECCEEEE (el n/meroPK del código A6,,).

     #$%ina &0 de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    11/93

     MACROS EN MS EXCEL

    C('te

    CCur

    C5ate

    C5bl

    C5ec

    C,nt

    C3n

    CSn

    CStr

    C!ar

    Bueno% despu#s de esta introducción a las variales% pasemos a estudiar unos cuantos objetos y propiedades que seutilizan &aitualmente.

    Objeto Cells8fila9 colu"na:)

    6irve% como el ojeto range% para re"erenciar una casilla o rango de casillas% pero en lugar de utilizar la re"erencia de la

    "orma AC% BC% M98E%... utiliza la "ila y la columna que ocupa la casilla dentro de la &oja (o ojeto >or?6&eet). 4or 

    ejemplo% para poner &ola en la casilla AC de la &oja activa seria%

    Active6&eet.ells(C%C).Value7H@olaH

    /tili;ar Cells para referenciar un rano)

    $sto seria el equivalente a !ange(HasillaD,nicialasillaD1inalH). La "orma que se otiene utilizando ells es un pocom's larga% pero se ver' que a veces resulta muc&o m's "uncional que utilizando /nicamente range. 4ara re"erirnos al

    rango ACBK% pondremos%

    !ange(ells(C% C)% ells(K% 8)).Value 7 H@olaH

    *tra "orma interesante de ells es la siguiente%

    !ange((HA:BCEH)%ells(8% C)).Value 7 H@olaH

    4ondr' en la celda AQ el valor H@olaH% oserve que en este ejemplo ells comienza a contar "ilas y columnas a partir del

    rango especi"icado en el ojeto !ange.

    9ariables de Objetos"

    Una variale ojeto sir ve para &acer re"erencia a un ojeto% esto signi"ica que podremos acceder a las propiedades de un

    ojeto e invocar a sus m#todos a trav#s de la variale en lugar de &acerlo directamente a trav#s del ojeto. 4osilemente

    no se utilice demasiado esta clase de variales (esta claro que esto depender' de las pre"erencias del programador)% pero&ay casos en los que no &ay m's remedio que utilizarlas% por ejemplo en estructuras $or Each ...

  • 8/20/2019 ! Macros Con MS EXCEL

    12/93

     MACROS EN MS EXCEL

    5i" ! %s Rane

    5i" @oja %s WorkSheet

    4ara asignar un ojeto a una variale dee utilizar la instrucción Set.

    Set VarialeD*jeto 7 *jeto

    4or $jemplo

    Set !7 Active6&eet.!ange(HACBCEH)Set @oja 7 Active6&eetSet @oja 7 >or?6&eets(C)

    Veamos a continuación un ejemplo de cómo utilizar este tipo de variales%

      Eje"plo =)

    Algo muy simple% llenar el rango de AC a BCE con la palara H@olaH y despu#s poner negrita% oserve como se asigna

    una variale ojeto al ojeto y luego como se traaja con esa variale de la misma "orma que traajar3a directamentesore el ojeto.

    Sub oj()

    5i" ! %s Rane

    Set ! 7 Active6&eet.!ange(HACEBC:H)

    !.Value 7 H@olaH!.1ont.Bold 7 =rue

    End Sub

    El &alor

  • 8/20/2019 ! Macros Con MS EXCEL

    13/93

     MACROS EN MS EXCEL$in Si

    .

    .

    uando el programa llega a la instrucción Si ondición Entonces % se eval/a la condición% si esta se cumple (es cierta)%se ejecutan todas las sentencias que est'n encerradas en el loque% si no se cumple la condición% se saltan estas

    sentencias. $sta estructura en Visual Basic tiene la sintaxis siguiente%

    ,f ondición 2hen

    6ent#nciaC

    6ent#ncia8

    .

    .6ent#ncia5

    End ,f 

    ♦ Eje"plo >)

    $ntrar una cantidad que representa el precio de algo por el teclado con la instrucción  1nput+o/ y guardarlo en la celda

    AC de la &oja activa. 6i el valor entrado desde el teclado (y guardado en AC) es superior a CEEE% pedir descuento con otro,nputBox y guardarlo en la casilla A8 de la &oja activa. alcular en A9% el precio de AC menos el descuento de A8.

    Sub ondicional()

    Active6&eet.!ange(HACH).Value 7 E 0 Poner las casillas donde se guardan los alores 87Active6&eet.!ange(HA8H).Value 7 E

    Active6&eet.!ange(HA9H).Value 7 E

    Active6&eet.!ange(HACH).Value 7 Val(,nputBox(H$ntrar el precioH% H$ntrarH))0 "i el alor de la casilla 2 es ma*or 4ue 28889 entonces9 pedir descuento

    ,f Active6&eet.!ange(HACH).Value R CEEE 2hen

    Active6&eet.!ange(HA8H).Value 7 Val(,nputBox(H$ntrar 0escuentoH% H$ntrarH))End ,f 

    Active6&eet.!ange(HA9H).Value 7 Active6&eet.!ange(HACH).Value S D Active6&eet.!ange(HA8H).Value

    End Sub

      Eje"plo ?)

    $l mismo que el anterior pero utilizando variales.

    Option Explicit

    Sub ondicional()

    5i" 4recio %s ,nteer5i" 0escuento %s ,nteer

    4recio 7 E

    0escuento 7 E

    4recio 7 Val(,nputBox(H$ntrar el precioH% H$ntrarH))

    0 "i el alor de la ariable precio es ma*or 4ue 28889 entonces9 pedir descuento

     #$%ina &( de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    14/93

     MACROS EN MS EXCEL

    ,f 4recio R CEEE 2hen

    0escuento 7 Val(,nputBox(H$ntrar 0escuentoH% H$ntrarH))End ,f 

    Active6&eet.!ange(HACH).Value 7 4recio

    Active6&eet.!ange(HA8H).Value 7 0escuento

    Active6&eet.!ange(HA9H).Value 7 4recio S 0escuento

    End Sub

    Viendo los dos programas anteriores puede que le surja la duda de si emplear variales o directamente valoresalmacenados en las celdas. La solución es "'cil% lo que le parezca m's conveniente en cada caso concreto que desee

    solucionar. Las variales% aunque muc&as veces HinnecesariasH% quiz's dejan los programas m's legiles y claros. G la

    legiilidad de un programa es lo m's valioso del mundo para un programador (pro"esionalmente &alando)% sore todo si

    se da el caso (inevitale el TT%TTT... de las ocasiones) que se tenga que modi"icar un programa para dotarle de m's"uncionalidades% "acilitar su manejo% etc. $n la mayor3a de ejemplos que encontrar' en este manual ver' que se utilizan

    variales pre"erentemente. Aunque muc&as veces su "unción sea simplemente recoger datos de las celdas para operarlas

    y dejarlas en otras celdas y% consecuentemente% aumente el n/mero de operaciones% creemos que con ello se gana en

    legiilidad y "lexiilidad.

      Eje"plo @)

    acro que compara los valores de las casillas AC y A8 de la &oja activa. 6i son iguales pone el color de la "uente de

    amas en azul.

    Sub ondicional8()

    ,f Active6&eet.!ange(HACH).Value 7 Active6&eet.!ange(HA8H).Value 2hen

    Active6&eet.!ange(HACH).1ont.olor 7 !JB(E% E% 8::)Active6&eet.!ange(HA8H).1ont.olor 7 !JB(E% E% 8::)

    End ,f 

    End Sub

        Estructura ,f))Else

    $sta estructura se utiliza cuando se requiere una respuesta alternativa a una condición. 6u estructura es la siguiente.

    Si ondición Entonces

    6ent#nciaC

    6ent#ncia8

    .

    .6ent#ncia5

    Sino6ent#nciaC

    6ent#ncia8.

    .

    6ent#ncia5$in Si

     #$%ina &2 de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    15/93

     MACROS EN MS EXCEL*serve que% si se cumple la condición% se ejecuta el loque de sentencias delimitado por Si ondición Entonces y 6i no

    se cumple la condición se ejecuta el loque delimitado por Sino y $in Si. $n Visual Basic la instrucción Si ondición

    Entonces ... Sino ... $in Si se expresa con las instrucciones siguientes.

    ,f ondición 2hen

    6ent#nciaC

    6ent#ncia8

    .

    .

    6ent#ncia5

    Else

    6ent#nciaC6ent#ncia8

    .

    .

    6ent#ncia5End ,f 

      Eje"plo .A)

    $ntrar una cantidad que representa el precio de algo por el teclado con la instrucción ,nputBox y guardarlo en la celda

    AC de la &oja activa. 6i el valor entrado desde el teclado (y guardado en AC) es superior a CEEE% se aplica un descuentodel CE sino se aplica un descuento del :% el descuento se guarda en la casilla A8 de la &oja activa. olocar en A9% el

    total descuento y en AP el total menos el descuento.

    Sub ondicionalD$lse()

    5i" 4recio %s Sinle

    5i" 0escuento %s Sinle

    4recio 7 E

    4recio 7 Val(,nputBox(H$ntrar el precioH% H$ntrarH))

    0 "i el alor de la ariable precio es ma*or 4ue 28889 entonces9 aplicar descuento del 28:,f 4recio R CEEE 2hen

    0escuento 7 4recio W (CE ; CEE)

    Active6&eet.!ange(HA8H).Value 7 E.C 0 erificar configuración regional para el decimal Else 0 "i no9 ; plicar descuento del

  • 8/20/2019 ! Macros Con MS EXCEL

    16/93

     MACROS EN MS EXCELActive6&eet.!ange(HA9H).Value 7 Active6&eet.!ange(HACH).Value S D 

    Active6&eet.!ange(HA8H).Value

    ,f Active6&eet.!ange(HA9H).Value X E 2hen

    Active6&eet.!ange(HA9H).1ont.olor 7 !JB(8::%E%E)

    Else

    Active6&eet.!ange(HA9H).1ont.olor 7 !JB(E%E%8::)End ,f 

    End Sub

        Estructuras ,f anidadas) 5o tiene que sorprenderle% dentro de una estructura i" puede ir otra% y dentro de esta otra% y otra... Vea el ejemplo

    siguiente.

      Eje"plo .1)

    omparar los valores de las casillas AC y A8 de la &oja activa. 6i son iguales% escriir en A9 =5os alores de 2 * > soniguales= % si el valor de AC es mayor que A8% escriir =2 ma*or 4ue >= % sino% escriir => ma*or 4ue 2= .

    Sub ondicional()

    ,f Active6&eet.!ange(HACH).Value 7 Active6&eet.!ange(HA8H).Value 2hen

    Active6&eet.!ange(HA9H).Value 7 HLos Valores de AC y A8 son igualesH

    Else

    ,f Active6&eet.!ange(HACH).Value R Active6&eet.!ange(HA8H).Value 2hen

    Active6&eet.!ange(HA9H).Value 7 HAC mayor que A8H

    Else

    Active6&eet.!ange(HA9H).Value 7 HA8 mayor que ACHEnd ,f 

    End ,f 

    End Sub

    *serve que la segunda estructura ,f ..Else..End ,f queda dentro del Else de la primera estructura. $sta es una regla

    general% cuando pone un End ,f % este cierra siempre el /ltimo ,f ( o Else) aierto.

        Operadores l-icos)

    $stos operadores se utilizan cuando se necesitan evaluar dos o m's condiciones para decidir si se ejecutan o no

    determinadas acciones.

    Operador 3-ico %nd 8B:)

    Utilizaremos este operador cuando sea preciso que para ejecutar un loque de instrucciones se cumpla m's de unacondición. *serve que deer'n cumplirse todas las condiciones. Vea el ejemplo siguiente.

      Eje"plo .6a)

    $ntrar el 5omre% la cantidad y el precio de un producto desde el teclado y guardarlos respectivamente en AC% A8 y A9.

    alcular el total y guardarlo en AP. 6i el total es superior a CE.EEE ' el nomre del producto es H4atatasH% pedir un

    descuento% calcularlo el total descuento y guardarlo en A:% luego restar el descuento del total y guardarlo en AQ.

    Sub $jemploDC9()

     #$%ina &: de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    17/93

  • 8/20/2019 ! Macros Con MS EXCEL

    18/93

     MACROS EN MS EXCEL4recio 7 Val(,nputBox(H$ntrar el precioH% H$ntrarH))

    antidad 7 Val(,nputBox(H$ntrar la cantidadH% H$ntrarH))

    =otal 7 4recio W antidad

    Active6&eet.!ange(HACH).Value 7 4roducto

    Active6&eet.!ange(HA8H).Value 7 4recio

    Active6&eet.!ange(HA9H).Value 7 antidadActive6&eet.!ange(HAPH).Value 7 =otal

    0 "i total ma*or 4ue 287888 o el producto es Patatas9 aplicar descuento7,f =otal R CEEEE Or Lase(4roducto) 7 HpatatasH 2hen

    0escuento 7 Val(,nputBox(H$ntrar 0escuentoH% H$ntrarH))

    =otalD0escuento 7 =otal W (0escuento ; CEE) 0colocar el Dcto en otra celda=otal 7 =otal S =otalD0escuento

    Active6&eet.!ange(HA:H).Value 7 =otalD0escuentoActive6&eet.!ange(HAQH).Value 7 =otal

    End ,f 

    End Sub

    *serve que para que se ejecute el loque de instrucciones entre ,".. $nd ," sólo es necesario que se cumpla alguna de lasdos condiciones que se eval/an (o las dos a la vez). 6ólo cuando no se cumple ninguna de las dos no se ejecutan las

    instrucciones del loque.

    Operador 3-ico

  • 8/20/2019 ! Macros Con MS EXCEL

    19/93

  • 8/20/2019 ! Macros Con MS EXCEL

    20/93

     MACROS EN MS EXCEL

    Select Case $xpresión

    Case valores ,nstrucciones.

    Case valores

    ,nstrucciones.

    .

    .

    Case valores

    ,nstrucciones.Case Else

    ,nstrucciones en caso que no sean ninguno de los valores anteriores.

    End Select

    Vea el ejemplo anterior solucionado con esta estructura.

      Eje"plo .=)

    Sub $jemploDCQ()

    5i" 6igno %s Strin5i" ValorC %s ,nteger% Valor8 %s ,nteer% =otal %s ,nteer

    ValorC 7 Active6&eet.!ange(HACH).Value

    Valor8 7 Active6&eet.!ange(HA8H).Value

    6igno 7 Active6&eet.!ange(HBCH).Value

    Select Case signo

    Case HOH=otal 7 ValorC O Valor8

    Case HSH

    =otal 7 ValorC S Valor8Case HxH

    =otal 7 ValorC W Valor8

    Case HH

    =otal 7 ValorC ; Valor8Case Else

    =otal 7 E

    End Select

    Active6&eet.!ange(HA9H).Value 7 =otal

    End Sub

    Vea el ejemplo siguiente donde cada sentencia ase eval/a un rango de valores.

      Eje"plo .>)

    4rograma que pide tres notas de un alumno mediante la "unción ,nputBox. Las notas van a parar respectivamente a lascasillas AC% A8 y A9 de la &oja activa. $l programa calcula la media y la deja en AP. 6i la media est' entre E y 8 deja en

    A: el mensaje Huy de"icienteH% si la nota es 9 deja en A: el mensaje H0e"icienteH% si la nota es P deja H,nsu"icienteH% si

    es : H6u"icienteH% si es Q HBienH% si est' entre F y K deja H5otaleH% si es mayor que K deja H6oresalienteH.

    Sub $jemploDCF()

     #$%ina )0 de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    21/93

     MACROS EN MS EXCEL5i" 5otaC %s ,nteer% 5ota8 %s ,nteer% 5ota9 %s ,nteer

    5i" edia %s Sinle

     5otaC 7 Val(,nputBox(H$ntrar 5ota primera evaluaciónH% H5otaH)) 5ota8 7 Val(,nputBox(H$ntrar 5ota 6egunda evaluaciónH% H5otaH))

     5ota9 7 Val(,nputBox(H$ntrar 5ota =ercera evaluaciónH% H5otaH))

    edia 7 (5otaC O 5ota8 O 5ota9) ; 9

    Active6&eet.!ange(HACH).Value 7 5otaC

    Active6&eet.!ange(HA8H).Value 7 5ota8

    Active6&eet.!ange(HA9H).Value 7 5ota9

    Active6&eet.!ange(HAPH).Value 7 edia

    Select Case edia

    Case E 2o 8

    Active6&eet.!ange(HA:H).Value 7 Huy de"icienteHCase 9

    Active6&eet.!ange(HA:H).Value 7 H0e"icienteH

    Case P

    Active6&eet.!ange(HA:H).Value 7 H,nsu"icienteH

    Case :Active6&eet.!ange(HA:H).Value 7 H6u"icienteH

    Case QActive6&eet.!ange(HA:H).Value 7 HBienH

    Case F 2o K

    Active6&eet.!ange(HA:H).Value 7 H5otaleHCase RK

    Active6&eet.!ange(HA:H).Value 7 H6oresalienteH

    End Select

    End Sub

        $unciones de co"probaci-n)Antes de terminar con el tema de condicionales veremos unas "unciones que nos ser'n /tiles a la &ora de comproar ovalidar el tipo de los datos entrados desde teclado o simplemente los datos contenidos en una casilla.

    Volvamos al ejemplo que codi"icamos de la manera siguiente.

    Sub $jemploDCQ()

    5i" 6igno %s Strin5i" ValorC %s ,nteer% Valor8 %s ,nteer% =otal %s ,nteer

    ValorC 7 Active6&eet.!ange(HACH).Value

    Valor8 7 Active6&eet.!ange(HA8H).Value

    6igno 7 Active6&eet.!ange(HBCH).Value

    Select Case signo

    Case HOH

    =otal 7 ValorC O Valor8Case HSH

    =otal 7 ValorC S Valor8

    Case HxH

    =otal 7 ValorC W Valor8Case HH

    =otal 7 ValorC ; Valor8

     #$%ina )& de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    22/93

     MACROS EN MS EXCELCase Else

    =otal 7 E

    End Select

    Active6&eet.!ange(HA9H).Value 7 =otal

    End Sub

    ,magine que en alguna de las casillas que se deen operar no &uiera ning/n valor o ien datos al"anum#ricos. Al

    ejecutar la macro se producir' un error. Aunque con Visual Basic se puede controlar el "lujo del programa cuando se

     produce un error imprevisto% para solucionar este prolema utilizaremos una "unción de comproación que nos diga si en

    las casillas AC y A8 &ay valores adecuados (num#ricos) para proseguir con la ejecución de la macro% en caso contrario semostrar' un error y no se ejecutar' ninguna de las operaciones.

    La "unción que utilizaremos es ,s

  • 8/20/2019 ! Macros Con MS EXCEL

    23/93

     MACROS EN MS EXCEL=otal 7 ValorC S Valor8

    Case HxH

    =otal 7 ValorC W Valor8Case HH

    =otal 7 ValorC ; Valor8

    Case Else

    =otal 7 EEnd Select

    Active6&eet.!ange(HA9H).Value 7 =otal

    End if 

    End Sub

    $n lugar de los tres ," de comproación se &uiera podido utilizar el operador *! de la manera siguiente%

    ,f not ,s5umeric(Active6&eet.!ange(HACH))Or not ,s5umeric(Active6&eet.!ange(HA8H)) D Or ,s$mpty(Active6&eet.!ange(HBCH))2hen

    sgBox 4rompt7H0ee entrar n/meros en AC y A8 y un signo (O%S%x% ) en BC%

    =itle7H$!!*!H

    ontinuar7 1alse

    Else0 6nstrucciones de las operaciones

    End if 

    3ista de $unciones de Co"probaci-n)

    ,s

  • 8/20/2019 ! Macros Con MS EXCEL

    24/93

  • 8/20/2019 ! Macros Con MS EXCEL

    25/93

     MACROS EN MS EXCEL&bMs(oxRtlReadin CEPK:FQ $speci"ica que el texto dee aparecer para leer de derec&a a

    izquierda en sistemas &ereos y 'raes

    $l primer grupo de valores (E a :) descrie el n/mero y el tipo de los otones mostrados en el cuadro de di'logo- elsegundo grupo (CQ% 98% PK% QP) descrie el estilo del icono% el tercer grupo (E% 8:Q% :C8) determina el otón

     predeterminado y el cuarto grupo (E% PETQ) determina la modalidad del cuadro de mensajes. uando se suman n/meros

     para otener el valor "inal del argumento uttons% se utiliza solamente un n/mero de cada grupo.

  • 8/20/2019 ! Macros Con MS EXCEL

    26/93

     MACROS EN MS EXCELLo que no puede &acer porque Visual Basic dar3a error es poner la primera "orma sin igualarla a ninguna variale. 4or 

    ejemplo% la expresión siguinete es incorrecta%

    Ms(ox (H@ola usuario% @a acaado el procesoH% V*?*nly% HensajeH)

    6eria correcto poner 

    M7 Ms(ox (H@ola usuario% @a acaado el procesoH% V*?*nly% HensajeH)

    $n este caso% aunque M recia un valor y luego no se utilize para nada se pone para que Visual Basic no d# error.

        3a instrucci-n With)6uponemos que llegado a este punto le parecer' engorroso tener que re"erirse a los ojetos siguiendo toda o casi toda la

     jerarqu3a. Ga &emos indicado que es mejor &acerlo de esta manera porque el programa gana en claridad y elegancia y%

    consecuentemente% el programador gana tiempo a la &ora de &acer modi"icaciones o actualizaciones. La sentencia With

    le ayudar' a tener que escriir menos código sin que por esto el programa pierda en claridad. oncretamente esta

    "unción sirve para ejecutar una serie de acciones sore un mismo *jeto. 6u sintaxis es la siguiente.

    With *jeto

    ,nstruccionesEnd With

    !epetiremos el ejemplo C9 utilizando esta sentencia. *serve como con With se &ace re"erencia al ojeto %cti&eSheet.

      Eje"plo .@)

    $ntrar el 5omre% la cantidad y el precio de un producto desde el teclado y guardarlos respectivamente en AC% A8 y A9.alcular el total y guardarlo en AP. 6i el total es superior a CE.EEE o el nomre del producto el H4atatasH% pedir un

    descuento% calcularlo el total descuento y guardarlo en A:% luego restar el descuento del total y guardarlo en AQ.

    Sub $jemploDCT()

    5i" 4roducto %s Strin

    5i" antidad %s ,nteer5i" 4recio %s Sinle

    5i" =otal %s Sinle

    5i" 0escuento %s Sinle5i" =otalD0escuento %s Sinle

    4recio 7 E

    4roducto 7 ,nputBox(H$ntrar 5omre del 4roductoH%H$ntrarH)

    4recio 7 Val(,nputBox(H$ntrar el precioH% H$ntrarH))antidad 7 Val(,nputBox(H$ntrar la cantidadH% H$ntrarH))

    =otal 7 4recio W antidad

    With Active6&eet.!ange(HACH).Value 7 4roducto

    .!ange(HA8H).Value 7 4recio

    .!ange(HA9H).Value 7 antidad

    .!ange(HAPH).Value 7 =otalEnd With

    0 "i total ma*or 4ue 287888 o el producto es Patatas9 aplicar descuento7,f =otal R CEEEE Or Lcase(4roducto) 7 HpatatasH 2hen

    0escuento 7 Val(,nputBox(H$ntrar 0escuentoH% H$ntrarH))

    =otalD0escuento 7 =otal W (0escuento ; CEE)

     #$%ina ): de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    27/93

     MACROS EN MS EXCEL=otal 7 =otal S =otalD0escuento

    With Active6&eet

    .!ange(HA:H).Value 7 =otalD0escuento

    .!ange(HAQH).Value 7 =otalEnd With

    End ,f 

    End Sub

    Estructuras Repetiti&as)$ste tipo de estructuras permiten ejecutar m's de una vez un mismo loque de sentencias.

      Eje"plo 1A)

    6upongamos que tenemos que &acer un programa para entrar las notas de una clase de : alumnos que se guardaran

    respectivamente en las celdas de AC a A: de la &oja activa. 0espu#s &acer la media que se guardar' en AQ. on lasestructuras vistas &asta a&ora% podr3amos &acer

    Sub $jemploD8E ()

    5i" 5ota %s ,nteer

    5i" edia %s Sinle

    edia 7 E

     5ota 7 Val(,nputBox(H$ntrar la C 5ota H%H$ntrar 5otaH))

    Active6&eet.!ange(HACH).Value 7 5ota

    edia 7 edia O 5ota

     5ota 7 Val(,nputBox(H$ntrar la C 5ota H%H$ntrar 5otaH))

    Active6&eet.!ange(HA8H).Value 7 5ota

    edia 7 edia O 5ota

     5ota 7 Val(,nputBox(H$ntrar la C 5ota H%H$ntrar 5otaH))

    Active6&eet.!ange(HA9H).Value 7 5otaedia 7 edia O 5ota

     5ota 7 Val(,nputBox(H$ntrar la C 5ota H%H$ntrar 5otaH))

    Active6&eet.!ange(HAPH).Value 7 5ota

    edia 7 edia O 5ota

     5ota 7 Val(,nputBox(H$ntrar la C 5ota H%H$ntrar 5otaH))

    Active6&eet.!ange(HA:H).Value 7 5ota

    edia 7 edia O 5ota

    edia 7 edia ; :

    Active6&eet.!ange(HAQH).Value 7 edia

    End Sub

    *serve que este programa repite el siguiente loque de sentencias% : veces.

     5ota 7 Val(,nputBox(H$ntrar la C 5ota H%H$ntrar 5otaH))

    Active6&eet.!ange(HA:H).Value 7 5ota

    edia 7 edia O 5ota

     #$%ina ); de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    28/93

     MACROS EN MS EXCEL4ara evitar esta tipo de repeticiones de código% los lenguajes de programación incorporan instrucciones que permiten la

    repetición de loques de código.

        Estructura repetiti&a Para 8for:)$sta estructura sirve para repetir la ejecución de una sentencia o loque de sentencias% un n/mero de"inido

    de veces. La estructura es la siguiente

    Para var 7ValorD,nicial *asta ValorD1inal Paso ,ncremento *acer

    ,nicio

    6entencia C

    6entencia 8.

    .

    6entencia 5$in

    !ar es una variale que la primera vez que se entra en el ucle se iguala a %alor_6nicial % las sentencias del ucle seejecutan &asta que !ar llega al %alor_Final % cada vez que se ejecutan el loque de instrucciones !ar se incrementaseg/n el valor de 6ncremento.

    $n Visual Basic para $xcel la estructura 4ara se implementa con la instrucción $or ...

  • 8/20/2019 ! Macros Con MS EXCEL

    29/93

  • 8/20/2019 ! Macros Con MS EXCEL

    30/93

     MACROS EN MS EXCEL5i" 1ila %s ,nteer% olumna %s ,nteer

    asillaD,nicial 7 ,nputBox(H,ntroducir la casilla ,nicial H% Hasilla ,nicialH)

    Active6&eet.!ange(asillaD,nicial).Activate1ila 7 C

    $or i 7 C 2o CEActive6&eet.!ange(asillaD,nicial).ells(1ila% C).Value 7 i

    1ila 7 1ila O C

  • 8/20/2019 ! Macros Con MS EXCEL

    31/93

     MACROS EN MS EXCEL

    edia 7 E

    Active6&eet.!ange(HACH).Activate

    $or 1ila 7 E 2o P

     5ota7Val(,nput Box(H$ntrar la H N 1ilaOC N H 5ota H% H$ntrar 5otaH))Activeell.*""set(1ila% E).Value 7 5ota

    edia 7 edia O 5ota

  • 8/20/2019 ! Macros Con MS EXCEL

    32/93

     MACROS EN MS EXCELlos que no se sae previamente el n/mero de veces que se dee repetir un proceso. 4or ejemplo% suponga que &a de

    recorrer un rango de "ilas en los que no se sae cuantos valores &ar' (esto es% cuantas "ilas llenas &ar')% en ocasiones

     puede que &ayan veinte% en ocasiones treinta% en ocasiones ninguna% etc. 4ara estos casos la estructura for no es

    adecuada y deeremos recurrir a la sentencia 5o While..3oop en alguna de sus "ormas. $sta estructura repetitiva est'controlada por una o varias condiciones% la repetición del loque de sentencias depender' de si se va cumpliendo la

    condición o condiciones.

    *acer Mientras (se cumpla la condición)6entenciaC

    6entencia8

    .

    .6entencia 5

    $in *acer Mientras

    $n Visual Basic

    5o While (se cumpla la condición)

    6entenciaC

    6entencia8

    .

    .

    6entencia 53oop

    WW Los ejemplos que veremos a continuación sore la instrucción 5o While..3oop se &ar'n sore una ase de datos.

    Una ase de datos en $xcel es simplemente un rango de celdas en que cada "ila representa un registro y cada columna uncampo de registro% la primera "ila es la que da nomre a los campos. 4ara nuestra ase de datos utilizaremos los campos

    siguientes% Nombre% 1iudad % /dad % Fec&a. 4onga estos t3tulos en el rango AC0C de la @ojaC ($n AC ponga 5omre% enBC ponga iudad% en C ponga $dad y en 0C 1ec&a)% oserve que los datos se empezar'n a entrar a partir de A8.

      Eje"plo 1>)

    4rograma para entrar registros en la ase de datos. ada campo se entra con ,nputBox. $l programa va pidiendo datos

    mientras se entre un valor en el ,nputBox correspondiente al nomre% es decir cuando al preguntar el nomre no se entrening/n valor% terminar' la ejecución del loque encerrado entre 5o While...3oop. *serve la utilización de la propiedad

    Offset para colocar los datos en las celdas correspondientes.

    Sub $jemploD8F()

    5i" 5omre %s Strin

    5i" iudad %s Strin5i" $dad %s ,nteer

    5i" "ec&a %s 5ate

    ctiar &oja2>or?6&eets(H@ojaCH).Activate

    ctiar casilla >Active6&eet.!ange(HA8H).Activate

     5omre 7 ,nputBox(H$ntre el 5omre (!eturn para =erminar) H% H5omreH)

    #ientras la ariable Nombre sea diferente a cadena ac$a5o While 5omre XR HH

    iudad 7 ,nputBox(H$ntre la iudad H% HiudadH)$dad 7 Val(,nputBox(H$ntre la $dad H% H$dadH))

    1ec&a7date(,nputBox(H$ntra la 1ec&a H% H1ec&aH))

     #$%ina () de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    33/93

     MACROS EN MS EXCEL

    1opiar los datos en las casillas correspondientesWith Activeell

    .Value 7 5omre

    .*""set(E%C).Value 7 iudad

    .*""set(E%8).Value 7 $dad

    .*""set(E%9).Value 7 "ec&aEnd With

    -acer actia la celda de la fila siguiente a la actual Activeell.*""set(C%E).Activate

     5omre 7 ,nputBox(H$ntre el 5omre (!eturn para =erminar) H% H5omreH)

    3oop

    End Sub

      Eje"plo 1?)

    4reste especial atención a este ejemplo ya que seguro que el código que viene a continuación lo utilizar' en muc&asocasiones. Antes que nada oserve el ejemplo anterior% "3jese en que siempre empezamos a llenar el rango de la &oja a

     partir de la celda A8% esto tiene una ne"asta consecuencia% la segunda vez que ejecute la macro mac&acar' los datos de

    A808 y si continua ejecutando mac&acar' los datos de los rangos siguientes. Una solución seria oservar cual es la

    casilla vac3a siguiente y camiar en la instrucción %cti&eSheet)Rane8G%1G:)%cti&ate % la re"erencia %1  por la quecorresponde a la primera casilla vac3a de la columna A. $l código que le mostramos a continuación &ar' esto por 

    nosotros% es decir recorrer' una "ila de celdas a partir de AC &asta encontrar una vac3a y dejar' a esta como celda activa

     para que la entrada de datos comience a partir de ella.

    Sub $jemploD8K()

    ctiar &oja2>or?6&eets(H@ojaCH).Activate ctiar casilla >Active6&eet.!ange(HACH).Activate

    #ientras la celda actia no esté ac$a5o While or?6&eets(H@ojaCH).ActivateActive6&eet.!ange(HACH).Activate

     #$%ina (( de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    34/93

     MACROS EN MS EXCEL !uscar la primera celda ac$a de la columna * conertirla en actia5o While

  • 8/20/2019 ! Macros Con MS EXCEL

    35/93

     MACROS EN MS EXCEL$l "uncionamiento de esta estructura repetitiva es similar a la anterior salvo que la condición se eal+a al final % lainmediata consecuencia de esto es que las instrucciones del cuerpo del ucle se ejecutaran al menos una vez . *serve

    que para nuestra estructura de entrada de datos vista en el /ltimo apartado de la sección anterior esta estructura es m's

    conveniente% al menos m's elegante% si vamos a entrar datos% al menos uno entraremos% por tanto las instrucciones delcuerpo del ucle se deen ejecutar al menos una vez% luego ya decidiremos si se repiten o no.

    5o

     5omre 7 ,nputBox(H$ntre el 5omre (!eturn para =erminar) H% H5omreH)iudad 7 ,nputBox(H$ntre la iudad H% HiudadH)

    $dad 7 Val(,nputBox(H$ntre la $dad H% H$dadH))

    1ec&a7date(,nputBox(H$ntra la 1ec&a H% H1ec&aH))

    With Activeell

    .Value 7 5omre

    .*""set(E%C).Value 7 iudad

    .*""set(E%8).Value 7 $dad

    .*""set(E%9).value 7 "ec&a

    End With

    Activeell.*""set(C%E).Activate

    asDdatos 7 sgBox(H*tro registro ]H% vGes5oOvZuestion%H$ntrada de datosH)

    #ientras #as_Datos G bes3oop While asD0atos 7 vGes

    *serve que en este caso no es necesario la l3nea asD0atos 7 vGes antes de 5o para "orzar la entrada en el ucle ya

    que la condición va al "inal.

        Estructura 5o))3oop /ntil 8*acer)) *asta que se cu"pla la condici-n:)$s otra estructura que eval/a la condición al "inal oserve que la interpretación es distinta ya que el ucle se va

    repitiendo *%S2% que se cu"ple la condici-n% no ,$5=!A6 se cumple la condición. ual de los dos utilizar% pues%

    no se sorprenda% la que entienda mejor o le guste m's. La entrada de datos con este ucle quedar3a

    5o 5omre 7 ,nputBox(H$ntre el 5omre (!eturn para =erminar) H% H5omreH)

    iudad 7 ,nputBox(H$ntre la iudad H% HiudadH)

    $dad 7 Val(,nputBox(H$nt re la $dad H% H$dadH)1ec&a7date(H,nputBox(H$ntra la 1ec&a H% H1ec&aH)

    With Activeell

    .Value 7 5omre

    .*""set(E%C).Value 7 iudad

    .*""set(E%8).Value 7 $dad

    .*""set(E%9).value 7 "ec&aEnd With

    Activeell.*""set(C%E).Activate

    asDdatos 7 sgBox(H*tro registro ]H% vGes5oOvZuestion%H$ntrada de datosH)

    -asta 4ue #as_Datos sea igual a bNo3oop /ntil asD0atos7v5o

        Estructura $or Each)

     #$%ina (4 de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    36/93

     MACROS EN MS EXCEL$ste ucle se utiliza 'sicamente para ejecutar un grupo de sentencias con los elementos de una colección o una matriz

    (pronto veremos los que es). !ecuerde que una colección es un conjunto de ojetos% &ojas% rangos% etc. Vea el ejemplo

    siguiente que se utiliza para camiar los nomres de las &ojas de un liro de traajo.

      Eje"plo 1@)

    4rograma que pregunta el nomre para cada &oja de un liro de traajo% si no se pone nomre a la &oja% queda el que

    tiene.

    Sub $jemploD8T()

    5i" 5uevoD5omre %s Strin

    5i" @oja %s WorkSheet

    Para cada &oja del conjunto IorJ"&eets$or Each @oja ,n >or?6&eets

     5uevoD5omre7,nputBox(H5omre de la @oja H N @oja.5ame%H5omrar @ojasH)

    ,f 5uevoD5omre XR HH 2hen

    @oja.5ame75uevoDnomreEnd if 

    or?6&eet% etc.) deen inicializarse muc&as veces a trav#s de la instrucción 6$= % esto se

    estudiar' en otro cap3tulo.

    Procedi"ientos ' funciones)6e de"ine como procedimiento i;o "unción a un loque de código que realiza alguna tarea. @asta a&ora% &emos

    construido los programas utilizando un /nico procedimiento% pero a medida que los programas (y los prolemas) crecense va &aciendo necesaria la inclusión de m's procedimientos. 4odr3a "'cilmente caer en la tentación de utilizar% como

    &asta a&ora% un /nico procedimiento por programa pero se dar' cuenta r'pidamente de que este m#todo no es nada

     pr'ctico ya que grandes loques de código implican mayor complicación del mismo% repetición de sentencias y lo que es

    m's grave% mayores prolemas de seguimiento a la &ora de depurar errores% ampliar "uncionalidades o incluir modi"icaciones.

    La "iloso"3a de utilizar procedimientos es la antigua "órmula del Hdivide y vencer'sH% es decir% con los procedimientos

     podremos tratar cada prolema o tarea de "orma m's o menos aislada de "orma que construiremos el programa paso a paso evitando tener que resolver o controlar m/ltiples cosas a la vez. ada tarea la realizar' un procedimiento% si esta

     #$%ina (: de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    37/93

     MACROS EN MS EXCELtarea implica la ejecución de otras tareas% cada una se implementar' y solucionar' en su correspondiente procedimiento

    de manera que cada uno &aga una cosa concreta. As3% los di"erentes pasos que se deen ejecutar para que un programa

    &aga algo% quedaran ien de"inidos cada uno en su correspondiente procedimiento% si el programa "alla% "allar' a partir de

    un procedimiento y de esta "orma podremos localizar el error m's r'pidamente.

    Los procedimientos son tami#n un e"icaz mecanismo para evitar la repetición de código en un mismo programa e

    incluso en di"erentes programas. 6uponemos que &ar' intuido que &ay muc&as tareas que se repiten en casi todos los

     programas% veremos como los procedimientos que ejecutan estas tareas se pueden incluir en un módulo de "orma queeste sea exportale a otros programas y de esta manera ganar tiempo que% como dice el tópico% es precioso.

        5efinir un procedi"iento)Ga lo &emos &ec&o unas cuantas veces% pero a&3 va de nuevo.

    Sub 5omreD4rocedimento

    6entencias.End Sub.

        3la"ar a un procedi"iento)4ara llamar un procedimiento desde otro se utiliza la instrucción Call Nombre_Procedimiento.

    Sub 4DUno6entencias..

    Call 4D0os

    .

    6entencias.

    End Sub

    Las secuencias del procedimiento  P_Uno se ejecutan &asta llegar a la l3nea Call  P_Dos% entonces se salta al procedimiento P_Dos% se ejecutan todas las sentencias de este procedimiento y el programa continua ejecut'ndose en el procedimiento P_Uno a partir de la sentencia que sigue a Call P_Dos.

    Eje"plo 61)$s el mismo programa que el visto en el ejemplo 8T pero el código que salta casilla &asta que se encuentra una vac3a se

    implementa en un procedimiento llamado% "altar_1eldas_5lenas. *serve que para entrar valores se &a sustituido 0o>&ile..Loop por 0o.. Loop >&ile.

    Sub $jemploD98()

    5i" 5omre %s Strin5i" iudad %s Strin

    5i" $dad %s ,nteer

    5i" "ec&a %s 5ate

    0 5lamada a la función "altar_1eldas_5lenas9 el programa salta a4u$ a ejecutar las

    0instrucciones de este procedimiento * luego uele para continuar la ejecución a partir de la0instrucción DoCall 6altarDeldasDLlenas

    5o

     5omre 7 ,nputBox(H$ntre el 5omre (!eturn para =erminar) H% H5omreH)

    iudad 7 ,nputBox(H$ntre la iudad H% HiudadH)

    $dad 7 Val(,nputBox(H$ntre la $dad H% H$dadH))1ec&a7date(,nputBox(H$ntra la 1ec&a H% H1ec&aH))

     #$%ina (; de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    38/93

     MACROS EN MS EXCELWith Activeell

    .Value 7 5omre

    .*""set(E%C).Value 7 iudad

    .*""set(E%8).Value 7 $dad

    .*""set(E%9).value 7 "ec&a

    End With

    Activeell.*""set(C%E).Activate

    asDdatos 7 sgBox(H*tro registro ]H% vGes5oOvZuestion%H$ntrada de datosH)

    3oop While asD0atos 7 vGes

    End Sub

    0 Función 4ue salta celdas de una misma columna7 "i re para encontrar la primera celda ac$a de la0 columnaSub 6altarDeldadDLlenas()

    >or?6&eets(H@ojaCH).Activate

    Active6&eet.!ange(HACH).Activate

    5o >&ile not ,s$mpty(Activeell)

    Activeell.*""set(C%E).Activate3oop

    End Sub

        4enerali;ar una funci-n)*serve que para saltar un rango de casillas llenas sólo necesitar' llamar a la "unción 6altarDeldasDLlenas% pero%siempre y cuando este rango est# en una &oja llamada H@ojaCH y empiece en la casilla AC% el procedimiento es poco

     pr'ctico ya que su 'mito de "uncionamiento es limitado. $n la siguiente sección modi"icaremos el procedimiento de

    manera que sirva para recorrer un rango que empiece en cualquier casilla de cualquier &oja.

    Pará"etros)

    Los par'metros son el mecanismo por el cual un procedimiento puede pasarle valores a otro y de esta "orma condicionar%

    moldear% etc. las acciones que ejecuta. $l procedimiento llamado gana entonces en "lexiilidad. La sintaxis de llamada

    de un procedimiento es la siguiente%

    Call 4rocedimiento(4ar'metroC% 4ar'metro8%...% 4ar'metro5)

    Los par'metros pueden ser valores o variales.

    La sintaxis para el procedimiento llamado es la siguiente%

    Sub 4rocedimiento(4ar'metroC as =ipo% 4ar'metro8 As =ipo%...% 4ar'metro9 As =ipo)

    *serve que aqu3 los par'metros son variales que reciir'n los valores% evidentemente dee &aer coincidencia de tipo.

    4or ejemplo% si el primer par'metro es una variale tipo ,nteger% el primer valor que se le dee pasar al procedimiento

    cuando se llama tami#n &a de ser de tipo ,nteger (recuerde que puede ser un valor directamente o una variale).

    Eje"plo 66)

    $l mismo programa que en el ejemplo 98 pero a&ora la "unción 6altarDeldasDLlenas tiene dos par'metros @oja y

    asillaD,nicial que recien respectivamente la &oja donde est' el rango a recorrer y la casilla inicial del rango.

    Sub $jemploD99()

    5i" 5omre %s Strin

    5i" iudad %s Strin

    5i" $dad %s ,nteer

     #$%ina (< de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    39/93

  • 8/20/2019 ! Macros Con MS EXCEL

    40/93

     MACROS EN MS EXCEL0 @bsere 4ue los parHmetros son dos ariables cu*o alor se &a entrado desde teclado en0 las dos instrucciones 6nput!o, anteriores7Call 6altarDeldasDLlenas(@oja% asillaD,nicial)

    .

    .

    End Sub

    !ariables locales ' &ariables 4lobales)

    $l 'mito de una variale declarada dentro de una "unción es la propia "unción% es decir no podr' utilizares "uera de

    dic&a "unción. As3% el siguiente programa que deer3a sumar las cinco "ilas siguientes a partir de la casilla activa y

    guardar el resultado en la sexta es incorrecto.

    Sub AlgunaDosa()

    .

    .Call 6umarDincoD6iguientesActiveell.*""set(Q%E).Value 7 6uma

    .

    .End Sub

    Sub 6umarDincoD6iguientes()

    5i" i %s ,nteer

    5i" 6uma %s Sinle

    6uma7E$or i7C 2o :

    6uma 7 6umaOActiveell.*""set(i%E).Value

  • 8/20/2019 ! Macros Con MS EXCEL

    41/93

     MACROS EN MS EXCEL5i" i %s ,nteer

    6uma7E$or i7C 2o :

    6uma 7 6umaOActiveell.*""set(i%E).Value

  • 8/20/2019 ! Macros Con MS EXCEL

    42/93

     MACROS EN MS EXCELAntes de copiar el programa% active una &oja en lanco y ponga valores del C al C: distriuidos de la "orma siguiente% en

    el rango ACA: valores del C al :% en el rango BCB: valores del Q al CE% en el rango C: valores del CC al C:.

    $l siguiente programa dee recorrer cada una de tres las columnas de valores% sumarlos y poner el resultado en las "ilas Qde cada columna. $ntonces% seg/n los valores que &a entrado en cada una de las columnas% cuando &aya acaado la

    ejecución del programa dee &aer los siguientes resultados% AQ 7 C:% BQ7PE% Q7Q:. 4ara llevar a cao la suma de los

    valores de cada columna se llama a la "unción Recorrer_"umar tres veces% una para cada columna% esta "unción recie enel par'metro F el valor de la "ila donde dee empezar a sumar% sore el par'metro 1 el valor de la columna a sumar ysore el par'metro K la cantidad de "ilas que &a de recorrer.

    $l programa utiliza la propiedad Cells  para re"erenciar las "ilas y columnas de los rangos. *serve atentamente los

    valores que ir' cogiendo la variale Fila ya que esta ser' la que su"ra el e"ecto lateral.

    Sub $"ectoDLateral()

    5i" 1ila %s ,nteer

    1ila 7 C

    Call !ecorrerD6umar(1ila% C%:) 0 1olumna

    Call !ecorrerD6umar(1ila% 8%:) [ 1olumna !Call !ecorrerD6umar(1ila% 9%:) [ 1olumna 1 

    End Sub

    Sub !ecorrerD6umar(1 %s ,nteer% %s ,nteer% Z %s ,nteer)

    5i" i %s ,nteer

    5i" =otal %s ,nteer

    =otal 7 E$or i 7C 2o Z

    =otal 7 =otal O Active6&eet.ells(1% ).Value

    171OC 0 @L@ con esta asignación9 recuerde 4ue F es la ariable Fila declarada en

    0 el procedimiento /fecto_5ateral 

  • 8/20/2019 ! Macros Con MS EXCEL

    43/93

     MACROS EN MS EXCELque F era la variale Fila% pues ien% esto no es cierto Fila es una variale y  F es otra variale% a&ora es lógico que se

     pregunte por qu# entonces  F act/a como si "uera Fila% este es un tema que no entra en el 'mito de este manual% sialguna vez programa en y llega al tema de los punteros entender' que es lo que sucede realmente en el paso por 

     par'metro y en el paso por valor. 6i ya conoce los punteros de o 4ascal entonces ya &ar' intuido que el paso por valor en nuestro ejemplo equivaldr3a a%

    !ecorrerD1ila(1% % Z)-

    void !ecorrerD1ila(int 1% int % int Z)

    G un paso por re"erencia a

    !ecorrerD1ila(N1% % Z)-

    Void !ecorrerD1ila(int W1% int % int Z)

        $unciones)

    Una "unción es lo mismo que un procedimiento con la salvedad que este devuelve un valor al procedimiento o "unción

    que lo llama. Vea el siguiente ejemplo% es una "unción muy sencilla ya que simplemente suma dos n/meros y devuelve elresultado.

    Eje"plo 67)

    1unción que devuelve la suma de dos valores que se le pasan como par'metros. *serve las di"erentes "ormas en como

    se llama la "unción.

    Sub $jemploD9P()

    5i" x %s ,nteer

    5i" nC %s ,nteer% n8 %s ,nteer

    M 7 6uma(:% :)

    nC7 Val ( ,nputBox(H$ntrar un n/mero H% H$ntradaH))

    n87 Val ( ,nputBox(H$ntrar otro n/mero H% H$ntradaH))

    M7 suma(nC%n8)

    Activeell.Value 7 6uma(Active6&eet.!ange(HACH).Value % Active6&eet.!ange(HA8H).Value)

    M 7 6uma(:% P) O 6uma (nC% n8)

    End Sub

    $unction 6uma(VC %s ,nteer% V8 %s ,nteer) %s ,nteer

    5i" =otal %s ,nteer

    =otal 7 VC O V8

    6uma 7 =otal

    End $unction

     #$%ina 2( de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    44/93

     MACROS EN MS EXCEL*serve la sintaxis de la caecera de "unción%

    $unction 6uma(VC %s ,nteer% V8 %s ,nteer) %s ,ntee r

    La estructura general seria%

    $unction Nombre_Funcion(parC %s 2ipo% par8 %s 2ipo%...% par5 %s 2ipo) %s 2ipo.

    La sintaxis es similar a la caecera de un procedimiento% sólo que una "unción tiene tipo% esto tiene su lógica% ya que una

    "unción devuelve un valor% ese valor ser' de un tipo determinado. As3% en nuestro ejemplo de $unction "uma% esta"unción es de tipo ,nteer% o dic&o de otra manera% la "unción ejecuta sus sentencias y devuelve un valor &acia el

     procedimiento o la "unción que la llamó% el valor devuelto se estalece igualando el nomre de la "unción a algo%

     5omreD1unción 7 ....

    $n el ejemplo de $unction 6uma%

    6uma 7 =otal

    *serve tami#n la sintaxis de la llamada a la "unción% en el ejemplo &emos utilizado unas cuantas "ormas de llamarla%

    lo que dee tener siempre presente es que en cualquier expresión aritm#tica o de c'lculo% el ordenador realiza un m3nimode dos operaciones% una de c'lculo y otra de asignación. 4or ejemplo%

    A7 BO

    $l ordenador primero calcula el resultado de sumar BO luego asigna ese resultado a la variale A. $n cualquier llamada

    a una "unción% cojamos por caso%

    M7 suma(nC%n8)

    4rimero se ejecutan todas las sentencias de la "unción 6uma% luego se asigna el c'lculo de la "unción a la variale M. 0e

    otro vistazo a la "unción de ejemplo y vea lo que realiza cada sentencia en la que se llama a la "unción "uma.

    Veamos a continuación unos cuantos ejemplos de "unciones. Antes recordarle que todo lo re"erente a par'metros por valor y re"erencia% variales locales y gloales% etc. que estudiamos en los procedimientos es lo mismo para las

    "unciones.

    Eje"plo 60)

    1unción que devuelve la dirección de la primera celda vac3a de un rango. La "unción es de tipo Strin ya que devuelve

    la casilla en la "orma H1ilaolumna H% por ejemplo HACEH. Utilizaremos la propiedad %ddress del ojeto range% esta propiedad devuelve un string que contiene la re"erencia H1ilaolumnaH de una casilla o rango de casillas. $n el caso de

    un rango devuelve%

    H1ilaolumnaD,nicial1ilaolumnaD1inalH% por ejemplo HACCEH

    Sub $jemploD9:()

    5i" asilla %s Strin

    asilla 7 asillaDVacia(HACH)

    ......

    $nd 6u

    0 Función 1asilla_%acia de Tipo "tring 

     #$%ina 22 de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    45/93

     MACROS EN MS EXCEL0 "ire para ; Recorrer las filas de una columna &asta encontrar una ac$a70 ParHmetros .0 1asilla_6nicio . 1asilla donde debe empe'ar a buscar70 Deuele ;Un string 4ue contiene la referencia de la primera casilla$unction asillaDVacia(asillaD,nicio %s Strin) %s Strin

    Active6&eet.!ange(asillaD,nicio).Activate

    5o While

  • 8/20/2019 ! Macros Con MS EXCEL

    46/93

     MACROS EN MS EXCELEnd if 

    End $unction

    Eje"plo 6=)

    6imilar al anterior. B/squeda secuencial de un valor en un rango de casillas% en esta "unción se avanzar' a trav#s de "ilas

    y columnas. La "unción devuelve la dirección (address) de la casilla donde est' el valor uscado% en caso que el valor noest# en el rango% devuelve una cadena vac3a (HH).

    Sub $jemploD9Q()

    5i" asilla %s 6tring

    asilla 7 BuscarDValor(HACH% 8:)

    ,f asilla 7 HH 2hen

    .....Else

    ....

    End if 

    End Sub

    $unction Buscar(asillaD,nicial%s Strin% ValorDBuscado %s ,nteer) As Strin

    5i" ,ncrementoDolumna %s ,nteer

    5i" ontinuar %s (oolean

    Active6&eet.!ange(asillaD,nicial).Activate

    ontinuar 7 =rue

    5o While ontinuar 

    ,ncrementoDolumna 7 E

    0 !uscar el alor por las columnas &asta encontrarlo o encontrar una celda ac$a75o While

  • 8/20/2019 ! Macros Con MS EXCEL

    47/93

     MACROS EN MS EXCELElse 0 5a casilla estH ac$a9 N@ se &a encontrado el alor buscado

    Buscar7HH 0 Deoler una cadema ac$aEnd if 

    End $unction

    3a cláusula Pri&ate)

    4uede anteponer la cl'usula private a todos los procedimientos y "unciones que sean llamados sólo desde el mismomódulo% es una "orma de a&orrar memoria y &acer que el programa corra un poco m's r'pido. 6i necesita llamar un

     procedimiento o "unción desde otro módulo% nunca dee precederlo por la cl'usula private% recuerde que esta cl'usularestringe el 'mito de utilización de un procedimiento a su propio módulo. 6upongamos el ejemplo siguiente.

    0 #ódulo 2

    Sub Jeneral

    ....End Sub

    Pri&ate Sub 4rivado

    ....

    End Sub

    [ #ódulo >

    Sub 4rocedimientoDdeDmodulo8

    0 /sto es correcto7 5lama al procedimiento eneral definido en #ódulo2Call Jeneral

    0 /sto no es correcto7 5lama al procedimiento Priado definido en #ódulo 29 este0 procedimiento a precedido pro la clHusula Priate9 por tanto sólo puede ser llamado0 desde procedimientos de su propio móduloCall 4rivado

    End Sub

    Vamos a ver a continuación tres ejemplos m's sore "unciones. $s importante que los cree en un liro de traajo nuevo ylos ponga en un mismo módulo% al "inal del cap3tulo utilizaremos las opciones de exportar e importar módulos de

     procedimientos y "unciones. $n todos los ejemplos ver' el procedimiento 4rocedimientoDLlamador% es para mostrar de

    que "orma se dee llamar al procedimiento o "unción. Los procedimientos implementados son% por llamarlo de alguna

    manera% de tipo general% es decir% son procedimientos que podr' utilizar en muc&as aplicaciones.

    Eje"plo 6>)

    4rocedimiento que are un cuador sgBox y muestra el texto que se le paso como par'metro.

    Sub 4rocedimientoDLlamador()

    .

    .Call mAviso(H$sto es el mensaje de avisoH% H$sto es el =3tuloH)

    .

    .End Sub

    0 Procedimiento miso0 Función ; #ostrar el cuadro de función #sg!o,9 con el icono información * el botón @O (ceptar)70 "e utili'a para mostrar aisos7

     #$%ina 2; de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    48/93

     MACROS EN MS EXCEL0 ParHmetros.

    0 Te,to G Te,to 4ue muestra el cuadro0 Titulo G T$tulo del cuadro

    Sub mAviso(=exto %s Strin% =itulo %s Strin)

    sgBox 4rompt7=exto% Buttons7v*Y*nly O v,n"ormation% =itle7=itulo

    End Sub

    Eje"plo 6?)

    1unción tipo range que devuelve un rango. *serve como la "unción se iguala a una variale tipo !ange% recuerde que

    con esta variale podr' acceder a todas las propiedades e invocar todos los m#todos propios de los ojetos !ange. $n

    este ejemplo en concreto se utilizan las variales para opiar un grupo de celdas de un rango &acia otro% se utilizan losm#todos opy y 4aste del ojeto !ange.

    Sub 4rocedimientoDLlamador()

    5i" !angoD*rigen %s Rane5i" !angoD0estino %s Rane

    Set !angoD*rigen7ogerD!ango(AC%:%:)

    !angoD*rigen.opy

    Set !angoD0estino7ogerD!ango(JC%:%:)!angoD0estino.4aste 4aste6pecial7xl4asteAll

    End Sub

    0 Función 4ue deuele un rango a una ariable de este tipo0 ParHmetros

    0 1asilla G casilla inicial del rango0 Filas G n+mero0 de filas0 1olumnas G n+mero de columnas del rango$unction ogerD!ango(asilla %s Strin% 1ilas %s ,nteer% olumnas %s ,nteer) %s Rane

    5i" asillaD1inal %s Strin

    Active6&eet.!ange(asilla).Activate

    Activeell.ells(1ilas% olumnas).Activate

    asillaD1inal 7 Activeell.Address

    Active6&eet.!ange(asilla N HH N asillaD1inal).6elect

    Set ogerD!ango 7 Active6&eet.!ange(asilla N HH N asillaD1,nal)

    End $unction

    Eje"plo 6@)

    1unción para comproar el tipo de datos. $s una "unción de comproación que se puede utilizar para validar los datosque se entran desde un cuadro ,nputBox o desde los cuadros de texto de "ormularios. La "unción es de tipo Booleano%

     #$%ina 2< de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    49/93

     MACROS EN MS EXCELdevuelve =rue (cierto) o 1alse en "unción de si el dato pasado es correcto. $n esta "unción se eval/an sólo datos

    num#ricos y datos tipo 1ec&a% puede ampliarla para que se comprueen m's tipos.

    Sub 4rocedimientoDLlamador()

    5i" antidad %s ,nteer

    5i" 1ec&a %s 5ate5i" 0atos %s Strin

    .

    .

    0atos 7 ,nputBox(H$ntrar una antidad H% H$ntrarH),f

  • 8/20/2019 ! Macros Con MS EXCEL

    50/93

     MACROS EN MS EXCELEnd ,f 

    End Select

    omproarD=ipo 7 ValidoEnd $unction

        

    ,"portar ' Exportar "-dulos)

    Los /ltimos tres ejemplos que &emos visto% como le &emos indicado% son procedimientos que pueden ser utilizados en

    multitud de ocasiones o situaciones% seria interesante tenerlos disponiles en cualquiera de las &ojas que

    con"eccionemos. 4odr3a pensar en utilizar las opciones de copiar y pegar para pasar procedimientos de una &oja a otra%es un m#todo totalmente v'lido y e"ectivo% pero le proponemos a continuación otro m#todo m's Hpro"esionalH% por 

    llamarlo de otra manera% e igual de e"ectivo. $ste m#todo consiste en guardar los procedimientos de un módulo en un

    arc&ivo aparte% es decir% independiente de cualquier &oja de c'lculo% luego% cuando en una nueva &oja necesite estas

    "unciones% solo deer' importar este arc&ivo para incorporarlo.

    Exportar un "-dulo) 4uardar un "-dulo en un archi&o)

    omo ejemplo% ara la &oja donde puso los tres /ltimos procedimientos.

    C. 4ase al editor de visual asic y active el módulo a exportar.

    8. Active opción de la arra de men/s %rchi&o+ Exportar archi&o. Aparece un cuadro de di'logo.9. $n cuadro de edición

  • 8/20/2019 ! Macros Con MS EXCEL

    51/93

     MACROS EN MS EXCEL4oner ordes al rango que va de AC a JQ.

    Sub 4onerDBordes()

    0 "eleccionar el rango 2.B !ange(HACJQH).6elect

    0 No &a* borde diagonal &acia abajo6election.Borders(xl0iagonal0on).Line6tyle 7 xl5one

    0 No &a* borde diagonal &acia arriba6election.Borders(xl0iagonalUp).Line6tyle 7 xl5one

    0 !orde i'4uierdo de la seleccónWith 6election.Borders(xl$dgeLe"t)

    .Line6tyle 7 xlontinuous 0/stilo de linea continuo

    .>eig&t 7 xledium 0 nc&o de l$nea #edio

    .olor,ndex 7 xlAutomatic 0 1olor de l$nea automHtico (negro)End With

    0 !orde superior de la selecciónWith 6election.Borders(xl$dge=op)

    .Line6tyle 7 xlontinuous

    .>eig&t 7 xledium

    .olor,ndex 7 xlAutomatic

    End With

    0 !orde inferior de la selecciónWith 6election.Borders(xl$dgeBottom)

    .Line6tyle 7 xlontinuous

    .>eig&t 7 xledium

    .olor,ndex 7 xlAutomatic

    End With

    0 !orde derec&o de la selecciónWith 6election.Borders(xl$dge!ig&t)

    .Line6tyle 7 xlontinuous

    .>eig&t 7 xledium

    .olor,ndex 7 xlAutomaticEnd With

    0 !ordes erticales interiores de la selecciónWith 6election.Borders(xl,nsideVertical)

    .Line6tyle 7 xlontinuous

    .>eig&t 7 xl=&in [ Anc&o 6imple.

    .olor,ndex 7 xlAutomatic

    End With

    0 No &a* bordes &oriontales interiores en la selección6election.Borders(xl,nside@orizontal).Line6tyle 7 xl5one

    0 "eleccionar rango 2.2!ange(HACJCH).6elect

    0 No &a* borde diagonal &acia arriba6election.Borders(xl0iagonal0on).Line6tyle 7 xl5one

     #$%ina 4& de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    52/93

     MACROS EN MS EXCEL

    0 No &a* borde diagonal &acia arriba6election.Borders(xl0iagonalUp).Line6tyle 7 xl5one

    0 !orde i4uierdo de la selecciónWith 6election.Borders(xl$dgeLe"t)

    .Line6tyle 7 xlontinuous

    .>eig&t 7 xledium

    .olor,ndex 7 xlAutomatic

    End With

    0 !orde superior de la selecciónWith 6election.Borders(xl$dge=op)

    .Line6tyle 7 xlontinuous

    .>eig&t 7 xledium

    .olor,ndex 7 xlAutomaticEnd With

    0 !orde inferior de la selecciónWith 6election.Borders(xl$dgeBottom) 0 Doble l$nea

    .Line6tyle 7 xl0oule

    .>eig&t 7 xl=&ic? 

    .olor,ndex 7 xlAutomaticEnd With

    0 !orde derec&o de la selecciónWith 6election.Borders(xl$dge!ig&t)

    .Line6tyle 7 xlontinuous

    .>eig&t 7 xledium

    .olor,ndex 7 xlAutomaticEnd With

    End Sub

    6uponemos que el procedimiento anterior le parecer' arumador% no se preocupe% le explicamos a continuación como lo

    &emos &ec&o y ver' que lo /nico que dee &acer son los pasos sore la &oja de c'lculo% el graador de macros se ocupa

    del resto.

    C. Active la graadora de macros. *erra"ientas+ Macro+ 4ra&ar nue&a "acro. Aparece la ventana siguiente.

    8. $n

  • 8/20/2019 ! Macros Con MS EXCEL

    53/93

     MACROS EN MS EXCEL9. 4ulse sore el otón %ceptar.

    P. $jecute los pasos siguientes. 6on para poner los ordes

    P.C. 6eleccione el rango ACJQ.

    P.8. Active *pción $or"ato+ Celdas. 6eleccione "ic&a (ordes.P.9. 4onga l3nea alrededor de la seleccón

    P.9.C. $n cuadro Estilos% seleccione la pen/ltima o antepen/ltima l3nea.

    P.9.8. 4ulse sore el otón que representa un cuadrado.

    P.P. 4onga las l3neas verticales.P.P.C. 6eleccione del cuadro estilo la /ltima l3nea de la primera columna.

    P.P.8. 4ulse sore el otón que representa las l3neas interiores de la selección (el situado en el centro de la

    l3nea in"erior de otones).

    :. 4ulse sore el otón %ceptar.Q. 6eleccione el rango ACJC

    F. Active de nuevo la opción $or"ato+Celdas y seleccione la "ic&a (ordes.

    K. 4onga l3nea in"erior dole.

    K.C. 6eleccione del cuadro $stilo la /ltima l3nea de la segunda columna.K.8. 4ulse sore el otón que representa la l3nea in"erior de la selección.

    T. 4ulse sore el otón %ceptar.

    CE. 0etenga la graadora de acros pulsando sore el otón o ien active *erra"ientas+ Macros + 5etener

    4rabaci-n.

    G Ga est'. A&ora ara el $ditor de Visual Basic y compruee como la graadora &a &ec&o todo el traajo pro usted.A&ora ya sólo nos queda modi"icar la macro de "orma que este "ormato de ordes sea aplicale a cualquier rango. Vea el

    ejemplo siguiente.

    Eje"plo1)

    $n este ejemplo modi"icaremos la macro de manera que sirva para dar ese "ormato a cualquier rango de la &oja. *serve

    en este ejemplo simplemente pasamos como par'metro el rango a "ormatear de manera que la caecera del

     procedimiento quedaria.

    0 Procedimiento Poner_!ordes70 Procedimiento 4ue pone bordes a un rango7 1oncretamente lo encierra en un cuadrado9 le pone l$neas0 erticales * pone una doble l$nea inferior en la primera fila70 ParHmetros.0 Nombre_-oja. Nombre de la &oja donde estH el rango70 Rango_Total . Rango al 4ue se le aplica el formato70 Rango_Primera_Fila . Rango de la primera fila al 4ue se debe aplicar doble l$nea inferior7

    Sub 4onerDBordes (5omreD@oja %s Strin% !angoD=otal %s Strin% !angoD4rimeraD1ila %s Strin)

    0 "eleccionamos la &oja en la 4ue se encuantra en rango>or?6&eets(5omreD@oja).Activate

    0 "eleccionamos en rangoActive6&eet.!ange(!angoD=otal).6elect

    0 -acemos cuadro * l$neas erticales7.......

    .......

    0 "elección de la primera filaActive6&eet.!ange(4rimeraD1ila).6elect

     #$%ina 4( de '(

  • 8/20/2019 ! Macros Con MS EXCEL

    54/93

     MACROS EN MS EXCEL

    0 -acemos l$nea inferior doble.........

    End Sub

    Eje"plo 6)

    !e"inamiento de la macro del ejemplo anterior. $n este ejemplo todav3a per"eccionaremos m's la macro del ejercicioanterior. 6ore todo en lo re"erente a los par'metros. B'sicamente camiaremos el tipo de par'metros% as3 en lugar del

    nomre de la &oja pasaremos el n/mero y en lugar de los par'metros !angoD=otal y !angoD4rimeraD1ila% simplemente pasaremos el rango de la casilla inicial% la macro se encargar' de seleccionar todas las casillas adyacentes y de uscar la

     primera "ila. $n esta macro adem's se &an incluido "uncionalidades como orrar los "ormatos antes de aplicar las l3neas%

    ajustar el anc&o de las columnas% etc. Lea los comentarios para ver que &ace cada sección de la macro.

    *serve la propiedad CurrentReion del ojeto Rane% esta propiedad devuelve el rango de las casillas llenas