You are on page 1of 57

Pgina 1

MACROS EN MS EXCELL
Que es una macro ?.
Una macro son un conjunto de instrucciones que sirven para automatizar procesos. Refirindonos a excel, supongamos que realizamos
frecuentemente la accin de seleccionar un rango para aplicarle negrita, cambio de fuente y centrado. En lugar de acer estas acciones
manualmente, se puede elaborar una macro e invocarla para que ejecute los tres procesos autom!ticamente.
Objetos, propiedades y mtodos.
Objeto.
Propiedades.
"ualquier objeto tiene caracter#sticas o propiedades como por ejemplo el color, la forma, peso, medidas, etc. Estas propiedades se
definen en la clase y luego se particularizan en cada objeto. $s#, en la clase coce se podr#an definir las propiedades "olor, $nco y
%argo , luego al definir un objeto concreto como coce ya se particularizar#an estas propiedades a, por ejemplo, "olor & Rojo, $nco &
' metros y %argo & (,) metros.
Mtodos.
Repasemos a continuacin todos estos conceptos pero aora desde el punto de vista de algunos de los objetos que nos encontraremos en
Excel como WorkSheet *+bjeto oja de c!lculo, o Range *+bjeto casilla o rango de casillas,.
Un objeto Range est! definido por una clase donde se definen sus propiedades, recordemos que una propiedad es una caracter#stica,
modificable o no, de un objeto. Entre las propiedades de un objeto Range est!n Value , que contiene el valor de la casilla , Column y
Ro que contienen respectivamente la fila y la columna de la casilla, !ont que contiene la fuente de los caracteres que muestra la
casilla, etc.
Range, como objeto, tambin tiene mtodos, recordemos que los mtodos sirven llevar a cabo una accin sobre un objeto. -or ejemplo
el mtodo Acti"ate, ace activa una celda determinada, Clear, borra el contenido de una celda o rango de celdas, Co#$, copia el
contenido de la celda o rango de celdas en el portapapeles,...
Conjuntos.
.entro de un libro de trabajo puede existir m!s de una oja *WorkSheet,, todas las ojas de un libro de trabajo forman un conjunto, el
con%unto WorkSheet&. "ada elemento individual de un conjunto se referencia por un #ndice, de esta forma, la primera, segunda y
tercera oja de un libro de trabajo, se referenciar!n por /or01eets*2,, /or01eets*', y /or01eets*(,.
Objetos de Objetos.
En Excel, el objeto WorkSheet& tiene la propiedad Range que es un objeto, Range tiene la propiedad !ont que es tambin un objeto y
!ont tiene la propiedad 'ol( *negrita,. 3enga esto muy presente ya que utilizaremos frecuentemente -ropiedades de un objeto que
ser!n tambin +bjetos. .ico de otra forma, ay propiedades que devuelven objetos, por ejemplo, la propiedad Range de un objeto
WorkSheet devuelve un objeto de tipo Range.
E(itor (e Vi&ual 'a&ic)
El editor de visual b!sic es la aplicacin que utilizaremos para construir las macros que interactuaran junto con los libros de trabajo. $
continuacin prepararemos un arcivo en el que escribiremos las primeras instrucciones en 4isual basic.
Preparar un archivo nuevo.
-ara entrar en el editor de 4isual 5asic, ejecute los pasos siguientes.
2. $ctive opcin *erramienta&+ Macro+ E(itor (e Vi&ual '&ic. 1e abrir! la ventana siguiente.
Insertar un nuevo mduo.
Un mdulo sirve para agrupar procedimientos y funciones. El procedimiento y la funcin son entidades de programacin que sirven
para agrupar instrucciones de cdigo que realizan una accin concreta.
-ara insertar un mdulo active opcin del men6 ,n&ertar+ M-(ulo. 1e activar! una nueva ventana.
Insertar un procedimiento.
7a emos dico que un procedimiento es un bloque de instrucciones de cdigo que sirven para llevar a cabo alguna tarea espec#fica. Un
procedimiento empieza siempre con la instruccin
Su. Nombre_Procedimiento
7 termina con la instruccin
En( Su..
$ continuacin crearemos un procedimiento para poner el texto 89ola8 en la casilla $2.
E%em#lo 1
Su. Primero
Range*8$28,.Value & 89ola8
En( Su.
+bserve el cdigo.
Range*8$28,.Value&89ola8
En esta l#nea estamos indicando que trabajamos con un objeto Range) -ara indicarle que nos referimos a la casilla $2, encerramos entre
parntesis esta referencia. .e este objeto, indicamos que queremos establecer un nuevo valor para la propiedad Value, observe que para
separar el objeto de su propiedad utilizamos la notacin punto.
Recuerde que el conjunto Range es un objeto que pende del objeto WorkSheet&, as# por ejemplo el siguiente cdigo ar#a lo mismo
que el anterior.
WorkSheet&*2,.Range*8$28,.Value & 89ola8
5ueno, de eco no ace lo mismo, en la primera opcin, el texto 89ola8 se pone dentro de la casilla $2 de la oja activa, mientras que
en el segundo es en la casilla $2 de primera oja * del conjunto de ojas,. %a segunda notacin es m!s larga, pero tambin m!s
recomendable ya que se especifican todos los objetos. En mucas ocasiones se pueden omitir algunos objetos precedentes, no le
aconsejamos acerlo, sus programas perder!n claridad y concisin. 1i desea acer referencia a la oja activa puede utilizar
Acti"eSheet, as#, el primer ejemplo lo dejaremos de la manera siguiente.
Su. Primero
$ctive1eet.Range*8$28,.4alue & 89ola8
En( Su.
1i desea poner 89ola8 *o cualquier valor, en la casilla activa, puede utilizar la propiedad *objeto, Acti"ecell de WorkSheet&. $s# para
poner 89ola8 en la casilla activa de la oja activa seria,
Su. Primero
$ctive1eet.$ctive"ell.4alue & 89ola8
En( Su.
E%em#lo /
En este segundo ejemplo simplemente ampliaremos la funcionalidad de la macro del ejemplo 2. $dem!s de escribir 89ola8 en la casilla
$2 de la celda $2, la pondremos en negrita y le daremos color al texto. -ara ello utilizaremos las propiedades 'ol( y Color del objeto
!ont.
Su. 1egundo
$ctive1eet.Range*8$28,.4alue & 89ola8
$ctive1eet.Range*8$28,.:ont.5old & True
$ctive1eet.Range*8$28,.:ont."olor & RGB*')),;,;,
En( Su.
True.
0rue, que traducido es verdadero, simplemente indica que la propiedad 'ol( est! activada. 1i se deseara desactivar, bastar#a con
igualarla al valor !al&e.
La funcin RGB.
+bserve que para establecer el color de la propiedad se utiliza la funcin !"#*Red, <reen, 5lue,, los tres argumentos para esta funcin
son valores del ; a ')) que corresponden a la intensidad de los colores Rojo, 4erde y $zul respectivamente.
Referenciar un rango de celdas.
1lo tiene que cambiar a la forma Casia$Inicia%Casia$&ina. -or ejemplo aplicar el 6ltimo ejemplo al rango de casillas que va de la
$2 a la $=, ponga.
Su. Segundo
$ctive1eet.Range*8$2>$=8,.4alue & 89ola8
$ctive1eet.Range*8$2>$=8,.:ont.5old & True
$ctive1eet.Range*8$2>$=8,.:ont."olor & RGB*')),;,;,
En( Su.
'ariabes.
$ continuacin vamos a repetir el programa Ejemplo2, pero en lugar de poner 89ola8 en la casilla $2 de la oja activa, dejaremos que
el usuario entre un texto desde teclado y a continuacin guardaremos ese valor en esa casilla. +bserve que el valor que entre del usuario
debe guardarse en alg6n lugar para poder ponerlo despus en la casilla $2? pues bien, ese valor se guardar! en una variable. Una
variable es simplemente un trozo de memoria que la funcin o procedimineto se reserva para guardar datos, la forma general de declarar
una variable es 1,M variable AS tipo.
1iendo variable el nombre que se asigna a la misma y 0i#o el tipo de datos que se guardar!n *n6meros, texto, feca, boleanos,...,. En
nuestro ejemplo, declararemos la variable de tipo (trin) *tipo texto,, y lo aremos de la forma siguiente. 1im 3exto A& (trin)
"on esto estamos indicando que se reserve un trozo de memoria *el que sea, , que se llama 3exto y que el tipo de datos que se
guardar!n a# ser!n caracteres.
La Funcin InputBox.
Esta funcin muestra una ventana para que el usuario pueda teclear datos. "uando se pulsa sobre Ace#tar, los datos entrados pasan a la
variable a la que se a igualado la funcin. 4ea la l#nea siguiente.
3exto & Input#o**8@ntroduzca el texto8, 8Entrada de datos8,.
1i en la ventana que muestra @nput5ox pulsa sobre el botn $ceptar, los datos tecleados se guardar!n el la variable 3exto.
Sintaxis de InputBox.
Input#o**Mensaje, Ttulo, Valor por defecto, Posicin ori!ontal, Posicin Vertical, "rci#o$ a%uda, N&mero de conte'to para la
a%uda,.
Mensaje > Es el mensaje que se muestra en la ventana. 1i desea poner m!s de una l#nea ponga "r*2(, para cada nueva l#nea, vea el
ejemplo siguiente.
Ttulo > Es el t#tulo para la ventana Input#o*. Es un par!metro opcional.
Valor por defecto> Es el valor que mostrar! por defecto el cuadro donde el usuario entra el valor. -ar!metro opcional.
Posicin (ori!ontal> %a posicin A de la pantalla donde se mostrar! el cuadro, concretamente es la posicin para la parte izquierda. 1i
se omite el cuadro se presenta orizontalmente centrado a la pantalla.
Posicin Vertical> %a posicin 7 de la pantalla donde se mostrar! el cuadro, concretamente es la posicin para la parte superior. 1i se
omite el cuadro se presenta verticalmente centrado a la pantalla.
"rci#o "%uda) Es el arcivo que contiene la ayuda para el cuadro. -ar!metro opcional.
N&mero de conte'to para la a%uda) B6mero asignado que corresponde al identificador del arcivo de ayuda, sirve para localizar el
texto que se debe mostrar. 1i se especifica este
par!metro, debe especificarse obligatoriamente el par!metro $rcivo $yuda.
E%em#lo 2
Su. *ntrarCValor
1im 3exto A& String
+ ,r-./0 sir#e para 1ue el mensaje se muestre en dos 2neas
3exto & @nput5ox*8@ntroducir un texto 8 D "r*2(, D 8-ara la casilla $28, 8Entrada de datos8,
$ctive1eet.Range*8$28,.4alue & 3exto
En( Su.
Este ejemplo tambin se puede acer sin variables.
Su. *ntrar_Valor
$ctive1eet.Range*8$28,.4alue & 3nputBo'*8@ntroducir un texto 8 D "r*2(, D 8-ara la casilla
$28, 8Entrada de datos8,
En( Su.
E%em#lo 3
Repetiremos el ejemplo (, pero en lugar de entrar los valores sobre la casilla $2, aremos que el usuario
pueda elegir en que casilla quiere entrar los dat os, es decir, se le preguntar! al usuario mediante un
segundo @nputbox sobre que casilla quiere entrar el valor del primer @nputbox. 1er!n necesaria dos
variables, una para guardar la casilla que escoja el usuario y otra para guardar el valor.
O#tion Ex#licit
Su. *ntrar_Valor
1im "asilla A& String
1im 3exto A& String
"asilla & @nput5ox*8En que casilla quiere entrar el valor8, 8Entrar "asilla8,
3exto & @nput5ox*8@ntroducir un texto 8 D "r*2(, D 8-ara la casilla 8 D "asilla , 8Entrada de
datos8,
$ctive1eet.Range*"asilla,.4alue & 3exto
En( Su.
Pgina 4
+a sentencia Option ,*picit.
En visual basic no es necesario declarar las variables, por ejemplo, en el programa anterior se ubiera
podido prescindir de las l#neas
1im "asilla A& (trin)
1im 3exto A& (trin)
$ pesar de ello, le recomendamos que siempre declare las variables que va a utilizar, de esta forma sabr!
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 variables,
si no declara las variables al principio del procedimiento ocurrir!n dos cosas. -rimero, las variables no
declaradas son asumidas como tipo Variant *este es un tipo de datos que puede almacenar cualquier
valor, n6mero, fecas, texto, etc. pero tenga en cuenta que ocupa '; 5ytes y para guardar una referencia a
una casilla, la edad de alguien, etc. no son necesarios tantos bytes,? segundo, reducir! considerablemente
la legibilidad de sus procedimient os ya que las variables las ir! colocando a medida que las necesite, esto,
a la larga complicar! la correccin o modificacin del procedimiento.
5ueno, pues toda la explicacin anterior es para que declare todas las variables que va a utilizar. %a
sentencia O#tion Ex#licit al principio del mdulo fuerza a que se declaren todas las variables. 1i al
ejecutar el programa, se encuentra alguna variable sin declarar se producir! un error y no se podr!
ejecutar el programa asta que se declare.
1i todav#a no se a convencido sobre la conveniencia de declarar las variables y utilizar O#tion Ex#licit,
pruebe el procedimiento siguiente, cpielo tal cual *3exto y 3esto est!n puestos adrede simulando que
nos emos equivocado al teclear,.
Su. EntrarC4alor
3exto & @nput5ox*8@ntroducir un texto 8 D "r*2(, D 8-ara la casilla $28, 8Entrada de datos8,
$ctive1eet.Range*8$28,.4alue & 3esto
En( Su.
+bserve que el programa no ace lo que se pretend#a que iciera. Efectivamente, 3exto y 3esto son dos
variables diferentes, como no se a declarado ninguna ni se a utilizado O#tion Ex#licit 4isual 5asic no
da ning6n tipo de error y ejecuta el programa. -ruebe el siguiente mdulo e intente ejecutarlo.
O#tion Ex#licit
Su. EntrarC4alor
1im 3exto A& String
3exto & @nput5ox*8@ntroducir un texto 8 D "r*2(, D 8-ara la casilla $28, 8Entrada de datos8,
$ctive1eet.Range*8$28,.4alue & 3esto
En( Su.
+bserve que el programa no se ejecuta, al poner O#tion Ex#licit, forzamos a que se declaren todas las
variables. 4isual 5asic detecta que la variable Testo no a sido declarada y as# lo indica mostrando Error,
entonces es cuando es m!s f!cil darnos cuenta del error que emos cometido al teclear y cambiamos
3esto por 3exto. $ora imagine que el error se produce en un programa de cientos de l#neas que necesita
otras tantas variables.
http%--....cybercursos.net
Pgina 15
Tipos de datos en Visual Basic para Excel. *3abla copiada de la ayuda en l#nea de 4isual 5asic
para Excel,.
0i#o (e (ato& 0ama6o
1e almacenamiento
,nter"alo
'$te 2 byte ; a '))
'oolean ' bytes 3rue o :alse
,nteger ' bytes E('.FG= a ('.FGF
Long*entero largo, H bytes E'.2HF.H=(.GH= a '.2HF.H=(.GHF
Single *coma flotanteI
precisin simple,
H bytes E(,H;'='(E(= a E2,H;2'J=EEH) para valores negativos?
2,H;2'J=EEH) a (,H;'='(E(= para valores positivos
1ou.le *coma flotanteI
precisin doble,
= bytes E2,FJFGJ(2(H=G'('E(;= a EH,JH;G)GH)=H2'HFEE('H
para valores negativos? H,JH;G)GH)=H2'HFEE('H a
2,FJFGJ(2(H=G'('E(;= para valores positivos
Currenc$ *entero a
escala,
= bytes EJ''.((F.';(.G=).HFF,)=;= a
J''.((F.';(.G=).HFF,)=;F
1ecimal 2H bytes KIEFJ.''=.2G'.)2H.'GH.((F.)J(.)H(.J);.(() sin punto
decimal? KIEF,J''=2G')2H'GH((F)J()H(J);(() con
'= posiciones a la dereca del signo decimal? el
n6mero m!s pequeLo distinto de cero esKIE
;,;;;;;;;;;;;;;;;;;;;;;;;;;;;2
1ate = bytes 2 de enero de 2;; a (2 de diciembre de JJJJ
O.%ect H bytes "ualquier referencia a tipo +bject
String *longitud
variable,
2; bytes K longitud de
la cadena
.esde ; a '.;;; millones
String*longitud fija, %ongitud de la cadena .esde 2 a G).H;; aproximadamente
Variant*con n6meros, 2G bytes "ualquier valor numrico asta el intervalo de un tipo
.ouble
Variant*con
caracteres,
'' bytes K longitud de
cadena
El mismo intervalo que para un tipo 1tring de longitud
variable
1e7ini(o #or el
u&uario *utilizando
3ype,
B6mero requerido por
los elementos
El intervalo de cada elemento es el mismo que el
intervalo de su tipo de datos.
Conversin de /ipos de datos.
"opie el siguiente Ejemplo. 1implemente se piden dos n6meros, se suman y se guardan el la casilla $2 de
la oja activa.
E%em#lo 8
O#tion Ex#licit
Su. 1umar*,
1im Bumero2 A& ,nteger
1im Bumero' A& ,nteger
Bumero2 & @nput5ox*8Entrar el primer valor8, 8Entrada de datos8,
Bumero' & @nput5ox*8Entrar el primer valor8, 8Entrada de datos8,
$ctive1eet.Range*8$28,.4alue & Bumero2 K Bumero'
En( Su.
http%--....cybercursos.net
Pgina 11
Ejecute el procedimiento y ponga respectivamente los valores ') y '). +bserve que todo a ido
correctamente y en la casilla $2 de la oja activa aparece un );.
$ora, vuelva a ejecutar el programa y cuando se le pide el primer valor teclee 89ola8. +bserve que el
programa se detiene indicando un error en el tipo de datos. Efectivamente, observe que la funcin
@nput5ox devuelve siempre datos tipo (trin), en el primer ejemplo no a abido ning6n problema, al
entrar caracteres numricos2, estos pueden asignarse a variables tipo Inte)er porque 4isual 5asic ace
autom!ticamente la conversin, pero al entrar texto e intentarlo asignar a una variable Inte)er 4isual
5asic muestra un error indicando que la variable no es adecuada para los datos que se desean guardar.
-ara solucionar estos problemas se deben utilizar funciones de conversin de tipo. Estas funciones, como
su nombre indica, convierten datos de un tipo a otro, de (trin) a Inte)er, de Inte)er a (trin), de 0ate a
(trin) ,... $s# el procedimiento anterior quedar#a.
O#tion Ex#licit
Su. Sumar*,
1im Bumero2 A& ,nteger
1im Bumero' A& ,nteger
Bumero2 & 4al*@nput5ox*8Entrar el primer valor8, 8Entrada de datos8,,
Bumero' & 4al*@nput5ox*8Entrar el primer valor8, 8Entrada de datos8,,
$ctive1eet.Range*8$28,.4alue & Bumero2 K Bumero'
En( Su.
%a funcin 'a*.ato 1tring,, convierte una cadena de caracteres a valor numrico. 1i la cadena a
convertir contiene alg6n car!cter no numrico devuelve ;. $s#, si al pedir un valor se teclea 89ola8, la
funcin 4al, devolver! un cero.
2 3enga en cuenta que para los ordenadores no es lo mismo el n6mero 2 que el car!cter 828. En los
lenguajes de programacin actuales la conversin de car!cter 828 a n6mero 2 se ace autom!ticamente en
mucos casos, esto es bueno y es malo. Es bueno porque nos aorra tener que acer las conversiones y es
malo porque es m!s dif#cil controlar ciertos casos. 1iga con los ejemplos y entender! de lo que estamos
ablando. 1lo para su informacin, el ordenador guarda el n6mero 2 de la siguiente manera ;;;;;;;2,
mientras que el car!cter 828 se guarda como ;;22;;;; *el n6mero H= del cdigo $1"@@,.
http%--....cybercursos.net
Pgina 1/
&unciones de conversin de tipos. -Tabla copiada de la a%uda en lnea de Visual Basic para *'cel04
'a*"adena,. "onvierte la cadena a un valor numrico.
(tr*B6mero,. "onvierte el n6mero a una expresin cadena.
%as siguientes funciones tienen la forma &uncin*Expresin,.
!unci-n 0i#o (e"uelto ,nter"alo (el argumento ex#re&i-n
Cboo 'oolean "ualquier expresin de cadena o numrica v!lida.
Cbyte '$te ; a ')).
Ccur Currenc$ EJ''.((F.';(.G=).HFF,)=;= a J''.((F.';(.G=).HFF,)=;F.
Cdate 1ate "ualquier expresin de feca.
C0b 1ou.le EH,JH;G)GH)=H2'HFEE('H para valores negativos?
H,JH;G)GH)=H2'HFEE('H a 2,FJFGJ(2(H=G'('E(;= para
valores positivos.
Cdec 1ecimal KIEF,J''=2G')2H'GH((F)J()H(J);((). %a menor posicin
para un n6mero que no sea cero es
;,;;;;;;;;;;;;;;;;;;;;;;;;;;;2.
CInt ,nteger E('.FG= a ('.FGF? las fracciones se redondean.
C+n) Long E'.2HF.H=(.GH= a '.2HF.H=(.GHF? las fracciones se redondean.
C(n) Single E(,H;'='(E(= a E2,H;2'J=EEH) para valores negativos?
2,H;2'J=EEH) a (,H;'='(E(= para valores positivos.
C'ar Variant El mismo intervalo que .ouble para valores numricos. El
mismo intervalo que 1tring para valores no numricos.
C(tr String El valor de retorno de "1tr depende del argumento expresin.
5ueno, despus de esta introduccin a las variables, pasemos a estudiar unos cuantos objetos y
propiedades que se utilizan abitualmente.
Obeto !ells"fila# colu$na%.
1irve, como el objeto range, para referenciar una casilla o rango de casillas, pero en lugar de utilizar la
referencia de la forma $2, 52, A(';,... utiliza la fila y la columna que ocupa la casilla dentro de la oja *o
objeto /or01eet,. -or ejemplo, para poner ola en la casilla $2 de la oja activa seria,
$ctive1eet."ells*2,2,.4alue&89ola8
&tili'ar !ells para referenciar un rango.
Esto seria el equivalente a Range*8"asillaC@nicial>"asillaC:inal8,. %a forma que se obtiene utilizando
"ells es un poco m!s larga, pero se ver! que a veces resulta muco m!s funcional que utilizando
6nicamente range. -ara referirnos al rango $2>5=, pondremos,
Range*"ells*2, 2,, "ells*=, ',,.4alue & 89ola8
+tra forma interesante de "ells es la siguiente,
Range*8$)>52;8,."ells*', 2,.4alue & 89ola8
-ondr! en la celda $G el valor 89ola8, observe que en este ejemplo "ells comienza a contar filas y
columnas a partir del rango especificado en el objeto Range.
http%--....cybercursos.net
Pgina 12
'ariabes de Objetos.
Una variable objeto sir ve para acer referencia a un objeto, esto significa que podremos acceder a las
propiedades de un objeto e invocar a sus mtodos a travs de la variable en lugar de acerlo directamente
a travs del objeto. -osiblemente no se utilice demasiado esta clase de variables *esta claro que esto
depender! de las preferencias del programador,, pero ay casos en los que no ay m!s remedio que
utilizarlas , por ejemplo en estructuras !or Each ... Next como veremos, o cuando sea necesario construir
funciones que devuelvan rangos, referencias a ojas, etc.
-ara declarar una variable objeto se utiliza tambin la palabra 1im de la forma siguiente,
1im 4arC+bjeto A& O.%eto
-or Ejemplo
1im R A& Range
1im 9oja A& WorkSheet
-ara asignar un objeto a una variable debe u tilizar la instruccin Set.
Set 4ariableC+bjeto & +bjeto
-or Ejemplo
Set R& $ctive1eet.Range*8$2>52;8,
Set 9oja & $ctive1eet
Set 9oja & /or01eets*2,
4eamos a continuacin un ejemplo de cmo utilizar este tipo de variables,
E%em#lo 9)
$lgo muy simple, llenar el rango de $2 a 52; con la palabra 89ola8 y despus poner negrita, observe
como se asigna una variable objeto al objeto y luego como se trabaja con esa variable de la misma forma
que trabajar#a directamente sobre el objeto.
Su. obj*,
1im R A& Range
Set R & $ctive1eet.Range*8$2;>52)8,
R.4alue & 89ola8
R.:ont.5old & 3rue
En( Su.
El (alor )ot*ing.
$lgunas veces puede que sea necesario desasignar una variable del objeto al cual ace referencia, en este
caso debe igu alar la variable al valor Nothing de la forma siguiente.
Set 4ariableC+bjeto & Nothing
9abitualmente se utiliza Nothing en una estructura condicional para comprobar si la variable objeto est!
asignada. +bserve que si se utiliza una variable objeto a la cual todav#a no se le a eco ninguna
asignacin el programa dar! error y detendr! su ejecucin. Es buena pr!ctica acer este tipo de
comprobaciones antes de trabajar con variables objeto. 4eremos un ejemplo de esto en el tema siguiente.
http%--....cybercursos.net
Pgina 13
E&tructura& con(icionale&)
$ora que ya a experimentado con unos cuantos objetos y propiedades, nos detendremos a estudiar las
estructuras condicionales. %as estructuras condicionales son instrucciones de programacin que permiten
controlar la ejecucin de un fragmento de cdigo en funcin de si se cumple o no una condicin.
Estudiaremos en primer lugar la instruccin i7 "ondicin then..En( i7 *Si "ondicin Entonce&...!in Si,
%a estructura condicional que se construye con la instruccin Si "ondicin Entonce&... !in Si tiene la
forma siguiente.
.
Si "ondicin Entonce&
1entncia2
1entncia'
..
1entnciaB
!in Si
..
"uando el programa llega a la instruccin Si "ondicin Entonce& , se eval6a la condicin, si esta se
cumple *es cierta,, se ejecutan todas las sentencias que est!n encerradas en el bloque, si no se cumple la
condicin, se saltan estas sentencias. Esta estructura en 4isual 5asic tiene la sintaxis siguiente,
,7 "ondicin 0hen
1entncia2
1entncia'
.
.
1entnciaB
En( ,7
E%em#lo 9.
Entrar una cantidad que representa el precio de algo por el teclado con la instruccin Input#o* y
guardarlo en la celda $2 de la oja activa. 1i el valor entrado desde el teclado *y guardado en $2, es
superior a 2;;;, pedir descuento con otro @nput5ox y guardarlo en la casilla $' de la oja activa.
"alcular en $(, el precio de $2 menos el descuento de $'.
Su. "ondicional*,
$ctive1eet.Range*8$28,.4alue & ; + Poner las casillas donde se guardan los #alores 54
$ctive1eet.Range*8$'8,.4alue & ;
$ctive1eet.Range*8$(8,.4alue & ;
$ctive1eet.Range*8$28,.4alue & 4al*@nput5ox*8Entrar el precio8, 8Entrar8,,
+ Si el #alor de la casilla ". es ma%or 1ue .555$ entonces$ pedir descuento
,7 $ctive1eet.Range*8$28,.4alue M 2;;; 0hen
$ctive1eet.Range*8$'8,.4alue & 4al*@nput5ox*8Entrar .escuento8, 8Entrar8,,
En( ,7
$ctive1eet.Range*8$(8,.4alue & $ctive1eet.Range*8$28,.4alue E C
$ctive1eet.Range*8$'8,.4alue
En( Su.
http%--....cybercursos.net
Pgina 18
E%em#lo :)
El mismo que el anterior pero utilizando variables.
O#tion Ex#l icit
Su. "ondicional*,
1im -recio A& ,nteger
1im .escuento A& ,nteger
-recio & ;
.escuento & ;
-recio & 4al*@nput5ox*8Entrar el precio8, 8Entrar8,,
+ Si el #alor de la #ariable precio es ma%or 1ue .555$ entonces$ pedir descuento
,7 -recio M 2;;; 0hen
.escuento & 4al*@nput5ox*8Entrar .escuento8, 8Entrar8,,
En( ,7
$ctive1eet.Range*8$28,.4alue & -recio
$ctive1eet.Range*8$'8,.4alue & .escuento
$ctive1eet.Range*8$(8,.4alue & -recio E .escuento
En( Su.
4iendo los dos programas anteriores puede que le surja la duda de si emplear variables o directamente
valores almacenados en las celdas. %a solucin es f!cil, lo que le parezca m!s conveniente en cada caso
concreto que desee solucionar. %as variables, aunque mucas veces 8innecesarias8, quiz!s dejan los
programas m!s legibles y claros. 7 la legibilidad de un programa es lo m!s valioso del mundo para un
programador *profesionalmente ablando ,, sobre todo si se da el caso *inevitable el JJ,JJJ...N de las
ocasiones, que se tenga que modificar un programa para dotarle de m!s funcionalidades, facilitar su
manejo, etc. En la mayor#a de ejemplos que encontrar! en este manual ver! que se utilizan variables
preferentemente. $unque mucas veces su funcin sea simplemente recoger datos de las celdas para
operarlas y dejarlas en otras celdas y, consecuentemente, aumente el n6mero de operaciones, creemos que
con ello se gana en legibilidad y flexibilidad.
E%em#lo ;)
Oacro que compara los valores de las casillas $2 y $' de la oja activa. 1i son iguales pone el color de la
fuente de ambas en azul.
Su. "ondicional'*,
,7 $ctive1eet.Range*8$28,.4alue & $ctive1eet.Range*8$'8,.4alue 0hen
$ctive1eet.Range*8$28,.:ont."olor & R<5*;, ;, ')),
$ctive1eet.Range*8$'8,.:ont."olor & R<5*;, ;, ')),
En( ,7
En( Su.
http%--....cybercursos.net
Pgina 19
E&tructura ,7))El&e
Esta estructura se utiliza cuando se requiere una respuesta alternativa a una condicin. 1u estructura es la
siguiente.
Si "ondicin Entonce&
1entncia2
1entncia'
..
1entnciaB
Sino
1entncia2
1entncia'
..
1entnciaB
!in Si
+bserve que, si se cumple la condicin, se ejecuta el bloque de sentencias delimitado por Si "ondicin
Entonce& y 1i no se cumple la condicin se ejecuta el bloque delimitado por Sino y !in Si. En 4isual
5asic la instruccin Si "ondicin Entonce& ... Sino ... !in Si se expresa con las instrucciones siguientes.
,7 "ondicin 0hen
1entncia2
1entncia'
.
.
1entnciaB
El&e
1entncia2
1entncia'
.
.
1entnciaB
En( ,7
E%em#lo 4)
Entrar una cantidad que representa el precio de algo por el teclado con la instruccin @nput5ox y
guardarlo en la celda $2 de la oja activa. 1i el valor entrado desde el teclado *y guardado en $2, es
superior a 2;;;, se aplica un descuento del 2;N sino se aplica un descuento del )N, el descuento se
guarda en la casilla $' de la oja activa. "olocar en $(, el total descuento y en $H el total menos el
descuento.
http%--....cybercursos.net
Pgina 1:
Su. "ondicionalCElse*,
1im -recio A& Single
1im .escuento A& Single
-recio & ;
-recio & 4al*@nput5ox*8Entrar el precio8, 8Entrar8,,
+ Si el #alor de la #ariable precio es ma%or 1ue .555$ entonces$ aplicar descuento del .56
,7 -recio M 2;;; 0hen
.escuento & -recio P *2; I 2;;,
$ctive1eet.Range*8$'8,.4alue & ;,2
El&e + Sino "plicar descuento del 76
.escuento & -recio P *) I 2;;,
$ctive1eet.Range*8$'8,.4alue & ;,;)
En( ,7
$ctive1eet.Range*8$28,.4alue & -recio
$ctive1eet.Range*8$(8,.4alue & .escuento
$ctive1eet.Range*8$H8,.4alue & -recio E .escuento
En( Su.
E%em#lo 15)
Restar los valores de las casilla $2 y $'. <uardar el resultado en $(. 1i el resultado es positivo o ;,
poner la fuente de $( en azul, sino ponerla en rojo.
Su. "ondicionalCElse'*,
$ctive1eet.Range*8$(8,.4alue & $vtive1eet.Range*8$28,.4alue E C
$ctive1eet.Range*8$'8,.4alue
,7 $ctive1eet*8$(8,.4alue Q ; 0hen
$ctive1eet.Range*8$(8,.:ont."olor & R<5*')),;,;,
El&e
$ctive1eet.Range*8$(8,.:ont."olor & R<5*;,;,')),
En( ,7
En( Su.
E&tructura& ,7 ani(a(a&)
Bo tiene que sorprenderle, dentro de una estructura if puede ir otra, y dentro de esta otra, y otra... 4ea el
ejemplo siguiente.
E%em#lo 11)
"omparar los valores de las casilla $2 y $' de la oja activa. 1i son iguales, escribir en $( 82os #alores
de ". % "9 son iguales8, si el valor de $2 es mayor que $', escribir 8". ma%or 1ue "98, sino, escribir
8"9 ma%or 1ue ".8 .
http%--....cybercursos.net
Pgina 1;
Su. "ondicional*,
,7 $ctive1eet.Range*8$28,.4alue & $ctive1eet.Range*8$'8,.4alue 0hen
$ctive1eet.Range*8$(8,.4alue & 8%os 4alores de $2 y $' son iguales8
El&e
,7 $ctive1eet.Range*8$28,.4alue M $ctive1eet.Range*8$'8,.4alue 0hen
$ctive1eet.Range*8$(8,.4alue & 8$2 mayor que $'8
El&e
$ctive1eet.Range*8$(8,.4alue & 8$' mayor que $28
En( ,7
En( ,7
En( Su.
+bserve que la segunda estructura ,7..El&e..En( ,7 queda dentro del El&e de la primera estructura. Esta es
una regla general, cuando pone un En( ,7, este cierra siempre el 6ltimo ,7 * o El&e, abierto.
O#era(ore& l-gico&)
Estos operadores se utilizan cuando se necesitan evaluar dos o m!s condiciones para decidir si se ejecutan
o no determinadas acciones.
Operador Lgico +nd ",%.
Utilizaremos este operador cuando sea preciso que para ejecutar un bloque de instrucciones se cumpla
m!s de una condicin. +bserve que deber!n cumplirse todas las condiciones . 4ea el ejemplo siguiente.
E%em#lo 1/)
Entrar el Bombre, la cantidad y el precio de un producto desde el teclado y guardarlos respectivamente en
$2, $' y $(. "alcular el total y guardarlo en $H. 1i el total es superior a 2;.;;; $ el nombre del producto
es 8-atatas8, pedir un descuento, calcularlo el total descuento y guardarlo en $), luego restar el descuento
del total y guardarlo en $G.
Su. EjemploC2'*,
1im -roducto A& String
1im "antidad A& ,nteger
1im -recio A& Single
1im 3otal A& Single
1im .escuento A& Single
1im 3otalC.escuento A& Single
-recio & ;
-roducto & @nput5ox*8Entrar Bombre del -roducto8,8Entrar8,
-recio & 4al*@nput5ox*8Entrar el precio8, 8Entrar8,,
-recio & 4al*@nput5ox*8Entrar la cantidad8, 8Entrar8,,
3otal & -recio P "antidad
$ctive1eet.Range*8$28,.4alue & -roducto
$ctive1eet.Range*8$'8,.4alue & -recio
$ctive1eet.Range*8$(8,.4alue & "antidad
$ctive1eet.Range*8$H8,.4alue & 3otal
http%--....cybercursos.net
Pgina 14
+ Si total ma%or 1ue .54555 % el producto es Patatas$ aplicar descuento4
,7 3otal M 2;;;; An( -roducto & 8-atatas8 0hen
.escuento & 4al*@nput5ox*8Entrar .escuento8, 8Entrar8,,
3otalC.escuento & 3otal P *.escuento I 2;;,
3otal & 3otal E 3otalC.escuento
$ctive1eet.Range*8$)8,.4alue & 3otalC.escuento
$ctive1eet.Range*8$G8,.4alue & 3otal
En( ,7
En( Su.
+bserve que para que se ejecute el bloque de instrucciones entre @f.. End @f deben cumplirse las dos
condiciones que se eval6an, si falla cualquiera de las dos *o las dos a la vez,, no se ejecuta dico bloque.
Operador Lgico Or "O%.
Utilizaremos este operador cuando sea preciso que para ejecutar un bloque de instrucciones se cumpla
alguna de una serie de condiciones. +bserve que slo es necesario que se cumpla alguna de las
condiciones que se eval6an. 4ea el ejemplo siguiente.
E%em#lo 12)
Entrar el Bombre, la cantidad y e l precio de un producto desde el teclado y guardarlos respectivamente en
$2, $' y $(. "alcular el total y guardarlo en $H. 1i el total es superior a 2;.;;; o el nombre del producto
el 8-atatas8, pedir un descuento, calcularlo el total descuento y guardarlo en $), luego restar el descuento
del total y guardarlo en $G.
Su. EjemploC2(*,
1im -roducto A& String
1im "antidad A& ,nteger
1im -recio A& Single
1im 3otal A& Single
1im .escuento A& Single
1im 3otalC.escuento A& Single
-recio & ;
-roducto & @nput5ox*8Entrar Bombre del -roducto8,8Entrar8,
-recio & 4al*@nput5ox*8Entrar el precio8, 8Entrar8,,
-recio & 4al*@nput5ox*8Entrar la cantidad8, 8Entrar8,,
3otal & -recio P "antidad
$ctive1eet.Range*8$28,.4alue & -roducto
$ctive1eet.Range*8$'8,.4alue & -recio
$ctive1eet.Range*8$(8,.4alue & "antidad
$ctive1eet.Range*8$H8,.4alue & 3otal
+ Si total ma%or 1ue .54555 o el producto es Patatas$ aplicar descuento4
,7 3otal M 2;;;; Or -roducto & 8-atatas8 0hen
.escuento & 4al*@nput5ox*8Entrar .escuento8, 8Ent rar8,,
3otalC.escuento & 3otal P *.escuento I 2;;,
3otal & 3otal E 3otalC.escuento
$ctive1eet.Range*8$)8,.4alue & 3otalC.escuento
$ctive1eet.Range*8$G8,.4alue & 3otal
En( ,7
En( Su.
http%--....cybercursos.net
Pgina /5
+bserve que para que se ejecute el bloque de instrucciones entre @f.. End @f slo es necesario que se
cumpla alguna de las dos condiciones que se eval6an *o las dos a la vez,. 1lo cuando no se cumple
ninguna de las dos no se ejecutan las instrucciones del bloque.
Operador Lgico )ot "no%.
Este operador se utiliza para ver si B+ se cumple una condicin. El siguiente ejemplo ace lo mismo que
el ejemplo F pero utilizando el operador Bot.
E%em#lo 13)
Entrar una cantidad que representa el precio de algo por el teclado con la instruccin @nput5ox y
guardarlo en la celda $2 de la oja activa. 1i el valor entrado desde el teclado *y guardado en $2, es
superior a 2;;;, pedir descuento con otro @nput5ox y guardarlo en la casilla $' de la oja activa.
"alcular en $(, el precio de $2 menos el descuento de $'.
Su. EjemploC2H*,
1im -recio A& ,nteger
1im .escuento A& ,nteger
-recio & ;
.escuento & ;
-recio & 4al*@nput5ox*8Entrar el precio8, 8Entrar8,,
+ Si el #alor de la #ariable precio N: es menor igual .555$ entonces$ pedir descuento
,7 Not *-recio Q& 2;;;, 0hen
.escuento & 4al*@nput5ox*8Entrar .escuento8, 8Entrar8,,
En( ,7
$ctive1eet.Range*8$28,.4alue & -recio
$ctive1eet.Range*8$'8,.4alue & .escuento
$ctive1eet.Range*8$(8,.4alue & -recio E .escuento
En( Su.
0a.la& (e la "er(a()
4ea las tablas siguientes para ver los resultados de evaluar dos condiciones con el operador $nd y con el
operador +r.
An(. Or.
Con(ici-n1 Con(ici-n/ Re&ulta(o Con(ici-n1 Con(ici-n/ Re&ulta(o
:alsa :alsa :also :alsa :alsa :also
:alsa "ierta :also :alsa "ierta "ierto
"ierta :alsa :also "ierta :alsa "ierto
"ierta "ierta "ierto "ierta "ierta "ierto
+bserve que con el operador $B. deben de cumplirse todas las condiciones *dos o veinticinco, para que
el resultado sea cierto. "on el operador +R slo es necesario que se cumpla una *de las dos o de las
veinticinco, para que el resultado sea cierto.
http%--....cybercursos.net
Pgina /1
E&tructura Select Ca&e)
En ocasiones se dar! el caso que en funcin del valor o rango de valores que pueda tener una variable,
una casilla, una expresin, etc. deber!n llevarse a cabo diferentes acciones o grupos de acciones. 4ea el
ejemplo siguiente.
E%em#lo 18)
Oacro que suma, resta, multiplica o divide los valores de las casillas $2 y $' dependiendo de si 52
contiene el signo K, E, x, >. El resultado lo deja en $(. 1i en 52 no ay ninguno de los signos anteriores
en $( debe dejarse un ;.
Su. EjemploC2)*,
1im 1igno A& String
1im 4alor2 A& ,nteger, 4alor' A& ,nteger, 3otal A& ,nteger
4alor2 & $ctive1eet.Range*8$28,.4alue
4alor' & $ctive1eet.Range*8$'8,.4alue
1igno & $ctive1eet.Range*8528,.4alue
3otal&;
,7 1igno & 8K8 0hen
3otal & 4alor2 K 4alor'
En( i7
,7 1igno & 8E8 0hen
3otal & 4alor2 E 4alor'
En( i7
,7 1igno & 8x8 0hen
3otal & 4alor2 P 4alor'
En( i7
,7 1igno & 8>8 0hen
3otal & 4alor2 I 4alor'
En( i7
$ctive"ell.Range*8$(8,.4alue & 3otal
En( Su.
+bserve que en el ejemplo anterior todas las instrucciones if eval6an la misma variable. El programa
funciona correctamente pero para estos casos es mejor utilizar la instruccin 1elect "a se, el motivo
principal es por legibilidad y elegancia. 1elect "ase tiene la sintaxis siguiente,
Select Ca&e Expresin
Ca&e valores >
@nstrucciones.
Ca&e valores >
@nstrucciones.
.
.
Ca&e valores>
@nstrucciones.
Ca&e El&e
@nstrucciones en caso que no sean ninguno de los valores anteriores.
En( Select
http%--....cybercursos.net
Pgina //
4ea el ejemplo anterior solucionado con esta estructura.
E%em#lo 19)
Su. EjemploC2G*,
1im 1igno A& String
1im 4alor2 A& @nteger, 4alor' A& ,nteger, 3otal A& ,nteger
4alor2 & $ctive1eet.Range*8$28,.4alue
4alor' & $ctive1eet.Range*8$'8,.4alue
1igno & $ctive1eet.Range*8$(8,.4alue
Select Ca&e signo
Ca&e 8K8
3otal & 4alor2 K 4alor'
Ca&e 8E8
3otal & 4alor2 E 4alor'
Ca&e 8x8
3otal & 4alor2 P 4alor'
Ca&e 8>8
3otal & 4alor2 I 4alor'
Ca&e El&e
3otal & ;
En( Select
$ctive"ell.Range*8$(8,.4alue & 3otal
En( Su.
4ea el ejemplo siguiente donde cada sentencia "ase eval6a un rango de valores.
E%em#lo 1:)
-rograma que pide tres notas de un alumno mediante la funcin @nput5ox. %as notas van a parar
respectivamente a las casillas $2, $' y $( de la oja activa. El programa calcula la media y la deja en
$H. 1i la media est! entre ; y ' deja en $) el mensaje 8Ouy deficiente8, si la nota es ( deja en $) el
mensaje 8.eficiente8, si la nota es H deja 8@nsuficiente8, si es ) 81uficiente8, si es G 85ien8, si est! entre F
y = deja 8Botable8, si es mayor que = deja 81obresaliente8.
Su. EjemploC2F*,
1im Bota2 A& ,nteger, Bota' A& ,nteger, Bota( A& ,nteger
1im Oedia A& Single
Bota2 & 4al*@nput5ox*8Entrar Bota primera evaluacin8, 8Bota8,,
Bota' & 4al*@nput5ox*8Entrar Bota 1egunda evaluacin8, 8Bota8,,
Bota( & 4al*@nput5ox*8Entrar Bota 3ercera evaluacin8, 8Bota8,,
Oedia & *Bota2 K Bota' K Bota(, I (
$ctive1eet.Range*8$28,.4alue & Bota2
$ctive1eet.Range*8$'8,.4alue & Bota'
$ctive1eet.Range*8$(8,.4alue & Bota(
$ctive1eet.Range*8$H8,.4alue & Oedia
http%--....cybercursos.net
Pgina /2
Select Ca&e Oedia
Ca&e ; 0o '
$ctive1eet.Range*8$)8,.4alue & 8Ouy deficiente8
Ca&e (
$ctive1eet.Range*8$)8,.4alue & 8.eficiente8
Ca&e H
$ctive1eet.Range*8$)8,.4alue & 8@nsuficiente8
Ca&e )
$ctive1eet.Range*8$)8,.4alue & 81uficiente8
Ca&e G
$ctive1eet.Range*8$)8,.4alue & 85ien8
Ca&e F 0o =
$ctive1eet.Range*8$)8,.4alue & 8Botable8
Ca&e M=
$ctive1eet.Range*8$)8,.4alue & 81obresaliente8
En( Select
En( Su.
!uncione& (e com#ro.aci-n)
$ntes de terminar con el tema de condicionales veremos unas funciones que nos ser!n 6tiles a la ora de
comprobar o validar el tipo de los datos ent rados desde teclado o simplemente los datos contenidos en una
casilla.
4olvamos al ejemplo que codificamos de la manera siguiente.
Su. EjemploC2G*,
1im 1igno A& String
1im 4alor2 A& ,nteger, 4alor' A& ,nteger, 3otal A& ,nteger
4alor2 & $ctive1eet.Range*8$28,.4alue
4alor' & $ctive1eet.Range*8$'8,.4alue
1igno & $ctive1eet.Range*8$(8,.4alue
Select Ca&e signo
Ca&e 8K8
3otal & 4alor2 K 4alor'
Ca&e 8E8
3otal & 4alor2 E 4alor'
Ca&e 8x8
3otal & 4alor2 P 4alor'
Ca&e 8>8
3otal & 4alor2 I 4alor'
Ca&e El&e
3otal & ;
En(Select
$ctive"ell.Range*8$(8,.4alue & 3otal
En( Su.
http%--....cybercursos.net
Pgina /3
@magine que en alguna de las casillas que se deben operar no ubiera ning6n valor o bien datos
alfanumricos. $l ejecutar la macro se producir! un error. $unque con 4isual 5asic se puede controlar el
flujo del programa cuando se produce un error imprevisto, para solucionar este problema utilizaremos una
funcin de comprobacin que nos diga si en las casillas $2 y $' ay valores adecuados *numricos, para
proseguir con la ejecucin de la macro, en caso contrario se mostrar! un error y no se ejecutar! ninguna
de las operaciones.
%a funcin que utilizaremos es ,&Numeric*expresin,, esta funcin devuelve un valor 0rue si la
expresin que se eval6a es un valor numrico, en caso contrario devuelve !al&e. 4ea como quedar#a el
programa. 3ambin se utiliza la funcin ,&Em#t$ para comprobar si en 52 ay algo,
,&Em#t$*Expresin, eval6a si expresin est! vac#a, devuelve 0rue si es as# y !al&e en caso contrario.
E%em#lo 1;)
Su. EjemploC2=*,
1im 1igno A& String
1im 4alor2 A& ,nteger, 4alor' A& ,nteger, 3otal A& ,nteger
1im "ontinuar A& 'oolean
4alor2 & $ctive1eet.Range*8$28,.4alue
4alor' & $ctive1eet.Range*8$'8,.4alue
1igno & $ctive1eet.Range*8$(8,.4alue
"ontinuar & 3rue
+ Si en la casilla ". no a% un #alor num;rico
,7 Not @sBumeric*$ctive1eet.Range*8$28,, 0hen
Osg5ox -rompt>&8En la casilla $2 no ay ning6n valor numrico8, 3itle>&8ERR+R8
"ontinuar& :alse
En( ,7
+ Si en la casilla "9 no a% un #alor num;rico
,7 not @sBumeric*$ctive1eet.Range*8$'8,, 0hen
Osg5ox -rompt>&8En la casilla $' no ay ning6n valor numrico8, 3itle>&8ERR+R8
"ontinuar& :alse
En( ,7
,7 @sEmpty*$ctive1eet.Range*8528,, 0hen
Osg5ox -rompt>&8la casilla 52 est! vac#a8, 3itle>&8ERR+R8
"ontinuar& :alse
En(,7
,7 "ontinuar 0hen
Select Ca&e signo
Ca&e 8K8
3otal & 4alor2 K 4alor'
Ca&e 8E8
3otal & 4alor2 E 4alor'
Ca&e 8x8
3otal & 4alor2 P 4alor'
Ca&e 8>8
3otal & 4alor2 I 4alor'
Ca&e El&e
3otal & ;
En( Select
http%--....cybercursos.net
Pgina /8
$ctive"ell.Range*8$(8,.4alue & 3otal
En( i7
En( Su.
En lugar de los tres @f de comprobacin se ubiera podido utilizar el operador +R de la manera siguientes,
,7 not @sBumeric*$ctive1eet.Range*8$28,, Or not @sBumeric*$ctive1eet.Range*8$'8,, C
Or @sEmpty*$ctive1eet.Range*8528,, 3en
Osg5ox -rompt>&8.ebe entrar n6meros en $2 y $' y un signo *K,E,x, > , en 52,
3itle>&8ERR+R8
El&e
+ 3nstrucciones de las operaciones
.......
En( i7
Lista de Funciones de !o$probacin.
,&Num<ric*Expresin,. "omprueba si expresin tiene un valor que se puede interpretar como
numrico.
,&1ate*Expresin,. "omprueba si expresin tiene un valor que se puede interpretar como tipo
feca.
,&Em#t$*Expresin,. "omprueba que expresin tenga alg6n valor, que se aya inicializado.
,&Error*Expresin,. "omprueba si expresin devuelve alg6n valor de error.
,&Arra$*Expresin,. "omprueba si expresin *una variable, es un array o no.
,&O.%ect*Expresin,. "omprueba si expresin *una variable, representa una variable tipo objeto.
,&Null*Expresin,. "omprueba si expresin contiene un valor nulo debido a datos no v!lidos.
Nothing. Bo es propiamente una funcin, sirve para comprobar si una variable objeto esta
asociada a un objeto antes de acer cualquier operacin con ella. Recuerde que para trabajar con
una variable objeto antes debe asignarse a uno *mediante la instruccin Set=, en caso contrario se
producir! un error en el programa cuando utilice el objeto y se detendr! su ejecucin.
Su. +bj*,
1im R A& Range
..
+ Si la #ariable R es Noting es 1ue no a sido asignada$ no se puede trabajar con ella
,7 R ,& Nothing 0hen
Osg5ox -rompt >& 8%a variable +bjeto no a sido asignada8, 5uttons>&vb+0, C
3itle >& 8Error8
El&e
R.4alue & 89ola8
En(,7
..
En( Su.
http%--....cybercursos.net
Pgina /9
La 7unci-n M&g'ox)
Esta funcin muestra un mensaje en un cuadro de di!logo asta que el usuario pulse un botn. %a funcin
devuelve un dato tipo @nteger en funcin del botn pulsado por el usuario. $ la ora de invocar est!
funcin, s e permiten diferentes tipos de botones.
Sint-xis de .sgBox.
M&g'ox* Oensaje, 5otones, 3#tulo, $rcivo de ayuda, contexto,
Men&a%e > +bligatorio, es el mensaje que se muestra dentro del cuadro de di!logo.
'otone& > +pcional. Es un n6mero o una suma de n6meros o constantes *vea tabla 4alores para
botones e @conos,, que sirve para mostrar determinados botones e iconos dentro del cuadro de
di!logo. 1i se omite este argumento asume valor ; que corresponde a un 6nico 5otn +R.
0>tulo > +pcional. Es el texto que se mostrar! en la barra del t#tulo del cuadro de di!logo.
Archi"o (e A$u(a > +pcional. 1i a asignado un texto de ayuda al cuadro de di!logo, aqu# debe
especificar el nombre del arcivo de ayuda donde est! el texto.
Context> +pcional. Es el n6mero que sirve para identificar el texto al tema de ayuda
correspondiente que estar! contenido en el arcivo especificado en el par!metro $rcivo de
$yuda.
0a.la #ara .otone& e icono& (el cua(ro M&g'ox. *3abla copiada del arcivo de ayuda de
Oicrosoft Excel,.
Con&tante Valor 1e&cri#ci-n
4b+R+nly ; Ouestra solamente el botn $ceptar.
4b+R"ancel 2 Ouestra los botones $ceptar y "ancelar.
4b$bortRetry@gnore ' Ouestra los botones $nular, Reintentar e @gnorar.
4b7esBo"ancel ( Ouestra los botones 1#, Bo y "ancelar.
4b7esBo H Ouestra los botones 1# y Bo.
4bRetry"ancel ) Ouestra los botones Reintentar y "ancelar.
4b"ritical 2G Ouestra el icono de mensaje cr#tico.
4bSuestion (' Ouestra el icono de pregunta de advertencia.
4bExclamation H= Ouestra el icono de mensaje de advertencia.
4b@nformation GH Ouestra el icono de mensaje de informacin.
4b.efault5utton2 ; El primer botn es el predeterminado.
4b.efault5utton' ')G El segundo botn es el predeterminado.
4b.efault5utton( )2' El tercer botn es el predeterminado.
4b.efault5uttonH FG= El cuarto botn es el predeterminado.
4b$pplicationOodal ; $plicacin modal? el usuario debe responder al cuadro de mensajes
antes de poder seguir trabajando en la aplicacin actual.
4b1ystemOodal H;JG 1istema modal? se suspenden todas las aplicaciones asta que el usuario
responda al cuadro de mensajes.
El primer grupo de valores *; a ), describe el n6mero y el tipo de los botones mostrados en el cuadro de
di!logo? el segundo grupo *2G, (', H=, GH, describe el estilo del icono, el tercer grupo *;, ')G, )2',
determina el botn predeterminado y el cuarto grupo *;, H;JG, determina la modalidad del cuadro de
mensajes. "uando se suman n6meros para obtener el valor final del argumento buttons, se utiliza
solamente un n6mero de cada grupo.
Bota Estas constantes las especifica 4isual 5asic for $pplications. -or tanto, el nombre de las mismas
puede utilizarse en cualquier lugar del cdigo en vez de sus valores reales.
http%--....cybercursos.net
Pgina /:
%os valores que puede devolver la funcin msgbox en funcin del botn que pulse el usuario se muestran
en la tabla siguiente.
3abla de valores que puede devolver Osg5ox. *3abla copiada del arcivo de ayuda de Oicrosoft 4isual
5asic para aplicaciones,.
Con&tante Valor 1e&cri#ci-n
4b+R 2 $ceptar
4b"ancel ' "ancelar
4b$bort ( $nular
4bRetry H Reintentar
4b@gnore ) @gnorar
4b7es G 1#
4bBo F Bo
E%em#lo& (e M&g'ox)
Su. 3al*,
..
+ *l cuadro Muestra los botones Si % No % un icono en forma de interrogante4 ,uando se pulsa
+ un botn$ el #alor lo recoge la #ariable <4 *n este caso los #alores de#ueltos pueden ser = o >
+ 1ue corresponden respecti#amente a las constantes Vb?es % VbNo$ obser#e la instruccin 3f de
+despu;s4
A & Osg5ox*8.esea "ontinuar8, vb7esBo K vbSuestion, 8+pcin8,,,
+ Se a pulsado sobre botn Si
,7 A & vb7es 0hen
.....
El&e T 1e a pulsado sobre botn Bo
.....
En(,7
.
.
En( Su.
$lgunas veces puede que le interese simplemente desplegar un cuadro Osg5ox para mostrar un mensaje
al usuario sin que se requiera recoger ning6n valor. En este caso puede optar por la forma siguiente,
M&g'oxPrompt>&89ola usuaria, 9a acabado el proceso8, #uttons>&4b+0+n%y C
/ite>&8Oensaje8
%o que no puede acer porque 4isual 5asic dar#a error es poner la primera forma sin igualarla a ninguna
variable. -or ejemplo, la expresin siguinete es incorrecta,
M&g'ox *89ola usuario, 9a acabado el proceso8, 4b+0+nly, 8Oensaje8,
1eria correcto poner
A& M&g'ox *89ola usuario, 9a acabado el proceso8, 4b+0+nly, 8Oensaje8,
En este caso, aunque A reciba un valor, luego no se utiliza para nada, es decir simplemente se pone para
que 4isual 5asic d error.
http%--....cybercursos.net
Pgina /;
La in&trucci-n With)
1uponemos que llegado a este punto le parecer! engorroso tener que referirse a los objetos siguiendo toda
o casi toda la jerarqu#a. 7a 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
modificaciones o actualizaciones. %a sentencia With le ayudar! a tener que escribir menos cdigo sin que
por esto el programa pierda en claridad. "oncretamente esta funcin sirve para ejecutar una serie de
acciones sobre un mismo +bjeto. 1u sintaxis es la siguiente.
With +bjeto
@nstrucciones
En( With
Repetiremos el ejemplo 2( utilizando esta sentencia. +bserve como con With se ace referencia al objeto
Acti"eSheet.
E%em#lo 14)
Entrar el Bombre, la cantidad y el precio de un producto desde el teclado y guardarlos respectivamente en
$2, $' y $(. "alcular el total y guardarlo en $H. 1i el total es superior a 2;.;;; o el nombre del producto
el 8-atatas8, pedir un descuento, calcularlo el total descuento y guardarlo en $), luego restar el descuento
del total y guardarlo en $G.
Su. EjemploC2J*,
1im -roducto A& String
1im "antidad A& ,nteger
1im -recio A& Single
1im 3otal A& Single
1im .escuento A& Single
1im 3otalC.escuento A& Single
-recio & ;
-roducto & @nput5ox*8Entrar Bombre del -roducto8,8Entrar8,
-recio & 4al*@nput5ox*8Entrar el precio8, 8Entrar8,,
-recio & 4al*@nput5ox*8Entrar la cantidad8, 8Entrar8,,
3otal & -recio P "antidad
With $ctive1eet
.Range*8$28,.4alue & -roducto
.Range*8$'8,.4alue & -recio
.Range*8$(8,.4alue & "antidad
.Range*8$H8,.4alue & 3otal
En( With
+ Si total ma%or 1ue .54555 o el producto es Patatas$ aplicar descuento4
,7 3otal M 2;;;; Or -roducto & 8-atatas8 0hen
.escuento & 4al*@nput5ox*8Entrar .escuento8, 8Entrar8,,
3otalC.escuento & 3otal P *.escuento I 2;;,
3otal & 3otal E 3otalC.escuento
With $ctive1eet
.Range*8$)8,.4alue & 3otalC.escuento
.Range*8$G8,.4alue & 3otal
En( With
En( ,7
En( Su.
http%--....cybercursos.net
Pgina /4
E&tructura& Re#etiti"a&)
Este tipo de estructuras permiten ejecutar m!s de una vez un mismo bloque de sentencias.
E%em#lo /5)
1upongamos que tenemos que acer un programa para entrar las notas de una clase de ) alumnos que se
guardaran respectivamente en las celdas de $2 a $) de la oja activa. .espus acer la media que se
guardar! en $G. "on las estructuras vistas asta aora, podr#amos acer>
Su. EjemploC'; *,
1im Bota A& ,nteger
1im Oedia A& Single
Oedia & ;
Bota & 4al*@nput5ox*8Entrar la 2 Bota > 8,8Entrar Bota8,,
$ctive1eet.Range*8$28,.4alue & Bota
Oedia & Oedia K Bota
Bota & 4al*@nput5ox*8Entrar la 2 Bota > 8,8Entrar Bota8,,
$ctive1eet.Range*8$'8,.4alue & Bota
Oedia & Oedia K Bota
Bota & 4al*@nput5ox*8Entrar la 2 Bota > 8,8Entrar Bota8,,
$ctive1eet.Range*8$(8,.4alue & Bota
Oedia & Oedia K Bota
Bota & 4al*@nput5ox*8Entrar la 2 Bota > 8,8Entrar Bota8,,
$ctive1eet.Range*8$H8,.4alue & Bota
Oedia & Oedia K Bota
Bota & 4al*@nput5ox*8Entrar la 2 Bota > 8,8Entrar Bota8,,
$ctive1eet.Range*8$)8,.4alue & Bota
Oedia & Oedia K Bota
Oedia & Oedia I )
$ctive1eet.Range*8$G8,.4alue & Oedia
En( Su.
+bserve que este programa repite el siguiente bloque de sentencias, ) veces.
Bota & 4al*@nput5ox*8Entrar la 2 Bota > 8,8Entrar Bota8,,
$ctive1eet.Range*8$)8,.4alue & Bota
Oedia & Oedia K Bota
-ara evitar esta tipo de repeticiones de cdigo, los lenguajes de programacin incorporan instrucciones
que permiten la repeticin de bloques de cdigo.
http%--....cybercursos.net
Pgina 25
E&tructura re#etiti"a Para ?7or=)
Esta estructura sirve para repetir la ejecucin de una sentencia o bloque de sentencias, un n6mero definido
de veces. %a estructura es la siguiente>
Para var &4alorC@nicial *a&ta 4alorC:inal Pa&o @ncremento *acer
,nicio
1entencia 2
1entencia '
.
.
1entencia B
!in
Var es una variable que la primera vez que se entra en el bucle se iguala a Valor_3nicial, las sentencias
del bucle se ejecutan asta que Var llega al Valor_@inal, cada vez que se ejecutan el bloque de
instrucciones Var se incrementa seg6n el valor de 3ncremento.
En 4isual 5asic para Excel la estructura -ara se implementa con la instruccin !or ... Next.
!or 4arible & 4alorC@nicial 0o 4alorC:inal Ste# @ncremento
1entencia 2
1entencia '
.
.
1entencia B
Next 4ariable
A Si el incremento es .$ no ace falta poner Step .4
E%em#lo /1)
Entrar 2; valores utilizando la funcin @nput5ox, sumarlos y guardar el resultado en la casilla $2 de la
oja activa.
Su. EjemploC'2*,
1im i A& ,nteger
1im 3otal A& ,nteger
1im 4alor A& ,nteger
!or i&2 0o 2;
4alor& 4al*@nput5ox*8Entrar un valor8,8Entrada8,,
3otal & 3otal K 4alor
Next i
$ctive"ell.Range*8$28,.4alue & 3otal
En( Su.
http%--....cybercursos.net
Pgina 21
Recorrer casillas de una *oa de c-lculo.
Una operacin bastante abitual cuando se trabaja con Excel es el recorrido de rangos de casillas para
llenarlas con valores, mirar su contenido, etc. %as estructuras repetitivas son imprescindibles para recorrer
grupos de celdas o rangos. 4ea los siguientes ejemplos para ver ejemplos de utilizacin de estructuras
repetitivas para recorrer rangos de casillas, observe la utilizacin de las propiedades Cell& y O77&et.
Pro#ie(a( Cell&)
7a conoce esta propiedad, sirve para referenciar una celda o un rango de celdas s eg6n coordenadas de fila
y columna.
E%em#lo //
%lenar el rango de las casillas $2..$) con valores pares consecutivos empezando por el '.
Su. EjemploC''*,
1im :ila A& ,nteger
1im i A& ,nteger
:ila & 2
!or i&' 0o 2; Ste# '
$ctive1eet."ells*:ila,2,.4alue & i
:ila & :ilaK2
Next i
En( Su.
E%em#lo /2)
%lenar un rango de filas, empezando por una celda, que se debe especificar desde teclado, con una serie
de 2; valores correlativos *comenzando por el 2,.
Su. EjemploC'(*,
1im "asillaC@nicial A& 1tring
1im i A& ,nteger
1im :ila A& ,nteger, "olumna A& ,nteger
"asillaC@nicial & @nput5ox*8@ntroducir la casilla @nicial > 8, 8"asilla @nicial8,
$ctive1eet.Range*"asillaC@nicial,.$ctivate
B ,oger el #alor de fila de la celda acti#a sobre la #ariable @ila
:ila & $ctive"ell.RoU
B ,oger el #alor de columna de la celda acti#a sobre la #ariable @ila
"olumna & $ctive"ell."olumn
!or i & 2 0o 2;
$ctive1eet."ells*:ila, "olumna,.4alue & i
:ila & :ila K 2
Next i
En( Su.
http%--....cybercursos.net
Pgina 2/
Pro#ie(a(e& ROW $ COL@MN)
"omo abr! deducido del ejemplo anterior devuelven la fila y la columna de un objeto range. En el
ejemplo anterior se utilizaban concretamente para obtener la fila y la columna de la casilla activa.
+tra forma de solucionar el ejemplo '( seria.
Su. EjemploC'(*,
1im "asillaC@nicial A& String
1im i A& ,nteger
1im :ila A& ,nteger, "olumna A& ,nteger
"asillaC@nicial & @nput5ox*8@ntroducir la casilla @nicial > 8, 8"asilla @nicial8,
$ctive1eet.Range*"asillaC@nicial,.$ctivate
:ila & 2
!or i & 2 0o 2;
$ctive1eet.Range*"asillaC@nicial,."ells*:ila, 2,.4alue & i
:ila & :ila K 2
Next i
En( Su.
PP Recuerde que cuando utilizamos Cell& como propiedad de un rango *+bjeto Range,, Cell& empieza a
contar a partir de la casilla referenciada por Range.
E%em#lo /3)
El mismo con el que introduc#amos el tema *ejemplo ';,, pero utilizando el 7or y propiedad Cell&
Su. EjemploC'H*,
1im Bota A& ,nteger
1im Oedia A& Single
1im :ila A& ,nteger
Oedia & ;
!or :ila & 2 0o )
Bota&4al*@nput5ox*8Entrar la 8 D :ila D 8 Bota > 8, 8Entrar Bota8,,
$ctive1eet."ells*:ila, 2, & Bota
Oedia & Oedia K Bota
Next :ila
Oedia & Oedia I )
$ctive1eet."ells*G, 2,.4alue & Oedia
En( Su.
http%--....cybercursos.net
Pgina 22
/ropiedad Offset.
Esta propiedad es tambin muy 6til a la ora de recorrer rango. O77&et, que significa desplazamiento, es
una propiedad del objeto Range y se utiliza para referenciar una casilla situada a n :ilas y n "olumnas de
una casilla dada. 4ea los ejemplos siguientes.
Acti"eSheet.Range*8$28,.O77&et*', ',.Value & 89ola8 + ,asilla ,/ C (ola$ 9 filas % 9
columnas desde ".4
Acti"eCell.O77&et*),2,.Value & 89ola8 + 7 @ilas por debajo de la casilla "cti#a C (ola
Acti"eCell.O77&et*',',.Acti"ate +"cti#ar la casilla 1ue estD 9 filas % 9 columnas de la acti#a
E%em#lo /8)
El mismo con el que introduc#amos el tema *ejemplo ';,, pero utilizando el !or y propiedad O77&et
Su. EjemploC')*,
1im Bota A& ,nteger
1im Oedia A& Single
1im :ila A& ,nteger
Oedia & ;
$ctive1eet.Range*8$28,.$ctivate
!or :ila & ; 0o H
Bota&4al*@nput 5ox*8Entrar la 8 D :ilaK2 D 8 Bota > 8, 8Entrar Bota8,,
$ctive"ell.+ffset*:ila, ;,.4alue & Bota
Oedia & Oedia K Bota
Next :ila
Oedia & Oedia I )
$ctive"ell.+ffset*G, 2,.4alue & Oedia
En( Su.
E%em#lo /9)
El mismo con el que introduc#amos el tema *ejemplo ';,, pero utilizando el !or y propiedad O77&et.
+bserve que aora vamos cambiando de celda activa.
Su. EjemploC'G*,
1im Bota A& ,nteger
1im Oedia A& Single
1im i A& ,nteger
Oedia & ;
$ctive1eet.Range*8$28,.$ctivate
!or i & 2 0o )
Bota&4al*@nput5ox*8Entrar la 8 D i D 8 Bota > 8, 8Entrar Bota8,,
$ctive"ell.4alue & Bota
http%--....cybercursos.net
Pgina 23
Oedia & Oedia K Bota
B (acer acti#a la casilla situada una fila por debajo de la actual
$ctive"ell.+ffset*2, ;,.$ctivate
Next :ila
Oedia & Oedia I )
$ctive"ell.4alue & Oedia
En( Su.
+bserve la diferencia entre los ejemplos ') y 'G, ambos utilizan la propiedad O77&et de diferente forma,
en el ejemplo ') la casilla activa siempre es la misma $2, O77&et se utiliza para referenciar una casilla a
partir de esta. En $'G se va cambiando de casilla activa cada vez de forma que, cuando termina la
ejecucin del programa la casilla activa es $G.
"uando utilizar cada mtodo, como casi siempre depende de lo que se pretenda acer. $qu# es bastante
claro, si le interesa que no cambie la casilla utilice O77&et como en el ejemplo '), en caso que interese
que vaya cambiando, aga como en el Ejemplo G. -or supuesto ay mucas variantes sobre el estilo de
recorrer "eldas, tanto con Cell& como con O77&et, solo tiene que ir probando y, como casi siempre, el que
m!s le guste.
E&tructura re#etiti"a 1o While))Loo# ?*acer Mientra&=)
%a estructura repetitiva 7or se adapta perfectamente a aquellas situaciones en que se sabe previamente el
n6mero de veces que se a de repetir un proceso, entrar veinte valores, recorrer cincuenta celdas, etc. -ero
ay ocasiones o casos en los que no se sabe previamente el n6mero de veces que se debe repetir un
proceso. -or ejemplo, suponga que a de recorrer un rango de filas en los que no se sabe cuantos valores
abr! *esto es, cuantas filas llenas abr!,, en ocasiones puede que ayan veinte, en ocasiones treinta, en
ocasiones ninguna, etc. -ara estos casos la estructura 7or no es adecuada y deberemos recurrir a la
sentencia 1o While..Loo# en alguna de sus formas. Esta estructura repetitiva est! controlada por una o
varias condiciones, la repeticin del bloque de sentencias depender! de si se va cumpliendo la condicin o
condiciones.
*acer Mientra& *se cumpla la condicin,
1entencia2
1entencia'
..
1entencia B
!in *acer Mientra&
En 4isual 5asic
1o While *se cumpla la condicin,
1entencia2
1entencia'
.
.
1entencia B
Loo#
PP %os ejemplos que veremos a continuacin sobre la instruccin 1o While..Loo# se ar!n sobre una
base de datos. Una base de datos en Excel es simplemente un rango de celdas en que cada fila representa
un registro y cada columna un campo de registro, la primera fila es la que da nombre a los campos. -ara
nuestra base de datos utilizaremos los campos siguientes, Nombre, ,iudad, *dad, @eca. -onga estos
t#tulos en el rango $2>.2 de la 9oja2 *En $2 ponga Bombre, en 52 ponga "iudad, en "2 ponga Edad y
en .2 :eca,, observe que los datos se empezar!n a entrar a partir de $'.
http%--....cybercursos.net
Pgina 28
E%em#lo /:)
-rograma para entrar registros en la base de datos. "ada campo se entra con @nput5ox. El programa va
pidiendo datos mientras se entre un valor en el @nput5ox correspondiente al nombre, es decir cuando al
preguntar el nombre no se entre ning6n valor, terminar! la ejecucin del bloque encerrado entre 1o
While...Loo#. +bserve la utilizacin de la propiedad O77&et para colocar los datos en las celdas
correspondientes.
Su. EjemploC'F*,
1im Bombre A& String
1im "iudad A& String
1im Edad A& ,nteger
1im feca A& 1ate
B "cti#ar oja.
/or01eets*89oja28,.$ctivate
B "cti#ar casilla "9
$ctive1eet.Range*8$'8,.$ctivate
Bombre & @nput5ox*8Entre el Bombre *Return para 3erminar, > 8, 8Bombre8,
B Mientras la #ariable Nombre sea diferente a cadena #aca
1o While Bombre QM 88
"iudad & @nput5ox*8Entre la "iudad > 8, 8"iudad8,
Edad & 4al*@nput5ox*8Entre la Edad > 8, 8Edad8,,
:eca&"date*@nput5ox*8Entra la :eca > 8, 8:eca8,,
B ,opiar los datos en las casillas correspondientes
With $ctive"ell
.4alue & Bombre
.+ffset*;,2,.4alue & "iudad
.+ffset*;,',.4alue & Edad
.+ffset*;,(,.4alue & feca
En( With
B(acer acti#a la celda de la fila siguiente a la actual
$ctive"ell.+ffset*2,;,.$ctivate
Bombre & @nput5ox*8Entre el Bombre *Return para 3erminar, > 8, 8Bombre8,
Loo#
En( Su.
E%em#lo /;)
-reste especial atencin a este ejemplo ya que seguro que el cdigo que viene a continuacin lo utilizar!
en mucas ocasiones. $ntes que nada observe el ejemplo anterior, f#jese en que siempre empezamos a
llenar el rango de la oja a partir de la celda $', esto tiene una nefasta consecuencia, la segunda vez que
ejecute la macro macacar! los datos de $'>.' y si continua ejecutando macacar! los datos de los
rangos siguientes. Una solucin seria observar cual es la casilla vac#a siguiente y cambiar en la
instruccin Acti"eSheet)Range?AA/A=)Acti"ate , la referencia A/ por la que corresponde a la primera
casilla vac#a de la columna $. El cdigo que le mostramos a continuacin ar! esto por nosotros, es decir
recorrer! una fila de celdas a partir de $2 asta encontrar una vac#a y dejar! a esta como celda activa para
que la entrada de datos comience a partir de ella.
http%--....cybercursos.net
Pgina 29
Su. EjemploC'=*,
..
B "cti#ar oja.
/or01eets*89oja28,.$ctivate
B "cti#ar casilla "9
$ctive1eet.Range*8$28,.$ctivate
B Mientras la celda acti#a no est; #aca
1o While Not @sEmpty*$ctive"ell,
B (acer acti#a la celda situada una fila por debajo de la actual
$ctive"ell.+ffset*2,;,.$ctivate
Loo#
))
En( Su.
E%em#lo /4)
Es la unin de los dos programas anteriores. Es decir abr! un bucle 1o While que buscar! la primera
casilla vac#a de la base da datos y otro para pedir los valores de los campos asta que se pulse Enter en
Bombre.
Su. EjemploC'=*,
1im Bombre A& String
1im "iudad A& String
1im Edad A& ,nteger
1im feca A& 1ate
/or01eets*89oja28,.$ctivate
$ctive1eet.Range*8$28,.$ctivate
B Buscar la primera celda #aca de la columna " % con#ertirla en acti#a
1o While Not @sEmpty*$ctive"ell,
$ctive"ell.+ffset*2,;,.$ctivate
Loo#
Bombre & @nput5ox*8Entre el Bombre *Return para 3erminar, > 8, 8Bombre8,
B Mientras la #ariable Nombre sea diferente a cadena #aca
1o While Bombre QM 88
"iudad & @nput5ox*8Entre la "iudad > 8, 8"iudad8,
Edad & 4al*@nput5ox*8Entre la Edad > 8, 8Edad8,,
:eca&"date*@nput5ox*8Entra la :eca > 8, 8:eca8,,
With $ctive"ell
.4alue & Bombre
.+ffset*;,2,.4alue & "iudad
.+ffset*;,',.4alue & Edad
.+ffset*;,(,.value & feca
En( With
$ctive"ell.+ffset*2,;,.$ctivate
Bombre & @nput5ox*8Entre el Bombre *Return para 3erminar, > 8, 8Bombre8,
Loo#
En( Su.
http%--....cybercursos.net
Pgina 2:
"uando se tienen que entrar desde el teclado conjuntos de valores, algunos programadores y usuarios
prefieren la frmula de que el programa pregunte si se desean entrar m!s datos, la t#pica pregunta V.esea
@ntroducir m!s datos W, si el usuario contesta 1#, el programa vuelve a ejecutar las instrucciones
correspondientes a la entrada de datos, si contesta que no se finaliza el proceso, observe como quedar#a
nuestro bucle de entrada de datos con este sistema.
OasCdatos & vb7es
1o While OasC.atos & vb7es
Bombre & @nput5ox*8Entre el Bombre *Return para 3erminar, > 8, 8Bombre8,
"iudad & @nput5ox*8Entre la "iudad > 8, 8"iudad8,
Edad & 4al*@nput5ox*8Entre la Edad > 8, 8Edad8,,
:eca&"date*@nput5ox*8Entra la :eca > 8, 8:eca8,,
With $ctive"ell
.4alue & Bombre
.+ffset*;,2,.4alue & "iudad
.+ffset*;,',.4alue & Edad
.+ffset*;,(,.value & feca
En( With
$ctive"ell.+ffset*2,;,.$ctivate
B Preguntar al usuario si desea entrar otro registro4
OasCdatos & Osg5ox*8+tro registro W8, vb7esBoKvbSuestion,8Entrada de datos8,
Loo#
PP +bserve que es necesaria la l#nea anterior al bucle Ma&B(ato& C ".De&, para que cuando se eval6e la
condicin por vez primera esta se cumpla y se ejecuten las sentencias de dentro del bucle, OasCdatos es
una variable de tipo ,nteger. 4ea la seccin siguiente donde se estudia una variante de la estructura 1o
While que es m!s adecuada para este tipo de situaciones.
http%--....cybercursos.net
Pgina 2;
E&tructura 1o))Loo# While)
El funcionamiento de esta estructura repetitiva es similar a la anterior salvo que la condicin se eval6a al
final, la inmediata consecuencia de esto es que las instrucciones del cuerpo del bucle se ejecutaran al
menos una vez . +bserve que para nuestra estructura de entrada de datos vista en el 6ltimo apartado de la
seccin 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 del cuerpo del bucle se deben ejecutar al menos una
vez, luego ya decidiremos si se repiten o no.
1o
Bombre & @nput5ox*8Entre el Bombre *Return para 3erminar, > 8, 8Bombre8,
"iudad & @nput5ox*8Entre la "iudad > 8, 8"iudad8,
Edad & 4al*@nput5ox*8Entre la Edad > 8, 8Edad8,,
:eca&"date*@nput5ox*8Entra la :eca > 8, 8:eca8,,
With $ctive"ell
.4alue & Bombre
.+ffset*;,2,.4alue & "iudad
.+ffset*;,',.4alue & Edad
.+ffset*;,(,.value & feca
En( With
$ctive"ell.+ffset*2,;,.$ctivate
OasCdatos & Osg5ox*8+tro registro W8, vb7esBoKvbSuestion,8Entrada de datos8,
BMientras Mas_Eatos C #b?es
Loo#While OasC.atos & vb7es
+bserve que en este caso no es necesario la l#nea OasC.atos & vb7es antes de 1o para forzar la entrada
en el bucle ya que la condicin va al final.
E&tructura 1o))Loo# @ntil ?*acer)) *a&ta Eue &e cum#la la con(ici-n=)
Es otra estructura que eval6a la condicin al final observe que la interpretacin es distinta ya que el bucle
se va repitiendo *AS0A Eue &e cum#le la con(ici-n, no O@EB3R$1 se cumple la condicin. "ual de
los dos utilizar, pues, no se sorprenda, la que entienda mejor o le guste m!s.
%a entrada de datos con este bucle quedar#a
1o
Bombre & @nput5ox*8Entre el Bombre *Return para 3erminar, > 8, 8Bombre8,
"iudad & @nput5ox*8Entre la "iudad > 8, 8"iudad8,
Edad & 4al*@nput5ox*8Ent re la Edad > 8, 8Edad8,
:eca&"date*8@nput5ox*8Entra la :eca > 8, 8:eca8,
With $ctive"ell
.4alue & Bombre
.+ffset*;,2,.4alue & "iudad
.+ffset*;,',.4alue & Edad
.+ffset*;,(,.value & feca
En( With
$ctive"ell.+ffset*2,;,.$ctivate
OasCdatos & Osg5ox*8+tro registro W8, vb7esBoKvbSuestion,8Entrada de datos8,
B(asta 1ue Mas_Eatos sea igual a #bNo
Loo#@ntil OasC.atos&vbBo
http%--....cybercursos.net
Pgina 24
E&tructura !or Each)
Este bucle se utiliza b!sicamente para ejecutar un grupo de sentencias con los elementos de una coleccin
o una matriz *pronto veremos los que es,. Recuerde que una coleccin es un conjunto de objetos, ojas,
rangos, etc. 4ea el ejemplo siguiente que se utiliza para cambiar los nombres de las ojas de un libro de
trabajo.
E%em#lo /4)
-rograma que pregunta el nombre para cada oja de un libro de trabajo, si no se pone nombre a la oja,
queda el que tiene.
Su. EjemploC'J*,
1im BuevoCBombre A& String
1im 9oja A& WorkSheet
B Para cada oja del conjunto ForGSeets
!or Each 9oja @n /or01eets
BuevoCBombre&@nput5ox*8Bombre de la 9oja > 8 D 9oja.Bame,8Bombrar 9ojas8,
,7 BuevaCBombre QM 88 0hen
9oja.Bame&BuevoCnombre
En(i7
Next
En( Su.
PP 9oja va referenciando cada una de las ojas del conjunto /or01eets a cada paso de bucle.
E%em#lo 25)
Entrar valores para las celdas del rango $2>52; de la oja $ctiva.
Su. EjemploC(;*,
1im R A& Range
B Para cada celda del rango ".)B.5 de la oja acti#a
!or Each R in $ctive1eet.Range*8$2>52;8,
R.4alue & @nput5ox*8Entrar valor para la celda 8 D R.$ddress, 8Entrada de valores8,
Next
En( Su.
PP +bserve que se a declarado una variable tipo Range, este tipo de datos, como puede imaginar y a
visto en el ejemplo sirve para guardar Rangos de una o m!s casillas, estas variables pueden luego utilizar
todas las propiedades y mtodos propios de los +bjetos Range. 3enga en cuenta que la asignacin de las
varaibles que sirven para guardar o referenciar objetos *Range, /or01eet, etc., deben inicializarse
mucas veces a travs de la instruccin 1E3 , esto se estudiar! en otro cap#tulo.
http%--....cybercursos.net
Pgina 35
Proce(imiento& $ 7uncione&)
1e define como procedimiento iIo funcin a un bloque de cdigo que realiza alguna tarea. 9asta aora,
emos construido los programas utilizando un 6nico procedimiento, pero a medida que los programas *y
los problemas, crecen se va aciendo necesaria la inclusin de m!s procedimientos. -odr#a f!cilmente
caer en la tentacin de utilizar, como asta aora, un 6nico procedimiento por programa pero se dar!
cuenta r!pidamente de que este mtodo no es nada pr!ctico ya que grandes bloques de cdigo implican
mayor complicacin del mismo, repeticin de sentencias y lo que es m!s grave, mayores problemas de
seguimiento a la ora de depurar errores, ampliar funcionalidades o incluir modificaciones.
%a filosof#a de utilizar procedimientos es la antigua frmula del 8divide y vencer!s8, es decir, con los
procedimientos podremos tratar cada problema o tarea de forma m!s o menos aislada de forma que
construiremos el programa paso a paso evitando tener que resolver o controlar m6ltiples cosas a la vez.
"ada tarea la realizar! un procedimiento, si esta tarea implica la ejecucin de otras tareas, cada una se
implementar! y solucionar! en su correspondiente procedimiento de manera que cada uno aga una cosa
concreta. $s#, los diferentes pasos que se deben ejecutar para que un programa aga algo, quedaran bien
definidos cada uno en su correspondiente procedimiento, si el programa falla, fallar! a partir de un
procedimiento y de esta forma podremos localizar el error m!s r!pidamente.
%os procedimientos son tambin un eficaz mecanismo para evitar la repeticin de cdigo en un mismo
programa e incluso en diferentes programas. 1uponemos que abr! intuido que ay mucas tareas que se
repiten en casi todos los programas, veremos como los procedimientos que ejecutan estas tareas se
pueden incluir en un mdulo de forma que este sea exportable a otros programas y de esta manera ganar
tiempo que, como dice el tpico, es precioso.
1e7inir un #roce(imiento)
7a lo emos ec o unas cuantas veces, pero a# va de nuevo.
Su. BombreC-rocedimento
1entencias.
En(Su..
Llamar a un #roce(imiento)
-ara llamar un procedimiento desde otro se utiliza la instruccin Call Nombre_Procedimiento.
Su. -CUno
1entencias.
.
Call -C.os
.
1entencias
.
En( Su.
%as secuencias del procedimiento P_Hno se ejecutan asta llegar a la l#nea Call P_Eos, entonces se salta
al procedimiento P_Eos, se ejecutan todas las sentencias de este procedimiento y el programa continua
ejecut!ndose en el procedimiento P_Hno a partir de la sentencia que sigue a Call P_Eos.
http%--....cybercursos.net
Pgina 31
E%em#lo 2/)
Es el mismo programa que el visto en el ejemplo 'J pero el cdigo que salta casilla asta que se
encuentra una vac#a se implementa en un procedimiento llamado, Saltar_,eldas_2lenas. +bserve que
para entrar valores se a sustituido .o /ile..%oop por .o.. %oop /ile.
Su. EjemploC('*,
1im Bombre A& String
1im "iudad A& String
1im Edad A& ,nteger
1im feca A& 1ate
+ 2lamada a la funcin Saltar_,eldas_2lenas$ el programa salta a1u a ejecutar las
+instrucciones de este procedimiento % luego #uel#e para continuar la ejecucin a partir de la
+instruccin Eo
Call 1altarC"eldasC%lenas
1o
Bombre & @nput5ox*8Entre el Bombre *Return para 3erminar, > 8, 8Bombre8,
"iudad & @nput5ox*8Entre la "iudad > 8, 8"iudad8,
Edad & 4al*@nput5ox*8Entre la Edad > 8, 8Edad8,,
:eca&"date*@nput5ox*8Entra la :eca > 8, 8:eca8,,
With $ctive"ell
.4alue & Bombre
.+ffset*;,2,.4alue & "iudad
.+ffset*;,',.4alue & Edad
.+ffset*;,(,.value & feca
En(With
$ctive"ell.+ffset*2,;,.$ctivate
OasCdatos & Osg5ox*8+tro registro W8, vb7esBoKvbSuestion,8Entrada de datos8,
Loo#While OasC.atos & vb7es
En( Su.
+ @uncin 1ue salta celdas de una misma columna4 Si r#e para encontrar la primera celda #aca de la
+ columna
Su. 1altarC"eldadC%lenas*,
/or01eets*89oja28,.$ctivate
$ctive1eet.Range*8$28,.$ctivate
1o /ile not @sEmpty*$ctive"ell,
$ctive"ell.+ffset*2,;,.$ctivate
Loo#
En( Su.
http%--....cybercursos.net
Pgina 3/
FeneraliGar una 7unci-n)
+bserve que para saltar un rango de casillas llenas slo necesitar! llamar a la funcin
1altarC"eldasC%lenas, pero, siempre y cuando este rango est en una oja llamada 89oja28 y empiece en
la casilla $2, el procedimiento es poco pr!ctico ya que su !mbito de funcionamiento es limitado. En la
siguiente seccin modificaremos el procedimiento de manera que sirva para recorrer un rango que
empiece en cualquier casilla de cualquier oja.
/ar-$etros.
%os par!metros son el mecanismo por el cual un procedimiento puede pasarle valores a otro y de esta
forma condicionar, moldear, etc. las acciones que ejecuta. El procedimiento llamado gana entonces en
flexibilidad. %a sintaxis de llamada de un procedimiento es la siguiente,
Call -rocedimiento*-ar!metro2, -ar!metro',..., -ar!metroB,
%os par!metros pueden ser valores o variables.
%a sintaxis para el procedimiento llamado es la siguiente,
Su. -rocedimiento*-ar!metro2 as 3ipo, -ar!metro' $s 3ipo,..., -ar!metro( $s 3ipo,
+bserve que aqu# los par!metros son variables que recibir!n los valores, evidentemente debe aber
coincidencia de tipo. -or ejemplo, si el primer par!metro es una variable tipo @nteger, el primer valor que
se le debe pasar al procedimiento cuando se llama tambin a de ser de tipo @nteger *recuerde que puede
ser un valor directamente o una variable,.
E%em#lo 22)
El mismo programa que en el ejemplo (' pero aora la funcin 1altarC"eldasC%lenas tiene dos
par!metros 9oja y "asillaC@nicial que reciben respectivamente la oja donde est! el rango a recorrer y la
casilla inicial del rango.
Su. EjemploC((*,
1im Bombre A& String
1im "iudad A& String
1im Edad A& ,nteger
1im feca A& 1ate
+ 2lamada a la funcin Saltar_,eldas_2lenas$ obser#ar 1ue mediante dos parDmetros se
+ "l procedimiento en 1ue oja estD el rango a saltar % en la casilla donde debe empe!ar4
Call 1altarC"eldasC%lenas*89oja28, 8$28,
1o
Bombre & @nput5ox*8Entre el Bombre *Return para 3erminar, > 8, 8Bombre8,
"iudad & @nput5ox*8Entre la "iudad > 8, 8"iudad8,
Edad & 4al*@nput5ox*8Entre la Edad > 8, 8Edad8,,
:eca&"date*@nput5ox*8Entre la :eca > 8, 8:eca8,,
With $ctive"ell
.4alue & Bombre
.+ffset*;,2,.4alue & "iudad
.+ffset*;,',.4alue & Edad
.+ffset*;,(,.value & feca
En(With
$ctive"ell.+ffset*2,;,.$ctivate
http%--....cybercursos.net
Pgina 32
OasCdatos & Osg5ox*8+tro registro W8, vb7esBoKvbSuestion,8Entrada de datos8,
Loo#While OasC.atos & vb7es
En( Su.
+
+ Procedimiento Saltar_,eldas_2lenas4
+ Sir#e para Saltar celdas llenas de una columna asta encontrar una #aca 1ue se con#ierte en acti#a
+ ParDmetros )
+ (oja ) (oja donde estD el rango a saltar4
+ ,asilla_3nicial ) ,asilla 3nicial de la columna
Su. 1altarC"eldasC%lenas*9oja A& String, "asillaC@nicial A& String,
/or01eets*9oja,.$ctivate
$ctive1eet.Range*"asillaC@nicial,.$ctivate
1o /ile not @sEmpty*$ctive"ell,
$ctive"ell.+ffset*2,;,.$ctivate
Loo#
En( Su.
+bserve que aora el procedimiento 1altarC"eldasC%lenas sirve para recorrer cualquier rango en
cualquier oja.
+bserve que al procedimiento se le pasan dos valores directamente, recuerde, y esto es quiz!s lo m!s
abitual, que tambin pueden pasarse variables, por ejemplo.
Su. EjemploC((
..
1im 9oja A& String
1im "asillaC@nicial A& String
9oja & @nput5ox*8En que oja est! la base de datos > 8, 8Entrar Bombre de 9oja8,
"asillaC@nicial & @nput5ox*8En que casilla comienza la base de datos8,8"asilla @nicial8,
+ :bser#e 1ue los parDmetros son dos #ariables cu%o #alor se a entrado desde teclado en
+ las dos instrucciones 3nputBo' anteriores4
Call 1altarC"eldasC%lenas*9oja, "asillaC@nicial,
.
.
En( Su.
http%--....cybercursos.net
Pgina 33
Variables locales 0 (ariables Globales.
El !mbito de una variable declarada dentro de una funcin es la propia funcin, es decir no podr!
utilizares fuera de dica funcin. $s#, el siguiente programa que deber#a sumar las cinco filas siguientes a
partir de la casilla activa y guardar el resultado en la sexta es incorrecto.
Su. $lgunaC"osa*,
..
.
Call 1umarC"incoC1iguientes
$ctive"ell.+ffset*G,;,.4alue & 1uma
.
.
En( Su.
Su. 1umarC"incoC1iguientes*,
1im i A& ,nteger
1im 1uma A& Single
1uma&;
!or i&2 0o )
1uma & 1umaK$ctive"ell.+ffset*i,;,.4alue
Next i
En( Su.
Es incorrecto porque tanto las variable i como la variable Suma est!n declaradas dentro del procedimiento
Sumar_,inco_Siguientes consecuentemente, su !mbito de accin es este procedimiento. -or tanto, la
instruccin "cti#e,ell4:ffset-=$504Value C Suma del procedimiento "lguna_,osa, generar#a un error *con
+ption Explicit activado, ya que la variable Suma no est! declarado dentro de l. 1i piensa en declarar la
variable Suma dentro del procedimiento (acer_"lgo, no solucionar! nada porque esta ser! local a dico
procedimiento, en este caso tendr#a dos variables llamadas Suma pero cada una de ellas local a su propio
procedimient o y consecuentemente con el !mbito de accin restringido a ellos.
Una solucin, que a nosotros no nos gusta, seria declarar suma como variable global. Una variable global
se declara fuera de todos los procedimientos y es reconocida por todos los procedimientos del mdulo,
O#tion Ex#licit
+ Suma es una #ariable global reconocida por todos los procedimientos del mdulo4
1im 1uma A& Single
Su. $lgunaC"osa*,
.
Call 1umarC"incoC1iguientes
$ctive"ell.+ffset*G,;,.4alue & 1uma
.
En( Su.
Su. 1umarC"incoC1iguientes*,
1im i A& ,nteger
1uma&;
!or i&2 0o )
1uma & 1umaK$ctive"ell.+ffset*i,;,.4alue
Next i
En( Su.
http%--....cybercursos.net
Pgina 38
%as variables globales son perfectas en cierta ocasiones, para este caso seria mejor declarar Suma en la
funcin (acer_"lgo y pasarla como par!metro al procedimiento Sumar_,inco_Siguientes.
Su. $lgunaC"osa*,
1im 1uma A& Single
..
+ 2lamada a la funcin Sumar_,inco_Siguientes pasDndole la #ariable Suma
Call 1umarC"incoC1iguientes*1uma,
$ctive"ell.+ffset*G,;,.4alue & 1uma
..
En( Su.
Su. 1umarC"incoC1iguientes*1 A& Single,
1im i A& ,nteger
1uma&;
!or i&2 0o )
1 & 1K$ctive"ell.+ffset*i,;,.4alue
Next i
En( Su.
Esto le funcionaria porque la variable par!metro S *y se le a cambiado el nombre adrede, de
Sumar_,inco_Siguientes es la variable Suma declarada en (acer_"lgo. :uncionar! porque en visual
basic, a menos que se indique lo contrario, el paso de par!metros es por referencia, vea la siguiente
seccin.
/aso por referencia 0 paso por (alor.
Bo entraremos en detalles sobre como funciona el paso de par!metros por valor y el paso de par!metros
por referencia, slo indicar que el paso por valor significa que la variable par!metro del procedimiento
recibe el valor de la variable *o directamente el valor, de su par!metro correspondient e de la instruccin
de llamada y en el paso por referencia, la variable par!metro del procedimiento es la misma que su
par!metro correspondiente de la instruccin de llamada, es decir, la declarada en el procedimiento desde
el que se ace la llamada. -or defecto, y siempre que en la instruccin de llamada se utilicen variables, las
llamadas son por referencia. 1i desea que el paso de par!metros sea por valor, debe anteponer a la
variable par!metro la palabra reservada '$Val, por ejemplo,
Su. 1altarC"eldasC%lenas*'$Val 9oja $s 1tring, '$Val "asillaC@nicial $s 1tring,
$unque lo elegante y efectivo por razones de memoria seria pasar siempre que sea posible por valor, es
poco abitual que as# se aga en visual basic, seguramente por comodidad. "omo suponemos que ar!
como la mayor#a, es decir, pasar por referencia, tenga cuidado con los *indeseables, efectos laterales.
"opie y ejecute este programa y descubrir! que son los efectos laterales.
http%--....cybercursos.net
Pgina 39
E%em#lo E7ectoBLateral)
$ntes de copiar el programa, active una oja en blanco y ponga valores del 2 al 2) distribuidos de la
forma siguiente, en el rango $2>$) valores del 2 al ), en el rango 52>5) valores del G al 2;, en el rango
"2>") valores del 22 al 2).
El siguiente programa debe recorrer cada una de tres las columnas de valores, sumarlos y poner el
resultado en las filas G de cada columna. Entonces, seg6n los valores que a entrado en cada una de las
columnas, cuando aya acabado la ejecucin del programa debe aber los siguientes resultados, $G & 2),
5G&H;, "G&G). -ara llevar a cabo la suma de los valores de cada columna se llama a la funcin
Recorrer_Sumar tres veces, una para cada columna, esta funcin recibe en el par!metro @ el valor de la
fila donde debe empezar a sumar, sobre el par!metro , el valor de la columna a sumar y sobre el
par!metro I la cantidad de filas que a de recorrer.
El programa utiliza la propiedad Cell& para referenciar las filas y columnas de los rangos. +bserve
atentamente los valores que ir! cogiendo la variable @ila ya que esta ser! la que sufra el efecto lateral.
Su. EfectoC%ateral*,
1im :ila A& ,nteger
:ila & 2
Call RecorrerC1umar*:ila, 2,), + ,olumna "
Call RecorrerC1umar*:ila, ',), T ,olumna B
Call RecorrerC1umar*:ila, (,), T ,olumna ,
En( Su.
Su. RecorrerC1umar*: A& ,nteger, " A& ,nteger, S A& ,nteger,
1im i A& ,nteger
1im 3otal A& ,nteger
3otal & ;
!or i &2 0o S
3otal & 3otal K $ctive1eet."ells*:, ",.4alue
:&:K2 + :J: con esta asignacin$ recuerde 1ue @ es la #ariable @ila declarada en
+ el procedimiento *fecto_2ateral
Next i
$ctive1eet."ells*:, ", & 3otal
En( Su.
"uando ejecute el programa se producir! la salida siguiente, en $G abr! un 2), asta aqu# todo correcto,
pero observe que en la segunda columna aparece un ; en 52' y en la tercera columna aparece un ; en
"2=, veamos que a pasado. %a primera vez que se llama la funcin, la variable @ vale 2 ya que este es el
valor que tiene su par!metro correspondiente *@ila, en la instruccin Call. +bserve que @ se va
incrementando una unidad a cada paso de bucle !or, RE"UER.E que @ es realmente la variable @ila
declarada en el procedimiento *fecto_2ateral, por tanto cuando finaliza el procedimiento
Recorrer_Sumar y vuelve el control al procedimiento *fecto_2ateral @ila vale G, y este es el valor que se
pasar! a Recorrer_Suma la segunda vez que se llama, a partir de a# todo ir! mal ya que se empezar! el
recorrido de filas por la G. Una de las soluciones a este problema para acer que cada vez que se llame
Recorrer_Sumar la variable @ reciba el valor 2, es utilizar un paso por valor, es decir que @ reciba el
valor de @ila, no que sea la variable @ila, observe que entonces, si @ no es la variable @ila, cuando
incremente @ no se incrementar! @ila, esta siempre conservar! el valor 2. -ara acer que @ sea un
par!metro por valor, simplemente ponga la palabra '$Val antes de @ en la declaracin del procedimiento.
4uelva a ejecutar el programa, ver! como aora funciona correctamente.
http%--....cybercursos.net
Pgina 3:
@nsistimos de nuevo en que tenga cuidado con estas cosas. $l menos aora ya est! sobre aviso, cuando un
programa no aga lo que a previsto una de las cosas que deber! repasar es el paso de par!metros a los
procedimientos.
PP -ara acabar, observe que en mucas ocasiones le emos indicado que en el paso por referencia la
variable del procedimiento llamado es la variable declarada en el procedimiento que llama. En este 6ltimo
ejemplo, le emos dico que @ era la variable @ila, pues bien, esto no es cierto @ila es una variable y @ es
otra variable, aora es lgico que se pregunte por qu entonces @ act6a como si fuera @ila, este es un
tema que no entra en el !mbito de este manual, si alguna 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. 1i ya
conoce los punteros de " o -ascal entonces ya abr! intuido que el paso por valor en nuestro ejemplo
equivaldr#a a,
RecorrerC:ila*:, ", S,?
void RecorrerC:ila*int :, int ", int S,
7 un paso por referencia a
RecorrerC:ila*D:, ", S,?
4oid RecorrerC:ila*int P:, int ", int S,
http%--....cybercursos.net
Pgina 3;
!uncione&)
Una funcin es lo mismo que un procedimiento con la salvedad que este devuelve un valor al
procedimiento o funcin que lo llama. 4ea el siguiente ejemplo, es una funcin muy sencilla ya que
simplemente suma dos n6meros y devuelve el resultado.
E%em#lo 23)
:uncin que devuelve la suma de dos valores que se le pasan como par!metros. +bserve las diferentes
formas en como se llama la funcin.
Su. EjemploC(H*,
1im x A& ,nteger
1im n2 A& ,nteger, n' A& ,nteger
A & 1uma*), ),
n2& 4al * @nput5ox*8Entrar un n6mero > 8, 8Entrada8,,
n'& 4al * @nput5ox*8Entrar otro n6mero > 8, 8Entrada8,,
A& suma*n2,n',
$ctive"ell.4alue & 1uma*$ctive1eet.Range*8$28,.4alue , $ctive1eet.Range*8$'8,.4alue,
A & 1uma*), H, K 1uma *n2, n',
En( Su.
!unction 1uma*42 A& ,nteger, 4' A& ,nteger, A& ,nteger
1im 3otal A& ,nteger
3otal & 42 K 4'
1uma & 3otal
En( !unction
+bserve la sintaxis de la cabecera de funcin,
!unction 1uma*42 A& ,nteger, 4' A& ,nteger, A& ,ntege r
%a estructura general seria,
!unctionNombre_@uncion*par2 A& 0i#o, par' A& 0i#o,..., parB A& 0i#o, A& 0i#o.
%a sintaxis es similar a la cabecera de un procedimiento, slo que una funcin tiene tipo, esto tiene su
lgica, ya que una funcin devuelve un valor, ese valor ser! de un tipo determinado. $s#, en nuestro
ejemplo de !unction Suma, esta funcin es de tipo ,nteger, o dico de otra manera, la funcin ejecuta
sus sentencias y devuelve un valor acia el procedimiento o la funcin que la llam, el valor devuelto se
establece igualando el nombre de la funcin a algo,
http%--....cybercursos.net
Pgina 34
BombreC:uncin & ....
En el ejemplo de !unction 1uma,
1uma & 3otal
+bserve tambin la sintaxis de la llamada a la funcin, en el ejemplo emos utilizado unas cuantas formas
de llamarla, lo que debe tener siempre presente es que en cualquier expresin aritmtica o de c!lculo, el
ordenador realiza un m#nimo de dos operaciones, una de c!lculo y otra de asignacin. -or ejemplo,
$& 5K"
El ordenador primero calcula el resultado de sumar 5K" luego asigna ese resultado a la variable $. En
cualquier llamada a una funcin, cojamos por caso,
A& suma*n2,n',
-rimero se ejecutan todas las sentencias de la funcin 1uma, luego se asigna el c!lculo de la funcin a la
variable A. .e otro vistazo a la funcin de ejemplo y vea lo que realiza cada sentencia en la que se llama
a la funcin Suma.
4eamos a continuacin unos cuantos ejemplos de funciones. $ntes recordarle que todo lo referente a
par!metros por valor y referencia, variables locales y globales, etc. que estudiamos en los procedimientos
es lo mismo para las funciones.
E%em#lo 28)
:uncin que devuelve la direccin de la primera celda vac#a de un rango. %a funcin es de tipo String ya
que devuelve la casilla en la forma 8:ila"olumna 8, por ejemplo 8$2;8. Utilizaremos la propiedad
A((re&& del objeto range, esta propiedad devuelve un string que contiene la referencia 8:ila"olumna8 de
una casilla o rango de casillas. En el caso de un rango devuelve,
8:ila"olumnaC@nicial>:ila"olumnaC:inal8, por ejemplo 8$2>"2;8
Su. EjemploC()*,
1im "asilla A& String
"asilla & "asillaC4acia*8$28,
......
End 1ub
http%--....cybercursos.net
Pgina 85
+ @uncin ,asilla_Vacia de Tipo String
+ Sir#e para Recorrer las filas de una columna asta encontrar una #aca4
+ ParDmetros )
+ ,asilla_3nicio ) ,asilla donde debe empe!ar a buscar4
+ Ee#uel#e Hn string 1ue contiene la referencia de la primera casilla
!unction "asillaC4acia*"asillaC@nicio A& String, A& String
$ctive1eet.Range*"asillaC@nicio,.$ctivate
1o While Not @sEmpty*$ctive"ell,
$ctive"ell.+ffset*2, ;,.$ctivate
Loo#
"asillaC4acia & $ctive"ell.$ddress
En( !unction
E%em#lo 29)
1imilar al anterior. Es la t#pica b6squeda secuencial de un valor en un rango de casillas, en esta funcin
solo se avanzar! a travs 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 rango de filas, devuelve una cadena vac#a *88,.
Su. EjemploC(G*,
1im "asilla A& 1tring
"asilla & 5uscarC4alor*8$28, '),
+ Si #alor no encontrado
,7 "asilla & 88 3en
.....
El&e +Valor encontrado
....
En(i7
En( Su.
+ @uncin Buscar de Tipo String
+ Sir#e para Recorrer las filas de una columna asta encontrar el #alor buscado o una de #aca4
+ ParDmetros )
+ ,asilla_3nicial ) ,asilla donde debe empe!ar a buscar4
+ Valor_Buscado ) Valor 1ue se debe encontrar
+ Ee#uel#e Hn string 1ue contiene la referencia de la casilla donde se a encontrado el #alor4
+ Tambi;n puede de#ol#er 88 en caso 1ue el #alor buscado no est;4
!unction 5uscar*"asillaC@nicial A& String, 4alorC5uscado A& ,nteger, A& String
$ctive1eet.Range*"asillaC@nicial,.$ctivate
+ Mientras casilla no #aca ? #alor de casilla diferente al buscado
1o While Not @sEmpty*$ctive"ell, An( $ctive"ell.4alue QM 4alorC5uscado
$ctive"ell.+ffset*2, ;,.$ctivate
Loo#
+ Si la casilla donde se a detenido la b&s1ueda N: *STK V",L" es 1ue se a encontrado
+el #alor4
,7 Not @sEmpty*$ctive"ell, 0hen
5uscar & $ctive"ell.$ddress + Ee#ol#er la casilla donde se a encontrado el #alor
El&e + 2a casilla estD #aca$ N: se a encontrado el #alor buscado
5uscar&88 + Ee#ol#er una cadema #aca
En(i7
En( !unction
http%--....cybercursos.net
Pgina 81
E%em#lo 29)
1imilar al anterior. 56squeda secuencial de un valor en un rango de casillas, en esta funcin se avanzar! a
travs 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 rango, devuelve una cadena vac#a *88,.
Su. EjemploC(G*,
1im "asilla A& 1tring
"asilla & 5uscarC4alor*8$28, '),
,7 "asilla & 88 0hen
.....
El&e
....
En(i7
En( Su.
!unction 5uscar*"asillaC@nicial A& String, 4alorC5uscado A& ,nteger, $s String
1im @ncrementoC"olumna A& ,nteger
1im "ontinuar A& 'oolean
$ctive1eet.Range*"asillaC@nicial,.$ctivate
"ontinuar & 3rue
1o While "ontinuar
@ncrementoC"olumna & ;
+ Buscar el #alor por las columnas asta encontrarlo o encontrar una celda #aca4
1o While Not @sEmpty*$ctive"ell.+ffset*;, @ncrementoC"olumna, An(
$ctive"ell. +ffset*;, @ncrementoC"olumna.4alue QM 4alorC5uscado
+ Siguiente columna
@ncrementoC"olumna & @ncrementoC"olumna K 2
Loo#
+ Si no estD #aca la casilla entonces parar la b&s1ueda$ se a encontrado el #alor
,7 Not @sEmpty*$ctive"ell.+ff1et*;, @ncrementoC"olumna,, 0hen
"ontinuar&:alse
El&e + 2a casilla estD #aca$ no se a encontrado el #alor
$ctive"ell.+ffset*2, ;,.$ctivate + Saltar a una nue#a fila
,7 @sEmpty*$ctive"ell, 0hen + Si la casilla de la nue#a fila estD #aca
"ontinuar&:alse + Parar la b&s1ueda$ no a% mDs casilla a recorrer
En(i7
En(i7
Loo#
+ Si la casilla donde se a detenido la b&s1ueda N: *STK V",L" es 1ue se a encontrado
+el #alor4
,7 Not @sEmpty*$ctive"ell, 0hen
5uscar & $ctive"ell*;, @ncrementoC"olumna,.$ddress + Ee#ol#er la casilla donde se
+a encontrado el #alor
El&e + 2a casilla estD #aca$ N: se a encontrado el #alor buscado
5uscar&88 + Ee#ol#er una cadema #aca
En(i7
En( !unction
http%--....cybercursos.net
Pgina 8/
La cl-usula /ri(ate.
-uede anteponer la cl!usula private a todos los procedimientos y funciones que sean llamados slo desde
el mismo mdulo, es una forma de aorrar memoria y acer que el programa corra un poco m!s r!pido. 1i
necesita llamar un procedimiento o funcin desde otro mdulo, nunca debe precederlo por la cl!usula
private, recuerde que esta cl!usula restringe el !mbito de utilizacin de un procedimiento a su propio
mdulo. 1upongamos el ejemplo siguiente.
+ Mdulo .
Su. <eneral
....
En( Su.
Pri"ate Su. -rivado
....
En( Su.
T Mdulo 9
Su. -rocedimientoCdeCmodulo'
+ *sto es correcto4 2lama al procedimiento General definido en Mdulo.
Call <eneral
+ *sto no es correcto4 2lama al procedimiento Pri#ado definido en Mdulo .$ este
+ procedimiento #a precedido pro la clDusula Pri#ate$ por tanto slo puede ser llamado
+ desde procedimientos de su propio mdulo
Call -rivado
En( Su.
http%--....cybercursos.net
Pgina 82
4amos a ver a continuacin tres ejemplos m!s sobre funciones. Es importante que los cree en un libro de
trabajo nuevo y los ponga en un mismo mdulo, al final del cap#tulo utilizaremos las opciones de exportar
e importar mdulos de procedimientos y funciones. En todos los ejemplos ver! el procedimiento
-rocedimientoC%lamador, es para mostrar de que forma se debe llamar al procedimiento o funcin. %os
procedimientos implementados son, por llamarlo de alguna manera, de tipo general, es decir, son
procedimientos que podr! utilizar en mucas aplicaciones.
E%em#lo 2:)
-rocedimiento que abre un cuador Osg5ox y muestra el texto que se le paso como par!metro.
Su. -rocedimientoC%lamador*,
.
.
Call m$viso*8Esto es el mensaje de aviso8, 8Esto es el 3#tulo8,
.
.
En( Su.
+ Procedimiento m"#iso
+ @uncin Mostrar el cuadro de funcin MsgBo'$ con el icono informacin % el botn :M -"ceptar04
+ Se utili!a para mostrar a#isos4
+ ParDmetros)
+ Te'to C Te'to 1ue muestra el cuadro
+ Titulo C Ttulo del cuadro
+
Su. m$viso*3exto A& String, 3itulo A& String,
Osg5ox -rompt>&3exto, 5uttons>&vb+R+nly K vb@nformation, 3itle>&3itulo
En( Su.
E%em#lo 2;)
:uncin tipo range que devuelve un rango. +bserve como la funcin se iguala a una variable tipo Range,
recuerde que con esta variable podr! acceder a todas las propiedades e invocar todos los mtodos propios
de los objetos Range. En este ejemplo en concreto se utilizan las variables para "opiar un grupo de celdas
de un rango acia otro, se utilizan los mtodos "opy y -aste del objeto Range.
Su. -rocedimientoC%lamador*,
1im RangoC+rigen A& Range
1im RangoC.estino A& Range
Set RangoC+rigen&"ogerCRango*$2,),),
RangoC+rigen."opy
Set RangoC.estino&"ogerCRango*<2,),),
RangoC.estino.-aste -aste1pecial>&xl-aste$ll
En( Su.
http%--....cybercursos.net
Pgina 83
+ @uncin 1ue de#uel#e un rango a una #ariable de este tipo
+ ParDmetros
+ ,asilla C casilla inicial del rango
+ @ilas C n&mero+ de filas
+ ,olumnas C n&mero de columnas del rango
!unction "ogerCRango*"asilla A& String, :ilas A& ,nteger, "olumnas A& ,nteger, A& Range
1im "asillaC:inal A& String
$ctive1eet.Range*"asilla,.$ctivate
$ctive"ell."ells*:ilas, "olumnas,.$ctivate
"asillaC:inal & $ctive"ell.$ddress
$ctive1eet.Range*"asilla D 8>8 D "asillaC:inal,.1elect
Set "ogerCRango & $ctive1eet.Range*"asilla D 8>8 D "asillaC:@nal,
En( !unction
E%em#lo 24)
:uncin para comprobar el tipo de datos. Es una funcin de comprobacin que se puede utilizar para
validar los datos que se entran desde un cuadro @nput5ox o desde los cuadros de texto de formularios. %a
funcin es de tipo 5ooleano, devuelve 3rue *cierto, o :alse en funcin de si el dato pasado es correcto.
En esta funcin se eval6an slo datos numricos y datos tipo :eca, puede ampliarla para que se
comprueben m!s tipos.
Su. -rocedimientoC%lamador*,
1im "antidad A& ,nteger
1im :eca A& 1ate
1im .atos A& String
..
.atos & @nput5ox*8Entrar una "antidad > 8, 8Entrar8,
,7 Not "omprobarC3ipo*.atos,8B8, 0hen
m$viso*8%os datos introducido no son numricos8, 8Error8,
El&e
"antidad & 4al*.atos,
..
En(,7
..
.atos&@nput5ox*8Entrar :eca8,8Entrar8,
,7 Not "omprobarC3ipo*.atos,8:8, 0hen
m$viso*8%os feca introducida no es correcta8, 8Error8,
El&e
:eca & 4al*.atos,
.
.
En( ,7
.
.
En( Su.
http%--....cybercursos.net
Pgina 88
+ @uncin 1ue e#al&a si el tipo de datos 1ue se le pasan son correctos o no4 Si son correctos de#uel#e
+ TRH* $ en caso contrario de#uel#e @"2S*
+ ParDmetros
+ Valor C#alor 1ue se debe comprobar$ de tipo String
+ Tipo C tipo a comprobar$ 8N8 NNO Num;rico$ 8@8$ tipo feca
!unction "omprobarC3ipo*4alor A& String, 3ipo A& String, A& 'oolean
1im 4alido A& 'oolean
4alido & 0rue
Select Ca&e 3ipo
+ ,omprueba si es un #alor num;rico #Dlido
Ca&e 8B8
,7 Not @sBumeric*4alor, 0hen
4alido & :alse
En( ,7
+ ,omprueba si es un #alor feca #Dlido
Ca&e 8:8
,7 Not @s.ate*4alor, 0hen
4alido & :alse
En( ,7
En( Select
"omprobarC3ipo & 4alido
En( !unction
,m#ortar $ Ex#ortar m-(ulo&)
%os 6ltimos tres ejemplos que emos visto, como le emos indicado, son procedimientos que pueden ser
utilizados en multitud de ocasiones o situaciones, seria interesante tenerlos disponibles en cualquiera de
las ojas que confeccionemos. -odr#a pensar en utilizar las opciones de copiar y pegar para pasar
procedimientos de una oja a otra, es un mtodo totalmente v!lido y efectivo, pero le proponemos a
continuacin otro mtodo m!s 8profesional8, por llamarlo de otra manera, e igual de efectivo. Este
mtodo consiste en guardar los procedimientos de un mdulo en un arcivo aparte, es decir,
independiente de cualquier oja de c!lculo, luego, cuando en una nueva oja necesite estas funciones,
solo deber! importar este arcivo para incorporarlo.
Exportar un $dulo. Guardar un $dulo en un arc*i(o.
"omo ejemplo, abra la oja donde puso los tres 6ltimos procedimientos.
2. -ase al editor de visual basic y active el mdulo a exportar.
'. $ctive opcin de la barra de men6s Archi"o+ Ex#ortar archi"o. $parece un cuadro de di!logo.
(. En cuadro de edicin Nom.re (e Archi"o, teclee el nombre para el arcivo donde se guardar! el
mdulo, por ejemplo 8<eneral.5as8, observe que .5$1 es la extensin de estos arcivos.
H. -ulse sobre el botn Fuar(ar.
http%--....cybercursos.net
Pgina 89
I$portar un $dulo.
1i est! siguiendo el ejemplo, cierre todos los arcivos de Excel y abra uno nuevo.
2. $ctive el editor 4isual 5asic.
'. $ctive opcin de la barra de men6s Archi"o+ ,m#ortar Archi"o. $parece un cuadro de di!logo.
(. 1eleccione en la lista 'u&car enH la carpeta donde tiene ubicado el arcivo a importar *la carpeta
donde est! <eneral.5as si est! siguiendo el ejemplo,.
H. Una vez localizada la carpeta, seleccione el arcivo a importar *<eneral.5as en el ejemplo, y pulse
sobre A.rir.
+bserve como en la ventana de proyecto se a incorporado un nuevo mdulo que contiene todos los
procedimientos y funciones del arcivo importado.
3erminamos aqu# el tema de procedimientos y funciones, djenos insistir de nuevo en que es muy
impor tante que construya sus programas utilizando todas las ventajas que le ofrece la programacin
modular. "omo 6ltimo consejo, agrupe todas las funciones que usted considere de utilizacin general en
uno o dos mdulos y luego utilice las opciones de importacin y exportacin para incorporarlos a sus
programas.
http%--....cybercursos.net
Pgina 8:
La gra.a(ora (e macro&)
Oicrosoft Excel lleva incluida una utilidad que sirve para registrar acciones que se llevan a cabo en un
libro de trabajo y registrarlas en forma de macro. -odemos aprovecar esta utilidad para generar cdigo
engorroso por su sintaxis un tanto complicada de recordar, adem!s de aorrar tiempo. "asi siempre
despus deberemos modificarlo para adaptarlo a nuestros programas, sin embargo eso resultar!
sumamente sencillo. 4ea el ejemp lo siguiente que sirve para poner bordes al rango de celdas de $2 a <G,
observe los comentarios para saber que bordes se ponen y dnde se ponen.
E%em#lo 1)
-oner bordes al rango que va de $2 a <G.
Su. -onerC5ordes*,
+ Seleccionar el rango ".)G=
Range*8$2><G8,.1elect
+ No a% borde diagonal acia abajo
1election.5orders*xl.iagonal.oUn,.%ine1tyle & xlBone
+ No a% borde diagonal acia arriba
1election.5orders*xl.iagonalUp,.%ine1tyle & xlBone
+ Borde i!1uierdo de la seleccn
With 1election.5orders*xlEdge%eft,
.%ine1tyle & xl"ontinuous +*stilo de linea continuo
./eigt & xlOedium + "nco de lnea Medio
."olor@ndex & xl$utomatic + ,olor de lnea automDtico -negro0
En( With
+ Borde superior de la seleccin
With 1election.5orders*xlEdge3op,
.%ine1tyle & xl"ontinuous
./eigt & xlOedium
."olor@ndex & xl$utomatic
En( With
+ Borde inferior de la seleccin
With 1election.5orders*xlEdge5ottom,
.%ine1tyle & xl"ontinuous
./eigt & xlOedium
."olor@ndex & xl$utomatic
En( With
+ Borde dereco de la seleccin
With 1election.5orders*xlEdgeRigt,
.%ine1tyle & xl"ontinuous
./eigt & xlOedium
."olor@ndex & xl$utomatic
En( With
+ Bordes #erticales interiores de la seleccin
With 1election.5orders*xl@nside4ertical,
.%ine1tyle & xl"ontinuous
./eigt & xl3in T $nco 1imple.
."olor@ndex & xl$utomatic
En( With
http%--....cybercursos.net
Pgina 8;
+ No a% bordes oriontales interiores en la seleccin
1election.5orders*xl@nside9orizontal,.%ine1tyle & xlBone
+ Seleccionar rango ".)G.
Range*8$2><28,.1elect
+ No a% borde diagonal acia arriba
1election.5orders*xl.iagonal.oUn,.%ine1tyle & xlBone
+ No a% borde diagonal acia arriba
1election.5orders*xl.iagonalUp,.%ine1tyle & xlBone
+ Borde i1uierdo de la seleccin
With 1election.5orders*xlEdge%eft,
.%ine1tyle & xl"ontinuous
./eigt & xlOedium
."olor@ndex & xl$utomatic
En( With
+ Borde superior de la seleccin
With 1election.5orders*xlEdge3op,
.%ine1tyle & xl"ontinuous
./eigt & xlOedium
."olor@ndex & xl$utomatic
En( With
+ Borde inferior de la seleccin
With 1election.5orders*xlEdge5ottom, + Eoble lnea
.%ine1tyle & xl.ouble
./eigt & xl3ic0
."olor@ndex & xl$utomatic
En( With
+ Borde dereco de la seleccin
With 1election.5orders*xlEdgeRigt,
.%ine1tyle & xl"ontinuous
./eigt & xlOedium
."olor@ndex & xl$utomatic
En( With
En( Su.
http%--....cybercursos.net
Pgina 84
1uponemos que el procedimiento anterior le parecer! abrumador, no se preocupe, le explicamos a
continuacin como lo emos eco y ver! que lo 6nico que debe acer son los pasos sobre la oja de
c!lculo, el grabador de macros se ocupa del resto.
2. $ctive la grabadora de macros. *erramienta&+ Macro+ Fra"ar nue"a macro. $parece la ventana
siguiente.
'. En Nom.re (e Macro, ponga Poner_2neas. En Fuar(ar Macro en, deje la opcin Li.ro Acti"o.
En 1e&cri#ci-n, ponga, macro para bordes a un rango de celdas.
(. -ulse sobre el botn Ace#tar.
H. Ejecute los pasos siguientes. 1on para poner los bordes
H.2 1eleccione el rango $2><G.
H.' $ctive +pcin !ormato+ Cel(a&. 1eleccione fica 'or(e&.
H.( -onga l#nea alrededor de la seleccn
H.(.2 En cuadro E&tilo&, seleccione la pen6ltima o antepen6ltima l#nea.
H.(.' -ulse sobre el botn que representa un cuadrado.
H.H -onga las l#neas verticales.
H.H.2 1eleccione del cuadro estilo la 6ltima l#nea de la primera columna.
H.H.' -ulse sobre el botn que representa las l#neas interiores de la seleccin *el situado
en el centro de la l#nea inferior de botones,.
H. -ulse sobre el botn Ace#tar.
). 1eleccione el rango $2><2
G. $ctive de nuevo la opcin !ormato+Cel(a& y seleccione la fica 'or(e&.
F. -onga l#nea inferior doble.
F.2 1eleccione del cuadro Estilo la 6ltima l#nea de la segunda columna.
F.' -ulse sobre el botn que representa la l#nea inferior de la seleccin.
=. -ulse sobre el botn Ace#tar.
J. .etenga la grabadora de Oacros pulsando sobre el botn o bien a2active
*erramienta&+ Macro& + 1etener Fra.aci-n.
7 7a est!. $ora abra el Editor de 4isual 5asic y compruebe como la grabadora a eco todo el trabajo
pro usted. $ora ya slo nos queda modificar la macro de forma que este formato de bordes sea aplicable
a cualquier rango. 4ea el ejemplo siguiente.
http%--....cybercursos.net
Pgina 95
E%em#lo/)
En es te ejemplo modificaremos la macro de manera que sirva para dar ese formato a cualquier rango de la
oja. +bserve en este ejemplo simplemente pasamos como par!metro el rango a formatear de manera que
la cabecera del procedimiento quedaria.
+ Procedimiento Poner_Bordes4
+ Procedimiento 1ue pone bordes a un rango4 ,oncretamente lo encierra en un cuadrado$ le pone lneas
+ #erticales % pone una doble lnea inferior en la primera fila4
+ ParDmetros)
+ Nombre_(oja) Nombre de la oja donde estD el rango4
+ Rango_Total ) Rango al 1ue se le aplica el formato4
+ Rango_Primera_@ila ) Rango de la primera fila al 1ue se debe aplicar doble lnea inferior4
Su. -onerC5ordes *BombreC9oja A& String, RangoC3otal A& String, RangoC-rimeraC:ila A& String,
+ Seleccionamos la oja en la 1ue se encuantra en rango
/or01eets*BombreC9oja,.$ctivate
+ Seleccionamos en rango
$ctive1eet.Range*RangoC3otal,.1elect
+ (acemos cuadro % lneas #erticales4
.......
.......
+ Seleccin de la primera fila
$ctive1eet.Range*-rimeraC:ila,.1elect
+ (acemos lnea inferior doble
.........
En( Su.
http%--....cybercursos.net
Pgina 91
E%em#lo 2)
Refinamiento de la macro del ejemplo anterior. En este ejemplo todav#a perfeccionaremos m!s la macro
del ejercicio anterior. 1obre todo en lo referente a los par!metros. 5!sicamente cambiaremos el tipo de
par!metros, as# en lugar del nombre de la oja pasaremos el n6mero y en lugar de los par!metros
RangoC3otal y RangoC-rimeraC:ila, simplemente pasaremos el rango de la casilla inicial, la macro se
encargar! de seleccionar todas las casillas adyacentes y de buscar la primera fila. En esta macro adem!s
se an incluido funcionalidades como borrar los formatos antes de aplicar las l#neas, ajustar el anco de
las columnas, etc. %ea los comentarios para ver que ace cada seccin de la macro.
+bserve la propiedad CurrentRegion del objeto Range, esta propiedad devuelve el rango de las casillas
llenas adyacentes a una dada. -or ejemplo imagine una oja con el rango $2>52; lleno de valores, la
instruccin
$ctive1eet.Range*8$28,."urrentRegion.1elect
1eleccionaria el rango correspondiente a $2>52;.
+ @uncin Poner_2neas_Seleccin4
+ *sta funcin sir#e para poner bordes a un rango4 Pone cuadro al rango$ separa las columnas con
+ una lnia % pone doble lnea inferior en la + primera fila4
+
+ParDmetros)
+ Num_(oja C N&mero de oja donde estD el rango a formatear4
+ ,asilla C ,asilla inicial -superior i!1uierda0 del rango a formatear
Su. -onerC%ineasC1eleccion*BumeroC9oja A& ,nteger, "asilla A& String,
1im x A& ,nteger
1im"asillaC@nicial A& String
1im "asillaC:@nal A& String
/or0seets*BumeroC9oja,.$ctivate
$ctive1eet.Range*"asilla,.$ctivate
+ Seleccionar el rango de celdas con #alores ad%acentes a la acti#a
$ctive"ell."urrentRegion.1elect
+ Borrar los bordes actuales de la seleccin actuales
With 1election
.5orders*xl.iagonal.oUn,.%ine1tyle & xlBone
.5orders*xl.iagonalUp,.%ine1tyle & xlBone
.5orders*xlEdge%eft,.%ine1tyle & xlBone
.5orders*xlEdge3op,.%ine1tyle & xlBone
.5orders*xlEdge5ottom,.%ine1tyle & xlBone
.5orders*xlEdgeRigt,.%ine1tyle & xlBone
.5orders*xl@nside4ertical,.%ine1tyle & xlBone
.5orders*xl@nside9orizontal,.%ine1tyle & xlBone
En( With
+ 2ineas del recuadro
With 1election.5orders*xlEdge%eft,
.%ine1tyle & xl"ontinuous
./eigt & xlOedium
."olor@ndex & xl$utomatic
En( With
http%--....cybercursos.net
Pgina 9/
With 1election.5orders*xlEdge3op,
.%ine1tyle & xl"ontinuous
./eigt & xlOedium
."olor@ndex & xl$utomatic
En( With
With 1election.5orders*xlEdge5ottom,
.%ine1tyle & xl"ontinuous
./eigt & xlOedium
."olor@ndex & xl$utomatic
En( With
With 1election.5orders*xlEdgeRigt,
.%ine1tyle & xl"ontinuous
./eigt & xlOedium
."olor@ndex & xl$utomatic
En( With
+ 2inieas #erticales interiores$ si en el
+ rango a% mDs de una columna4
,7 1election."olumns."ount M 2 0hen
With 1election.5orders*xl@nside4ertical,
.%ine1tyle & xl"ontinuous
./eigt & xl3in
."olor@ndex & xl$utomatic
En( With
En( ,7
+ "justar anco de columnas
1election."olumns.$uto:it
+ 2nea doble inferior de primera fila
+ P"ra este proceso se selecciona la casilla inicial pasada a la macro$ luego se busca
+ la &ltima casilla con datos4 Se constru%e un rango combinando las direcciones de ambas
+ casillas % se utili!a el objeto Range junto con el m;todo Select para acer la seleccin
+
+ R"NG*-3nicial)@inal04Select
+ Seleccionar primera casilla
$ctive1eet.Range*"asilla,.1elect
+ Buscar primera casilla #acia de misma fila recorriendo las columnas
x & ;
1o While Not @sEmpty*$ctive"ell.+ffset*;, x,,
x & x K 2
Loo#
+ Recoger las direcciones de la casilla inicial ? la casilla final$ es decir las referencias
+ @ila,olumna -".$ "9$44440
"asillaC@nicial & $ctive"ell.$ddress
"asillaC:@nal & $ctive"ell.+ffset*;, x E 2,.$ddress
http%--....cybercursos.net
Pgina 92
+ Seleccionar el rango de la fila4 :bser#ar la concatenacin de las cadenas de
+ ,asilla_3nicial % casilla_final 1ue representan las direcciones del rango a seleccionar
$ctive1eet.Range*"asillaC@nicial D 8>8 D "asillaC:@nal,.1elect
+ Poner doble lnea
With 1election.5orders*xlEdge5ottom,
.%ine1tyle & xl.ouble
./eigt & xl3ic0
."olor@ndex & xl$utomatic
En( With
$ctive1eet.Range*"asilla,.$ctivate
En( Su.
5ueno, este segundo ejemplo, un poco m!s sofisticado es slo para que vea asta que punto se puede
refinar una macro. -rimero construimos una macro con la grabadora que ponia formato a un rango de
casillas que siempre era el mismo, despus modificamos esta macro de manera que el rango de casillas
que pudiera formatear fuera cualquiera, como tercer paso, adem!s de conseguir lo mismo que la segunda
versin pero con menos par!metros le emos aLadido nuevas funcionalidades como ajustar el anco de
las celdas, borrar los formatos previos, etc. 7 esta macro todavia podr#a refinarse m!s, poner color de
fondo a la primera fila, poner color a los datos numricos, etc. %o que intentamos decirle es que
aprovece al m!ximo la utilidad de la grabadora de macros, tenga pero en cuenta que casi siempre tendr!
que aLadir cdigo usted mismo si quiera ampliar la funcionalidad de la macro, sobre todo si quiere
aplicarle cierta generalidad.
http%--....cybercursos.net
Pgina 93
4ea el siguiente ejemplo, sirve para representar gr!ficamente un rango de valores. %a macro se a eco
de forma similar a la anterior, es decir, una vez activada la grabadora de macros se an seguido todos los
pasos necesarios para diseLar el gr!fico, luego se an cambiado las referencias a ojas y rangos por
variables que se colocan como par!metros del procedimiento para as# dotarle de generalidad.
+ Procedimiento Grafico4
+ Procedimiento 1ue representa grDficamente los #alores de un rango4
+ ParDmetros)
+ (oja_Eatos ) (oja donde estD el rango de #alores4
+ Rango_Eatos ) Rango de #alores a representar grDficamente4
+ Titulo ) Titulo para el grDfico4
+ *je_< ) Ttulo para el eje <
+ *je_? ) Ttulo para el eje ?
Su. <rafico*9ojaC.atos A& String, RangoC.atos A& String,3itulo A& String, EjeCA A& String, EjeC7
A& String,
+ "Padir el grDfico
"arts.$dd
+ Tipo de grDficoNO 'l,olumn,lustered -,olumnas agrupadas0
$ctive"art."art3ype & xl"olumn"lustered
+ Eefinir el origen de datos % representar las series-PlotB%0 por filas -'lRoQs0
$ctive"art.1et1ource.ata 1ource>&1eets*9ojaC.atos,.Range*RangoC.atos,, -lot5y>& C
xlRoUs
+ *l grDfico debe ponerse en una oja nue#a
$ctive"art.%ocation /ere>&xl%ocation$sBeU1eet
With $ctive"art
+ Tiene ttulo
.9as3itle & 3rue
+ Poner ttulo
."art3itle."aracters.3ext & 84entas de :rutas8
+ Tiene ttulo para el eje <
.$xes*xl"ategory, xl-rimary,.9as3itle & 3rue
+ Ttulo para el eje <
.$xes*xl"ategory, xl-rimary,.$xis3itle."aracters.3ext & 8Oeses8
+ Tiene ttulo para el eje ? principal
.$xes*xl4alue, xl-rimary,.9as3itle & 3rue
+ Ttulo para el eje ? principal
.$xes*xl4alue, xl-rimary,.$xis3itle."aracters.3ext & 8"antidades8
En( With
+ Poner lneas de di#isin para el eje de categorias < -ori!ontales0
With $ctive"art.$xes*xl"ategory,
+ Poner 2ineas de di#isin primarias
.9asOajor<ridlines & 3rue
+ No poner lineas de di#isin secundarias
.9asOinor<ridlines & :alse
En( With
http%--....cybercursos.net
Pgina 98
+ Poner lneas de di#isin para el eje ? -#erticales0
With $ctive"art.$xes*xl4alue,
.9asOajor<ridlines & 3rue
.9asOinor<ridlines & :alse
En( With
+ Tiene le%enda
$ctive"art.9as%egend & 3rue
+ Seleccionar le%enda
$ctive"art.%egend.1elect
+ Situar la le%enda en la parte inferior
1election.-osition & xl5ottom
$ctive"art.$pply.ata%abels 3ype>&xl.ata%abels1oUBone, %egendRey>&:alse
End 1ub
-ara finalizar, seguro que cuando utilice la grabadora apareceran mucas propiedades y mtodos que
desconoce, slo debe acer clic sobre estas propiedades o mtodos y pulsar :2, autom!ticamente se
activar! la ayuda sobre esa propiedad o mtodo concreto.
,n&ertar 7uncione& (e Micro&o7t Excel (e&(e Vi&ual 'a&ic)
"opie el siguiente procedimiento y ejec6telo. Es un procedimiento que sencillamente va pidiendo
n6meros y los va colocando en las celdas de la columna $ partir de $2, al final coloca la funcin
&1UO$ para sumar los valores introducidos y la funcin &-R+OE.@+ para acer el promedio de los
mismos valores.
Su. 1umar*,
1im 4alor A& ,nteger
1im "asillaC@nicial A& String
1im "asillaC:inal A& String
+ (acer acti#a la casilla ". de la oja acti#a
$ctive1eet.Range*8$28,.$ctivate
1o
+ *ntrar un #alor % con#ertirlo a num;rico
4alor & 4al*@nput5ox*8Entrar un valor8, 8Entrada8,,
+ Si el #alor es distinto de 5
,7 4alor QM ; 0hen
+ Guardar el #alor en la casilla acti#a
$ctive"ell.4alue & 4alor
+ (acer acti#a la casilla de la fila siguiente
$ctive"ell.+ffset*2, ;,.$ctivate
En( ,7
Loo#@ntil 4alor & ;
http%--....cybercursos.net
Pgina 99
+ *stablecer la casilla inicial del rango a sumar
"asillaC@nicial & 8$28
+ *stablecer la casilla final del rango a sumar4
+ ,oger la direccin de la casilla acti#a$ la &ltima
"asillaC:inal & $ctive"ell.$ddress
$ctive"ell.+ffset*2, ;,.$ctivate
+ Poner en la casilla acti#a la funcin SHM"
$ctive"ell.:ormula & 8&1uma*8 D "asillaC@nicial D 8>8 D "asillaC:inal D 8,8
$ctive"ell.+ffset*2, ;,.$ctivate
+ Poner en la casilla acti#a la funcin promedio
$ctive"ell.:ormula & 8&-romedio*8 D "asillaC@nicial D 8>8 D "asillaC:inal D 8,8
En( Su.
Una vez aya ejecutado la macro, observe que en las celdas donde se an colocado respectivamente las
funciones &1UO$, &-R+OE.@+ aparece VB+O5REW *es posible que aparezca XXXX, en es caso ampl#e
la columna,, esto significa que Excel no reconoce el nombre de la funcin, que no existe. 1in embargo,
estas funciones si existen y funcionan perfectamente cuando se teclean directamente sobre la oja de
c!lculo, se preguntar! el porqu cuando se colocan desde una macro no funcionan. -ues resulta que para
que cualquier funcin de Excel insertada desde una macro B+ de error debe ponerse con su nombre en
@ngls, la traduccin se ace luego de forma autom!tica. Es decir en la macro debe ponerla en ingls y
luego cuando esta se inserte en la oja aparecer! con su nomenclatura en el idioma que corresponda.
Oodifique el procedimiento del ejemplo y en lugar de poner
$ctive"ell.:ormula & 8&1uma*8 D "asillaC@nicial D 8>8 D "asillaC:inal D 8,8
-onga
$ctive"ell.:ormula & 8&1um*8 D "asillaC@nicial D 8>8 D "asillaC:inal D 8,8
7 aora, en lugar de
$ctive"ell.:ormula & 8&-romedio*8 D "asillaC@nicial D 8>8 D "asillaC:inal D 8,8
-onga
$ctive"ell.:ormula & 8&$verage*8 D "asillaC@nicial D 8>8 D "asillaC:inal D 8,8
Ejecute la macro y compruebe que aora todo funciona correctamente. +bserve que en la oja, las
funciones se an insertado con su nombre correcto seg6n el idioma, es decir 1UO$ y -R+OE.@+.
http%--....cybercursos.net
Pgina 9:
$ continuacin le explicaremos como puede averiguar el nombre de cualquier funcin en ingls.
Utilizaremos la grabadora de macros. "omo ejemplo obtendremos el nombre de las funcin
&-R+OE.@+. .eber! seguir los mismos pasos para obtener el nombre de cualquier funcin.
2. $ctive la grabadora de macros.
'. 4aya a una casilla cualquiera, "2 por ejemplo y teclee la funcin tal como lo ar#a en su idioma. -or
ejemplo, ponga &-R+OE.@+*$2>$2;, o elnombre de cualquier otra funcin Excel.
(. .etenga la ejecucin de la macro.
H. Edite la macro y observe el nombre que se a puesto, ya slo debe apunt!rselo y pasarlo a su
procedimiento. Es posible que la funcin que vea tenga una nomenclatura que le suene rara y es que
la grabadora de macros utiliza referencias tipo R" *roU column,
http%--....cybercursos.net
Pgina 9;
1etecci-n (e Errore& $ 1e#uraci-n (e #rograma&)
$ medida que los programas van creciendo la probabilidad de cometer errores tambin va creciendo. %os
errores se clasifican normalmente en tres categor#as.
Errore& en tiem#o (e com#ilaci-n) 1on los t#picos errores que impiden acer funcionar el programa
debido, por ejemplo, a errores de sintaxis en las instrucciones, llamadas a funciones que no existen o
llamadas con el tipo o el n6mero de par!metros incorrectos, etc. Este tipo de errores no dan demasiados
problemas, primero porque el compilador avisa de donde se an producido y luego porque simplemente
revisando la sintaxis se solucionan r!pidamente.
Errore& en tiem#o (e e%ecuci-n. Estos errores se producen por una mala programacin del cdigo al no
aber previsto determinados casos concretos o especiales, como por ejemplo intentar abrir un arcivo que
no existe, imprimir sin comprobar que la impresora est! conectada, definir mal la dimensin de un array e
intentar acceder a miembros que no existen, etc. "uando se produce este tipo de errores se detiene la
ejecucin del programa y normalmente se informa del tipo de error que se a producido. Oucos de estos
errores se pueden solucionar mediante rutinas o funciones de tratamiento de errores, estudiaremos este
tipo de rutinas un poco m!s adelante.
Errore& (e 7unci-n. 1on los m!s complicados de detectar ya que ni se detectan en la fase de ejecucin, ni
provocan la detencin del programa, son debidos a la incorrecta programacin de alg6n proceso y como
resultado se obtienen datos errneos. Errores de este tipo son c!lculos mal ecos, bucles infinitos,
devolucin de valores incorrectos, etc. "omo ni los detecta el compilador, ni provocan la interrupcin del
programa deben revisarse a mano, y claro, si el programa es extenso y trata mucos datos, su deteccin
puede resultar dificultosa. 4isual 5asic, y todos los entornos de programacin incorporan erramientas
para facilitar la deteccin de este tipo de errores, son las erramientas de depuracin. $ntes de comenzar
a describir como funcionan estas erramientas, le recomendamos, una vez m!s, que modularice su
programa utilizando procedimientos cortos que realicen trabajos concretos y precisos, de esta forma
conseguir!, adem!s de que el programa quede m!s elegante y en un futuro sea m!s sencillo modificarlo,
evitar el tener que revisar grandes bloques de cdigo para detectar errores de este tipo.
*erramienta& (e (e#uraci-n)
"omo se acaba de indicar, estas erramientas son muy 6tiles a la ora de testear paso a paso el
funcionamiento del programa y detectar los procesos que provocan un mal funcionamiento del mismo.
"opie los datos siguientes en la primera oja de un libro de trabajo, estos datos ser!n utilizados por las
funciones que utilizaremos para explicar el funcionamiento de las erramientas de depuracin.
+ B ! 1 E F G
2 Enero Febrero .ar'o +bril .a0o 3unio
4 2 3406 3336 3135 2402 4345 4891
5 4 2754 2807 3945 4780 3352 3946
6 5 3646 3704 3140 3236 2640 2052
7 6 2546 4275 4370 3193 2710 2670
8 7 3805 3533 4409 3227 3458 4917
9 8 2709 4509 3153 4894 4801 3454
: 9 2248 4293 3171 3834 3596 3258
; : 2906 4530 3336 4770 2212 4141
2< ; 3827 3538 3748 4800 3869 4896
22 2< 3897 4052 4189 3132 4016 3593
24
http%--....cybercursos.net
Pgina 94
"opie el cdigo siguiente, es el que utilizaremos para estudiar y ver ejemplos sobre las erramientas de
depuracin. %a primera *Sub Prueba, recorre los datos de las columnas asta encontrar una vac#a, esta
funcin va llamando a Recorrer_,olumna, sirve para recorrer las filas de una columna asta encontrar
una vac#a, va sumando los valores que encuentra en las filas y va contando cuantas ay de llenas, al final
llama a la funcin ,Dlculos, esta funcin coloca en respectivas casilla, la suma de los valores de la
columna, la cantidad de celdas llenas que a encontrado, y la media. Una vez aya copiado las funciones
ejec6telas para comprobar su correcto funcionamiento antes de proceder al estudio de las erramientas de
depuracin.
Su. -rueba*,
/or0seets*2,.Range*85'8,.$ctivate
T Recorrer las casillas de una fila asta que se encuentre una vac#a
1o While Not @sEmpty*$ctive"ell,
"all RecorrerC"olumna
$ctive"ell.+ffset*;, 2,.$ctivate
Loo#
En( Su.
Pri"ate 1ub RecorrerC"olumna*,
1im 1umaC"olumna A& Long +Suma de los #alores de la columna
1im OayorCSueC"ero A& ,nteger + ,ontar casillas con #alores ma%ores 1ue cero
1im .espC:ila A& ,nteger + 3ncremento de @ila
1umaC"olumna & ;
OayorCSueC"ero & ;
.espC:ila & ;
+ Recorrer las filas de una columna asta 1ue se encuentre una #aca
1o While Not @sEmpty*$ctive"ell.+ffset*.espC:ila, ;,,
,7 $ctive"ell.+ffset*.espC:ila, ;,.4alue M ; 0hen
1umaC"olumna & 1umaC"olumna K $ctive"ell.+ffset*.espC:ila, o,.4alue
OayorCSueC"ero & OayorCSueC"ero K 2
En( ,7
.espC:ila & .espC:ila K 2
Loo#
Call "alcular*1umaC"olumna, OayorCSueC"ero, .espC:ila,
En( Su.
Pri"ate Su. "alcular*1uma $s %ong, S $s @nteger, : $s @nteger,
$ctive"ell.+ffset*: K ', ;,.4alue & 1uma
$ctive"ell.+ffset*: K (, ;,.4alue & S
$ctive"ell.+ffset*: K H, ;,.4alue & 1uma I S
En( Su.
http%--....cybercursos.net
Pgina :5
$ctive la barra de depuracin para ver los botones que se utilizar!n en las secciones que se explican a
continuacin *Ver+ 'arra& (e *erramienta&+ 1e#uraci-n,.
.odo Eecucin paso a paso por instrucciones.
El modo paso a paso permite la ejecucin del programa instruccin por instruccin, de esta forma es
posible ver que el funcionamiento del programa es el correcto, es decir que la ejecucin de instrucciones
sigue los pasos que se ab#an previsto. -ara ejecutar un procedimiento paso a paso, slo debe ir pulsando
sobre el botn , activar la opcin de men6 1e#uraci-n +Pa&o a Pa&o #or ,n&truccione& o ir
pulsando la tecla !;, que seguramente es lo m!s cmodo.
E%em#lo)
2. 1it6e el cursor dentro del procedimiento -rueba.
'. 4aya pulsando la tecla !; y ver! como se ejecuta ejecuta una sola instruccin por cada pulsacin.
-uede ir alternando con la oja de c!lculo para ver que es lo que ocurre cada vez que se ejecuta una
instruccin.
"uando est ejecutando paso a paso puede utilizar los botones siguientes para llevar a cabo determinadas
acciones.
1irve para detener la ejecucin del programa.
1irve para ejecutar el resto del programa.
1irve para ejecutar todo un procedimiento. "uando en la ejecucin de un procedimiento, se llega a
una l#nea que llama a otro procedimiento o funcin, pulsando este botn se puede provocar la ejecucin
de todo el cdigo de esta funcin para luego continuar con el modo paso a paso.
E%em#lo)
2. 1it6e el cursor dentro del procedimiento Prueba.
'. 4aya ejecutando paso a paso asta la l#nea
,all Recorrer_,olumna
(. En este punto pulse el botn , observe como se ejecuta toda el procedimiento
Recorrer_,olumna para luego continuar con la ejecucin normal de -aso a -aso. -ara activar esta
opcin, tambin puede activar la opcin 1e#uraci-n+ Pa&o a #a&o #or #roce(imiento&, o bien
pulsar la combinacin MADI!;.
1irve para ejecutar todas las instrucciones del procedimiento activo y volver *o terminar,.
E%em#lo)
2. 1it6e el cursor dentro del procedimiento Prueba.
'. 4aya ejecutado paso a paso asta la instruccin
Ma%or_Iue_,ero C Ma%or_Iue_,ero R .
7a dentro del procedimiento Recorrer_,olumna.
http%--....cybercursos.net
Pgina :1
(. -ulse sobre el botn ver! como se termina la ejecucin de este procedimiento y se vuelve al
procedimiento -rueba para continuar con la ejecucin paso a paso. -ara activar esta opcin, tambin
puede la opcin .epuracinI -aso a paso para salir, o bien pulsar la combinacin "+B3R+%K
O$7K :=.
El $odo Interrupcin.
En programas largos resulta fastidioso tener que ejecutarlos paso a paso, sobretodo si sabemos que el
error se produce en una parte avanzada del programa. El modo interrupcin, permite la ejecucin del
programa asta una instruccin determinada para, a partir de esta, ejecutar paso a paso y as# poder
detectar el error.
1e7inir #unto& (e interru#ci-n)
2. 1it6e el cursor sobre la instruccin en la cual debe detenerse el programa para continuar paso a paso.
'. -ulse sobre el botn . 3ambin puede activar la opcin 1e#uraci-n+ Alternar #unto (e
interru#ci-n, pulsar la tecla :J o bien acer un clic en la parte izquierda de la ventana del mdulo
*la franja vertical en color gris,.
Para desacti#ar un punto de interrupcin siga los mismos pasos4
Solucionar los errores.
3odo lo dico anteriormente no servir#a de gran cosa si no fuera posible revisar los valores que las
variables van cogiendo a medida que vamos avanzando o si no tuviramos ocasin de evaluar las
expresiones del programa. En las siguientes secciones veremos como llevar a cabo estas acciones.
Inspecciones r-pidas de (ariables.
Estas opciones sirven para revisar el valor de las variables a medida que se va ejecutando el programa.
-ara ver los valores que van tomando las variables es conveniente tener visible la Ventana (e
in&#ecci-n, para activarla Ver+ Ventana (e ,n&#ecci-n o pulse sobre el botn .
A6a(ir una "aria.le a la "entana (e in&#ecci-n)
$unque no es necesario estar ejecutando el programa en modo paso a pas o, es conveniente.
2. 1eleccione la variable que desee aLadir a la ventana aciendo un clic sobre ella.
'. -ulse sobre el botn , tambin puede activar 1e#uraci-n+ ,n&#ecci-n r#i(a o pulsar la
combinacin MaDI!4. $parece un cuadro de di!logo donde se muestra el valor actual de la
variable. 1i no est! ejecutando el programa paso a paso, aparecer! el valor !uera (e Contexto.
(. -ulse sobre el botn Agregar para aLadir la variable a la ventana de inspeccin.
.ebe tener en cuenta que para revisar las variables las expresiones que les asignan valores deben de
ejecutarse al menos una vez.
http%--....cybercursos.net
Pgina :/
E%em#lo)
2. 1it6e un punto de interrupcin en la l#nea.
Ma%or_Iue_,ero C Ma%or_Iue_,ero R .
'. Ejecute el programa, cuando este se detenga en el punto de interrupcin, sit6e el cursor sobre la
variable Suma_,olumna *puede ponerlo en cualquier parte,.
(. -ulse sobre el botn .
H. -ulse sobre el botn Agregar para que la variable se inserte en la ventana @nspecciones.
Repita los pasos anteriores para las variables Ma%or_Iue_,ero y Eesp_@ila
). 4aya ejecutando el programa paso a paso y observe como va cambiando el valor de las variables en
la ventana de inspeccin.
Recuerde que puede agregar una variable a la ventana de inspeccin aunque no est ejecutando el
programa.
AA Suponemos 1ue %a se abrD dado cuenta 1ue cuando ejecuta el programa paso a paso$ si
sit&a el puntero de ratn sobre una #ariable$ se muestra el #alor de la misma4
'orrar una "aria.le (e la "entana (e ,n&#ecci-n)
1lo debe seleccionarla en la ventana de inspeccin y pulsar sobre la tecla S@PR.
Mo(i7icar el "alor (e una "aria.le en tiem#o (e e%ecuci-n)
$ veces resulta interesante cambiar el valor de alguna variable cuando se est! ejecutando el programa,
para ver que ocurre si coge determinados valores, para terminar un bucle, etc.
E%em#lo)
2. 1it6e un punto de interrupcin en la l#nea.
Ma%or_Iue_,ero C Ma%or_Iue_,ero R .
'. $gregue a la ventana de inspeccin *si no est!, la variable Suma_,olumna.
(. Ejecute el programa, al detenerse, observe en la Ventana (e ,n&#ecci-n que la variable
Suma_,olumna tiene un valor que aora cambiaremos.
H. 9aga doble clic sobre el valor de Suma_,olumna dentro de la ventana de inspeccin.
). 5orre el valor que tiene, c!mbielo por otro y pulse EN0ER.
G. $ora puede continuar con la ejecucin normal del programa.
Expresiones de Re(isin.
$dem!s de permitir aLadir una variable o expresin dentro de la Ventana ,nme(iato, una Ex#re&i-n (e
Re"i&i-n permite interrumpir la ejecucin del programa cuando una variable coge determinado valor.
-iense que mucas veces un programa deja de funcionar, o funciona mal cuando una variable coge
determinados valores. "on una expresin de revisin, podremos detener la ejecucin del programa
cuando una variable contiene determinado valor * a partie de determinado valor,, luego, podremos
continuar con la ejecucin paso a paso para ver que ocurre a partir de este punto.
http%--....cybercursos.net
Pgina :2
E%em#lo)
En el ejemplo que veremos a continuacin, aremos que el programa se interrumpa cuando la variable
Suma_,olumna alcance un valor superior a (;;;;.
2. 1it6e el cursor sobre el nombre de la variable Suma_,olumna$ puede escoger cualquier posicin
donde aparece la variable.
'. $ctive la opcin 1e#uraci-n+ Agregar ,n&#ecci-n. $parece el siguiente cuadro de di!logo,
Ex#re&i-n > 4ariable o expresin que se desea evaluar.
Proce(imiento> $qu# se describe el procedimiento donde debe evaluarse la variable, esto significa
que el !mbito de comprobacin de la variable es slo dentro de este procedimiento. @magine que
tiene dos o m!s procedimientos donde utiliza una variable con el mismo nombre, o bien que tiene
una variable global, aqu# se indica en que procedimiento debe acerse la evaluacin.
M-(ulo. %o mismo que en apartado procedimiento pero a nivel mdulo.
Ex#re&i-n (e in&#ecci-n. $ctivando esta opcin, indicamos que lo 6nico que deseamos acer es
incluir la variable o expresin dentro de la ventana de expresin.
Mo(o (e interru#ci-n cuan(o el "alor &ea "er(a(ero. @ndicamos que cuando la expresin
indicada en cuadro de texto Expresin> sea cierta, debe detenerse el programa.
Mo(o (e interru#ci-n cuan(o el "alor cam.ie. El programa se detendr! cuando la expresin
cambie de valor.
-ara nuestro ejemplo rellene con los datos siguientes.
Ex#re&i-n > 1umaC"olumna M (;;;;
Proce(imientoH RecorrerC"olumna
M-(ulo> Odulo2 *o como se llame su mdulo,.
$ctive Mo(o (e interru#ci-n cuan(o el "alor &ea "er(a(ero.
(. -ulse sobre botn Ace#tar.
Ejecute el programa. +bserve que el programa se interrumpe cuando SumaC,olumna coge un valor
superior a (;;;;, a partir de este podr#amos continuar con la ejecucin paso a paso y ver como
evoluciona el valor de la variable o variables.
http%--....cybercursos.net
Pgina :3
La Ventana In$ediato.
Es otra forma de inspeccionar variables cuando el programa est! en modo interrupcin *ejecut!ndose paso
a paso,, pero adem!s, ofrece la posibilidad de cambiar valores de las variables e incluso ejecutar o evaluar
expresiones. -ara ver el valor de una variable en la ventana inmediato debe anteponerle un W y luego
pulsar Enter.
-ara activar la ventana @nmediato, active opcin Ver+,nme(iato, o pulse la combinacin CON0ROLIF.
E%em#lo.
En el siguiente ejemplo, utilizaremos la ventana @nmediato para ver el valor de las variables
Suma_,olumna, Ma%or_Iue_,ero y Eesp_@ila. 3ambin cambiaremos el valor de una de ellas y
comprobaremos una expresin.
1) $ctive la ventana de @nmediato. Ver+ Ventana ,nme(iato)
'. 1it6e un punto de interrupcin en la instruccin
,all ,alcular-Suma_,olumna$ Ma%or_Iue_,ero$ Eesp_@ila0
(. Ejecute el programa, este debe detenerse cuando llegue a la instruccin indicada en paso '.
H. Entre en la ventana inmediato, aga las pruebas siguientes.
Escriba
S Suma_,olumna
S Ma%or_Iue_,ero
S Eesp_@ila
-ruebe la expresin siguiente. En este caso concreto solo sirve para ver que es una posibilidad.
< C Suma_,olumna T Ma%or_Iue_,ero
S <
-ara terminar, cambiaremos el valor de la variable Suma_,olumna y continuaremos la ejecucin
normal del programa.
Suma_,olumna C N9/75555
). Suite el punto de interrupcin y termine la ejecucin del programa.
La instruccin 1ebug./rint.
Esta instruccin, que se utiliza directamente sobre el cdigo del programa, permite ver todos los valores
que a ido cogiendo una variable o expresin durante la ejecucin del programa. %os valores se mostrar!n
en la ventana @nmediato una vez finalizado el programa. Esta expresin resulta 6til en una fase avanzada
de depuracin ya que permite ir viendo la evolucin de una variable o expresin sin necesidad de poner
puntos de interrupcin. Evidentemente cuando el programa est listo deben de sacarse.
E%em#lo)
Oediante la instruccin 1e.ug)Print veremos la evolucin de la variable Suma_,olumna4
2. 1it6e el cursor despus de la instruccin
Suma_,olumna C Suma_,olumna R "cti#e,ell4:ffset-Eesp_@ila$ 504Value
Escriba> Eebug4Print 8Eentro del Bucle ) 8 U Suma_,olumna4
http%--....cybercursos.net
Pgina :8
'. 1it6e el cursor despus de la instruccin %oop y escriba
Eebug4Print 8 @uera del Bucle ) 8 U Suma_,olumna4
(. Ejecute el programa *sin puntos de interrupcin,.
Una vez terminada la ejecucin, observe lo que ay escrito en la ventana inmediato. $ veces, resulta
interesante controlar en que pasos la variable a ido cogiendo determinados valores, para acer esto
deber!n declararse las correspondientes variables que agan las funciones de contador.
E%em#lo)
9aremos lo mismo que en el ejemplo anterior pero indicando los pasos de bucle y las llamadas al
procedimiento Recorrer_,olumna.
E .eclare a nivel global al variable ,ontar_2lamadas de tipo @nteger.
E .eclare dentro del -rocedimiento Recorrer_,olumna la variable Pasos_Ee_Bucle de tipo
@nteger.
E @nicialice a 2 la variable ,ontar_2lamadas dentro de la funcin Prueba, !galo antes de la
instruccin Eo File.
E .ebajo de la instruccin "cti#e,ell4:ffset-5$ .04"cti#ate ponga
,ontar_2lamadas C ,ontar_2lamadasR.
E @nicialice a 2 la variable Pasos_Ee_Bucle dentro del procedimiento Recorrer_,olumna$ !galo
antes de la instruccin Eo File.
E .ebajo de la instruccin Eesp_@ila C Eesp_@ila R ., ponga
Pasos_Ee_Bucle C Pasos_Ee_BucleR.
E "ambie las expresiones .ebug.-rint por,
Eebug4Print 8Paso de Bucle) 8 U Paso_Ee_Bucle U 8 Suma_,olumna C 8 U
Suma_,olumna
Eebug4Print 8 2lamada ) 8 U ,ontar_2lamadas U 8 Suma_,olumna C 8 U
Suma_,olumna
E Ejecute el programa y observe la salida en la ventana @nmediato.
-or supuesto cuando el programa est terminado y comprobado deber! quitar todas las instrucciones
.ebug.-rint
7 con esto terminamos el tema de la depuracin. @nsistimos en la importancia de estas erramientas no
slo a la ora de localizar errores de programacin sino tambin a la ora de comprobar la evolucin del
programa cuando se dan determinadas condiciones. .jenos acabar el tema insistiendo de nuevo en la
importancia que modularice sus programas, observe que si lo ace, tambin le resultar! muco m!s
sencillo detectar errores de programacin.
http%--....cybercursos.net
Pgina :9
Errore& (e E%ecuci-n)
Es imposible excluir del todo los errores en los programas. 1i adem!s, y como es de desear, el programa
ser! utilizado por usuarios que no an tenido nada que ver en el proceso de desarrollo e implementacin
posiblemente *seguramente, se producir!n errores debido a su incorrecta utilizacin. Estos errores son los
que se deben prevenir. Errores de este tipo son, por ejemplo, intentar acceder a un arcivo inexistente,
entrar valor es incorrectos a travs de un cuadro de di!logo o formulario *datos tipo 1tring cuando se
requieren n6meros,...,. 3ambin entrar#an en este tipo de errores aquellos casos excepcionales pero que
deben ser previstos por el programador, como por ejemplo que se llene la unidad de disco, que la
impresora se quede sin papel *este ya no es tan excepcional,, etc.
4isual 5asic y la mayor#a de lenguajes de programacin permiten implementar rutinas de tratamiento de
errores cuya finalidad es interceptar determinados tipo de errores que se producen en tiempo de ejecucin.
%a finalidad de estas rutinas es que el programa no se detenga, o al menos si se detiene, informar sobre la
posible causa del error e intentar controlarlo de alguna forma. Estudiaremos a continuacin como se
realiza esto en visual basic.
"opie el mdulo siguiente, ser! el que utilizaremos en los ejemplos. Es un simple procedimiento que pide
dos valores al usuario, los suma y los guarda en la celda $2 de 9oja'.
O#tion Ex#licit
Su. -rueba*,
1im n2 A& ,nteger
1im n' A& ,nteger
1im total A& ,nteger
n2 & @nput5ox*8Entrar un valor8, 8Entrada8,
n' & @nput5ox*8Entrar otro valor 8, 8Entrada8,
total & n2 K n'
/or0seets*89oja'8,.Range*8$28,.4alue & total
En( Su.
http%--....cybercursos.net
Pgina ::
Rutinas de trata$iento de errores.
<eneralmente una rutina de tratamiento de errores reacciona ante casos esperados por el programador. En
el ejemplo que nos ocupa, podr#a ser que el usuario entrara caracteres en lugar de n6meros por lo que el
programa generar#a el error siguiente.
Oediante una rutina de tratamiento de errores informaremos del error que se a producido y
direccionaremos la ejecucin del programa acia donde interese. En visual basic el tratamiento de errores
es una parte normal de la ejecucin del programa. %a instruccin para el tratamiento de errores es ON
ERROR FO0O 1neaJ l#nea es una etiqueta o marca de l#nea que indica acia donde debe dirigirse el
programa en caso de error. El formato general de un procedimiento o funcin donde se implementa una
rutina de tratamiento de errores es la siguiente.
Su. prueba*,
On Error FO0O 3ratarCerrores
+ 3nstrucciones del procedimiento
Exit Su.+ Salir del procedimiento
3ratarCErrores>
+ 3nstrucciones de tratamiento de error
En( Su.)
"on On Error FO0O /ratar$,rrores, indicamos al programa que en caso que se produzca un error en
tiempo de ejecucin vaya a ejecutar las l#neas que siguen a la etiqueta o marca de l#nea Tratar_*rrores.
+bserve que antes de la etiqueta Tratar_*rrores ay la instruccin Exit Su., sirve para que si el
procedimiento se a desarrollado correctamente, salga en ese punto, tenga en cuenta que si no se pusiera
esta l#nea la ejecucin continuar#a secuencialmente y se ejecutar#an las l#neas de la rutina Tratar_*rrores.
1i la rutina de tratamiento de errores se implementa en una funcin debe poner Exit !unction en lugar de
Exit Su..
http%--....cybercursos.net
Pgina :;
Escribir cdigo de trata$iento de errores.
En este primer ejemplo aremos algo muy simple, mostrar informacin sobre el tipo de error que se a
producido y detener la ejecucin del programa. 4ale, esto es lo que ace ya 4isual 5asic sin necesidad de
implementar nada, pero nos servir! para introducir el objeto Err.
, objeto ,rr.
1iempre que se produce un error en tiempo de ejecucin 4isual 5asic genera *o disp ara como dicen
algunos autores, un objeto tipo Err, estudiaremos dos propiedades de este objeto Num.er y 1e&cri#tion.
Num.er es un n6mero indicativo sobre el tipo de error que se a producido, dico de otra forma, cuando
visual basic dispara un objeto Err en tiempo de ejecucin, podemos revisar su propiedad Num.er para
saber que es lo que a causado el error. 1e&cri#tion es el mensaje asociado al n6mero de error y es una
cadena de texto que describe brevemente el error. $ora en nuestro ejemplo, implementaremos una rutina
de error que muestre el n6mero de error y su descripcin, insistimos que es lo que ace visual basic por si
slo, pero luego veremos como gracias al n6mero de error podremos determinar la causa del error y
controlar la ejecucin del programa como m!s convenga. El procedimiento quedar#a de la siguiente
manera.
Su. -rueba*,
On Error Fo0o 3ratarCErrores
1im n2 A& ,nteger
1im n' A& ,nteger
1im total A& ,nteger
n2 & @nput5ox*8Entrar un valor8, 8Entrada8,
n' & @nput5ox*8Entrar otro valor 8, 8Entrada8,
total & n2 K n'
/or0seets*89oja'8,.Range*8$28,.4alue & total
Exit Su.
0ratarBErrore&H
Osg5ox *8B6mero de Error > 8 D Err.Bumber D "r*2(, D 8.escripcin > 8 D Err..escription,
En( Su.
Ejecute el procedimiento anterior y cuando se le pida el primer n6mero entre el 3exto 89ola8. +bserve
que como se a producido un error, el programa salta acia la rutina de tratamiento de errores y muestra
el n6mero de error y su descripcin asociada.
Continuar el #rograma (e&#u<& (e la e%ecuci-n (e la rutina (e tratamiento (e errore&)
En la mayor#a de los casos, las rutinas de tratamiento de errores son para que el programa no se detenga.
El proceso abitual cuando se produce el error es tratar de corregirlo y continuar la ej ecucin del
programa. %a continuacin del programa se consigue mediante la instruccin Re&ume. Esta instruccin
da tres posibilidades, Ejecutar otra vez la instruccin que a causado el error, continuar por la instruccin
siguiente a la que a causado el error o dirigir la ejecucin acia una l#nea marcada con una etiqueta.
http%--....cybercursos.net
Pgina :4
Re&ume. Ejecutar de nuevo la instruccin que a causado el error.
Esto, en nuestro caso, ser#a volver a preguntar de nuevo el valor. %a rutina de tratamiento de
errores quedar#a.
0ratarBErrore&H
Osg5ox *8B6mero de Error > 8 D Err.Bumber D "r*2(, D 8.escripcin > 8 D
Err..escription,
Re&ume
-odr#amos cambiar el mensaje que ve el usuario para acerlo m!s compresivo. %a rutina
quedar#a.
0ratarBErrore&H
Osg5ox *8.ebe entrar un valor numrico8,
Re&ume
Re&ume Next) "ontinuar el programa por la instruccin siguiente a la que a causado el error.
0ratarBErrore&H
Osg5ox *8.ebe entrar un valor numrico8,
Re&ume Next
En este caso el programa informar#a de la causa del error pero continuar#a la ejecucin por la
l#nea siguiente a la que a causado el error. Bo es una buena solucin para este caso pero los ay
en los que es la mejor.
Re&ume E0,K@E0A. "ontinuar por la instruccin que sigue a la *T3IH*T".
9aremos que el programa vuelva al principio cuando se produzca un error. -ara ello debemos poner una
etiqueta o marca de l#nea mediante la cual indicaremos en que punto debe continuar la ejecucin del
programa. +bserve que emos puesto la etiqueta @nicio> al principio del procedimiento. Evidentemente no
siempre tiene que empezar desde el principio, puede dirigirse la ejecucin acia donde m!s convenga.
Su. -rueba*,
On Error Fo0o 3ratarCErrores
1im n2 A& ,nteger
1im n' A& ,nteger
1im total A& ,nteger
,nicioH +"1u #uel#e el programa si se produce un error
n2 & @nput5ox*8Entrar un valor8, 8Entrada8,
n' & @nput5ox*8Entrar otro valor 8, 8Entrada8,
total & n2 K n'
/or0seets*89oja'8,.Range*8$28,.4alue & total
Exit Su.
http%--....cybercursos.net
Pgina ;5
3ratarCErrores>
Osg5ox *8.ebe entrar un valor numrico8,
Re&ume @nicio
En( Su.
%legados a este punto ya sabemos como controlar errores simples y como redirigir la ejecucin del
programa. $ora, pruebe lo siguiente, ejecute el programa y cuando se le pida el primer valor, ponga
);;;;.
Efectivamente, se produce un error, );;;; no es un valor v!lido para datos tipo @nteger, recuerde que el
rango para los datos tipo @nteger es de E('FG= a ('FGF. +bserve que la rutina continua tratando el error y
pidiendo de nuevo los datos, pero el mensaje que ver! el usuario continuar! siendo 8Eebe entrar un #alor
num;rico 8, cosa que seguramente le dejar! perplejo. "on esto emos pretendido que vea que puede aber
m!s de una causa que provoque error, consecuentemente las rutinas de tratamiento de errores deber!n
prevenir m!s de un error. En este nuevo caso el error lo produce un desbordamiento, cuyo n6mero de
error es el G. 1uponemos que aora ya se abr! dado cuenta de la importancia del n6mero de error ya que
este nos permitir! tratar dentro de la rutina diferentes casos de error con la instruccin Select Ca&e.
Nue&tro e%em#lo Eue(ar>a)
Su. -rueba*,
On Error Fo0o 3ratarCErrores
1im n2 A& ,nteger
1im n' A& ,nteger
1im total A& ,nteger
n2 & @nput5ox*8Entrar el primer valor8, 8Entrada8,
n' & @nput5ox*8Entrar el segundo valor 8, 8Entrada8,
total & n2 K n'
/or0seets*89oja'8,.Range*8$28,.4alue & total
Exit Su.
3ratarCErrores>
Select Ca&e Err.Bumber
Ca&e 2(>
Osg5ox *8.ebe introducir valores numricos8,
Ca&e G>
Osg5ox *8El valor es demasiado grande o demasiado pequeLo. 8 D C
8El n6mero 8debe estar comprendido entre E('FG= y ('FGF8,
En( Select
Re&ume
En( Su.
1e estar! preguntando si todav#a se pueden producir m!s errores. %a respuesta es que por supuesto que s# ,
por ejemplo, vay a al procedimiento y pruebe poner 9oja'' en lugar de 9oja' en ForGSeets-440.
Recomendamos que termine siempre la rutina de errores con un case else de la forma siguiente,
http%--....cybercursos.net
Pgina ;1
3ratarCErrores>
Select Ca&e Err.Bumber
Ca&e 2(>
Osg5ox *8.ebe introducir valores numricos8,
Ca&e G>
Osg5ox *8El valor es demasiado grande o demasiado pequeLo. 8 D C
El n6mero debe estar comprendido entre E('FG= y ('FGF8,
Ca&e El&e
Osg5ox *8Error no previsto. %lame al responsable facilitando la 8 D C
8informacin que sigue 8 D "r*2(, D 8B6mero de Error > 8 D C
Err.Bumber D "r*2(, D 8.escripcin > 8 D Err..escription,
Exit Su. + : lo 1ue sea
En( Select
Re&ume + : lo 1ue sea
Es decir, si se produce cualquier otro error no previsto, se informa al usuario que avise a quien proceda
informando del n6mero de error y su descripcin.
...Bo se vayan todav#a, a6n ay m!s. %a cosa se complica cuando en un programa se definen m6ltiples
procedimientos y funciones, cada una de ellas puede tratar sus propios errores, pero VSu pasa si el error
se provoca debido a los valores que pasa la funcin que llama W o V"mo continuar la ejecucin fuera del
procedimientoW, es decir en el procedimiento que llama al que a provocado el error. "opie los
procedimientos siguientes mediante los cuales estudiaremos diferentes casos.
Su. -rueba*,
On Error Fo0o 3ratarCErrores
1im n2 A& ,nteger
1im n' A& ,nteger
1im 3otal A& ,nteger
n2 & @nput5ox*8Entrar el primer valor8, 8Entrada8,
n' & @nput5ox*8Entrar el segundo valor 8, 8Entrada8,
Call -onerC"alculo*n2, n', ',
Exit Su.
3ratarCErrores>
Select Ca&e Err.Bumber
Ca&e 2(>
Osg5ox *8.ebe introducir valores numricos8,
Ca&e G>
Osg5ox *8El valor es demasiado grande o demasiado pequeLo. 8 D C
El n6mero debe estar comprendido entre E('FG= y ('FGF8,
Ca&e El&e
Osg5ox *8Error no previsto. %lame al responsable facilitando la 8 D C
8informacin que sigue 8 D "r*2(, D 8B6mero de Error > 8 D C
Err.Bumber D "r*2(, D 8.escripcin > 8 D Err..escription,
Exit Su. + : lo 1ue sea
En( Select
Re&ume + : lo 1ue sea
En( Su.
http%--....cybercursos.net
Pgina ;/
Pri"ate Su. -onerC"alculo*n2 A& ,nteger, n' A& ,nteger, BumeroC9oja A& ,nteger,
1im 3otal A& ,nteger
3otal & n2 K n'
/or0seets*BumeroC9oja,.Range*8$28,.4alue & 3otal
En( Su.
Una vez entrados los valores en el procedimiento Prueba se llama a Poner_,alculo, simplemente suma
los dos valores y los asigna a una oja del libro de trabajo *observe que la oja viene indicada por el
par!metro Numero_(oja,.
+bserve que el procedimiento Poner_,alculo no tiene rutina de tratamiento de errores, puede pensar que
si se produce un error dentro de l se detendr! el programa, pero no es as#. 1i se produce un error dentro
del procedimiento Poner_,alculo el programa pasa a ejecutar la rutina de tratamiento de errores definida
dentro de Prueba, esto algunas veces *pocas, puede ser lo que conviene, pero compruebe el efecto
indeseable que ocurre aqu#.
Ejecute el programa e introduzca los valores siguientes n2&');;; y n'&';;;;, los dos valores entran
dentro del rango de los datos @nteger, pero su suma H);;; no, se producir! un error de desbordamiento en
la instruccin 3otal & n2 K n' del procedimiento Poner_,alculo y se proceder! a ejecutar las
instrucciones de la rutina de error definida en el procedimiento PruebaV aqu#, despus de mostrar el error,
se vuelve a ejecutar la instruccin Total C n.Rn9 debido a la instruccin Resume y el programa entra en
un bucle infinito ya que no es posible cambiar los valores de n2 y n'. %a solucin aqu# es sencilla, slo
debe cambiar Resume por Resume Ne't o Resume *ti1ueta. +tra posibilidad es implementar una rutina de
tratamiento de errores dentro del procedimiento Poner_,alculo, o simplemente desactivar la rutina de
tratamiento de errores antes de llamar al procedimiento mediante las instruccin On Error Foto 5.
On Error Foto ; + Eesacti#ar el tratamiento de errores
Call -onerC"alculo*n2, n', ',
Esto 6ltimo conlleva la consecuencia que si se produce un error dentro del procedimiento Poner_,alculo
el programa se detendr!.
Oucas veces este tipo de errores se pueden controlar mejor utilizando una variable global. Esta variable
permitir! recoger el error que se a producido en la funcin para luego tratarlo cuando la ejecucin del
programa vuelva a la funcin llamadora. +bserve como quedar#a nuestro ejemplo.
O#tion Ex#licit
1im gError A& ,nteger +Variable 1ue recogerD n&meros de error
Su. -rueba*,
On Error Fo0o 3ratarCErrores
1im n2 A& ,nteger
1im n' A& ,nteger
1im 3otal A& ,nteger
n2 & @nput5ox*8Entrar el primer valor8, 8Entrada8,
n' & @nput5ox*8Entrar el segundo valor 8, 8Entrada8,
http%--....cybercursos.net
Pgina ;2
Call -onerC"alculo*n2, n', ',
,7 gError QM ; 0hen + Si al #ol#er de la funcin g*rror WO 5 NNO *rror dentro de la funcin
Osg5ox *8Error en la :uncin -oner "!lculo.8 D "r*2(, D gError,
Exit Su.+ : lo 1ue sea
En( ,7
Exit Su.
3ratarCErrores>
Select Ca&e Err.Bumber
Ca&e 2(>
Osg5ox *8.ebe introducir valores numricos8,
Ca&e G>
Osg5ox *8El valor es demasiado grande o demasiado pequeLo. 8 D C
El n6mero debe estar comprendido entre E('FG= y ('FGF8,
Ca&e El&e
Osg5ox *8Error no previsto. %lame al responsable facilitando la 8 D C
8informacin que sigue 8 D "r*2(, D 8B6mero de Error > 8 D C
Err.Bumber D "r*2(, D 8.escripcin > 8 D Err..escription,
Exit Su. + : lo 1ue sea
En( Select
Re&ume + : lo 1ue sea
En( Su.
Pri"ate Su. -onerC"alculo*n2 A& ,nteger, n' A& ,nteger, BumeroC9oja A& ,nteger,
On Error Fo0o 3ratarCErrores'
1im 3otal A& ,nteger
gError & ;
3otal & n2 K n'
/or0seets*BumeroC9oja,.Range*8$28,.4alue & 3otal
Exit Su.
3ratarCErrores'>
Error & Err.Bumber + Si a% error g*rror recoge el n&mero de error
En( Su.
El funcionamiento aqu# es bastante simple. 1e construye una rutina de tratamiento de errores dentro de la
funcin que simplemente asigna el n6mero de error a la variable g*rror, cuando se devuelve el control al
procedimiento llamador se inspecciona esta variable y si su valor es distinto de ; se debe tratar el error
*en el ejemplo simplemente se termina el programa, por supuesto el tratamiento podr#a se diferente,.
http%--....cybercursos.net
Pgina ;3
1efinir errores propios.
4isual 5asic incorpora la instruccin Error con la que es posible definir o generar errores propios. -uede
que se est preguntando para que quiere definirse errores propios, dico de otra forma, para que provocar
errores propios. 5ueno, pues por ejemplo, para un mayor control en programas largos y complejos, para
validar datos, y algunos procesos m!s.
-ara provocar un error simplemente tiene que utilizar la instruccin Error*Numero_Ee_*rror,,
Numero_Ee_*rror debe ser un valor comprendido entre ; y G))(), es decir debe estar dentro del rango
de errores definidos por 4isual 5asic, aora bien, utilice siempre valores altos ya que si no, corre el riesgo
de modificar un valor ya establecido por 4isual 5asic. %e recomendamos que empiece a partir del valor
G))() y vaya bajando, estos valores tan elevados nunca ser!n utilizados por 4isual 5asic.
4ea el siguiente ejemplo, es un caso en los que puede resultar interesante provocar un error. Es el ejemplo
que emos utilizado en la seccin, el programa pide tres valores, luego llama a la funcin Poner_,alculo
donde se suman n2 y n' y el resultado se divide por n(. +bserve que se a definido una rutina de
tratamiento de errores que seg6n el error que se aya producido dentro de la funcin, asigna un valor a la
variable global g*rror *aora definida como tipo %ong,. "uando el programa vuelve al procedimiento
Prueba se comprueba el valor de g*rror, si es distinto de ;, se provocar un error Error?),rror=, el
programa salta entonces a la rutina de tratamiento de errores definida dentro del procedimiento donde
gracias a los valores de error asignados sabemos que tipo de error se a producido y en que funcin o
procedimiento se produjo.
O#tion Ex#licit
1im gError A& Long +Variable 1ue recogerD n&meros de error
Su. -rueba*,
On Error Fo0o 3ratarCErrores
1im n2 A& ,nteger
1im n' A& ,nteger
1im n( A& ,nteger
1im 3otal A& ,nteger
n2 & @nput5ox*8Entrar el primer valor8, 8Entrada8,
n' & @nput5ox*8Entrar el segundo valor 8, 8Entrada8,
n( & @nput5ox*8Entrar el 3ercer valor 8, 8Entrada8,
Call -onerC"alculo*n2, n', n(, '),
,7 gError QM ; 0hen + Si al #ol#er de la funcin g*rror WO 5 NNO *rror dentro de la funcin
Error *gError, L Fenerar Error
En( ,7
Exit Su.
http%--....cybercursos.net
Pgina ;8
3ratarCErrores>
Select Ca&e Err.Bumber
Ca&e 2(>
Osg5ox *8.ebe introducir valores numricos8,
Ca&e G>
Osg5ox *8El valor es demasiado grande o demasiado pequeLo. 8 D C
8El n6mero debe estar comprendido entre E('FG= y ('FGF8,
Ca&e G))()>
Osg5ox *81e produjo un error en la funcin -oner "alculo. 8 D C
8B6mero demasiado grande para un entero8,
Ca&e G))(H>
Osg5ox *81e produjo un error en la funcin -oner "alculo. 8 D C
8.ivisin por cero8,
Ca&e G))((>
Osg5ox *81e produjo un error en la funcin -oner "alculo. 8 D C
8B6mero de 9oja no existe8,
Ca&e El&e
Osg5ox *8Error no previsto. %lame al responsable facilitando 8 D C
la informacin que sigue 8 D "r*2(, D 8B6mero de Error > 8 D C
Err.Bumber D "r*2(, D 8.escripcin > 8 D Err..escription,
Exit 1ub + : lo 1ue sea
En( Select
Re&ume Next + : lo 1ue sea
En( Su.
Pri"ate 1ub -onerC"alculo*n2 A& ,nteger, n' A& ,nteger, n( A& ,nteger, BumeroC9oja A& ,nteger,
On Error Fo0o 3ratarCErrores'
1im 3otal A& ,nteger
gError & ;
3otal & n2 K n'
3otal & 3otal I n(
/or0seets*BumeroC9oja,.Range*8$28,.4alue & 3otal
Exit Su.
3ratarCErrores'>
Select Ca&e Err.Bumber
+ Valor demasiado grande
Ca&e G>
gError & G))()
+ Ei#isin por cero
Ca&e 22>
gError & G))(H
+ Subndice fuera del inter#alo -N&mero de oja no e'iste0
Ca&e J>
gError & G))((
http%--....cybercursos.net
Pgina ;9
+ :tro *rror
Ca&e El&e
gError & Err.Bumber
En( Select
En( Su.
7 con esto terminamos el cap#tulo de depuracin de programas y tratamiento de errores. Utilice estos
mecanismos siempre que sus programas vayan a ser usados por otras personas. "on la depuracin podr!,
adem!s de detectar errores m!s f!cilmente, comprobar como el programa en situaciones extremas *y
cranos, si lo an de utilizar diferentes usuarios se producir!n,. "on las rutinas de tratamiento de errores
podr! controlar mucos de ellos, y si se produce uno de imprevisto, al menos le ser! m!s f!cil localizarlo
o saber las causas que lo an provocado.
:inalmente y como opinin personal, si conoce lenguajes como .elpi o Yava o alg6n d#a trabaja con
ellos comprobar ! que el control de errores est! muco mejor acabado que con 4isual basic. "on visual a
uno siempre le queda la sensacin de que algo queda suelto, y cosas como los saltos de Resume Etiqueta
dejan siempre cierta intranquilidad.
Controle& (e 7ormulario en la ho%a (e clculo)
En este tema estudiaremos como insertar controles *botones, cuadros de texto, cuadros de lista, botones
de radio, etc. , dentro de una oja de c!lculo. 1eguramente es m!s abitual utilizar este tipo de controles
dentro de formularios y a travs de ellos gestionar datos de una o varias ojas, sin embargo resulta
conveniente mucas veces incluir directamente estos controles dentro de una misma oja, sobre todo
cuando slo se requiere procesos simples como elegir datos de una lista o act ivar una macro desde un
botn, etc.
Bo estudiaremos en profundidad estos controles, simplemente utilizaremos las propiedades m!s
abituales *concretamente las que necesitemos,, dejaremos un estudio m!s completo para el tema de los
formularios.
A#licaci-n (e e%em#lo)
-ara ver el funcionamiento de los distintos controles, construiremos una pequeLa aplicacin que nos sirva
para gestionar una pequeLa tabla de registros, b!sicamente extraer datos que cumplan una determinada
condicin. %a mayor#a de funciones que aplicaremos pueden acerse directamente desde las utilidades del
men6 1ato&+ !iltro a"anGa(o que lleva incorporado el propio Excel pero creemos que ser! un buen
ejemplo para ver las posibilidades de los controles.
$bra su aplicacin Excel y active la oja de c!lculo 2ista>4'ls que debi bajar junto a este documento, en
la primera oja est! la lista de registros que utilizaremos en los ejemplos que veremos a continuacin. En
la 9oja' se encuentrar algunos datos necesarios para los controles.
.ostrar la barra de *erra$ientas para cuadros de control.
+bviamente para insertar controles en la oja deber! tener activada la barra de controles. $ctive Ver+
'arra& (e *erramienta&+ Cua(ro (e Controle&. .eber! activarse una barra como la siguiente.
http%--....cybercursos.net
Pgina ;:
!uadro de texto 0 Botn.
%o primero que aremos es algo muy sencillo, simplemente copiaremos en 9oja', los datos
correspondientes a los registros de 9oja2 cuyos datos correspondientes a la columna Nombre coincidan
con el que teclearemos en una cuadro de texto que insertaremos en 9oja'. %os datos se copiaran a partir
de la celda $2G. El botn simplemente servir! para invocar la macro que copiar! los datos.
Insertar el cuadro de texto.
1lo tiene que seleccionar el elemento de la barra de controles y dibujarlo sobre la oja *9oja ' en
nuestro ejemplo, procure que coja m!s o menos el rango correspondiente a las celdas "' y .'.
Insertar una eti=ueta.
%as etiquetas sirven b!sicamente para acompaLar los controles con texto descriptivo. 1eleccione el botn
y dibuje en la oja el rect!ngulo para insertar la etiqueta, pngalo al lado del control cuadro de texto.
http%--....cybercursos.net
Pgina ;;
Insertar un Botn.
%os botones se utilizan b!sicamente para invocar las macros que realizar!n las accio nes. Bo es el 6nico
control que puede invocar macros, cualquiera de los controles puede invocarla, pero es el m!s abitual.
Cam.iar la& #ro#ie(a(e& (e lo& o.%eto&)
$ continuacin desplegaremos la ventana de propiedades para cambiar algunas de los objetos acabados
de incrustar. .ebe estar en modo diseLo, el botn de estar activado.
Cam.iar el texto (el control La.el) Pro#ie(a( Ca#tion)
2. 1eleccione el control EtiEueta.
'. -ulse sobre el botn de la barra de controles, se activa la ventana de Pro#ie(a(e&.
(. En la propiedad Ca#tion, cambien el texto +abe2 por 0atos a #uscar.
H. $juste la posicin y el tamaLo del control.
Cam.iar el nom.re (el control Cua(ro (e 0exto) Pro#ie(a( Name)
Bo es necesario cambiar el nombre de los controles pero si muy conveniente, tenga en cuenta que a travs
de los nombres de un control ser! como se refiera a ellos a travs de las macros. 1iempre es mejor llamar
a un control por un nombre descriptivo que por 3ext2 o "ommand2, etc. $l control cuadro de texto le
pondremos el nombre 0atos$#uscar.
2. 1eleccione el control "uadro de 3exto.
'. 1i no tiene activada la ventana de propiedades, act#vela.
(. En la propiedad Name, cambie el text2 por 0atos$#uscar.
. "ambie la propiedad Ca#ti-n del 5otn pro Copiar 0atos y su propiedad Name por Copiar$0atos
*debe poner el guin bajo ya que la propiedad Name no permite espacios en blanco,.
E&ta.lecer la acci-n (e co#iar (ato& cuan(o &e #ul&e el .ot-n)
$ continuacin crearemos la macro que ser! invocada cuando se pulse el botn. %a macro simplemente
debe buscar en la columna $ de la lista de 9oja2 el nombre que coincida con el tecleado en el cuadro de
texto y luego copiarlo acia 9oja' a partir de la casilla $2G. %a macro controlar! que aya algo en el
cuadro de texto. 1e copiaran todas las coincidencias, es decir si ay dos nombres Ramn se copiar!n los
dos. 1i no ay ninguna coincidencia se mostrar! un mensaje avisando de ello.
Los e(entos.
"uando se programan controles bien sea directamente en la oja como estamos aciendo aora o desde
un formulario, debe tener en cuenta los eventos. Un evento en cuando ocurre algo sobre un objeto, en
entornos /indoUs constantemente se est!n produciendo eventos. "lic0s con el ratn sobre un control,
teclear sobre un cuadro de texto, etc. provocan eventos que son recogidos por el sistema. -rogramar un
evento significa acer que se ejecuten determinadas instrucciones cuando ocurra dico evento. En el caso
que nos ocupa aora, aremos que las acciones necesarias para copia r los datos se ejecuten cuando se
aga un clic sobre el botn Copiar$0atos. En general, todos los controles son capaces de capturar
diferentes eventos. El sistema de eventos es bastante m!s complejo de lo que estudiaremos aqu#, nosotros
simplemente tendremos en cuenta que evento debemos elegir para lanzar la ejecucin de determinado
cdigo. 4eamos en la siguiente seccin como asociar el cdigo necesario para copiar datos cuando
ocurre el evento clic0 *Zpulsar el botn y soltarlo, sobre el botn Copiar$0atos.
http%--....cybercursos.net
Pgina ;4
E&cri.ir c-(igo #ara el e"ento Click (el 'ot-n)
.eber! estar en modo 1i&e6o, aseg6rese que el botn est! pulsado.
2. 9aga doble clic0 sobre el botn, observe que se activa autom!ticamente la ventana de 4isual 5asic y
aparece un esqueleto de funcin
Su. "opiarC.atosC"lic0*,
En( Su.
Es lo que se llama procedimiento de evento, es decir, este procedimiento est! asociado al evento
"lic0 del 5otn Copiar$0atos, observe que el procedimiento lleva un nombre compuesto por el
nombre del control 8"opiarC.atos8, un guin bajo y el nombre del evento 8"lic08, en general todos
los procedimientos de evento se nombra de esta forma,
Nom.re1eControlBNom.re1eE"ento
+bserve la lista de la parte superior dereca, la que tiene el elemento Click. Es la lista de eventos, si
la despliega ver! que adem!s del elemento "lic0 aparecen unos cuantos m!s 1.lClick *.oble "lic0,
Fot7ocu& *"oger el foco,, etc. todos ellos son eventos programables del control botn, es decir,
podemos incluir cdigo que se ejecutar! cuando ocurren dicos eventos. -or otra parte, todos los
controles tienen un evento 8por defecto8, dico de otra forma, cuando se programa un evento del
control casi siempre ser! ese. En el caso de nuestro botn *y de todos los botones,, el evento por
defecto es Click, observe que lo abitual es que queramos que el cdigo se ejecute cuando se ace
clic0 sobre el botn, no cuando este coge el foco o cuando el puntero de ratn pasa sobre l, etc. El
evento por defecto de un control es el que aparece cuando, en modo diseLo, se ace doble clic sobre
l, obviamente este se puede cambiar, por el que m!s nos convenga.
'. 3eclear el cdigo para llevar a cabo las acciones. Recuerde que lo que se desea acer es copiar acia
oja' todos los nombres que coincidan con el que est! en el cuadro de texto. El cdigo ser! el que
sigue, observe los comentarios.
O#tion Ex#licit
+ Numero de columnas-campos0 de las 1ue consta cada registro
Con&t BumC"olumnas & G
Pri"ate Su. "opiarC.atosC"lic0*,
1im r2 A& Range, r' A& Range
1im encontrado A& 'oolean
+ Si el cuadro de te'to estD #aco$ no se busca nada
,7 %en*.atosC5uscar.4alue, & ; 0hen
Osg5ox *8Bo ay datos que buscar8,
El&e
+ Borrar los datos actuales
Call borrarCdatos
+ "cti#ar ,asilla ".= de (oja9 % referenciarla con r9$ *s la casilla donde se copiarDn
+los datos en caso 1ue se encuentren
/or0seets*',.Range*8$2G8,.$ctivate
Set r' & $ctive"ell
+ "cti#ar casilla "9 de (oja. % referenciarla con r.
/or0seets*2,.$ctivate
/or0seets*2,.Range*8$'8,.$ct ivate
http%--....cybercursos.net
Pgina 45
+ Recorrer todo el rango de datos de (oja.
encontrado & :alse
1o While Not @sEmpty*$ctive"ell,
+ Si la casilla acti#a C Eatos_Buscados
,7 $ctive"ell.4alue & .atosC5uscar.3ext 0hen
encontrado & 3rue
+ Referenciar con r. la celda donde estDn os datos
Set r2 & $ctive"ell
+ ,opiar los datos
"all "opiarC.atosC9ojas*r2, r',
+ Referenciar con r9 la casilla donde se copiaran los pr'imos datos
1et r' & r'.+ffset*2, ;,
En( ,7
$ctive"ell.+ffset*2, ;,.$ctivate
Loo#
/or0seets*',.$ctivate
,7 encontrado 0hen
Osg5ox *8.atos "opiados8,
El&e
Osg5ox *8Binguna coincidencia8,
En( ,7
En( ,7
En( Su.
+ Procedimiento para borrar los datos de (oja9 se llama antes de proceder a la nue#a copia
Pri"ate Su. borrarCdatos*,
1im i A& ,nteger
/or0seets*',.Range*8$2G8,.$ctivate
1o While Not @sEmpty*$ctive"ell,
!or i & ; 0o BumC"olumnas E 2
$ctive"ell.+ffset*;, i,.4alue & 88
Next i
$ctive"ell.+ffset*2, ;,.$ctivate
Loo#
En( Su.
+ Procedimiento para copiar los datos de (oja. a (oja/
+ ParDmetros4
+ r. C ,elda :rigen
+ r9 C ,elda Eestino
Pri"ate Su. "opiarC.atosC9ojas*r2 A& Range, r' A& Range,
1im i A& ,nteger
1im .atos A& Variant
+ Recorrer las columnas del registro % copiar celda a celda
!or i & ; 0o BumC"olumnas E 2
.atos & r2.+ffset*;, i,.4alue
r'.+ffset*;, i,.4alue & .atos
Next i
En( Su.
http%--....cybercursos.net
Pgina 41
Cua(ro& Com.ina(o& ?Com.o'ox= )
"on lo eco asta aora podemos extraer de la tabla los registros cuyo nombre coincida con el tecleado
en el cuadro de texto. $ continuacin aremos que se pueda escoger el campo, es decir, podremos extraer
coincidencias del Nombre, los "pellidos, la ,iudad, etc. -ara ello incluiremos un cuadro combinado que
permita escoger en que campo o columna tiene que buscarse la coincidencia. %a lista, por supuesto,
mostrar! los nombres de las columnas.
@ncluya un cuadro combinado en 9oja' y pngale por nombre *propiedad Name,. +ista$Campos
/ropiedad ListFillRange.
"on esta propiedad deberemos definir los elementos que debe mostrar la lista, debe especificarse el rango
que contiene los elementos a mostrar, el rango debe ser una columna *o dos , o tres, etc.,. En nuestro caso
el rango ser! Y2>YG de 9oja' *+bserve que en este rango est!n especificados los nombres de las
columnas,.
/ropiedad Lin>ed!ell.
En esta propiedad debe especificar en que celda debe copiarse el elemento seleccionado de la lista. En
esta lista no utilizaremos esta propiedad.
,uidado con esta propiedad$ tenga en cuenta 1ue los elementos de la lista son tratados como datos de
tipo (trin) aun1ue contenga n&meros o fecas$ por lo 1ue en estos casos$ a #eces serD necesario aplicar
funciones de con#ersin de datos antes 1ue el dato se copie en la oja4 Por ejemplo$ si alguna #e!
constru%e una lista con n&meros #erD 1ue el dato seleccionado se alinea a la dereca$ si son fecas$ no se
muestra con el formato correspondiente4
/ropiedad ListIndex.
Oediante esta propiedad podremos saber que elemento de la lista es el seleccionado por su n6mero de
orden. Es decir, si est! seleccionado el primero, %ist@ndex valdr! ;, si est! seleccionado el segundo valdr!
2, etc. 1i no ay ning6n elemento seleccionado valdr! E2. 3enga en cuenta que esta propiedad slo est!
disponible en tiempo de ejecucin, es decir la podremos leer mientras est funcionando el programa, no
se puede establecer en modo diseLo, observe que no aparece en la ventana propiedades del cuadro
combinado.
5ien, ya sabemos como funcionan las propiedades que utilizaremos para acer que se extraigan de la
tabla los elementos que coincidan con el valor del cuadro de texto y cuya columna o campo sea el
seleccionado de la lista, veamos como quedar! la macro.
En primer lugar cree un procedimiento llamado Proceder donde deber! copiar todo el cdigo que aora
est! en Copiar$0atos. .ebemos acer esto porque antes de proceder se deben acer ciertas
comprobaciones que ya iremos viendo conforme avanzamos, por el momento la comprobacin a acer es
la de ver sobre que campo o columna se deben buscar las coincidencias con los datos tecleados en el
cuadro de texto. %a funcin Copiar$0atos quedar! de la forma siguiente.
http%--....cybercursos.net
Pgina 4/
Pri"ate Su. "opiarC.atosC"lic0*,
1im i A& ,nteger
+ Recoger el elemento seleccionado de la lista
i & %istaC"ampos.%ist@ndex
+ Si i W 5 es 1ue no a% ning&n elemento seleccionado4
,7 i Q ; 0hen
Osg5ox *8.ebe 1eleccionar un campo de la lista8,
El&e
+ 2lamar a proceder para iniciar la copia4
Call -roceder*i,
En( ,7
En( Su.
%a cabecera de la funcin proceder quedar! de la forma siguiente.
+ Procedimiento Proceder
+ 3nicia la copia de los datos coincidentes
+ ParDmetros)
+ ,olumna C *lementos seleccionado de la lista 1ue coincidirD con la columna sobre la 1ue se
+ debe buscar
Pri"ate Su. -roceder*"olumna $s @nteger,
.....
$ora, dentro del procedimiento -roceder cambie la l#nea
,7 $ctive"ell.4alue & .atosC5uscar.3ext 0hen
-or
,7 $ctive"ell.+ffset*;, "olumna,.4alue & .atosC5uscar.3ext 0hen
Ex#licaci-n (el #roce&o. "uando se selecciona un elemento de la lista, su propiedad +istInde* es igual
al orden que ocupa dico elemento en la lista, supongamos que escogemos ,iudad, +istInde* valdr! '.
Este valor se pasa a Proceder y es recogido por el par!metro Coumna. $ora observe la l#nea
,7 $ctive"ell.+ffset*;, "olumna,.4alue & .atosC5uscar.3ext 0hen
Es decir la coincidencia con el valor del cuadro de texto 0atos$#uscar se busca respecto a la casilla que
est! a la dereca * offset , de la activa, tantas columnas como las expresadas por el valor de la variable
Coumna . +bserve que en este caso la casilla activa siempre corresponde a una de la columna $, si la
variable Coumna vale ' la coincidencia se buscar! respecto al valor de la columna " *' m!s acia la
dereca, y que coincide con la columna correspondiente a la Ciudad.
http%--....cybercursos.net
Pgina 42
Segun(a Li&ta)
$ora crearemos una lista donde sea posible escoger la relacin de comparacin. 9asta aora la
extraccin se realizaba con aquellos elementos iguales al valor entrado en el cuadro de texto
0atos$#uscar, esta segunda lista permitir! escoger si los elementos a extraer deben ser 3guales$ Menores$
Ma%ores$ Menores 3guales o Ma%ores 3guales que el valor de 0atos$#uscar. -ara ello debe construir una
segunda lista con las propiedades siguientes.
Name & %istaC"omparacin.
Li&t!illRange & %2>%) +bserve que en este rango est!n los valores correspondientes a la
operacin relacional que se desea realizar *@gual, Oenor, etc.,
+bviamente deberemos modificar las funciones para realizar las operaciones con respecto al elemento
seleccionado en el cuadro de lista +ista$Comparacin. .ejaremos el procedimiento Proceder de la forma
siguiente y crearemos una funcin que aga las comparaciones, esta funcin a la que emos llamado
Comparar devuelva el valor 3rue si el resultado de la comparacin es "ierto y :alse si es falso.
+ Procedimiento Proceder
+ 3nicia la copia de los datos coincidentes
+ ParDmetros)
+ ,olumna C *lementos seleccionado de la lista 1ue coincidirD con la columna sobre la 1ue se debe
+ buscar
Pri"ate Su. -roceder*"olumna $s @nteger,
1im r2 A& Range, r' A& Range
1im encontrado A& 'oolean
1im 4alorC"omparacion A& 'oolean
+ Si el cuadro de te'to estD #aco$ no se busca nada
,7 %en*.atosC5uscar.4alue, & ; 0hen
Osg5ox *8Bo ay datos que buscar8,
El&e
+ Borrar los datos actuales
Call borrarCdatos
+ "cti#ar ,asilla ".= de (oja9 % referenciarla con r9+ *s la casilla donde se copiarDn
+ los datos en caso 1ue+ se encuentren
/or0seets*',.Range*8$2G8,.$ctivate
Set r' & $ctive"ell
+ "cti#ar casilla "9 de (oja. % referenciarla con r.
/or0seets*2,.$ctivate
/or0seets*2,.Range*8$'8,.$ctivate
encontrado & !al&e
T Recorrer todo el rango de datos de 9oja2
1o While Not @sEmpty*$ctive"ell,
4alorC"omparacion & "omparar*$ctive"ell.+ffset*;, "olumna,.4alue, C
.atosC5uscar.4alue, %istaC"omparacion.%ist@ndex,
,7 4alorC"omparacion & 3rue 0hen
encontrado & 3rue
+ Referenciar con r. la celda donde estDn os datos
Set r2 & $ctive"ell
+ ,opiar los datos
Call "opiarC.atosC9ojas*r2, r',
+ Referenciar con r9 la casilla donde se copiaran los pr'imos datos
http%--....cybercursos.net
Pgina 43
Set r' & r'.+ffset*2, ;,
En( ,7
$ctive"ell.+ffset*2, ;,.$ctivate
Loo#
/or0seets*',.$ctivate
,7 encontrado 0hen
Osg5ox *8.atos "opiados8,
El&e
Osg5ox *8Binguna coincidencia8,
En( ,7
En( ,7
En( Su.
+ @uncin 1ue compara dos #alores con un operador relacional C$ O$ W$ etc4
+ 2a funcin de#uel#e True o @alse en funcin de la comparacin4
+ ParDmetros4
+ Valor. % Valor9 C Valores 1ue se comparan
+ Signo C #ariable 1ue sir#e para escoger el operador relacional
+ en funcin de su #alor$ #er estructura Select ,ase
Pri"ate !unction "omparar*4alor2 A& Variant, 4alor' A& Variant, +perador A& ,nteger, A& 'oolean
1im q A& 'oolean
Select Ca&e +perador
Ca&e ;>
q & 4alor2 & 4alor'
Ca&e 2>
q & 4alor2 M 4alor'
Ca&e '>
q & 4alor2 Q 4alor'
Ca&e (>
q & 4alor2 M& 4alor'
Ca&e H>
q & 4alor2 Q& 4alor'
En( Select
"omparar & q
En( !unction
+bserve la l#nea que llama a la funcin Comparar,
4alorC"omparacion & "omparar*$ctive"ell.+ffset*;, "olumna,.4alue, C
.atosC5uscar.4alue, %istaC"omparacion.%ist@ndex,
3ctiveCe.O44set56,Coumna7 ser!n los valores que se comparar!n con el valor del cuadro de
texto.
0atos$#uscar.vaue es el valor del cuadro de texto.
+ista$Comparacin.+istInde* devuelve el #ndice del elemento seleccionado de la lista, observe
como se utiliza este valor en la estructura Select Ca&e de Comparar para determinar que
operador utilizar.
http%--....cybercursos.net
Pgina 48
Pero to(o e&to no 7uncionar)
-ruebe lo siguiente.
En el cuadro de texto escriba Madrid * o simplemente O,.
1eleccione de la lista de "ampos ,iudad.
1eleccione de la lista de operadores Ma%or.
-ulse sobre el botn y observe que se copian todos los registros cuyo campo "iudad sea superior
a Oadrid *o a la O,. 9asta aqu# todo correcto.
$ora pruebe lo siguiente.
En el cuadro de texto escriba 2;;;;;
1eleccione de la lista de "ampos ,antidad.
1eleccione de la lista de operadores Ma%or.
-ulse sobre el botn y observe que no se copia nada a pesar que en cantidad ay registros con el
valor superior a 2;;;;;.
Recuerde que los valores de un cuadro de texto son siempre datos tipo 1tring, entonces en este caso
estar!n compar!ndose valores 1tring *los del cuadro de texto, con valores numricos, *los recogidos de la
columna ,antidad,. 3enga en cuenta siempre esta circunstancia cuando trabaje con elementos de
formulario. 4ea la seccin siguiente donde se solucionar! este problema y de paso se ver! como construir
%ista con m!s de una columna.
Li&ta& con m& (e una columna)
-ara solucionar el problema del apartado anterior utilizaremos una segunda columna cuyos elementos
indicar!n el tipo de datos del campo. +bserve el rango R2>RG de 9oja', las letras significan lo siguiente
T campo tipo te'to o string$ N campo Num;rico$ @ campo feca. -ara incluir esta segunda columna en la
lista deber! cambiar las propiedades siguientes.
Li&t!illRange , Y2>RG
ColumnCount , ' *@ndicamos el n6mero de columnas de la lista.
$dem!s especificaremos el anco de cada columna mediante la propiedad,
ColumnWi(th&, Hpt?;pt .ebe separar el anco de cada columna mediante un punto y coma.
+bserve que la segunda columna no se mostrar! debido a que emos especificado el anco a ;.
Column'oun(, 2 significa que el dato que recoger! la propiedad 4alue corresponde al elemento
seleccionado de la primera columna.
1i desea recoger datos le la segunda columna deber! utilizar la propiedad
Column*Numero de ,olumna, 3ndice del elemento seleccionado,
%as columnas empiezan a numerarse a partir de la ;.
%a funcin Comparar y su correspondiente llamada quedar!n de la forma siguiente. +bserve que se an
incluido variables que recogen los valores de +ista$Comparacin y +ista$Campos, simplemente lo
emos eco para que quede m!s claro.
http%--....cybercursos.net
Pgina 49
............
1o While Not @sEmpty*$ctive"ell,
+ Recoger el Signo de comparacin
1igno & %istaC"omparacion.%ist@ndex
+ Recoger el tipo de datos
3ipoC.atos & %istaC"ampos."olumn*2, "olumna,
4alorC"omparacion & "omparar*$ctive"ell.+ffset*;, "olumna,.4alue, C
.atosC5uscar.4alue, 1igno, 3ipoC.atos,
La 7unci-n Com#arar)
Pri"ate !unction "omparar*4alor2 A& Variant, 4alor' A& Variant, +perador A& ,nteger, 3ipo A&
String, A& 'oolean
1im q A& 'oolean
+ ,on#ersin del tipo de datos de las #ariables
Select Ca&e 3ipo
Ca&e 8B8> T "onvertir a n6mero
4alor' & 4al*4alor',
Ca&e 8:8> T "onvertir a :eca
4alor' & ".ate*4alor',
En( Select
Select Ca&e +perador
Ca&e ;>
q & 4alor2 & 4alor'
Ca&e 2>
q & 4alor2 M 4alor'
Ca&e '>
q & 4alor2 Q 4alor'
Ca&e (>
q & 4alor2 M& 4alor'
Ca&e H>
q & 4alor2 Q& 4alor'
En( Select
"omparar & q
En( !unction
http%--....cybercursos.net
Pgina 4:
Control Num<rico )
@nserte un control de n6mero y pngale por nombre *propiedad Name, 8umero.
Establezca su propiedad Orientation a 4mOrientatiom'ertica para que se alinee verticalmente.
Este control se utiliza normalmente para aumentar y disminuir valores numricos de un cuadro de texto,
aunque por supuesto puede utilizarse para otras funciones. Utilizaremos un control de este tipo para
aumentar los valores del "uadro de 3exto 0atos$#uscar pero slo si el campo seleccionado de
+ista$Campos es de tipo numrico. -ara ello activaremos este control 6nicamente cuando el campo
seleccionado sea de este tipo. -ara activar o desactivar un control se utiliza la propiedad Ena.le(, si est!
a true el control estar! activado y sino estar! desactivado.
+bserve que la accin de activar o desactivar el control de n6mero deberemos acerlo cuando se
seleccione un elemento de +ista$Campos. Es decir el cdigo deberemos insertarlo en el evento Change
*cambio, de +ista$Campos. 9aga doble clic sobre el elemento +ista$Campos para desplegar su
procedimiento de evento. El cdigo para controlar la activacin del control es el que sigue,
Pri"ate Su. %istaC"amposC"ange*,
1im i A& ,nteger
1im 3ipoC.atos A& String
i & %istaC"ampos.%ist@ndex
,7 i M& ; 0hen
3ipoC.atos & %istaC"ampos."olumn*2, i,
,7 3ipoC.atos & 8B8 0hen
Bumero.Enabled & 3rue
El&e
Bumero.Enabled & :alse
En( ,7
En( ,7
En( Su.
Establecer los (alores del control de n?$ero.
-ara establecer los valores que puede devolver un control de n6mero se deben modificar las propiedades
siguientes.
Max, establece el valor m!ximo que puede tener el control.
Min, establece el valor m#nimo que puede tener el control.
Smallchange, establece el incremento o decremento para la propiedad value cada vez que se
pulse sobre alguno de los dos botones.
Estos valores se pueden establecer en tiempo de diseLo, pero lo que aremos a continuacin ser!
establecerlos en tiempo de ejecucin dependiendo del campo que se seleccione en +ista$Campos.
Estableceremos los valores siguientes.
-ara campo ,dad.
Max & JJ
Min & 2=
SmallChange & 2
http%--....cybercursos.net
Pgina 4;
-ara campo cantidad.
Max & );;.;;;
Min & 2;.;;;
SmalChange & 2.;;;
.eberemos modificar el cdigo del procedimiento de evento +ista$Campos$Chan)e de la forma
siguiente.
Pri"ate Su. %istaC"amposC"ange*,
1im i A& ,nteger
1im 3ipoC.atos A& String
i & %istaC"ampos.%ist@ndex
,7 i M& ; 0hen
3ipoC.atos & %istaC"ampos."olumn*2, i,
,7 3ipoC.atos & 8B8 0hen
Bumero.Enabled & 3rue
,7 %istaC"ampos.4alue & 8Edad8 0hen
Bumero.Oin & 2=
Bumero.Oax & JJ
Bumero.1mall"ange & 2
.atosC5uscar.4alue & ;
Bumero.4alue&;
En( ,7
,7 %istaC"ampos.4alue & 8"antidad8 0hen
Bumero.Oin & 2;;;;
Bumero.Oax & );;;;;
Bumero.1mall"ange & 2;;;
.atosC5uscar .4alue& ;
Bumero.4alue&;
En( ,7
El&e
Bumero.Enabled & :alse
En(,7
En( ,7
En( Su.
7 para terminar ya slo debemos codificar el evento Change del control de n6mero para que el "uadro
de texto vaya incrementando o decrementando su valor cada vez que se aga clic sobre el control.
Pri"ate Su. BumeroC"ange*,
.atosC5uscar.4alue & Bumero.4alue
En( Su.
http%--....cybercursos.net
Pgina 44
-ero adem!s debemos acer que cuando se cambie el valor del cuadro de texto tambin se cambie el del
control de n6mero de forma que cuando se pulse sobre l, incremente o decremente a partir del valor que
ay en el cuadro de texto. 1i no se ace as#, el incremento o decremento se ar! en funcin del valor que
tenga el control de n6mero no el que est! en el cuadro de texto. Oodificaremos el evento Change del
cuadro de texto. +bserve que se controla que slo se ejecute la accin si el control de n6mero est!
activado, adem!s se debe controlar tambin el valor m!ximo y m#nimo que puede contener el cuadro de
texto, si no se iciera as# se generar#a un error al poner un valor mayor o menor que los definidos en las
propiedades Oax y Oin del control de n6mero.
Pri"ate Su. .atosC5uscarC"ange*,
+ Si el numero de control estD acti#ado
,7 Bumero.Enabled 0hen
+ No permite coger #alores superiores a la propiedad Ma'
,7 4al*.atosC5uscar.4alue, M Bumero.Oax 0hen
Osg5ox *84alor demasiado grande8,
.atosC5uscar.4alue & Bumero.Oax
El&e
+ No permite coger #alores inferiores a la propiedad Min
,7 4al*.atosC5uscar.4alue, Q Bumero.Oin 0hen
Osg5ox *84alor demasiado pequeLo8,
.atosC5uscar.4alue & Bumero.Oin
El&e
Bumero.4alue & 4al*.atosC5uscar.4alue,
En( ,7
En( ,7
En( ,7
En( Su.
$ntes de proceder con el siguiente control djenos remarcar que la programacin de controles
implica que mucas veces unos dependan de otros por lo que debe ser extremadamente
cuidadoso en la elaboracin del cdigo de los eventos. +bserve las 6ltimas operaciones que
emos realizado debido a la interdependencia de dos controles .
Ca&illa& (e "eri7icaci-n ?Check'ox= )
Estos con troles se suelen utilizar para activar o desactivar la ejecucin de determinadas acciones. "asi
siempre implican una estructura condicional a la ora de acer alguna cosa,
Si las casilla est! activada Entonce&
$cciones
....
!in Si
$ continuacin utilizaremos una casilla de verificacin que si est! activada provocar! que los datos tipo
texto se conviertan a may6scula antes de copiarse, se utilizar! la funcin @ca&e. 1implemente se deber!
comprobar que la casilla est activada y si lo est! proceder a la conversin *slo si el dato es tipo texto,.
@nserte un control casilla de verificacin. Establezca las siguientes propiedades.
Name, Oayusculas.
Ca#ti-n, Oay6sculas.
-ara comprobar si la casilla est! activada o no simplemente debe mirarse su propiedad Value. 1i vale true
es que est! activada, sino valdr! :alse.
http%--....cybercursos.net
Pgina 155
4ea como quedar! el procedimiento Copiar$0atos$9ojas, observe que adem!s de comprobar que la
casilla est activada se utiliza la funcin 0$#eName para comprobar si los datos que se van a copiar son
del tipo 1tring, si no lo fueran, la funcin @ca&e provocar#a un error. 0$#eName**'presin , devuelve
una cadena que indica el tipo de datos de la expresin.
Pri"ate Su. "opiarC.atosC9ojas*r2 A& Range, r' A& Range,
1im i A& ,nteger
1im .atos A& Variant
+ recorrer las columnas del registro % copiar celda a celda
!or i & ; 0o BumC"olumnas E 2
+ Si la casilla Ma%&sculas estD acti#ada % el tipo de datos es String
,7 Oayusculas.4alue & 3rue $nd 3ypeBame*r2.+ffset*;, i,.4alue, & 81tring8 0hen
.atos & U"ase*r2.+ffset*;, i,.4alue,
El&e
.atos & r2.+ffset*;, i,.4alue
En( ,7
r'.+ffset*;, i,.4alue & .atos
Next i
En( Su.
'otone& (e O#ci-n ?O#tion 'utton= )
%os botones de opcin se utilizan para elegir una 6nica opcin entre una serie de ellas, es decir, de un
grupo de opciones slo permitir!n que se escoja una. .e la misma forma que las casillas de verificacin,
casi siempre implican una estructura condicional para comprobar cual de ellas est! activada. El botn
activado tendr! su propiedad Value igual a true.
"omo ejemplo de su utilizacin crearemos dos botones de opcin que sirvan para que a la ora de copiar
datos acia la oja, se copie slo los valores de Nombre y "pellidos o todos como asta aora.
@ncluya dos botones de opcin y establezca las siguientes propiedades.
5otn2.
Name, 3odo.
Ca#tion, 3odo.
5otn'.
Name, 1oloCBombre.
Ca#tion, Bombre y $pellidos.
1i est! activado el primer botn deber!n copiarse todos los datos mientras que si est! activado el segundo
solo se copiar!n el Nombre y los "pellidos. El procedimiento Copiar$0atos$9ojas quedar! de la forma
siguiente.
http%--....cybercursos.net
Pgina 151
Pri"ate Su. "opiarC.atosC9ojas*r2 A& Range, r' A& Range,
1im i A& ,nteger
1im .atos A& Variant
1im :inal A& ,nteger
+ Si Botn Todo "cti#ado$ se copian todas las columnas
,7 3odo.4alue & 3rue 0hen
:inal & BumC"olumnas E 2
El&e + Slo se copian las dos primera columnas
:inal & 2
En( ,7
+ recorrer las columnas del registro % copiar celda a celda
!or i & ; 3o !inal
+ Si la casilla Ma%&sculas estD acti#ada % el tipo de datos es String
,7 Oayusculas.4alue & 3rue An( 3ypeBame*r2.+ffset*;, i,.4alue, & 81tring8 0hen
.atos & U"ase*r2.+ffset*;, i,.4alue,
El&e
.atos & r2.+ffset*;, i,.4alue
En( ,7
r'.+ffset*;, i,.4alue & .atos
Next i
En( Su.
7 aqu# terminamos el estudio de cmo se pueden utilizar los controles de formulario dentro de una oja
de c!lculo. Recordarle para terminar que debe ser extremadamente cuidadoso con el cdigo que utilice en
los procedimientos de evento sobre todo si los controles se interrelacionan entre ellos.
El siguiente %istado incluye todo el cdigo que se a utilizado. -uede probar su funcionamiento cargando
el arcivo Li&ta:B/)xl& que debi descargarse junto a este tema.
http%--....cybercursos.net
Pgina 15/
O#tion Ex#licit
+ Numero de columnas-campos0 de las 1ue consta cada registro
Con&t BumC"olumnas & G
Pri"ate Su. "opiarC.atosC"lic0*,
1im i A& ,nteger
1im x A& ,nteger
+ Recoger el elemento seleccionado de la lista
i & %istaC"ampos.%ist@ndex
+ Si i W 5 no estD seleccionado ning&n elemento
,7 i Q ; 0hen
Osg5ox *8.ebe 1eleccionar un campo de la lista8,
El&e
x & %istaC"omparacion.%ist@ndex
,7 x Q ; 0hen
Osg5ox *8.ebe 1eleccionar uno operador de "omparacin8,
El&e
+ llamar a proceder
Call -roceder*i,
En( ,7
En( ,7
En( Su.
+ Procedimiento Proceder
+ 3nicia la copia de los datos coincidentes
+ ParDmetros)
+ ,olumna C *lementos seleccionado de la lista 1ue coincidirD
+ con la columna sobre la 1ue se debe buscar
Pri"ate Su. -roceder*"olumna $s @nteger,
1im r2 A& Range, r' A& Range
1im encontrado A& 'oolean
1im 4alorC"omparacion A& 'oolean
1im 1igno A& ,nteger
1im 3ipoC.atos A& String
+ Si el cuadro de te'to estD #aco$ no se busca nada
,7 %en*.atosC5uscar.4alue, & ; 0hen
Osg5ox *8Bo ay datos que buscar8,
El&e
+ Borrar los datos actuales
Call borrarCdatos
+ "cti#ar ,asilla ".= de (oja9 % referenciarla con r9
+ *s la casilla donde se copiarDn los datos en caso 1ue se encuentren
/or0seets*',.Range*8$2G8,.$ctivate
Set r' & $ctive"ell
+ "cti#ar casilla "9 de (oja. % referenciarla con r.
/or0seets*2,.$ctivate
/or0seets*2,.Range*8$'8,.$ctivate
+ Recorrer todo el rango de datos de (oja.
encontrado & :alse
.o /ile Bot @sEmpty*$ctive"ell,
http%--....cybercursos.net
Pgina 152
+ Recoger el Signo de comparacin
1igno & %istaC"omparacion.%ist@ndex
+ recoger el tipo de datos
3ipoC.atos & %istaC"ampos."olumn*2, "olumna,
4alorC"omparacion & "omparar*$ctive"ell.+ffset*;, "olumna,.4alue, C
.atosC5uscar.4alue, 1igno, 3ipoC.atos,
,7 4alorC"omparacion & 3rue 0hen
encontrado & 3rue
+ Referenciar con r. la celda donde estDn os datos
Set r2 & $ctive"ell
+ ,opiar los datos
Call "opiarC.atosC9ojas*r2, r',
+ Referenciar con r9 la casilla donde se copiaran los pr'imos datos
Set r' & r'.+ffset*2, ;,
En( ,7
$ctive"ell.+ffset*2, ;,.$ctivate
Loo#
/or0seets*',.$ctivate
,7 encontrado 0hen
Osg5ox *8.atos "opiados8,
El&e
Osg5ox *8Binguna coincidencia8,
En( ,7
En( ,7
En( Su.
+ @uncin 1ue compara dos #alores con un operador relacional C$ O$ W$ etc4
+ 2a funcin de#uel#e True o @alse en funcin de la comparacin4
+ ParDmetros4
+ Valor. % Valor9 C Valores 1ue se comparan
+ Signo C #ariable 1ue sir#e para escoger el operador relacional
+ en funcin de su #alor$ #er estructura Select ,ase
Pri"ate !unction "omparar*4alor2 A& Variant, 4alor' A& Variant, +perador A& ,nteger, 3ipo A&
String, A& 'oolean
1im q A& 'oolean
Select Ca&e 3ipo
Ca&e 8B8> T "onvertir a n6mero
4alor' & 4al*4alor',
Ca&e 8:8> T "onvertir a :eca
4alor' & ".ate*4alor',
En( Select
Select Ca&e +perador
Ca&e ;>
q & 4alor2 & 4alor'
Ca&e 2>
q & 4alor2 M 4alor'
Ca&e '>
q & 4alor2 Q 4alor'
http%--....cybercursos.net
Pgina 153
Ca&e (>
q & 4alor2 M& 4alor'
Ca&e H>
q & 4alor2 Q& 4alor'
En( Select
"omparar & q
En( !unction
+ Procedimiento para borrar los datos de (oja9 se llama antes de proceder a la nue#a copia
Pri"ate Su. borrarCdatos*,
1im i A& ,nteger
/or0seets*',.Range*8$2G8,.$ctivate
1o While Not @sEmpty*$ctive"ell,
!or i & ; 0o BumC"olumnas E 2
$ctive"ell.+ffset*;, i,.4alue & 88
Next i
$ctive"ell.+ffset*2, ;,.$ctivate
Loo#
En( Su.
+ Procedimiento para copiar los datos de (oja. a (oja/
+ ParDmetros4
+ r. C ,elda :rigen
+ r9 C ,elda Eestino
Pri"ate Su. "opiarC.atosC9ojas*r2 A& Range, r' A& Range,
1im i A& ,nteger
1im .atos A& Variant
1im :inal A& ,nteger
+ Si Botn Todo "cti#ado$ se copian todas las columnas
,7 3odo.4alue & 3rue 0hen
:inal & BumC"olumnas E 2
El&e + Slo se copian las dos primera columnas
:inal & 2
En( ,7
+ recorrer las columnas del registro % copiar celda a celda
!or i & ; 3o !inal
+ Si la casilla Ma%&sculas estD acti#ada % el tipo de datos es String
,7 Oayusculas.4alue & 3rue An( 3ypeBame*r2.+ffset*;, i,.4alue, & 81tring8 0hen
.atos & U"ase*r2.+ffset*;, i,.4alue,
El&e
.atos & r2.+ffset*;, i,.4alue
En( ,7
r'.+ffset*;, i,.4alue & .atos
Next i
En( Su.
http%--....cybercursos.net
Pgina 158
Pri"ate Su. .atosC5uscarC"ange*,
+ Si el numero de control estD acti#ado
,7 Bumero.Enabled 0hen
+ No permite coger #alores superiores a la propiedad Ma'
,7 4al*.atosC5uscar.4alue, M Bumero.Oax 0hen
Osg5ox *84alor demasiado grande8,
.atosC5uscar.4alue & Bumero.Oax
El&e
+ No permite coger #alores inferiores a la propiedad Min
,7 4al*.atosC5uscar.4alue, Q Bumero.Oin 0hen
Osg5ox *84alor demasiado pequeLo8,
.atosC5uscar.4alue & Bumero.Oin
El&e
Bumero.4alue & 4al*.atosC5uscar.4alue,
En( ,7
En( ,7
En( ,7
En( Su.
Pri"ate Su. %istaC"amposC"ange*,
1im i A& ,nteger
1im 3ipoC.atos A& String
i & %istaC"ampos.%ist@ndex
,7 i M& ; 0hen
3ipoC.atos & %istaC"ampos."olumn*2, i,
,7 3ipoC.atos & 8B8 0hen
Bumero.Enabled & 3rue
,7 %istaC"ampos.4alue & 8Edad8 0hen
Bumero.Oin & 2=
Bumero.Oax & JJ
Bumero.1mall"ange & 2
.atosC5uscar.4alue & ;
Bumero.4alue&;
En( ,7
,7 %istaC"ampos.4alue & 8"antidad8 0hen
Bumero.Oin & 2;;;;
Bumero.Oax & );;;;;
Bumero.1mall"ange & 2;;;
.atosC5uscar .4alue& ;
Bumero.4alue&;
En( ,7
El&e
Bumero.Enabled & :alse
En(,7
En( ,7
http%--....cybercursos.net
Pgina 159
En( Su.
Pri"ate Su. BumeroC"ange*,
.atosC5uscar.4alue & Bumero.4alue
En( Su.

You might also like