Upload
virginia-watkins
View
238
Download
0
Embed Size (px)
Citation preview
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
0
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