Vous êtes sur la page 1sur 84

Aplicaciones en Visual Basic

Vocabulario
Aplicacin o Programa:
Conjunto de bloques de instrucciones y de objetos de control que realizan una
funcin o tarea. Se divide en mdulos.
Mdulo:
Pueden ser de tres clases (Formulario Estndar, Clase!
Formulario:
"entanas que sirven de interfaz de la a#licacin. Contiene controles, eventos,
declaraciones de variables y #rocedimientos.
Estndar:
Contiene declaraciones de variables y #rocedimientos.
Clase:
Contiene definiciones de nuevos objetos con sus m$todos y #ro#iedades.
Procedimiento:
Conjunto de instrucciones que forman el cdi%o. Pueden ser subrutinas o
funciones.
Objeto:
Combinacin de cdi%o y datos que se #ueden tratar como una unidad, #or
ejem#lo, un control, un formulario o un com#onente de una a#licacin
Se a%ru#an #or clases!
&bjetos del sistema! objetos es#eciales del sistema o#erativo (Err,
Printer, 'ebu%, etc..
&bjetos de formulario! Contiene el #ro#io formulario y todos los
controles contenidos en $l.
&bjetos de E(cel! )e#resenta un elemento de una a#licacin, como una
*oja de clculo, una celda, un dia%rama, etc.
Coleccin:
+na coleccin es un objeto que contiene varios objetos que normalmente,
#ero no siem#re, son del mismo ti#o.
En ,icrosoft E(cel, #or ejem#lo, el objeto Worboos contiene todos los
objetos Worboo abiertos.
E!ento:
Cdi%o que se ejecuta cada vez que se realiza una accin sobre un objeto! clic,
doble clic, arrastrar, car%ar, modificar, etc.
-os eventos #ueden ocurrir como resultado de una accin del usuario o del
cdi%o del #ro%rama, tambi$n #ueden ser ori%inados #or el sistema.
Propiedad:
Atributo de un objeto (nombre, color, fuente, #osicin, etc que define una de
las caracter"sticas del objeto, tal como su tama.o, color o localizacin en la
#antalla, o un as#ecto de su com#ortamiento, #or ejem#lo si est visible o
activado.
Para cambiar las caracter/sticas de un objeto, se cambia el valor de sus
#ro#iedades.
M#todo:
+n #rocedimiento que se a#lica a un objeto.
$e!ol!er objetos:
Cada a#licacin tiene una forma de devolver los objetos que contiene.
Macro:
+na macro #ermite la automatizacin de tareas de uso frecuente.
Por lo tanto una macro consiste en una serie de comandos y funciones, que se
almacenan en un mdulo de "isual 0asic y que #uede ejecutarse siem#re que
sea necesario realizar la tarea.
Editor de Visual Basic:
Con el Editor de "isual 0asic, se #ueden modificar macros, co#iar macros de
un mdulo en otro, co#iar macros entre diferentes libros, cambiar de nombre a
los mdulos que almacenan macros o cambiar de nombre a las macros.

Objetos de E%cel
1l%unos de los objetos que se encuentran en E(cel son! 2or3S*eet (&bjeto
*oja de clculo o )an%e (&bjeto casilla o ran%o de casillas.
+n objeto )an%e est definido #or una clase donde se definen sus
#ro#iedades. Entre las #ro#iedades de un objeto )an%e estn! "alue , que
contiene el valor de la casilla , Column y )o4 que contienen res#ectivamente
la fila y la columna de la casilla, Font que contiene la fuente de los caracteres
que muestra la casilla.
)an%e , como objeto, tambi$n tiene m$todos5 Por ejem#lo el m$todo
1ctivate , *ace activa una celda determinada, Clear , borra el contenido de una
celda o ran%o de celdas, Co#y , co#ia el contenido de la celda o ran%o de
celdas en el #orta#a#eles.
)an%e, es un elemento del Conjunto 2or3S*eets5 dentro de un libro de trabajo
#uede e(istir ms de una *oja ( 2or3S*eet , todas las *ojas de un libro de
trabajo forman un conjunto, el conjunto 2or3S*eets .
Cada elemento individual de un conjunto se referencia #or un /ndice, de esta
forma, la #rimera, se%unda y tercera *oja de un libro de trabajo, se
referenciarn #or 2or3S*eets(6, 2or3S*eets(7 y 2or3S*eets(8.
Objetos de Objetos&
Es muy *abitual que una #ro#iedad de un objeto sea otro objeto.
En este trabajo, se utilizarn objetos ya definidos #or la a#licacin E(cel como
2or3S*eets, )an%e u otros. S/ se definirn sus #ro#iedades y m$todos de
a#licacin.

Editor de Visual Basic&
El editor de "isual 0asic es la a#licacin que utilizaremos #ara construir las
macros que interactuarn junto con los libros de trabajo.
1 continuacin, #re#araremos un arc*ivo en el que escribiremos las #rimeras
instrucciones en "isual 0asic.
Preparar un arc'i!o nue!o de E%cel&
Para entrar en el editor de "isual 0asic, ejecute los si%uientes #asos!
1ctive o#cin 9erramientas: ,acro: Editor de "isual 0sic.
Se abrir la si%uiente ventana!
,a(imice la ventana #ara trabajar ms cmodamente, e intente tener activa la
ventana E(#lorador de #royectos y la ventana Pro#iedades ( "er: E(#lorador
de #royectos y "er: "entana #ro#iedades .

(nsertar un nue!o mdulo&
+n mdulo, sirve #ara a%ru#ar #rocedimientos y funciones5 siendo que el
#rocedimiento y la funcin, son entidades de #ro%ramacin com#uestas #or
instrucciones de cdi%o que realizan una accin concreta.
Mdulo estndar
Es un mdulo que contiene solamente declaraciones y definiciones de
#rocedimiento, ti#o y datos. -as declaraciones y definiciones a nivel de
mdulo, de un mdulo estndar, son Public de manera #redeterminada.
En versiones anteriores de "isual 0asic un mdulo estndar se denomina
mdulo de cdi%o.
El cdi%o dentro de un mdulo se or%aniza en #rocedimientos5 y un
#rocedimiento le comunica a la a#licacin cmo ejecutar una tarea es#ec/fica.
+tilice #rocedimientos #ara dividir tareas de cdi%o com#lejas, en unidades
ms mani#ulables.
Procedimiento
Es una secuencia, con nombre, de instrucciones que se ejecutan como una
unidad.
Por ejem#lo, Function, Pro#erty y Sub son todos ti#os de #rocedimientos.
+n nombre de #rocedimiento, siem#re se define a nivel de mdulo.
;odo el cdi%o ejecutable debe estar contenido en un #rocedimiento.
-os #rocedimientos no se #ueden anidar dentro de otros #rocedimientos.
Para insertar un mdulo active o#cin del men< =nsertar: ,dulo.

Se activar una nueva ventana, si a#arece demasiado #eque.a, ma(im/cela.
(nsertar un procedimiento&
)ecordemos que un #rocedimiento es un bloque de instrucciones de cdi%o,
que sirven #ara llevar a cabo al%una tarea es#ec/fica.
+n #rocedimiento em#ieza siem#re con la instruccin Sub
>ombre?Procedimiento5 @ termina con la instruccin End Sub .
1 continuacin crearemos un #rocedimiento #ara sumar dos valores, que se
encuentran en la *oja6 del libro 6 de nuestro arc*ivo E(cel.
El #rimer t$rmino de la o#eracin se encuentra en la celda 16 el se%undo el la
celda 17 y la o#eracin, se suma, se encuentra en 18.
Ejem#lo 6



&bserve el cdi%o!
)an%e (A18A. Formula B AB16C17A
En esta l/nea estamos indicando que trabajamos con un objeto )an%e.
Para indicarle que nos referimos al ran%o 18, encerramos entre #ar$ntesis esta
referencia.
'e este objeto )an%e (A18A, indicamos que queremos establecer una frmula
#ara la #ro#iedad Formula, observe que #ara se#arar el objeto de su #ro#iedad
utilizamos la notacin #unto A.A .
Application
1##lication es el objeto su#erior, que en nuestro caso re#resenta la a#licacin
E(cel.
1s/, el #rimer ejem#lo, si%uiendo toda la jerarqu/a de objetos quedar/a de la
forma si%uiente!
Sub suma(
1##lication.2or3boo3s(6.2or3s*eets(6.)an%e(A18A.Formula B AB16C17A
End Sub
1##lication, no siem#re es necesario es#ecificarlo5 ser necesario
im#lementarlo, si en las macros se trabaja con diferentes libros de trabajo
(diferentes arc*ivos.
Ejecutar un procedimiento o )uncin&
Para ejecutar el #rimer #rocedimiento del ejem#lo suma.
6.Sit<e el cursor dentro del #rocedimiento.
7. 1ctive de la barra de *erramientas! Ejecutar: Ejecutar Sub +serform .

;ambi$n #uede *acer clic sobre el botn corres#ondiente en la barra de
asistente o #ulsar la tecla AFDA .
Para ejecutar el #rocedimiento desde la *oja de clculo, debe estar en una *oja
del -ibro de E(cel.
6.1ctive o#cin de la barra de men<s 9erramientas: ,acro: ,acros .

Se des#lie%a una ventana que muestra una lista donde ests todas las macros
incluidas en el libro de trabajo.
7.Seleccione la macro de la lista y #ulse sobre el botn Ejecutar .


Formas
En este se%undo ejem#lo se am#liar la funcionalidad de la macro del ejem#lo
anterior.
1dems de escribir la funcin AB16C17A en el ran%o 18 , se le a#licar!
Formato del ti#o moneda
el si%no #esos
la #ro#iedad de *egrita y Color 1zul .
Para asi%nar la >e%rita y color, se a#lica la #ro#iedad 0old y Color del objeto
Font .
Ejem#lo 7!
Public Sub forma(
)an%e(A18A.Formula B AB16 C 17A
Selection.>umberFormat B AE,EE FGA
)an%e(A18A.Font.0old B ;rue
)an%e(A18A.Font.Color B )H0(F, F, 7DD
End Sub

El valor ;rue , indica que la #ro#iedad 0old est activada5 #ara desactivarla,
basta con i%ualarla al valor False .
Para establecer el color de la #ro#iedad se utiliza la funcin )H0 (+ed ,
,reen , Blue , los tres ar%umentos #ara esta funcin son valores de que van
de F a 7DD y que corres#onden a la intensidad de los res#ectivos colores +ojo,
Verde y A-ul.
+e)erenciar un rango de celdas&
Slo tiene que cambiar a la forma Celda?=nicial!Celda?Final .
Ejem#lo 8!
Public Sub forma(
)an%e(A18A.Formula B AB16 C 17A
Selection.>umberFormat B AE,EE FGA
)an%e(A16!18A.Font.0old B ;rue
)an%e(A16!18A.Font.Color B )H0(F, F, 7DD
End Sub

Variables&
1 continuacin se realizar un #ro%rama que solicita al usuario, #or medio de
una ventana, in%resar un valor desde el teclado y el #ro%rama %uarda a ese
valor en una celda.
El #ro%rama utilizar una variable #ara #oder re%istrar el valor (que el usuario
in%resa #or teclado, en la celda res#ectiva.
Siendo que una variable es sim#lemente una #arte de memoria que, la funcin
o #rocedimiento, se reserva #ara %uardar datos.
-a forma %eneral de declarar una variable es!
'im variable 1S ti#o .
Siendo variable el nombre que se asi%na a la misma y ;i#o el ti#o de datos
que se %uardarn (n<meros, te(to, fec*a, booleanos,....
En el ejem#lo, se declarar la variable de ti#o Strin% (ti#o te(to, y se realizar
de la si%uiente forma!
'im ;e(to 1s Strin%
1s/ se est indicando que se reserve #arte de la memoria que se llama ;e(to y
que el ti#o de datos que se %uardarn a*/ sern caracteres.
.a Funcin (nputBo% &
Esta funcin muestra una ventana #ara que el usuario #ueda teclear datos.
Cuando se #ulsa sobre el botn 1ce#tar , los datos entrados #asan a la variable
a la que se *a i%ualado la funcin.
"ea la si%uiente l/nea .
;e(to B =n#ut0o( (A=ntroduzca el te(toA, AEntrada de datosA.
En este caso, si en la ventana que muestra =n#ut0o( #ulsa sobre el botn
1ce#tar, los datos tecleados se %uardarn el la variable ;e(to.
Sinta(is de =n#ut0o(! =n#ut0o( ( ,ensaje , ;/tulo , "alor #or defecto ,
Posicin *orizontal , Posicin "ertical , 1rc*ivo ayuda , ><mero de conte(to
#ara la ayuda .
,ensaje ! Es el mensaje que se muestra en la ventana. Si desea #oner
ms de una l/nea #on%a C*r(68 #ara cada nueva l/nea, vea el ejem#lo
si%uiente.
;/tulo ! Es el t/tulo #ara la ventana =n#ut0o( . Es un #armetro
o#cional.
"alor #or defecto ! Es el valor que mostrar #or defecto el cuadro donde
el usuario entra el valor. Parmetro o#cional.
Posicin 9orizontal ! -a #osicin I de la #antalla donde se mostrar el
cuadro, concretamente es la #osicin #ara la #arte izquierda. Si se omite
el cuadro se #resenta *orizontalmente centrado a la #antalla.
Posicin "ertical ! -a #osicin @ de la #antalla donde se mostrar el
cuadro, concretamente es la #osicin #ara la #arte su#erior. Si se omite
el cuadro se #resenta verticalmente centrado a la #antalla.
1rc*ivo 1yuda! Es el arc*ivo que contiene la ayuda #ara el cuadro.
Parmetro o#cional.
><mero de conte(to #ara la ayuda! ><mero asi%nado que corres#onde
al identificador del arc*ivo de ayuda, sirve #ara localizar el te(to que se
debe mostrar. Si se es#ecifica este #armetro, debe es#ecificarse
obli%atoriamente el #armetro 1rc*ivo 1yuda.

Ejem#lo J
Sub #recio?im#uesto(
'im #recio 1s Sin%le
KC*r(68 sirve #ara que el mensaje se muestre en dos l/neas
#recio B =n#ut0o((A=ntroduzca #recio sin im#uestoA L C*r(68 L AEl
resultado se %uardar en la casilla 16A, AEntrada de datosA
1ctiveS*eet.)an%e(A16A."alue B (#recio M (6 C (F.76
End Sub
Ejem#lo D
En este ejem#lo, mediante un se%undo =n#utbo( , el usuario decide en que
celda se entran los datos del #rimer =n#utbo(.
Sern necesarias dos variables, una #ara %uardar la celda destino esco%ida #or
el usuario y otra #ara %uardar el valor.
&#tion E(#licit
Sub #recio?im#uesto(
'im celda 1s Strin%
'im #recio 1s Sin%le
celda B =n#ut0o((AEn que celda quiere re%istrar el valorA L C*r(68 L
Aindicar letra de columna y n<mero de filaA, AEntrar CeldaA
#recio B =n#ut0o((A=n%rece el #recio sin im#uestoA L C*r(68 L AEl resultado
se %uardar en la celda A L celda, AEntrada de datosA
1ctiveS*eet.)an%e(celda."alue B (#recio M (6 C (F.76
End Sub
.a sentencia Option E%plicit&
En "isual 0asic no es necesario declarar las variables, #or ejem#lo, en el
#ro%rama anterior se *ubiera #odido #rescindir de las l/neas!
'im celda 1s Strin%
'im #recio 1s Sin%le.
1 #esar de ello, es recomendable que siem#re se declaren las variables a
utilizar5 de esta forma se sabr cuales son las variables que utiliza el
#rocedimiento y que ti#o de datos %uarda cada una.
1 medida que se vayan creando #rocedimientos ms com#licados y que
requieran el uso de ms variables, si no declara las variables al #rinci#io del
#rocedimiento ocurrirn dos cosas!
Primero, las variables no declaradas sern asumidas como ti#o "ariant5
este es un ti#o de datos que #uede almacenar cualquier valor, n<mero,
fec*as, te(to, etc. #ero ten%a en cuenta que ocu#a 7F 0ytes y #ara
%uardar una referencia a una casilla, la edad de al%uien, etc. y #uede que
no sean necesarios tantos bytes
Se%undo, reducir considerablemente la le%ibilidad de los
#rocedimientos ya que las variables se irn colocando a medida que se
#recisen, esto com#licar la correccin o modificacin del
#rocedimiento.
"olviendo a la cuestin central, la sentencia &#tion E(#licit al #rinci#io del
mdulo fuerza a que se declaren todas las variables.
Si al ejecutar el #ro%rama, se encuentra al%una variable sin declarar se
#roducir un error y no se #odr ejecutar el #ro%rama *asta que se declare.
El si%uiente ejem#lo muestra dos #rocedimientos con el mismo objetivo, en el
#rimero no son declaradas las variables5 y en el se%undo s/ se #rocede a la
declaracin de las variables.
Preste atencin a las #alabras A;e(toA y A;estoA, que simularn un error al
teclear.
Ejem#lo N
Sub Entrar?"alor(
;e(to B =n#ut0o((A=ntroducir un te(to A L C*r(68 L APara la celda 16A,
AEntrada de datosA
1ctiveS*eet.)an%e(A16A."alue B ;esto
End Sub
&bserve que el #ro%rama no *ace lo que se #retende, #ues ;e(to y ;esto son
dos variables diferentes y como no se *a declarado nin%una variable, ni se *a
utilizado &#tion E(#licit "isual 0asic no da nin%<n ti#o de error. Est
ejecutando el #ro%rama #ero no in%resa nin%<n valor.
1*ora el ,dulo cuenta con &#tion E(#licit.
&#tion E(#licit
Sub Entrar?"alor(
'im ;e(to 1s Strin%
;e(to B =n#ut0o((A=ntroducir un te(to A L C*r(68 L APara la celda 16A,
AEntrada de datosA
1ctiveS*eet.)an%e(A16A."alue B ;esto
End Sub
&bserve que el #ro%rama no se ejecuta, al #oner &#tion E(#licit , forzamos a
que se declaren todas las variables.
"isual 0asic detecta que la variable ;esto no *a sido declarada y as/ lo indica
mostrando Error.
Entonces se #uede detectar la e(istencia de un error y #roceder a su
modificacin.


/ipos de datos en Visual Basic para E%cel &

0yte 6 byte F a 7DD
0oolean 7 bytes ;rue o False
=nte%er 7 bytes O87.PNQ a 87.PNP
-on%(entero lar%o J bytes O7.6JP.JQ8.NJQ a 7.6JP.JQ8.NJP
Sin%le (coma
flotante:#recisinsim#le
J bytes
O8,JF7Q78E8Q a O6,JF67RQEOJD #ara
valores ne%ativos5 6,JF67RQEOJD a
8,JF7Q78E8Q #ara valores #ositivos
'ouble (coma
flotante:#recisin doble
Q bytes
O6,PRPNR868JQN787E8FQ a
OJ,RJFNDNJDQJ67JPEO87J #ara valores
ne%ativos5 J,RJFNDNJDQJ67JPEO87J a
6,PRPNR868JQN787E8FQ #ara valores
#ositivos
Currency (entero a
escala
Q bytes
OR77.88P.7F8.NQD.JPP,DQFQ a
R77.88P.7F8.NQD.JPP,DQFP
'ecimal 6J bytes C:O
PR.77Q.6N7.D6J.7NJ.88P.DR8.DJ8.RDF.88D
sin #unto decimal5 C:O
P,R77Q6N7D6J7NJ88PDR8DJ8RDF88D con
7Q #osiciones a la derec*a del si%no
decimal5 el n<mero ms #eque.o distinto
de cero esC:O
F,FFFFFFFFFFFFFFFFFFFFFFFFFFF6
'ate Q bytes
6 de enero de 6FF a 86 de diciembre de
RRRR
&bject J bytes Cualquier referencia a ti#o &bject
Strin%(lon%itud variable
6F bytesC
lon%itud
de la
cadena
'esde F a 7.FFF millones
Strin%(lon%itud fija
-on%itud
de la
cadena
'esde 6 a ND.JFF a#ro(imadamente
"ariant(con n<meros 6N bytes
Cualquier valor num$rico *asta el
intervalo de un ti#o 'ouble
"ariant (con caracteres
77 bytes
C lon%itud
de cadena
El mismo intervalo que #ara un ti#o
Strin% de lon%itud variable
'efinido #or el
usuario(utilizando ;y#e
><mero
requerido
#or los
elementos
El intervalo de cada elemento es el
mismo que el intervalo de su ti#o de
datos.

Ejem#lo P
&#tion E(#licit
Sub ti#o?dato(
'im c 1s =nte%er
'im t 1s =nte%er
'im i 1s =nte%er
c B =n#ut0o((AEntrar el Ca#ital =nicialA, AEntrada de datosA
t B =n#ut0o((AEntrar el ;iem#oA, AEntrada de datosA
i B =n#ut0o((AEntrar el =nter$sA, AEntrada de datosA
1ctiveS*eet.)an%e(A16A."alue B (c M (6 C i M t
End Sub
"uelva a ejecutar el #ro%rama y cuando se le #ide el #rimer valor teclee
A9olaA. &bserve que el #ro%rama se detiene indicando un error en el ti#o de
datos.


Efectivamente, la funcin =n#ut0o( devuelve siem#re datos ti#o Strin%.
En el #rimer ejem#lo no *a *abido nin%<n #roblema, al entrar caracteres
num$ricos , estos #ueden asi%narse a variables ti#o =nte%er #orque "isual
0asic *ace automticamente la conversin5 #ero al entrar te(to e intentarlo
asi%nar a una variable =nte%er "isual 0asic muestra un error, indicando que la
variable no es adecuada #ara los datos que se desean %uardar.
Para solucionar estos #roblemas, se deben utilizar funciones de conversin de
ti#o.
Estas funciones, como su nombre lo indica, convierten datos de un ti#o a otro,
de Strin% a =nte%er, de =nte%er a Strin%, de 'ate a Strin%,...
1s/ el #rocedimiento anterior quedar/a.
Sub convertir(
'im c 1s =nte%er
'im t 1s =nte%er
'im i 1s =nte%er
c B val(=n#ut0o((AEntrar el Ca#ital =niciaA, AEntrada de datosA
t B val(=n#ut0o((AEntrar el ;iem#oA, AEntrada de datosA
i B val(=n#ut0o((AEntrar el =nter$sA, AEntrada de datosA
1ctiveS*eet.)an%e(A16A."alue B (c M (6 C i M t
End Sub
-a funcin "al('ato Strin%, devuelve los n<meros contenidos en una cadena
como un valor num$rico del ti#o adecuado.
Si la cadena a convertir contiene al%<n carcter no num$rico devuelve F.
1s/, si al #edir un valor se teclea A9olaA, la funcin "al devolver un cero.

Con!ersin de /ipos de datos&
Ejem#lo Q
En el si%uiente ejem#lo se #iden dos n<meros, se suman y se %uardan en la
celda 16 de la *oja activa.
&#tion E(#licit
Sub Sumar(
'im >umero6 1s =nte%er
'im >umero7 1s =nte%er
>umero6 B =n#ut0o((AEntrar el #rimer valorA, AEntrada de datosA
>umero7 B =n#ut0o((AEntrar el #rimer valorA, AEntrada de datosA
1ctiveS*eet.)an%e(A16A."alue B >umero6 C >umero7
End Sub
1l ejecutar el #rocedimiento in%rese, en cada ventana, los valores 7D y 7D
res#ectivamente.
En la celda 16 de la *oja activa a#arece un re%istro con valor i%ual a DF.
1*ora, vuelva a ejecutar el #ro%rama y cuando se #ide el #rimer valor teclee
A9olaA.
Con este nuevo evento el #ro%rama se detiene e indica un error en el ti#o de
datos.
Esto ocurre #orque la funcin =n#ut0o( devuelve siem#re datos ti#o Strin%.
En el #rimer caso del #resente ejem#lo, no se #resentaron #roblemas al entrar
caracteres num$ricos. Sstos #ueden asi%narse a variables ti#o =nte%er, #orque
"isual 0asic *ace automticamente la conversin.
Pero al entrar te(to e intentar asi%narlo a una variable =nte%er, "isual 0asic
muestra un error indicando que la variable no es adecuada #ara los datos que
se desean %uardar.
Para solucionar este ti#o de #roblemas se deben utilizar funciones de
conversin de ti#o.
Estas funciones, como su nombre indica, convierten datos de un ti#o a otro, de
Strin% a =nte%er , de =nte%er a Strin% , de 'ate a Strin% ,...
1s/ el #rocedimiento anterior quedar/a.
&#tion E(#licit
Sub Sumar(
'im >umero6 1s =nte%er
'im >umero7 1s =nte%er
>umero6 B "al(=n#ut0o((AEntrar el #rimer valorA, AEntrada de datosA
>umero7 B "al(=n#ut0o((AEntrar el #rimer valorA, AEntrada de datosA
1ctiveS*eet.)an%e(A16A."alue B >umero6 C >umero7
End Sub
-a funcin "al ('ato Strin%, convierte una cadena de caracteres a valor
num$rico.
Si la cadena a convertir contiene al%<n carcter no num$rico devuelve F.
1s/, si al #edir un valor se teclea A9olaA, la funcin "al, devolver un cero.

Funciones de con!ersin de tipos&
(;abla co#iada del ayudante de &ffice en l/nea de )eferencia de "isual 0asic
#ara E(cel.
"al (Cadena.
Convierte la cadena a un valor num$rico.
Str (><mero. Convierte el n<mero a una e(#resin cadena.
-as si%uientes funciones tienen la forma Funcin (E(#resin.
6 ;en%a en cuenta que #ara los ordenadores no es lo mismo el n<mero 6 que el
carcter A6A.
En los len%uajes de #ro%ramacin actuales la conversin de carcter A6A a
n<mero 6 se *ace automticamente en muc*os casos, esto es bueno y es malo.
Es bueno #orque nos a*orra tener que *acer las conversiones y es malo #orque
es ms dif/cil controlar ciertos casos.
Si%a con los ejem#los y entender de lo que estamos *ablando.
Slo #ara su informacin, el ordenador %uarda el n<mero 6 de la si%uiente
manera FFFFFFF6,mientras que el carcter A6A se %uarda como FF66FFFF (el
n<mero JQ del cdi%o 1SC==.

Funcin
/ipo
de!uelto
(nter!alo del argumento e%presin
Cbool Boolean
Cualquier e(#resin de cadena o num$rica
vlida.
Cbyte B0te F a 7DD.
Ccur Currenc0
OR77.88P.7F8.NQD.JPP,DQFQ a
R77.88P.7F8.NQD.JPP,DQFP.
Cdate $ate Cualquier e(#resin de fec*a.
CDbl $ouble
OJ,RJFNDNJDQJ67JPEO87J #ara valores
ne%ativos5
J,RJFNDNJDQJ67JPEO87J a
6,PRPNR868JQN787E8FQ
#ara valores #ositivos.
Cdec $ecimal
C:OP,R77Q6N7D6J7NJ88PDR8DJ8RDF88D.
-a menor #osicin #ara un n<mero que no sea
cero es F,FFFFFFFFFFFFFFFFFFFFFFFFFFF6.
CInt (nteger O87.PNQ a 87.PNP5 las fracciones se redondean.
CLng .ong
O7.6JP.JQ8.NJQ a 7.6JP.JQ8.NJP5
las fracciones se redondean.
CSng 1ingle
O8,JF7Q78E8Q a O6,JF67RQEOJD #ara valores
ne%ativos5
6,JF67RQEOJD a 8,JF7Q78E8Q #ara valores
#ositivos.
CVar Variant
El mismo intervalo que 'ouble #ara valores
num$ricos.
El mismo intervalo que Strin% #ara valores no
num$ricos
CStr 1tring
El valor de retorno de CStr de#ende del
ar%umento e(#resin.

Objetos 0 Propiedades de uso )recuente&

Objeto Cells2)ila3 columna4&
Sirve, como el objeto ran%e, #ara referenciar una celda o ran%o de celdas, #ero
en lu%ar de utilizar la referencia de la forma 16, 06, I87F,... utiliza la fila y la
columna que ocu#a la celda dentro de la *oja (objeto 2or3S*eet.
Por ejem#lo, #ara #oner 9ola en la celda 16 de la *oja activa seria!
1ctiveS*eet.Cells(6,6."alueBA9olaA

5tili-ar Cells para re)erenciar un rango&
seria el equivalente a )an%e(ACelda?=nicial!Celda?FinalA.
-a forma que se obtiene utilizando Cells es un #oco ms lar%a, #ero se ver
que a veces resulta muc*o ms funcional que utilizando <nicamente ran%e.
Para referirnos al ran%o 16!0Q, #ondremos!
)an%e(Cells(6, 6, Cells(Q, 7."alue B A9olaA
&tra forma interesante de Cells es la si%uiente!
)an%e(A1D!06FA.Cells(7, 6."alue B A9olaA
Pondr en la celda 1N el valor A9olaA, observe que en este ejem#lo Cells
comienza a contar filas y columnas a #artir del ran%o es#ecificado en el objeto
)an%e.

Variables de Objetos&
+na variable objeto sirve #ara *acer referencia a un objeto, esto si%nifica que
#odremos acceder a las #ro#iedades de un objeto e invocar a sus m$todos a
trav$s de la variable en lu%ar de *acerlo directamente a trav$s del objeto.
Esta clase de variables se utilizan en estructuras For Eac* ... >e(t , o cuando
es necesario construir funciones que devuelvan ran%os o referencias a *ojas.
Para declarar una variable objeto se utiliza tambi$n la #alabra 'im de la
si%uiente forma!
'im "ar?&bjeto 1s &bjeto
'im ) 1s )an%e
'im 9oja 1s 2or3S*eet
Para asi%nar un objeto a una variable debe utilizar la instruccin Set .
Set "ariable?&bjeto B &bjeto
Set )B 1ctiveS*eet.)an%e(A16!06FA
Set 9oja B 1ctiveS*eet
Set 9oja B 2or3S*eets(6

Ejem#lo de cmo utilizar este ti#o de variables.
Ejem#lo R.
-lenar el ran%o de 16 a 06F con la #alabra A9olaA y des#u$s #oner ne%rita.
Primero se asi%na una variable objeto al objeto y lue%o se trabaja con esa
variable de la misma forma que trabajar/a directamente sobre el objeto.
Sub obj(
'im ) 1s )an%e
Set ) B 1ctiveS*eet.)an%e(A16!06FA
)."alue B A9olaA
).Font.0old B ;rue
End Sub

El !alor *ot'ing&
Cuando sea necesario desasi%nar una variable del objeto al cual *ace
referencia, deber i%ualar la variable al valor >ot*in% de la si%uiente forma !
Set "ariable?&bjeto B >ot*in%
9abitualmente se utiliza >ot*in% en una estructura condicional #ara
com#robar si la variable objeto est asi%nada.
&bserve que si se utiliza una variable objeto a la cual todav/a no se le *a
*ec*o nin%una asi%nacin, el #ro%rama dar error y detendr su ejecucin.
Es de buena #rctica *acer este ti#o de com#robaciones antes de trabajar con
variables objeto.
"eremos un ejem#lo de esto en el si%uiente tema.

Estructuras condicionales&
-as estructuras condicionales son instrucciones de #ro%ramacin que #ermiten
controlar la ejecucin de un fra%mento de cdi%o, en funcin de si se cum#le o
no una condicin.
(nstruccin i) Condicin t'en && End i) 2 1i Condicin Entonces &&& Fin 1i 4
-a estructura condicional que se construye con la instruccin Si Condicin
Entonces ... Fin Si tiene la forma si%uiente!
Si Condicin Entonces
Sent$ncia6
Sent$ncia7 . .
Sent$ncia>
Fin Si
Cuando el #ro%rama lle%a a la instruccin Si Condicin Entonces , se eval<a la
condicin, si esta se cum#le (es verdadera, se ejecutan todas las sentencias
que estn encerradas en el bloque, si no se cum#le la condicin (es falsa, se
saltan estas sentencias.
Esta estructura en "isual 0asic tiene la sinta(is si%uiente!
=f Condicin ;*en
Sent$ncia6
Sent$ncia7
Sent$ncia>
End =f

Ejem#lo 6F !
Entrar un valor #or el teclado con la instruccin =n#ut0o( y %uardarlo en la
celda 16 de la *oja activa.
Si el valor entrado desde el teclado (y %uardado en 16 es su#erior a 6FFF,
a#licar un descuento con otro =n#ut0o( y %uardarlo en la celda 17 de la *oja
activa.
Calcular en 18, el #recio de 16 menos el descuento de 17.
Sub Condicional(
1ctiveS*eet.)an%e(A16A."alue B F
K Poner las casillas donde se %uardan los valores F .
1ctiveS*eet.)an%e(A17A."alue B F
1ctiveS*eet.)an%e(A18A."alue B F
1ctiveS*eet.)an%e(A16A."alue B "al(=n#ut0o((AEntrar el valorA, AEntrarA
K Si el valor de la celda 16 es mayor que 6FFF, entonces, a#licar descuento
=f 1ctiveS*eet.)an%e(A16A."alue T 6FFF ;*en
1ctiveS*eet.)an%e(A17A."alue B "al(=n#ut0o((AEntrar 'escuentoA,
AEntrarA
End =f
1ctiveS*eet.)an%e(A18A."alue B 1ctiveS*eet.)an%e(A16A."alue O
1ctiveS*eet.)an%e(A17A."alue
End Sub
Ejem#lo 66.
1#licando variables.
&#tion E(#licit
Sub Condicional(
'im valor 1s Strin%
'im descuento 1s Strin%
valor B F
descuento B F
valor B "al(=n#ut0o((AEntrar el valorA, AEntrarA
K Si el valor de la variable es mayor que 6FFF, entonces, #edir descuento
=f valor T 6FFF ;*en
descuento B "al(=n#ut0o((AEntrar 'escuentoA, AEntrarA
End =f
1ctiveS*eet.)an%e(A16A."alue B valor
1ctiveS*eet.)an%e(A17A."alue B descuento
1ctiveS*eet.)an%e(A18A."alue B valor O descuento
End Sub

Esta <ltima alternativa es mas recomendable que la anterior #ues las variables,
aunque muc*as veces AinnecesariasA, dejan a los #ro%ramas ms le%ibles y
claros.
Esta buena #rctica quedar evidenciada al momento de tener que realizar
mantenimientos o modificaciones en el o los #ro%ramas.
Ejem#lo 67.
,acro que com#ara los valores de las casillas 16 y 17 de la *oja activa.
Si son i%uales #one el color de la fuente de ambas en azul.
Sub Condicional7(
=f 1ctiveS*eet.)an%e(A16A."alue B 1ctiveS*eet.)an%e(A17A."alue ;*en
1ctiveS*eet.)an%e(A16A.Font.Color B )H0(F, F, 7DD
1ctiveS*eet.)an%e(A17A.Font.Color B )H0(F, F, 7DD
End =f
End Sub

Estructura ()&&Else
Esta estructura se utiliza cuando se requiere una res#uesta alternativa a una
condicin.
Su estructura es la si%uiente!
Si Condicin Entonces
Sentencia 6
Sentencia 7
Sentencia >
Sino
Sentencia 6
Sentencia 7
Sentencia >
Fin Si
Si se cum#le la condicin , se ejecuta el bloque de sentencias delimitado #or
Si Condicin Entonces y Si no se cum#le la condicin, se ejecuta el bloque
delimitado #or Sino y Fin Si .
En "isual 0asic la instruccin Si Condicin Entonces ... Sino ... Fin Si se
e(#resa con las instrucciones si%uientes!
=f Condicin ;*en
Sentencia 6
Sentencia 7
Sentencia >
Else
Sentencia 6
Sentencia 7
Sentencia >
End =f

Ejem#lo 68.
Entrar un valor #or el teclado con la instruccin =n#ut0o( y %uardarlo en la
celda 16 de la *oja activa.
Si el valor entrado desde el teclado (y %uardado en 16 es su#erior a 6FFF,
a#licar un descuento del 6FU sino a#licar un descuento del DU, el descuento
se %uarda en la celda 17 de la *oja activa.
Colocar en 18, el total descuento y en 1J el total menos el descuento.
Sub Condicional?Else(
'im valor 1s Sin%le
'im descuento 1s Sin%le
valor B F
valor B "al(=n#ut0o((AEntrar el valorA, AEntrarA
K Si el valor de la variable es mayor que 6FFF, entonces, a#licar descuento del
6FU
=f valor T 6FFF ;*en
descuento B valor M (6F : 6FF
1ctiveS*eet.)an%e(A17A."alue B F.6
Else
K Sino 1#licar descuento del DU
descuento B valor M (D : 6FF
1ctiveS*eet.)an%e(A17A."alue B F.FD
End =f
1ctiveS*eet.)an%e(A16A."alue B valor
1ctiveS*eet.)an%e(A18A."alue B descuento
1ctiveS*eet.)an%e(A1JA."alue B valor O descuento
End Sub

Ejem#lo 6J
)estar los valores de las celda 16 y 17.
Huardar el resultado en 18.
Si el resultado es!
o #ositivo o cero, #oner la fuente de 18 en a-ul ,
o si es ne%ativo #oner la fuente 18 en rojo .
Sub Condicional?Else7(
)an%e(A18A."alue B )an%e(A16A."alue O )an%e(A17A."alue
=f )an%e(A18A."alue V F ;*en
)an%e(A18A.Font.Color B )H0(7DD, F, F
Else! )an%e(A18A.Font.Color B )H0(F, F, 7DD
End =f
End Sub

Estructuras () anidadas&
=f...;*en...Else se #ueden anidar en tantos niveles como sea necesario
Ejem#lo 6D.
Com#arar los valores de las celda 16 y 17 de la *oja activa.
o Si son i%uales, escribir en 18 A-os valores de 16 y 17 son
i%ualesA ,
o Si el valor de 16 es mayor que 17, escribir A16 mayor que 17A ,
o Si el valor de 16 es menor que 17 A17 mayor que 16A .

Sub Condicional(
=f )an%e(A16A."alue B )an%e(A17A."alue ;*en
)an%e(A18A."alue B A-os "alores de 16 y 17 son i%ualesA
Else
=f )an%e(A16A."alue T )an%e(A17A."alue ;*en
)an%e(A18A."alue B A16 mayor que 17A
Else
)an%e(A18A."alue B A17 mayor que 16A
End =f
End =f
End Sub

-a se%unda estructura
=f ..
Else ..
End =f
queda dentro del Else de la #rimera estructura.
Esta es una re%la %eneral, cuando #one un End =f , este cierra siem#re el
<ltimo =f ( o Else abierto.

Operadores lgicos&
Estos o#eradores l%icos, se utilizan cuando es #reciso evaluar dos o ms
condiciones #ara decidir si se ejecutan o no determinadas acciones.
Operador .gico And 264&
Este o#erador se utiliza cuando! #ara ejecutar un bloque de instrucciones se
cum#la ms de una condicin. Para que el bloque de instrucciones #ueda
ejecutarse se debern cum#lir todas las condiciones.
Ejem#lo 6N.
Entrar desde teclado!
o el >ombre de un #roducto,
o la cantidad requerida y
o el #recio del #roducto
Huardar en!
o 16 el >ombre,
o 17 la Cantidad requerida y
o 18 el Precio del #roducto.
Calcular el total y %uardarlo en 1J.
Si el total es su#erior a 6F.FFF y el nombre del #roducto es APa#aA!
o #edir un descuento,
o calcular el total descuento
o %uardarlo en 1D,
o restar el descuento del total y
o %uardarlo en 1N.

Sub Ejem#lo?6N(
'im Producto 1s Strin%
'im Cantidad 1s =nte%er
'im Precio 1s Sin%le
'im ;otal 1s Sin%le
'im 'escuento 1s Sin%le
'im ;otal?'escuento 1s Sin%le
Precio B F
Producto B =n#ut0o((AEntrar >ombre del ProductoA, AEntrarA
Precio B "al(=n#ut0o((AEntrar el #recioA, AEntrarA
Cantidad B "al(=n#ut0o((AEntrar la cantidadA, AEntrarA
;otal B Precio M Cantidad
1ctiveS*eet.)an%e(A16A."alue B Producto
1ctiveS*eet.)an%e(A17A."alue B Precio
1ctiveS*eet.)an%e(A18A."alue B Cantidad
1ctiveS*eet.)an%e(A1JA."alue B ;otal
K Si total mayor que 6F.FFF y el #roducto es Pa#a, a#licar descuento.
=f ;otal T 6FFFF 1nd Producto B APa#aA ;*en
'escuento B "al(=n#ut0o((AEntrar 'escuentoA, AEntrarA
;otal?'escuento B ;otal M ('escuento : 6FF
;otal B ;otal O ;otal?'escuento
1ctiveS*eet.)an%e(A1DA."alue B ;otal?'escuento
1ctiveS*eet.)an%e(A1NA."alue B ;otal
End =f
End Sub
Para que se ejecute el bloque de instrucciones entre =f ... End =f, deben
cum#lirse las dos condiciones que se eval<an5 basta que no se cum#la una de
ellas #ara que no se ejecute dic*o bloque.

Operador .gico Or 2O4&
Con este o#erador, #ara ejecutar un bloque de instrucciones es #reciso que se
cum#la, con #or lo menos, al%una de una serie de condiciones.
Ejem#lo 6P.
Entrar desde el teclado!
o el >ombre,
o la Cantidad y
o e l Precio
Huardar en!
o 16 el >ombre,
o 17 la Cantidad y
o 18 el Precio.
Calcular el total y %uardarlo en 1J.
Si el total es su#erior a 6F.FFF o el nombre del #roducto el APa#aA!
o #edir un descuento,
o calcular el total descuento
o %uardarlo en 1D,
o restar el descuento del total y
o %uardarlo en 1N.

Sub Ejem#lo?6P(
'im Producto 1s Strin%
'im Cantidad 1s =nte%er
'im Precio 1s Sin%le
'im ;otal 1s Sin%le
'im 'escuento 1s Sin%le
'im ;otal?'escuento 1s Sin%le
Precio B F
Producto B =n#ut0o((AEntrar >ombre del ProductoA, AEntrarA
Precio B "al(=n#ut0o((AEntrar el #recioA, AEntrarA
Cantidad B "al(=n#ut0o((AEntrar la cantidadA, AEntrarA
;otal B Precio M Cantidad
1ctiveS*eet.)an%e(A16A."alue B Producto
1ctiveS*eet.)an%e(A17A."alue B Precio
1ctiveS*eet.)an%e(A18A."alue B Cantidad
1ctiveS*eet.)an%e(A1JA."alue B ;otal
KSi total mayor que 6F.FFF o el #roducto es Pa#a, a#licar descuento
=f ;otal T 6FFFF &r Producto B APa#aA ;*en
'escuento B "al(=n#ut0o((AEntrar 'escuentoA, AEntrarA
;otal?'escuento B ;otal M ('escuento
;otal B ;otal O ;otal?'escuento
1ctiveS*eet.)an%e(A1DA."alue B ;otal?'escuento
1ctiveS*eet.)an%e(A1NA."alue B ;otal
End =f
End Sub
&bserve que #ara que se ejecute el bloque de instrucciones entre =f ... End =f,
slo es necesario que se cum#la al%una de las dos condiciones que se eval<an
(o las dos a la vez5 slo cuando no se cum#le nin%una de las dos no se
ejecutan las instrucciones del bloque.

Operador .gico *ot 2no4&
El o#erador l%ico >ot, se utiliza #ara ver si >& se cum#le una condicin.
Ejem#lo 6Q.
Entrar un valor, #or el teclado, con la instruccin =n#ut0o(
%uardar el valor en la celda 16 de la *oja activa.
Si el valor entrado desde el teclado es su#erior a 6FFF,
o a#licar un descuento con otro =n#ut0o(
o %uardar el descuento en la celda 17 de la *oja activa.
Calcular en 18, el #recio de 16 menos el descuento de 17.

Sub Ejem#lo?6Q(
'im "alor 1s Sin%le
'im 'escuento 1s Sin%le
"alor B F
'escuento B F
"alor B "al(=n#ut0o((AEntrar el "alorA, AEntrarA
K Si el valor de la variable >& es menor i%ual 6FFF, entonces, a#licar
descuento
=f >ot ("alor VB 6FFF ;*en
'escuento B "al(=n#ut0o((AEntrar 'escuentoA, AEntrarA
End =f
1ctiveS*eet.)an%e(A16A."alue B "alor
1ctiveS*eet.)an%e(A17A."alue B 'escuento
1ctiveS*eet.)an%e(A18A."alue B "alor O 'escuento
End Sub

Estructura 1elect Case&
Ejecuta uno de varios %ru#os de instrucciones, de#endiendo del valor de una
e(#resin.
Ejem#lo 6R.
,acro que suma, resta, multi#lica o divide los valores de las casillas 16
y 17 de#endiendo de que si 06 contiene el si%no 7, 8, %, !.
El resultado lo re%istra en 18.
Si en 06 no *ay nin%uno de los si%nos anteriores en 18 debe dejarse un
F.

Sub Ejem#lo?6R(
'im Si%no 1s Strin%
'im "alor6 1s =nte%er
'im "alor7 1s =nte%er
'im ;otal 1s =nte%er
"alor6 B 1ctiveS*eet.)an%e(A16A."alue
"alor7 B 1ctiveS*eet.)an%e(A17A."alue
Si%no B 1ctiveS*eet.)an%e(A06A."alue
;otal B F
=f Si%no B ACA ;*en
;otal B "alor6 C "alor7
End =f
=f Si%no B AOA ;*en
;otal B "alor6 O "alor7
End =f
=f Si%no B A(A ;*en
;otal B "alor6 M "alor7
End =f
=f Si%no B A!A ;*en
;otal B "alor6 : "alor7
End =f
1ctiveCell.)an%e(A18A."alue B ;otal
End Sub

En este ejem#lo todas las instrucciones if eval<an la misma variable.
Con el objetivo de lo%rar una mejor le%ibilidad, se debe utilizar la instruccin
Select Case.
Select Case tiene la sinta(is si%uiente, Select Case E(#resin Case valores !
=nstrucciones.
Case valores ! =nstrucciones
Case valores! =nstrucciones.
Case Else
=nstrucciones en caso que no sean nin%uno de los valores anteriores.
End Select.

Ejem#lo 7F.
Sub Ejem#lo?7F(
'im Si%no 1s Strin%
'im "alor6 1s =nte%er
'im "alor7 1s =nte%er
'im ;otal 1s =nte%er
"alor6 B 1ctiveS*eet.)an%e(A16A."alue
"alor7 B 1ctiveS*eet.)an%e(A17A."alue
Si%no B 1ctiveS*eet.)an%e(A06A."alue
Select Case Si%no
Case ACA
;otal B "alor6 C "alor7
Case AOA
;otal B "alor6 O "alor7
Case A(A
;otal B "alor6 M "alor7
Case A!A
;otal B "alor6 : "alor7
Case Else
;otal B F
End Select
1ctiveCell.)an%e(A18A."alue B ;otal
End Sub

En el #r(imo ejem#lo cada sentencia Case eval<a un ran%o de valores.
Ejem#lo 76.
En este #ro%rama se #ro%rama se #ide!
;res notas de un alumno mediante la funcin =n#ut0o(.
-as notas van a #arar a las casillas 16, 17 y 18 de la *oja activa.
El #ro%rama calcula la media y la deja en 1J.
o Si la media est entre F y 7 deja en 1D el mensaje A,uy
deficienteA,
o si la nota es 8 deja en 1D el mensaje A'eficienteA,
o si la nota es J deja A=nsuficienteA,
o si es D ASuficienteA,
o si es N A0ienA,
o si est entre P y Q deja A>otableA,
o si es mayor que Q deja ASobresalienteA.

Sub Ejem#lo?76(
'im >ota6 1s =nte%er
'im >ota7 1s =nte%er
'im >ota8 1s =nte%er
'im ,edia 1s Sin%le
>ota6 B "al(=n#ut0o((AEntrar >ota #rimera evaluacinA, A>otaA
>ota7 B "al(=n#ut0o((AEntrar >ota Se%unda evaluacinA, A>otaA
>ota8 B "al(=n#ut0o((AEntrar >ota ;ercera evaluacinA, A>otaA
,edia B (>ota6 C >ota7 C >ota8 : 8
1ctiveS*eet.)an%e(A16A."alue B >ota6
1ctiveS*eet.)an%e(A17A."alue B >ota7
1ctiveS*eet.)an%e(A18A."alue B >ota8
1ctiveS*eet.)an%e(A1JA."alue B ,edia
Select Case ,edia
Case F ;o 7
1ctiveS*eet.)an%e(A1DA."alue B A,uy deficienteA
Case 8
1ctiveS*eet.)an%e(A1DA."alue B A'eficienteA
Case J
1ctiveS*eet.)an%e(A1DA."alue B A=nsuficienteA
Case D
1ctiveS*eet.)an%e(A1DA."alue B ASuficienteA
Case N
1ctiveS*eet.)an%e(A1DA."alue B A0ienA
Case P ;o Q
1ctiveS*eet.)an%e(A1DA."alue B A>otableA
Case =s T Q
1ctiveS*eet.)an%e(A1DA."alue B ASobresalienteA
End Select
End Sub
Funciones de comprobacin&
Funciones que son <tiles #ara com#robar o validar el ti#o de datos entrados
desde teclado, o los datos contenidos en una casilla.
Ejem#lo 77.
Sub Ejem#lo?77(
'im Si%no 1s Strin%
'im "alor6 1s =nte%er
'im "alor7 1s =nte%er
'im ;otal 1s =nte%er
"alor6 B 1ctiveS*eet.)an%e(A16A."alue
"alor7 B 1ctiveS*eet.)an%e(A17A."alue
Si%no B 1ctiveS*eet.)an%e(A06A."alue
Select Case Si%no
Case ACA
;otal B "alor6 C "alor7
Case AOA
;otal B "alor6 O "alor7
Case A(A
;otal B "alor6 M "alor7
Case A!A
;otal B "alor6 : "alor7
Case Else
;otal B F
End Select
1ctiveCell.)an%e(A18A."alue B ;otal
End Sub
Si en al%una de las casillas que se deben o#erar no *ubiera nin%<n valor o bien
datos alfanum$ricos, al ejecutar la macro se #roducir un error.
1unque con "isual 0asic se #uede controlar el flujo del #ro%rama cuando se
#roduce un error im#revisto, #ara solucionar este #roblema se utiliza una
funcin de com#robacin que indica si en las casillas 16 y 17 *ay valores
adecuados (en nuestro caso num$ricos #ara #rose%uir con la ejecucin de la
macro, en caso contrario se mostrar un error y no se ejecutar nin%una de las
o#eraciones.
-a funcin que utilizaremos es =s>umeric (e(#resin, esta funcin devuelve
un valor ;rue si la e(#resin que se eval<a es un valor num$rico, en caso
contrario devuelve False .
;ambi$n se utiliza la funcin =sEm#ty #ara com#robar si en 06 *ay al%o,
=sEm#ty (E(#resin eval<a si e(#resin est vac/a, devuelve ;rue si es as/ y
False en caso contrario.
1*ora lo a#licamos al #ro%rama del Ejem#lo 77.

Ejem#lo 78.
Sub Ejem#lo?78(
'im Si%no 1s Strin%
'im "alor6 1s Strin%
'im "alor7 1s Strin%
'im ;otal 1s Strin%
'im Continuar 1s 0oolean
"alor6 B 1ctiveS*eet.)an%e(A16A."alue
"alor7 B 1ctiveS*eet.)an%e(A17A."alue
Si%no B 1ctiveS*eet.)an%e(A06A."alue
Continuar B ;rue
K Si en la celda 16 no *ay un valor num$rico
=f >ot =s>umeric(1ctiveS*eet.)an%e(A16A ;*en
,s%0o( Prom#t!BAEn la celda 16 no *ay nin%<n valor num$ricoA,
;itle!BAE))&)A
Continuar B False
End =f
K Si en la celda 17 no *ay un valor num$rico
=f >ot =s>umeric(1ctiveS*eet.)an%e(A17A ;*en
,s%0o( Prom#t!BAEn la celda 17 no *ay nin%<n valor num$ricoA,
;itle!BAE))&)A
Continuar B False
End =f
=f =sEm#ty(1ctiveS*eet.)an%e(A06A ;*en
,s%0o( Prom#t!BAEn la celda 06 no *ay nin%<n o#erador (C,O,(,!A,
;itle!BAE))&)A
End =f
End Sub

En lu%ar de los tres =f de com#robacin se #uede a#licar el o#erador &), de la
manera si%uientes!
Ejem#lo 7J
Sub Ejem#lo?7J(
'im Si%no 1s Strin%
'im "alor6 1s Strin%
'im "alor7 1s Strin%
'im ;otal 1s Strin%
'im Continuar 1s 0oolean
"alor6 B 1ctiveS*eet.)an%e(A16A."alue
"alor7 B 1ctiveS*eet.)an%e(A17A."alue
Si%no B 1ctiveS*eet.)an%e(A06A."alue
Continuar B ;rue
K Si en la celda 16 no *ay un valor num$rico
=f >ot =s>umeric(1ctiveS*eet.)an%e(A16A &r >ot
=s>umeric(1ctiveS*eet.)an%e(A17A &r =sEm#ty(1ctiveS*eet.)an%e(A06A
;*en
,s%0o( Prom#t!BA'ebe entrar n<meros en 16 y 17 y un si%no (C,O,(, ! en
06A, ;itle!BAE))&)A
Else
K =nstrucciones de las o#eraciones .......
End =f
End Sub

.ista de Funciones de Comprobacin&
=s>um$ric (E(#resin! Com#rueba si e(#resin tiene un valor que se #uede
inter#retar como num$rico.
=s'ate (E(#resin! Com#rueba si e(#resin tiene un valor que se #uede
inter#retar como ti#o fec*a.
=sEm#ty (E(#resin! Com#rueba que e(#resin ten%a al%<n valor, que se
*aya inicializado.
=sError (E(#resin! Com#rueba si e(#resin devuelve al%<n valor de error.
=s1rray (E(#resin! Com#rueba si e(#resin (una variable es un array o no.
=s&bject (E(#resin! Com#rueba si e(#resin (una variable re#resenta una
variable ti#o objeto.
=s>ull (E(#resin! Com#rueba si e(#resin contiene un valor nulo debido a
datos no vlidos.
>ot*in%! >o es #ro#iamente una funcin, sirve #ara com#robar si una variable
objeto esta asociada a un objeto antes de *acer cualquier o#eracin con ella.
Para trabajar con una variable objeto antes debe asi%narse a uno mediante la
instruccin Set , en caso contrario se #roducir un error en el #ro%rama cuando
utilice el objeto y se detendr su ejecucin.
Ejem#lo 7D
Sub &bj(
'im ) 1s )an%e
K Si la variable ) es >ot*in% es que no *a sido asi%nada, no se #uede trabajar
con ella
=f ) =s >ot*in% ;*en
,s%0o( Prom#t!BA-a variable &bjeto no *a sido asi%nadaA, 0uttons!Bvb&W,
;itle!BAErrorA
Else
)."alue B A9olaA
End =f
End Sub
Para trabajar con una variable objeto debe asi%narse a uno, mediante la
instruccin Set
Ejem#lo 7N
Sub &bj(
'im ) 1s )an%e
Set ) B 1ctiveS*eet.)an%e(A16A
K Si la variable ) es >ot*in% es que no *a sido asi%nada, no se #uede trabajar
con ella
=f ) =s >ot*in% ;*en
,s%0o( Prom#t!BA-a variable &bjeto no *a sido asi%nadaA, 0uttons!Bvb&W,
;itle!BAErrorA
Else
)."alue B A9olaA
End =f
End Sub

.a )uncin MsgBo%&
Esta funcin muestra un mensaje en un cuadro de dilo%o *asta que el usuario
#ulse un botn.
-a funcin devuelve un dato ti#o =nte%er en funcin del botn #ulsado #or el
usuario.
1 la *ora de invocar est funcin, se #ermiten diferentes ti#os de botones.
Sint(is de ,s%0o(. ,s%0o( ( ,ensaje, 0otones, ;/tulo, 1rc*ivo de ayuda,
conte(to
,ensaje! &bli%atorio, es el mensaje que se muestra dentro del cuadro de
dilo%o.
0otones! &#cional. Es un n<mero o una suma de n<meros o constantes (vea
tabla "alores #ara botones e =conos, que sirve #ara mostrar determinados
botones e iconos dentro del cuadro de dilo%o.
Si se omite este ar%umento asume valor F que corres#onde a un <nico 0otn
&W.
;/tulo! &#cional. Es el te(to que se mostrar en la barra del t/tulo del cuadro
de dilo%o.
1rc*ivo de 1yuda ! &#cional. Si *a asi%nado un te(to de ayuda al cuadro de
dilo%o, aqu/ debe es#ecificar el nombre del arc*ivo de ayuda donde est el
te(to.
Conte(t! &#cional. Es el n<mero que sirve #ara identificar el te(to al tema de
ayuda corres#ondiente que estar contenido en el arc*ivo es#ecificado en el
#armetro
1rc*ivo de 1yuda.
;abla #ara botones e iconos del cuadro ,s%0o( . (;abla co#iada del arc*ivo
de ayuda de ,icrosoft E(cel.
Constante "alor 'escri#cin "b&W&nly F ,uestra solamente el botn
1ce#tar.
"b&WCancel 6 ,uestra los botones 1ce#tar y Cancelar.
"b1bort)etry=%nore 7 ,uestra los botones 1nular, )eintentar e =%norar.
"b@es>oCancel 8 ,uestra los botones S/, >o y Cancelar.
"b@es>o J ,uestra los botones S/ y >o.
"b)etryCancel D ,uestra los botones )eintentar y Cancelar.
"bCritical 6N ,uestra el icono de mensaje cr/tico.
"bXuestion 87 ,uestra el icono de #re%unta de advertencia.
"bE(clamation JQ ,uestra el icono de mensaje de advertencia.
"b=nformation NJ ,uestra el icono de mensaje de informacin.
"b'efault0utton6 F El #rimer botn es el #redeterminado.
"b'efault0utton7 7DN El se%undo botn es el #redeterminado.
"b'efault0utton8 D67 El tercer botn es el #redeterminado.
"b'efault0uttonJ PNQ El cuarto botn es el #redeterminado.
"b1##lication,odal F 1#licacin modal5 el usuario debe res#onder al cuadro
de mensajes antes de #oder se%uir trabajando en la a#licacin actual.
"bSystem,odal JFRN Sistema modal5 se sus#enden todas las a#licaciones
*asta que el usuario res#onda al cuadro de mensajes.
El #rimer %ru#o de valores (F a D describe el n<mero y el ti#o de los botones
mostrados en el cuadro de dilo%o5 el se%undo %ru#o (6N, 87, JQ, NJ describe
el estilo del icono, el tercer %ru#o (F, 7DN, D67 determina el botn
#redeterminado y el cuarto %ru#o (F, JFRN determina la modalidad del cuadro
de mensajes.
Cuando se suman n<meros #ara obtener el valor final del ar%umento buttons,
se utiliza solamente un n<mero de cada %ru#o.
>ota! Estas constantes las es#ecifica "isual 0asic for 1##lications.Por lo
tanto, el nombre de las mismas #uede utilizarse en cualquier lu%ar del cdi%o
en vez de sus valores reales.
-os valores que #uede devolver la funcin ms%bo( en funcin del botn que
#ulse el usuario se muestran en la tabla si%uiente.
;abla de valores que #uede devolver ,s%0o(. (;abla co#iada del arc*ivo de
ayuda de ,icrosoft "isual 0asic #ara a#licaciones.
Constante "alor 'escri#cin "b&W 6 1ce#tar "bCancel 7 1nular "b1bort 8
Cancelar "b)etry J )eintentar "b=%nore D =%norar "b@es N S/ "b>o P >o
Ejem#los de ,s%0o(.
Ejem#lo 7P.
En referencia a un #roducto!
entrar desde el teclado!
o El nombre,
o la cantidad y
o el #recio.
%uardarlos en
o 16 el nombre,
o 17 la cantidad y
o 18 el #recio.
Calcular el total y
re%istrar el total en 1J.
Pedir un descuento, si el total es!
o su#erior a 6F.FFF o
o el nombre del #roducto el A#a#aA,
o calcularlo el total descuento y
o %uardarlo en 1D,
o restar el descuentodel total y
o %uardarlo en 1N.

Sub Ejem#lo?7P(
'im Producto 1s Strin%
'im Cantidad 1s Sin%le
'im Precio 1s Sin%le
'im ;otal 1s Sin%le
'im 'escuento 1s Sin%le
'im ;otal?'escuento 1s Sin%le
Precio B F
Producto B =n#ut0o((AEntrar >ombre del ProductoA, AEntrarA
Precio B "al(=n#ut0o((AEntrar el #recioA, AEntrarA
Cantidad B "al(=n#ut0o((AEntrar la cantidadA, AEntrarA
;otal B Precio M Cantidad
2it* 1ctiveS*eet
)an%e(A16A."alue B Producto
)an%e(A17A."alue B Precio
)an%e(A18A."alue B Cantidad
)an%e(A1JA."alue B ;otal
End 2it*
K Si total mayor que 6F.FFF o el #roducto es #a#a, a#licar descuento.
=f ;otal T 6FFFF &r Producto B A#a#aA ;*en
'escuento B "al(=n#ut0o((AEntrar 'escuentoA, AEntrarA
;otal?'escuento B ;otal M ('escuento : 6FF
;otal B ;otal O ;otal?'escuento
2it* 1ctiveS*eet
)an%e(A1DA."alue B ;otal?'escuento
)an%e(A1NA."alue B ;otal
End 2it*
End =f
End Sub
Estructuras +epetiti!as&
Este ti#o de estructuras #ermiten ejecutar ms de una vez el mismo bloque de
sentencias.
Ejem#lo 7Q.
)ealizar un #ro%rama que!
=n%rese las notas de una clase de D alumnos
%uardar las notas en las celdas 16 a 1D res#ectivamente, de la *oja
activa.
'es#u$s *acer la media
%urardar la media en 1N.
Con las estructuras vistas *asta a*ora, #odr/amos *acer!
Sub Ejem#lo?7Q(
'im >ota 1s =nte%er
'im ,edia 1s Sin%le
,edia B F
>ota B "al(=n#ut0o((AEntrar la 6 >ota ! A, AEntrar >otaA
1ctiveS*eet.)an%e(A16A."alue B >ota
,edia B ,edia C >ota
>ota B "al(=n#ut0o((AEntrar la 7 >ota ! A, AEntrar >otaA
1ctiveS*eet.)an%e(A17A."alue B >ota
,edia B ,edia C >ota
>ota B "al(=n#ut0o((AEntrar la 8 >ota ! A, AEntrar >otaA
1ctiveS*eet.)an%e(A18A."alue B >ota
,edia B ,edia C >ota
>ota B "al(=n#ut0o((AEntrar la J >ota ! A, AEntrar >otaA
1ctiveS*eet.)an%e(A1JA."alue B >ota
,edia B ,edia C >ota
>ota B "al(=n#ut0o((AEntrar la D >ota ! A, AEntrar >otaA
1ctiveS*eet.)an%e(A1DA."alue B >ota
,edia B ,edia C >ota
,edia B ,edia : D
1ctiveS*eet.)an%e(A1NA."alue B ,edia
End Sub
&bserve que este #ro%rama re#ite el si%uiente bloque de sentencias, D veces.
>ota B "al(=n#ut0o((AEntrar la ?? >ota ! A,AEntrar >otaA
1ctiveS*eet.)an%e(A1 ?? A."alue B >ota
,edia B ,edia C >ota
Para evitar esta ti#o de re#eticiones de cdi%o, los len%uajes de #ro%ramacin
incor#oran instrucciones que #ermiten la re#eticin de bloques de cdi%o.

Estructura repetiti!a Para 2)or4&
Esta estructura re#ite un %ru#o de instrucciones un n<mero es#ecificado de
veces.
-a estructura es la si%uiente!
Para var B"alor?=nicial 9asta "alor?Final Paso =ncremento 9acer =nicio
Sentencia 6
Sentencia 7
Sentencia >
Fin
"ar es una variable que la #rimera vez que se entra en el bucle se i%uala a
"alor?=nicial , las sentencias del bucle se ejecutan *asta que "ar lle%a al
"alor?Final , cada vez que se ejecutan el bloque de instrucciones "ar se
incrementa se%<n el valor de =ncremento .
En "isual 0asic #ara E(cel la estructura Para se im#lementa con la instruccin
For ... >e(t .
For "arible B "alor?=nicial ;o "alor?Final Ste# =ncremento
Sentencia 6
Sentencia 7
Sentencia >
>e(t "ariable
M Si el incremento es 6, no *ace falta #oner Ste# 6.
Ejem#lo 7R.
Entrar 6F valores utilizando la funcin =n#ut0o(,
sumarlos y
%uardar el resultado en la celda 16 de la *oja activa.
Sub Ejem#lo?7R(
'im i 1s =nte%er
'im ;otal 1s =nte%er
'im "alor 1s =nte%er
For i B 6 ;o 6F
"alor B "al(=n#ut0o((AEntrar un valorA, AEntradaA
;otal B ;otal C "alor
>e(t i
1ctiveCell.)an%e(A16A."alue B ;otal
End Sub
+ecorrer casillas de una 'oja de clculo&
+na o#eracin bastante *abitual cuando se trabaja con E(cel es el recorrido de
ran%os de casillas #ara llenarlas con valores, mirar su contenido, etc.
-as estructuras re#etitivas son im#rescindibles #ara recorrer %ru#os de celdas
o ran%os.
En los si%uientes ejem#los se #odr observar la utilizacin de estructuras
re#etitivas #ara recorrer ran%os de casillas, observe la utilizacin de las
#ro#iedades Cells y &ffset .
Propiedad Cells&
Esta #ro#iedad, sirve #ara referenciar una celda o un ran%o de celdas se%<n
coordenadas de fila y columna.
Ejem#lo 8F
-lenar el ran%o de las casillas 16..1D con valores #ares consecutivos
em#ezando #or el 7.
Sub Ejem#lo?8F(
'im Fila 1s =nte%er
'im i 1s =nte%er
Fila B 6
For i B 7 ;o 6F Ste# 7
1ctiveS*eet.Cells(Fila, 6."alue B i
Fila B Fila C 6
>e(t i
End Sub

Ejem#lo 86.
-lenar un ran%o de filas, em#ezando #or una celda, que se debe
es#ecificar desde teclado, con una serie de 6F valores correlativos
(comenzando #or el 6.
Sub Ejem#lo?86(
'im Celda?=nicial 1s Strin%
'im i 1s =nte%er
'im Fila 1s =nte%er
'im Columna 1s =nte%er
Celda?=nicial B =n#ut0o((A=ntroducir la celda =nicial (-etra de columna y
><mero de Fila! A, ACelda =nicialA
1ctiveS*eet.)an%e(Celda?=nicial.1ctivate
K ;omar el valor de fila de la celda activa sobre la variable Fila
Fila B 1ctiveCell.)o4
K ;omar el valor de columna de la celda activa sobre la variable Fila
Columna B 1ctiveCell.Column
For i B 6 ;o 6F
1ctiveS*eet.Cells(Fila, Columna."alue B i
Fila B Fila C 6
>e(t i
End Sub

Propiedades +OW 0 CO.5M*&
Como *abr deducido del ejem#lo anterior devuelven la fila y la columna de
un objeto ran%e.
En el ejem#lo anterior se utilizaban concretamente #ara obtener la fila y la
columna de la celda activa.
&tra forma de solucionar el ejem#lo anterior seria.
Ejem#lo 87
Sub Ejem#lo?87(
'im Celda?=nicial 1s Strin%
'im i 1s =nte%er
'im Fila 1s =nte%er
'im Columna 1s =nte%er
Celda?=nicial B =n#ut0o((A=ntroducir la celda =nicial (-etra de la Columna y
><mero de la Fila! A, ACelda =nicialA
1ctiveS*eet.)an%e(Celda?=nicial.1ctivate
Fila B 6
For i B 6 ;o 6F
1ctiveS*eet.)an%e(Celda?=nicial.Cells(Fila, 6."alue B i
Fila B Fila C 6
>e(t i
End Sub
MM )ecuerde que cuando utilizamos Cells como #ro#iedad de un ran%o
(&bjeto )an%e, Cells em#ieza a contar a #artir de la celda referenciada #or
)an%e .
Ejem#lo 88.
+tilizando el for y #ro#iedad Cells
Sub Ejem#lo?88(
'im >ota 1s =nte%er
'im ,edia 1s Sin%le
'im Fila 1s =nte%er
,edia B F
For Fila B 6 ;o D
>ota B "al(=n#ut0o((AEntrar la A L Fila L A >ota ! A, AEntrar >otaA
1ctiveS*eet.Cells(Fila, 6 B >ota
,edia B ,edia C >ota
>e(t Fila
End Sub

Propiedad O))set&
'evuelve un objeto )an%e que re#resenta un ran%o des#lazado con res#ecto al
ran%o es#ecificado. Es de slo lectura.
Ejem#lo 8J.
Sub Ejem#lo?8J(
'im >ota 1s =nte%er
'im ,edia 1s Sin%le
'im Fila 1s =nte%er
,edia B F
1ctiveS*eet.)an%e(A16A.1ctivate
For Fila B F ;o J
>ota B "al(=n#ut0o((AEntrar la A L Fila C 6 L A >ota ! A, AEntrar >otaA
1ctiveCell.&ffset(Fila, F."alue B >ota
,edia B ,edia C >ota
>e(t Fila
,edia B ,edia : D
1ctiveCell.&ffset(N, 6."alue B ,edia
End Sub

Ejem#lo 8D.
1*ora se cambia de celda activa.
Sub Ejem#lo?8D(
'im >ota 1s =nte%er
'im ,edia 1s Sin%le
'im i 1s =nte%er
,edia B F
1ctiveS*eet.)an%e(A16A.1ctivate
For i B 6 ;o D
>ota B "al(=n#ut0o((AEntrar la A L i L A >ota ! A, AEntrar >otaA
1ctiveCell."alue B >ota
,edia B ,edia C >ota
K9acer activa la celda situada una fila #or debajo de la actual
1ctiveCell.&ffset(6, F.1ctivate
>e(t
,edia B ,edia : D
1ctiveCell."alue B ,edia
End Sub
-os ejem#los 8J y 8D, utilizan la #ro#iedad &ffset de forma diferente.
En el ejem#lo 8J la celda activa siem#re es la misma 16. &ffset se
utiliza #ara referenciar una celda a #artir de $sta.
En el ejem#lo 8D se va cambiando de celda activa cada vez, de forma
que cuando termina la ejecucin del #ro%rama, la celda activa es 1N.

Estructura repetiti!a $o W'ile&&.oop 29acer Mientras4&
'o 2*ile ...-oo# re#ite un bloque de instrucciones cuando una condicin es
verdadera, o *asta que una condicin se convierta en falsa.
Para las situaciones en que se sabe #reviamente el n<mero de veces que se *a
de re#etir un #roceso, la estructura re#etitiva for resulta conveniente.
Pero cuando #reviamente no se sabe el n<mero de veces que se debe re#etir un
#roceso, deberemos recurrir a la sentencia 'o 2*ile ... -oo# en al%una de sus
formas.
Esta estructura re#etitiva, 'o 2*ile .. -oo#, est controlada #or una o varias
condiciones5 la re#eticin del bloque de sentencias de#ender, de si se va
cum#liendo la condicin o las condiciones.
Ejem#lo8N
Construir, en E(cel, una tabla que conten%a los si%uientes cam#os!
>ombre , Ciudad , Edad , Fec*a .

Pro%rama #ara entrar re%istros en la tabla.
Cada cam#o se entra con =n#ut0o(.
El #ro%rama va #idiendo datos mientras se entre un valor en el =n#ut0o(
corres#ondiente al >ombre.
Cuando al #re%untar el >ombre no se entre nin%<n valor, terminar la
ejecucin del bloque encerrado entre 'o 2*ile ... -oo#.
Sub Ejem#lo?8N(
'im >ombre 1s Strin%
'im Ciudad 1s Strin%
'im Edad 1s =nte%er
'im fec*a 1s 'ate
K 1ctivar *oja6
2or3s*eets(A9oja6A.1ctivate
K1ctivar celda 17
1ctiveS*eet.)an%e(A17A.1ctivate
>ombre B =n#ut0o((AEntre el >ombre ()eturn #ara ;erminar ! A, A>ombreA
K ,ientras la variable >ombre sea diferente a cadena vac/a
'o 2*ile >ombre VT AA
Ciudad B =n#ut0o((AEntre la Ciudad ! A, ACiudadA
Edad B "al(=n#ut0o((AEntre la Edad ! A, AEdadA
fec*a B C'ate(=n#ut0o((AEntra la Fec*a (ddOmmOaa ! A, AFec*aA
K Co#iar los datos en las casillas corres#ondientes
2it* 1ctiveCell
."alue B >ombre
.&ffset(F, 6."alue B Ciudad
.&ffset(F, 7."alue B Edad
.&ffset(F, 8."alue B fec*a
End 2it*
K9acer activa la celda de la fila si%uiente a la actual
1ctiveCell.&ffset(6, F.1ctivate
>ombre B =n#ut0o((AEntre el >ombre ()eturn #ara ;erminar ! A, A>ombreA
-oo#
End Sub
En este ejem#lo, siem#re se em#ieza a llenar el ran%o a #artir de la celda 17,
consecuentemente, la se%unda vez que ejecute la macro destruir los datos
re%istrados anteriormente.
-a estructura del ejem#lo 8P recorrer una fila de celdas a #artir de 16 *asta
encontrar una vac/a y dejar a esta como celda activa #ara que la entrada de
datos comience a #artir de ella.
Ejem#lo 8P.
Sub Ejem#lo?8P(
K1ctivar *oja6
2or3s*eets(A9oja6A.1ctivate
K1ctivar celda 17
1ctiveS*eet.)an%e(A16A.1ctivate
K ,ientras la celda activa no est$ vac/a
'o 2*ile >ot =sEm#ty(1ctiveCell
K 9acer activa la celda situada una fila #or debajo de la actual
1ctiveCell.&ffset(6, F.1ctivate
-oo#
End Sub
Ejem#lo 8Q.
1#licar la estructura del ejem#lo 8P a la tabla del ejem#lo 8N.
Sub Ejem#lo?8Q(
'im >ombre 1s Strin%
'im Ciudad 1s Strin%
'im Edad 1s =nte%er
'im fec*a 1s 'ate
2or3s*eets(A9oja6A.1ctivate
1ctiveS*eet.)an%e(A16A.1ctivate
K 0uscar la #rimera celda vac/a de la columna 1 y convertirla en activa
'o 2*ile >ot =sEm#ty(1ctiveCell
1ctiveCell.&ffset(6, F.1ctivate
-oo#
>ombre B =n#ut0o((AEntre el >ombre ()eturn #ara ;erminar ! A, A>ombreA
K ,ientras la variable >ombre sea diferente a cadena vac/a
'o 2*ile >ombre VT AA
Ciudad B =n#ut0o((AEntre la Ciudad ! A, ACiudadA
Edad B "al(=n#ut0o((AEntre la Edad ! A, AEdadA
fec*a B C'ate(=n#ut0o((AEntra la Fec*a (ddOmmOaa ! A, AFec*aA
2it* 1ctiveCell
."alue B >ombre
.&ffset(F, 6."alue B Ciudad
.&ffset(F, 7."alue B Edad
.&ffset(F, 8."alue B fec*a
End 2it*
1ctiveCell.&ffset(6, F.1ctivate
>ombre B =n#ut0o((AEntre el >ombre ()eturn #ara ;erminar ! A, A>ombreA
-oo#
End Sub

Ejem#lo 8R
Si se #refiere que el #ro%rama #re%unte si e(isten mas datos #ara re%istrar
Sub Ejem#lo?8R(
'im >ombre 1s Strin%
'im Ciudad 1s Strin%
'im Edad 1s =nte%er
'im fec*a 1s 'ate
'im ,as?datos 1s =nte%er
2or3s*eets(A9oja6A.1ctivate
1ctiveS*eet.)an%e(A16A.1ctivate
K 0uscar la #rimera celda vac/a de la columna 1 y convertirla en activa
'o 2*ile >ot =sEm#ty(1ctiveCell
1ctiveCell.&ffset(6, F.1ctivate
-oo#
,as?datos B vb@es
'o 2*ile ,as?datos B vb@es
>ombre B =n#ut0o((AEntre el >ombre ()eturn #ara ;erminar ! A, A>ombreA
Ciudad B =n#ut0o((AEntre la Ciudad ! A, ACiudadA
Edad B "al(=n#ut0o((AEntre la Edad ! A, AEdadA
fec*a B C'ate(=n#ut0o((AEntra la Fec*a (ddOmmOaa! A, AFec*aA
2it* 1ctiveCell
."alue B >ombre
.&ffset(F, 6."alue B Ciudad
.&ffset(F, 7."alue B Edad
.&ffset(F, 8."alue B fec*a
End 2it*
1ctiveCell.&ffset(6, F.1ctivate
K Pre%untar al usuario si desea entrar otro re%istro.
,as?datos B ,s%0o((A&tro re%istro YA, vb@es>o C vbXuestion, AEntrada de
datosA
-oo#
End Sub
Es #reciso incor#orar la variable ,as?datos, que es una variable, de ti#o
=nte%er .

Estructura $o&&&.oop W'ile&
Esta estructura, re#ite un bloque de instrucciones cuando una condicin es
verdadera, o *asta que una condicin se convierta en falsa5 la condicin se
eval<a al final5 consecuentemente las instrucciones del cuer#o del bucle se
ejecutaran al menos una vez .
Ejem#lo JF

Sub Ejem#lo?JF(
'im >ombre 1s Strin%
'im Ciudad 1s Strin%
'im Edad 1s =nte%er
'im fec*a 1s 'ate
'im ,as?datos 1s =nte%er
2or3s*eets(A9oja6A.1ctivate
1ctiveS*eet.)an%e(A16A.1ctivate
K 0uscar la #rimera celda vac/a de la columna 1 y convertirla en activa
'o 2*ile >ot =sEm#ty(1ctiveCell
1ctiveCell.&ffset(6, F.1ctivate
-oo#
'o
>ombre B =n#ut0o((AEntre el >ombre ()eturn #ara ;erminar ! A, A>ombreA
Ciudad B =n#ut0o((AEntre la Ciudad ! A, ACiudadA
Edad B "al(=n#ut0o((AEntre la Edad ! A, AEdadA
fec*a B C'ate(=n#ut0o((AEntra la Fec*a ! A, AFec*aA
2it* 1ctiveCell
."alue B >ombre
.&ffset(F, 6."alue B Ciudad
.&ffset(F, 7."alue B Edad
.&ffset(F, 8."alue B fec*a
End 2it*
1ctiveCell.&ffset(6, F.1ctivate
,as?datos B ,s%0o((A&tro re%istro YA, vb@es>o C vbXuestion, AEntrada de
datosA
K,ientras ,as?'atos B vb@es
-oo# 2*ile ,as?datos B vb@es
End Sub
>o es #recisa la l/nea A,as?'atos B vb@esA antes de 'o #ara forzar la entrada
en el bucle, #ues la condicin va al final.
Estructura $o&&&.oop 5ntil 29acer&& 9asta :ue se cumpla la condicin4&
)e#ite instrucciones *asta que una condicin lle%ue a ser verdadera.
9ay dos formas de utilizar la #alabra clave +ntil #ara com#robar el estado de
una condicin en una instruccin 'o...-oo#!
Se #uede com#robar la condicin antes de entrar en el bucle (como
muestra el #rocedimiento ComPrimero+ntil,
o se #ueden com#robar des#u$s de que el bucle se *aya ejecutado al
menos una vez (como muestra el #rocedimiento ComFinal+ntil. El
bucle si%ue ejecutndose mientras la condicin si%a siendo Falsa.
-a entrada de datos con este bucle quedar/a

Ejem#lo J6!
Sub Ejem#lo?J6(
'im >ombre 1s Strin%
'im Ciudad 1s Strin%
'im Edad 1s =nte%er
'im fec*a 1s 'ate
'im ,as?datos 1s =nte%er
2or3s*eets(A9oja6A.1ctivate
1ctiveS*eet.)an%e(A16A.1ctivate
K 0uscar la #rimera celda vac/a de la columna 1 y convertirla en activa
'o 2*ile >ot =sEm#ty(1ctiveCell
1ctiveCell.&ffset(6, F.1ctivate
-oo#
'o
>ombre B =n#ut0o((AEntre el >ombre ()eturn #ara ;erminar ! A, A>ombreA
Ciudad B =n#ut0o((AEntre la Ciudad ! A, ACiudadA
Edad B "al(=n#ut0o((AEntre la Edad ! A, AEdadA
fec*a B C'ate(=n#ut0o((AEntra la Fec*a ! A, AFec*aA
2it* 1ctiveCell
."alue B >ombre
.&ffset(F, 6."alue B Ciudad
.&ffset(F, 7."alue B Edad
.&ffset(F, 8."alue B fec*a
End 2it*
1ctiveCell.&ffset(6, F.1ctivate
,as?datos B ,s%0o((A&tro re%istro YA, vb@es>o C vbXuestion, AEntrada de
datosA
K9asta que ,as?'atos sea i%ual a vb>o
-oo# +ntil ,as?datos B vb>o
End Sub
Estructura For Eac'&
Este bucle se utiliza bsicamente #ara ejecutar un %ru#o de sentencias con los
elementos de una coleccin o una matriz (#ronto veremos los que es.
)ecuerde que una coleccin es un conjunto de objetos, *ojas, ran%os, etc.
"ea el ejem#lo si%uiente que se utiliza #ara cambiar los nombres de las *ojas
de un libro de trabajo.
Ejem#lo J7.
Pro%rama que #re%unta el nombre #ara cada *oja de un libro de trabajo, si no
se #one nombre a la *oja, queda el que tiene.
Sub Ejem#lo?J7(
'im >uevo?>ombre 1s Strin%
'im 9oja 1s 2or3s*eet
K Para cada *oja del conjunto 2or3s*eets
For Eac* 9oja =n 2or3s*eets
>uevo?>ombre B =n#ut0o((A>ombre de la 9oja ! A L 9oja.>ame, A>ombrar
9ojasA
=f >ueva?>ombre VT AA ;*en
9oja.>ame B >uevo?>ombre
End =f
>e(t
End Sub
MM 9oja va referenciando cada una de las *ojas del conjunto 2or3S*eets a
cada #aso de bucle.

Procedimientos 0 )unciones&
Se define como #rocedimiento o funcin a un bloque de cdi%o que realiza
al%una tarea. 9asta a*ora, se *an construido los #ro%ramas utilizando un <nico
#rocedimiento, #ero a medida que los #ro%ramas (y los #roblemas crecen se
va *aciendo necesaria la inclusin de ms #rocedimientos.
Podr/a fcilmente caer en la tentacin de utilizar, como *asta a*ora, un <nico
#rocedimiento #or #ro%rama #ero se dar cuenta r#idamente de que este
m$todo no es nada #rctico ya que %randes bloques de cdi%o im#lican mayor
com#licacin del mismo, re#eticin de sentencias y lo que es ms %rave,
mayores #roblemas de se%uimiento a la *ora de de#urar errores, am#liar
funcionalidades o incluir modificaciones.
-a filosof/a de utilizar #rocedimientos es la anti%ua frmula del Adivide y
vencersA, es decir, con los #rocedimientos #odremos tratar cada #roblema o
tarea de forma ms o menos aislada de forma que construiremos el #ro%rama
#aso a #aso evitando tener que resolver o controlar m<lti#les cosas a la vez.
Cada tarea la realizar un #rocedimiento, si esta tarea im#lica la ejecucin de
otras tareas, cada una se im#lementar y solucionar en su corres#ondiente
#rocedimiento de manera que cada uno *a%a una cosa concreta. 1s/, los
diferentes #asos que se deben ejecutar #ara que un #ro%rama *a%a al%o,
quedaran bien definidos cada uno en su corres#ondiente #rocedimiento, si el
#ro%rama falla, fallar a #artir de un #rocedimiento y de esta forma #odremos
localizar el error ms r#idamente.
-os #rocedimientos son tambi$n un eficaz mecanismo #ara evitar la re#eticin
de cdi%o en un mismo #ro%rama e incluso en diferentes #ro%ramas.
Su#onemos que *abr intuido que *ay muc*as tareas que se re#iten en casi
todos los #ro%ramas, veremos como los #rocedimientos que ejecutan estas
tareas se #ueden incluir en un mdulo de forma que este sea e(#ortable a otros
#ro%ramas y de esta manera %anar tiem#o que, como dice el t#ico, es
#recioso.

$e)inir un procedimiento&
>uevamente re#itamos este #rocedimiento
Sub >ombre?Procedimento
Sentencias.
End Sub.
.lamar a un procedimiento&
Para llamar un #rocedimiento desde otro se utiliza la instruccin Call
>ombre?Procedimiento.
Sub P?+no
Sentencias.
.
Call P?'os
.
Sentencias
.
End Sub
-as secuencias del #rocedimiento P?+no se ejecutan *asta lle%ar a la l/nea
Call P?'os, entonces se salta al #rocedimiento P?'os, se ejecutan todas las
sentencias de este #rocedimiento y el #ro%rama continua ejecutndose en el
#rocedimiento P?+no a #artir de la sentencia que si%ue a Call P?'os.
Ejem#lo J8.
En este ejem#lo, el cdi%o que salta casilla *asta que se encuentra una vac/a se
im#lementa en un #rocedimiento llamado, Saltar?Celdas?-lenas. &bserve que
#ara entrar valores se *a sustituido 'o 2*ile..-oo# #or 'o.. -oo# 2*ile.
Sub Ejem#lo?J8(
'im >ombre 1s Strin%
'im Ciudad 1s Strin%
'im Edad 1s =nte%er
'im fec*a 1s 'ate
K -lamada a la funcin Saltar?Celdas?-lenas, el #ro%rama salta aqu/ a ejecutar
las
Kinstrucciones de este #rocedimiento y lue%o vuelve #ara continuar la
ejecucin a #artir de la
Kinstruccin 'o
Call Saltar?Celdas?-lenas
'o
>ombre B =n#ut0o((AEntre el >ombre ! A, A>ombreA
Ciudad B =n#ut0o((AEntre la Ciudad ! A, ACiudadA
Edad B "al(=n#ut0o((AEntre la Edad ! A, AEdadA
Fec*aBCdate(=n#ut0o((AEntra la Fec*a ! A, AFec*aA
2it* 1ctiveCell
."alue B >ombre
.&ffset(F,6."alue B Ciudad
.&ffset(F,7."alue B Edad
.&ffset(F,8.value B fec*a
End 2it*
1ctiveCell.&ffset(6,F.1ctivate
,as?datos B ,s%0o((A&tro re%istro YA, vb@es>oCvbXuestion,AEntrada de
datosA
-oo# 2*ile ,as?'atos B vb@es
End Sub
K Funcin que salta celdas de una misma columna. Sirve #ara encontrar la
#rimera celda vac/a de la
K columna
Sub Saltar?Celdas?-lenas(
2or3S*eets(A9oja6A.1ctivate
1ctiveS*eet.)an%e(A16A.1ctivate
'o 2*ile not =sEm#ty(1ctiveCell
1ctiveCell.&ffset(6,F.1ctivate
-oo#
End Sub
,enerali-ar una )uncin&
&bserve que #ara saltar un ran%o de casillas llenas slo necesitar llamar a la
funcin Saltar?Celdas?-lenas, #ero, siem#re y cuando este ran%o est$ en una
*oja llamada A9oja6A y em#iece en la casilla 16, el #rocedimiento es #oco
#rctico ya que su mbito de funcionamiento es limitado. En la si%uiente
seccin modificaremos el #rocedimiento de manera que sirva #ara recorrer un
ran%o que em#iece en cualquier casilla de cualquier *oja.

Parmetros&
-os #armetros son el mecanismo #or el cual un #rocedimiento #uede #asarle
valores a otro y de esta forma condicionar, moldear, etc. las acciones que
ejecuta. El #rocedimiento llamado %ana entonces en fle(ibilidad. -a sinta(is
de llamada de un #rocedimiento es la si%uiente, Call Procedimiento
(Parmetro6, Parmetro7,..., Parmetro>.
-os #armetros #ueden ser valores o variables.
-a sinta(is #ara el #rocedimiento llamado es la si%uiente,
Sub Procedimiento(Parmetro6 as ;i#o, Parmetro7 1s ;i#o,..., Parmetro8
1s ;i#o
&bserve que aqu/ los #armetros son variables que recibirn los valores,
evidentemente debe *aber coincidencia de ti#o.
Por ejem#lo, si el #rimer #armetro es una variable ti#o =nte%er, el #rimer
valor que se le debe #asar al #rocedimiento cuando se llama tambi$n *a de ser
de ti#o =nte%er (recuerde que #uede ser un valor directamente o una variable.
Ejem#lo JJ.
1*ora la funcin Saltar?Celdas?-lenas tiene dos #armetros 9oja y
Casilla?=nicial que reciben res#ectivamente la *oja donde est el ran%o a
recorrer y la casilla inicial del ran%o.
Sub Ejem#lo?JJ(
'im >ombre 1s Strin%
'im Ciudad 1s Strin%
'im Edad 1s =nte%er
'im fec*a 1s 'ate
K -lamada a la funcin Saltar?Celdas?-lenas, observar que mediante dos
#armetros se indica
K al #rocedimiento en que *oja est el ran%o a saltar y en la casilla donde debe
em#ezar.
Call Saltar?Celdas?-lenas(A9oja6A, A16A
'o
>ombre B =n#ut0o((AEntre el >ombre ()eturn #ara ;erminar ! A, A>ombreA
Ciudad B =n#ut0o((AEntre la Ciudad ! A, ACiudadA
Edad B "al(=n#ut0o((AEntre la Edad ! A, AEdadA
Fec*aBCdate(=n#ut0o((AEntre la Fec*a ! A, AFec*aA
2it* 1ctiveCell
."alue B >ombre
.&ffset(F,6."alue B Ciudad
.&ffset(F,7."alue B Edad
.&ffset(F,8.value B fec*a
End 2it*
1ctiveCell.&ffset(6,F.1ctivate
,as?datos B ,s%0o((A&tro re%istro YA, vb@es>oCvbXuestion,AEntrada de
datosA
-oo# 2*ile ,as?'atos B vb@es
End Sub
K
K Procedimiento Saltar?Celdas?-lenas.
K Sirve #ara Saltar celdas llenas de una columna *asta encontrar una vac/a que
se convierte en activa
K Parmetros !
K 9oja ! 9oja donde est el ran%o a saltar.
K Casilla?=nicial ! Casilla =nicial de la columna
Sub Saltar?Celdas?-lenas(9oja 1s Strin%, Casilla?=nicial 1s Strin%
2or3S*eets(9oja.1ctivate
1ctiveS*eet.)an%e(Casilla?=nicial.1ctivate
'o 2*ile not =sEm#ty(1ctiveCell
1ctiveCell.&ffset(6,F.1ctivate
-oo#
End Sub
&bserve que a*ora el #rocedimiento Saltar?Celdas?-lenas sirve #ara recorrer
cualquier ran%o en cualquier *oja.
&bserve que al #rocedimiento se le #asan dos valores directamente, recuerde,
y esto es quizs lo ms *abitual, que
tambi$n #ueden #asarse variables, #or ejem#lo.
Sub Ejem#lo?JD
.
'im 9oja 1s Strin%
'im Casilla?=nicial 1s Strin%
9oja B =n#ut0o((AEn que *oja est la base de datos ! A, AEntrar >ombre de
9ojaA
Casilla?=nicial B =n#ut0o((AEn que casilla comienza la base de datosA,ACasilla
=nicialA
K &bserve que los #armetros son dos variables cuyo valor se *a entrado desde
teclado en
K las dos instrucciones =n#ut0o( anteriores.
Call Saltar?Celdas?-lenas(9oja, Casilla?=nicial
End Sub

Variables locales 0 !ariables ,lobales&
El mbito de una variable declarada dentro de una funcin es la #ro#ia
funcin, es decir no #odr utilizares fuera de dic*a
funcin. 1s/, el si%uiente #ro%rama que deber/a sumar las cinco filas
si%uientes a #artir de la casilla activa y %uardar el resultado en la se(ta es
incorrecto.
Sub 1l%una?Cosa(
Call Sumar?Cinco?Si%uientes
1ctiveCell.&ffset(N,F."alue B Suma
End Sub
Sub Sumar?Cinco?Si%uientes(
'im i 1s =nte%er
'im Suma 1s Sin%le
SumaBF
For iB6 ;o D
Suma B SumaC1ctiveCell.&ffset(i,F."alue
>e(t i
End Sub
Es incorrecto #orque tanto las variable i como la variable Suma estn
declaradas dentro del #rocedimiento Sumar?Cinco?Si%uientes
consecuentemente, su mbito de accin es este #rocedimiento. Por tanto, la
instruccin 1ctiveCell.&ffset(N,F."alue B Suma del #rocedimiento
1l%una?Cosa, %enerar/a un error (con &#tion E(#licit activado ya que la
variable Suma no est declarado dentro de $l. Si #iensa en declarar la variable
Suma dentro del #rocedimiento 9acer?1l%o, no solucionar nada #orque esta
ser local a dic*o #rocedimiento, en este caso tendr/a dos variables llamadas
Suma #ero cada una de ellas local a su #ro#io #rocedimient o y
consecuentemente con el mbito de accin restrin%ido a ellos.
+na solucin, que a nosotros no nos %usta, seria declarar suma como variable
%lobal. +na variable %lobal se declara fuera de todos los #rocedimientos y es
reconocida #or todos los #rocedimientos del mdulo,
&#tion E(#licit
K Suma es una variable %lobal reconocida #or todos los #rocedimientos del
mdulo.
'im Suma 1s Sin%le
Sub 1l%una?Cosa(
Call Sumar?Cinco?Si%uientes
1ctiveCell.&ffset(N,F."alue B Suma
End Sub
Sub Sumar?Cinco?Si%uientes(
'im i 1s =nte%er
SumaBF
For iB6 ;o D
Suma B SumaC1ctiveCell.&ffset(i,F."alue
>e(t i
End Sub
-as variables %lobales son #erfectas en cierta ocasiones, #ara este caso seria
mejor declarar Suma en la funcin
9acer?1l%o y #asarla como #armetro al #rocedimiento
Sumar?Cinco?Si%uientes.
Sub 1l%una?Cosa(
'im Suma 1s Sin%le
K -lamada a la funcin Sumar?Cinco?Si%uientes #asndole la variable Suma
Call Sumar?Cinco?Si%uientes(Suma
1ctiveCell.&ffset(N,F."alue B Suma
End Sub
Sub Sumar?Cinco?Si%uientes(S 1s Sin%le
'im i 1s =nte%er
SumaBF
For iB6 ;o D
S B SC1ctiveCell.&ffset(i,F."alue
>e(t i
End Sub
Esto le funcionaria #orque la variable #armetro S (y se le *a cambiado el
nombre adrede de Sumar?Cinco?Si%uientes es la variable Suma declarada en
9acer?1l%o. Funcionar #orque en "isual 0asic, a menos que se indique lo
contrario, el #aso de #armetros es #or referencia, vea la si%uiente seccin.

Paso por re)erencia 0 paso por !alor&
>o entraremos en detalles sobre como funciona el #aso de #armetros #or
valor y el #aso de #armetros #or referencia, slo indicaremos que en el !
a #aso #or valor, la variable #armetro del #rocedimiento, recibe el valor de
la variable (o directamente el valor de su #armetro corres#ondiente de la
instruccin de llamada y
b #aso #or referencia, la variable #armetro del #rocedimiento, es la misma
que su #armetro corres#ondiente de la instruccin de llamada, es decir, la
declarada en el #rocedimiento desde el que se *ace la llamada.
Por defecto, y siem#re que en la instruccin de llamada se utilicen variables,
las llamadas son #or referencia. Si desea que el #aso de #armetros sea #or
valor, debe ante#oner a la variable #armetro la #alabra reservada 0y"al, #or
ejem#lo,
Sub Saltar?Celdas?-lenas(0y"al 9oja 1s Strin%, 0y"al Casilla?=nicial 1s
Strin%
1unque lo ele%ante y efectivo #or razones de memoria seria #asar siem#re que
sea #osible #or valor, es #oco *abitual que as/ se *a%a en "isual 0asic,
se%uramente esto ocurre #or comodidad. Como su#onemos que *ar como la
mayor/a, es decir, #asar #or referencia, ten%a cuidado con los (indeseables
efectos laterales.
Co#ie y ejecute este #ro%rama y descubrir que son los efectos laterales.
Ejem#lo Efecto?-ateral.
1ntes de co#iar el #ro%rama, active una *oja en blanco y #on%a valores del 6
al 6D distribuidos de la forma si%uiente, en el ran%o 16!1D valores del 6 al D,
en el ran%o 06!0D valores del N al 6F, en el ran%o C6!CD valores del 66 al 6D.
El si%uiente #ro%rama debe recorrer cada una de tres las columnas de valores,
sumarlos y #oner el resultado en las filas N de cada columna. Entonces, se%<n
los valores que *a entrado en cada una de las columnas, cuando *aya acabado
la ejecucin del #ro%rama debe *aber los si%uientes resultados, 1N B 6D,
0NBJF, CNBND.
Para llevar a cabo la suma de los valores de cada columna se llama a la
funcin )ecorrer?Sumar tres veces, una #ara cada columna, esta funcin
recibe en el #armetro F el valor de la fila donde debe em#ezar a sumar, sobre
el #armetro C el valor de la columna a sumar y sobre el #armetro X la
cantidad de filas que *a de recorrer.
El #ro%rama utiliza la #ro#iedad Cells #ara referenciar las filas y columnas de
los ran%os. &bserve atentamente los valores que ir co%iendo la variable Fila
ya que esta ser la que sufra el efecto lateral.
Sub Efecto?-ateral(
'im Fila 1s =nte%er
Fila B 6
Call )ecorrer?Sumar(Fila, 6,D K Columna 1
Call )ecorrer?Sumar(Fila, 7,D K Columna 0
Call )ecorrer?Sumar(Fila, 8,D K Columna C
End Sub
Sub )ecorrer?Sumar(F 1s =nte%er, C 1s =nte%er, X 1s =nte%er
'im i 1s =nte%er
'im ;otal 1s =nte%er
;otal B F
For i B6 ;o X
;otal B ;otal C 1ctiveS*eet.Cells(F, C."alue
FBFC6 K &Z& con esta asi%nacin, recuerde que F es la variable Fila declarada
en
K el #rocedimiento Efecto?-ateral
>e(t i
1ctiveS*eet.Cells(F, C B ;otal
End Sub
Cuando ejecute el #ro%rama se #roducir la salida si%uiente, en 1N *abr un
6D, *asta aqu/ todo correcto, #ero observe que en la se%unda columna a#arece
un F en 067 y en la tercera columna a#arece un F en C6Q, veamos que *a
#asado.
-a #rimera vez que se llama la funcin, la variable F vale 6 ya que este es el
valor que tiene su #armetro corres#ondiente (Fila en la instruccin Call.
&bserve que F se va incrementando una unidad a cada #aso de bucle For,
)EC+E)'E que F es realmente la variable Fila declarada en el
#rocedimiento Efecto?-ateral, #or tanto cuando finaliza el #rocedimiento
)ecorrer?Sumar y vuelve el control al #rocedimiento Efecto?-ateral Fila vale
N, y este es el valor que se #asar a )ecorrer?Suma la se%unda vez que se
llama, a #artir de a*/ todo ir mal ya que se em#ezar el recorrido de filas #or
la N.
+na de las soluciones a este #roblema #ara *acer que cada vez que se llame
)ecorrer?Sumar la variable F reciba el valor 6, es utilizar un #aso #or valor, es
decir que F reciba el valor de Fila, no que sea la variable Fila, observe que
entonces, si
F no es la variable Fila, cuando incremente F no se incrementar Fila, esta
siem#re conservar el valor 6.
Para *acer que F sea un #armetro #or valor, sim#lemente #on%a la #alabra
0y"al antes de F en la declaracin del #rocedimiento.
"uelva a ejecutar el #ro%rama, ver como a*ora funciona correctamente.
=nsistimos de nuevo en que ten%a cuidado con estas cosas. 1l menos a*ora ya
est sobre aviso, cuando un #ro%rama no *a%a lo que *a #revisto una de las
cosas que deber re#asar es el #aso de #armetros a los #rocedimientos.
MM Para finalizar, observe que en muc*as ocasiones le *emos indicado que en
el #aso #or referencia la variable del #rocedimiento llamado es la variable
declarada en el #rocedimiento que llama. En este <ltimo ejem#lo, le *emos
dic*o que F era la variable Fila, #ues bien, esto no es cierto Fila es una
variable y F es otra variable, a*ora es l%ico que se #re%unte #or qu$ entonces
F act<a como si fuera Fila, este es un tema que no entra en el mbito de este
manual, si al%una vez #ro%rama en C y lle%a al tema de los #unteros entender
que es lo que sucede realmente en el #aso #or #armetro y en el #aso #or
valor. Si ya conoce los #unteros de C o Pascal entonces ya *abr intuido que
el #aso #or valor en nuestro ejem#lo equivaldr/a a,
)ecorrer?Fila(F, C, X5
void )ecorrer?Fila(int F, int C, int X
@ un #aso #or referencia a
)ecorrer?Fila(LF, C, X5
"oid )ecorrer?Fila(int MF, int C, int X

Funciones&
+na funcin es lo mismo que un #rocedimiento con la salvedad que este
devuelve un valor al #rocedimiento o funcin que lo llama. "ea el si%uiente
ejem#lo, es una funcin muy sencilla ya que sim#lemente suma dos n<meros
y devuelve el resultado.
Ejem#lo JN.
Funcin que devuelve la suma de dos valores que se le #asan como
#armetros.
&bserve las diferentes formas en como se llama la funcin.
Sub Ejem#lo?JN(
'im ( 1s =nte%er
'im n6 1s =nte%er, n7 1s =nte%er
I B Suma(D, D
n6B "al ( =n#ut0o((AEntrar un n<mero ! A, AEntradaA
n7B "al ( =n#ut0o((AEntrar otro n<mero ! A, AEntradaA
IB suma(n6,n7
1ctiveCell."alue B Suma(1ctiveS*eet.)an%e(A16A."alue ,
1ctiveS*eet.)an%e(A17A."alue
I B Suma(D, J C Suma (n6, n7
End Sub
Function Suma("6 1s =nte%er, "7 1s =nte%er 1s =nte%er
'im ;otal 1s =nte%er
;otal B "6 C "7
Suma B ;otal
End Function
&bserve la sinta(is de la cabecera de funcin,
Function Suma("6 1s =nte%er, "7 1s =nte%er 1s =nte%er
-a estructura %eneral seria, Function >ombre?Funcion(#ar6 1s ;i#o, #ar7 1s
;i#o,..., #ar> 1s ;i#o 1s ;i#o.
-a sinta(is es similar a la cabecera de un #rocedimiento, slo que una funcin
tiene ti#o, esto tiene su l%ica, ya que una funcin devuelve un valor, ese valor
ser de un ti#o determinado. 1s/, en nuestro ejem#lo de Function Suma, esta
funcin es de ti#o =nte%er, o dic*o de otra manera, la funcin ejecuta sus
sentencias y devuelve un valor *acia el #rocedimiento o la funcin que la
llam, el valor devuelto se establece i%ualando el nombre de la funcin a al%o,
>ombre?Funcin B ....
En el ejem#lo de Function Suma,
Suma B ;otal
&bserve tambi$n la sinta(is de la llamada a la funcin, en el ejem#lo *emos
utilizado unas cuantas formas de llamarla, lo que debe tener siem#re #resente
es que en cualquier e(#resin aritm$tica o de clculo, el ordenador realiza un
m/nimo de dos o#eraciones, una de clculo y otra de asi%nacin.
Por ejem#lo, 1B 0CC El ordenador #rimero calcula el resultado de sumar
0CC lue%o asi%na ese resultado a la variable 1. En cualquier llamada a una
funcin, cojamos #or caso, IB suma(n6,n7 Primero se ejecutan todas las
sentencias de la funcin Suma, lue%o se asi%na el clculo de la funcin a la
variable I. 'e otro vistazo a la funcin de ejem#lo y vea lo que realiza cada
sentencia en la que se llama a la funcin Suma.
"eamos a continuacin unos cuantos ejem#los de funciones. 1ntes recordarle
que todo lo referente a #armetros #or valor y referencia, variables locales y
%lobales, etc. que estudiamos en los #rocedimientos es lo mismo #ara las
funciones.
Ejem#lo JP.
Funcin que devuelve la direccin de la #rimera celda vac/a de un ran%o. -a
funcin es de ti#o Strin% ya que devuelve la casilla en la forma AFilaColumna
A, #or ejem#lo A16FA. +tilizaremos la #ro#iedad 1ddress del objeto ran%e,
esta #ro#iedad devuelve un strin% que contiene la referencia AFilaColumnaA de
una casilla o ran%o de casillas. En el caso de un ran%o devuelve,
AFilaColumna?=nicial!FilaColumna?FinalA, #or ejem#lo A16!C6FA
Sub Ejem#lo?JP(
'im Casilla 1s Strin%
Casilla B Casilla?"acia(A16A
End Sub
K Funcin Casilla?"acia de ;i#o Strin%
K Sirve #ara )ecorrer las filas de una columna *asta encontrar una vac/a.
K Parmetros !
K Casilla?=nicio ! Casilla donde debe em#ezar a buscar.
K 'evuelve +n strin% que contiene la referencia de la #rimera casilla
Function Casilla?"acia(Casilla?=nicio 1s Strin% 1s Strin%
1ctiveS*eet.)an%e(Casilla?=nicio.1ctivate
'o 2*ile >ot =sEm#ty(1ctiveCell
1ctiveCell.&ffset(6, F.1ctivate
-oo#
Casilla?"acia B 1ctiveCell.1ddress
End Function
Ejem#lo JQ.
Similar al anterior. Es la t/#ica b<squeda secuencial de un valor en un ran%o
de casillas, en esta funcin solo se avanzar a trav$s de una fila. -a funcin
devuelve la direccin (address de la casilla donde est el valor buscado, en
caso que el valor no est$ en el ran%o de filas, devuelve una cadena vac/a (AA.
Sub Ejem#lo?JQ(
'im Casilla 1s Strin%
Casilla B 0uscar?"alor(A16A, 7D
K Si valor no encontrado
=f Casilla B AA ;*en
Else K"alor encontrado
End if
End Sub
K Funcin 0uscar de ;i#o Strin%
K Sirve #ara )ecorrer las filas de una columna *asta encontrar el valor buscado
o una de vac/a.
K Parmetros !
K Casilla?=nicial ! Casilla donde debe em#ezar a buscar.
K "alor?0uscado ! "alor que se debe encontrar
K 'evuelve +n strin% que contiene la referencia de la casilla donde se *a
encontrado el valor.
K ;ambi$n #uede devolver AA en caso que el valor buscado no est$.
Function 0uscar(Casilla?=nicial 1s Strin%, "alor?0uscado 1s =nte%er 1s
Strin%
1ctiveS*eet.)an%e(Casilla?=nicial.1ctivate
K ,ientras casilla no vac/a @ valor de casilla diferente al buscado
'o 2*ile >ot =sEm#ty(1ctiveCell 1nd 1ctiveCell."alue VT "alor?0uscado
1ctiveCell.&ffset(6, F.1ctivate
-oo#
K Si la casilla donde se *a detenido la b<squeda >& ES;[ "1C\1 es que se
*a encontrado
Kel valor.
=f >ot =sEm#ty(1ctiveCell ;*en
0uscar B 1ctiveCell.1ddress K 'evolver la casilla donde se *a encontrado el
valor
Else K -a casilla est vac/a, >& se *a encontrado el valor buscado
0uscarBAA K 'evolver una cadema vac/a
End if
End Function
Ejem#lo JR.
Similar al anterior. 0<squeda secuencial de un valor en un ran%o de casillas,
en esta funcin se avanzar a trav$s de filas y columnas. -a funcin devuelve
la direccin (address de la casilla donde est el valor buscado, en caso que el
valor no est$ en el ran%o, devuelve una cadena vac/a (AA.
Sub Ejem#lo?JR(
'im Casilla 1s Strin%
Casilla B 0uscar?"alor(A16A, 7D
=f Casilla B AA ;*en
Else
End if
End Sub
Function 0uscar(Casilla?=nicial 1s Strin%, "alor?0uscado 1s =nte%er 1s
Strin%
'im =ncremento?Columna 1s =nte%er
'im Continuar 1s 0oolean
1ctiveS*eet.)an%e(Casilla?=nicial.1ctivate
Continuar B ;rue
'o 2*ile Continuar
=ncremento?Columna B F
K 0uscar el valor #or las columnas *asta encontrarlo o encontrar una celda
vac/a.
'o 2*ile >ot =sEm#ty(1ctiveCell.&ffset(F, =ncremento?Columna 1nd
1ctiveCell. &ffset(F, =ncremento?Columna."alue VT "alor?0uscado
K Si%uiente columna
=ncremento?Columna B =ncremento?Columna C 6
-oo#
K Si no est vac/a la casilla entonces #arar la b<squeda, se *a encontrado el
valor
=f >ot =sEm#ty(1ctiveCell.&ffSet(F, =ncremento?Columna ;*en
ContinuarBFalse
Else K -a casilla est vac/a, no se *a encontrado el valor
1ctiveCell.&ffset(6, F.1ctivate K Saltar a una nueva fila
=f =sEm#ty(1ctiveCell ;*en K Si la casilla de la nueva fila est vac/a
ContinuarBFalse K Parar la b<squeda, no *ay ms casilla a recorrer
End if
End if
-oo#
K Si la casilla donde se *a detenido la b<squeda >& ES;[ "1C\1 es que se
*a encontrado
Kel valor.
=f >ot =sEm#ty(1ctiveCell ;*en
0uscar B 1ctiveCell(F, =ncremento?Columna.1ddress K 'evolver la casilla
donde se
K*a encontrado el valor
Else K -a casilla est vac/a, >& se *a encontrado el valor buscado
0uscarBAA K 'evolver una cadema vac/a
End if
End Function
-a clusula Private.
Puede ante#oner la clusula #rivate a todos los #rocedimientos y funciones
que sean llamados slo desde el mismo mdulo, es una forma de a*orrar
memoria y *acer que el #ro%rama corra un #oco ms r#ido. Si necesita llamar
un #rocedimiento o funcin desde otro mdulo, nunca debe #recederlo #or la
clusula #rivate, recuerde que esta clusula restrin%e el mbito de utilizacin
de un #rocedimiento a su #ro#io mdulo. Su#on%amos el ejem#lo si%uiente.
K ,dulo 6
Sub Heneral
....
End Sub
Private Sub Privado
....
End Sub
K ,dulo 7
Sub Procedimiento?de?modulo7
K Esto es correcto. -lama al #rocedimiento Heneral definido en ,dulo6
Call Heneral
K Esto no es correcto. -lama al #rocedimiento Privado definido en ,dulo 6,
este
K #rocedimiento va #recedido #ro la clusula Private, #or tanto slo #uede ser
llamado
K desde #rocedimientos de su #ro#io mdulo
Call Privado
End Sub
"amos a ver a continuacin tres ejem#los ms sobre funciones. Es im#ortante
que los cree en un libro de trabajo nuevo y los #on%a en un mismo mdulo, al
final del ca#/tulo utilizaremos las o#ciones de e(#ortar e im#ortar mdulos de
#rocedimientos y funciones. En todos los ejem#los ver el #rocedimiento
Procedimiento?-lamador, es #ara mostrar de que forma se debe llamar al
#rocedimiento o funcin. -os #rocedimientos im#lementados son, #or
llamarlo de al%una manera, de ti#o %eneral, es decir, son #rocedimientos que
#odr utilizar en muc*as a#licaciones.
Ejem#lo DF.
Procedimiento que abre un cuador ,s%0o( y muestra el te(to que se le #aso
como #armetro.
Sub Procedimiento?-lamador(
Call m1viso(AEsto es el mensaje de avisoA, AEsto es el ;/tuloA
End Sub
K Procedimiento m1viso
K Funcin ,ostrar el cuadro de funcin ,s%0o(, con el icono informacin y el
botn &W (1ce#tar.
K Se utiliza #ara mostrar avisos.
K Parmetros!
K ;e(to B ;e(to que muestra el cuadro
K ;itulo B ;/tulo del cuadro
K
Sub m1viso(;e(to 1s Strin%, ;itulo 1s Strin%
,s%0o( Prom#t!B;e(to, 0uttons!Bvb&W&nly C vb=nformation, ;itle!B;itulo
End Sub
Ejem#lo D6.
Funcin ti#o ran%e que devuelve un ran%o. &bserve como la funcin se i%uala
a una variable ti#o )an%e, recuerde que con esta variable #odr acceder a
todas las #ro#iedades e invocar todos los m$todos #ro#ios de los objetos
)an%e.
En este ejem#lo en concreto se utilizan las variables #ara Co#iar un %ru#o de
celdas de un ran%o *acia otro, se utilizan los m$todos Co#y y Paste del objeto
)an%e.
Sub Procedimiento?-lamador(
'im )an%o?&ri%en 1s )an%e
'im )an%o?'estino 1s )an%e
Set )an%o?&ri%enBCo%er?)an%o(16,D,D
)an%o?&ri%en.Co#y
Set )an%o?'estinoBCo%er?)an%o(H6,D,D
)an%o?'estino.Paste PasteS#ecial!B(lPaste1ll
End Sub
K Funcin que devuelve un ran%o a una variable de este ti#o
K Parmetros
K Casilla B casilla inicial del ran%o
K Filas B n<meroK de filas
K Columnas B n<mero de columnas del ran%o
Function Co%er?)an%o(Casilla 1s Strin%, Filas 1s =nte%er, Columnas 1s
=nte%er 1s )an%e
'im Casilla?Final 1s Strin%
1ctiveS*eet.)an%e(Casilla.1ctivate
1ctiveCell.Cells(Filas, Columnas.1ctivate
Casilla?Final B 1ctiveCell.1ddress
1ctiveS*eet.)an%e(Casilla L A!A L Casilla?Final.Select
Set Co%er?)an%o B 1ctiveS*eet.)an%e(Casilla L A!A L Casilla?F=nal
End Function
Ejem#lo D7.
Funcin #ara com#robar el ti#o de datos. Es una funcin de com#robacin que
se #uede utilizar #ara validar los datos que se entran desde un cuadro
=n#ut0o( o desde los cuadros de te(to de formularios. -a funcin es de ti#o
0ooleano, devuelve ;rue (cierto o False en funcin de si el dato #asado es
correcto. En esta funcin se eval<an slo datos num$ricos y datos ti#o Fec*a,
#uede am#liarla #ara que se com#rueben ms ti#os.
Sub Procedimiento?-lamador(
'im Cantidad 1s =nte%er
'im Fec*a 1s 'ate
'im 'atos 1s Strin%
'atos B =n#ut0o((AEntrar una Cantidad ! A, AEntrarA
=f >ot Com#robar?;i#o('atos,A>A ;*en
m1viso(A-os datos introducido no son num$ricosA, AErrorA
Else
Cantidad B "al('atos
End =f
'atosB=n#ut0o((AEntrar Fec*aA,AEntrarA
=f >ot Com#robar?;i#o('atos,AFA ;*en
m1viso(A-os fec*a introducida no es correctaA, AErrorA
Else
Fec*a B "al('atos
End =f
End Sub
K Funcin que eval<a si el ti#o de datos que se le #asan son correctos o no. Si
son correctos devuelve
K ;)+E , en caso contrario devuelve F1-SE
K Parmetros
K "alor Bvalor que se debe com#robar, de ti#o Strin%
K ;i#o B ti#o a com#robar, A>A OOT >um$rico, AFA, ti#o fec*a
Function Com#robar?;i#o("alor 1s Strin%, ;i#o 1s Strin% 1s 0oolean
'im "alido 1s 0oolean
"alido B ;rue
Select Case ;i#o
K Com#rueba si es un valor num$rico vlido
Case A>A
=f >ot =s>umeric("alor ;*en
"alido B False
End =f
K Com#rueba si es un valor fec*a vlido
Case AFA
=f >ot =s'ate("alor ;*en
"alido B False
End =f
End Select
Com#robar?;i#o B "alido
End Function

(mportar 0 E%portar mdulos&
-os <ltimos tres ejem#los que *emos visto, como le *emos indicado, son
#rocedimientos que #ueden ser utilizados en multitud de ocasiones o
situaciones, seria interesante tenerlos dis#onibles en cualquiera de las *ojas
que confeccionemos.
Podr/a #ensar en utilizar las o#ciones de co#iar y #e%ar #ara #asar
#rocedimientos de una *oja a otra, es un m$todo totalmente vlido y efectivo,
#ero le #ro#onemos a continuacin otro m$todo ms A#rofesionalA, #or
llamarlo de otra manera, e i%ual de efectivo. Este m$todo consiste en %uardar
los #rocedimientos de un mdulo en un arc*ivo a#arte, es decir, inde#endiente
de cualquier *oja de clculo, lue%o, cuando en una nueva *oja necesite estas
funciones, solo deber im#ortar este arc*ivo #ara incor#orarlo.
E(#ortar un mdulo. Huardar un mdulo en un arc*ivo.
Como ejem#lo, abra la *oja donde #uso los tres <ltimos #rocedimientos.
6. Pase al editor de visual basic y active el mdulo a e(#ortar.
7. 1ctive o#cin de la barra de men<s 1rc*ivo: E(#ortar arc*ivo. 1#arece un
cuadro de dilo%o.
8. En cuadro de edicin >ombre de 1rc*ivo, teclee el nombre #ara el arc*ivo
donde se %uardar el mdulo, #or ejem#lo AHeneral.0asA, observe que .01S
es la e(tensin de estos arc*ivos.
J. Pulse sobre el botn Huardar.
=m#ortar un mdulo.
Si est si%uiendo el ejem#lo, cierre todos los arc*ivos de E(cel y abra uno
nuevo.
6. 1ctive el editor "isual 0asic.
7. 1ctive o#cin de la barra de men<s 1rc*ivo: =m#ortar 1rc*ivo. 1#arece un
cuadro de dilo%o.
8. Seleccione en la lista 0uscar en! la car#eta donde tiene ubicado el arc*ivo a
im#ortar (la car#eta donde est Heneral.0as si est si%uiendo el ejem#lo.
J. +na vez localizada la car#eta, seleccione el arc*ivo a im#ortar (Heneral.0as
en el ejem#lo y #ulse sobre 1brir.
&bserve como en la ventana de #royecto se *a incor#orado un nuevo mdulo
que contiene todos los #rocedimientos y
funciones del arc*ivo im#ortado.
;erminamos aqu/ el tema de #rocedimientos y funciones, d$jenos insistir de
nuevo en que es muy im#ortante que construya sus #ro%ramas utilizando todas
las ventajas que le ofrece la #ro%ramacin modular. Como <ltimo consejo,
a%ru#e todas las funciones que usted considere de utilizacin %eneral en uno o
dos mdulos y lue%o utilice las o#ciones de im#ortacin y e(#ortacin #ara
incor#orarlos a sus #ro%ramas.
1rriba

Vous aimerez peut-être aussi