Está en la página 1de 72

CURSO VISUAL BASIC 6

Este es el contenido de esta segunda parte del Apndice A del Curso Bsico de
Programacin con Visual Basic
Introduccin
Empe!ar con el I"E de VB
A#adir controles al $ormulario
Cam%iar el tama#o & posicin de los controles
A#adir ms controles & usar el dise#ador para a'ustar el tama#o & la
posicin
Introduccin
En esta segunda parte del Apndice A del Curso Bsico( )amos a )er cmo a#adir
controles a nuestros $ormularios & cmo con$igurar esos controles( cam%iar los
)alores de las propiedades( etc*
Esto es algo +ue ,ace a#os tendr-a +ue ,a%er ,ec,o( lo s( pero &o es +ue antes
era un poco ms inocente +ue a,ora( & pensa%a +ue los lectores de este curso se
i%an a tomar un poco de ms inters en aprender estas cosas usando la
in$ormacin .o documentacin/ +ue acompa#a%a al Visual Basic*** & creo +ue ,ace
alg0n tiempo as- era*** antes la gente no se me +ue'a%a tanto como a,ora***
seguramente por+ue los lectores eran menos numerosos*** &( posi%lemente( .1uille(
creo +ue de%er-as decir 2presuntamente2( para +ue nadie se sienta 2acusado2/(
por+ue a,ora la gente tiene ms oportunidad de 2conseguir2 gratuitamente el Visual
Basic( .es +ue ,a& 2)ie'os VisualBasikeros2 +ue son mu& caritati)os( no te creas
otra cosa/( & es posi%le +ue no se acompa#e 2ning0n2 tipo de documentacin***
Espero +ue nadie se de por aludido con el comentario anterior( & si es as-( ec,ando
mano del re$ranero3 el que se rasca, es porque algo le pica... .4+ue malo so&5/
La cuestin es +ue( sea como sea( a+u- estn estos apndices( los cuales intentarn
2a&udarte2 en la medida de lo posi%le a +ue aprendas 2me'or2 este +uerido( .al
menos por mi/( lengua'e de programacin*
En este caso seguiremos usando el Visual Basic 6*7 Control Creation Edition
.VB6CCE para los amigos/( &a +ue( al ser un entorno .I"E/ gratuito( todos tendris
la oportunidad de poder 2'ugar2 con l*
En la primera parte de este Apndice A te e8pli+u cmo conseguirlo( cmo
instalarlo & como con$igurar algunas de las opciones & %arras de ,erramientas( as-
+ue*** si a0n no te lo ,as le-do( de%er-as ,acerlo antes de seguir*
9e recuerdo o aclaro +ue todo lo +ue )o& a e8plicar a+u-( estar %asado en el Visual
Basic 6*7 Control Creation Edition( pero tam%in ser )lido para el Visual Basic 6*7
e incluso para el Visual Basic 6*7( pero en algunos casos no ser 2tan e)idente2
para la )ersin :*7( aun+ue en estas $ec,as( esa )ersin &a es ms di$-cil de
encontrar( as- +ue*** si tienes el VB:( intenta amoldarte a las e8plicaciones* ; si no
tienes ninguna de esas )ersiones( &a +ue tra%a'as con el Visual Basic de O$$ice(
pues*** %'ate el VB6CCE & prue%a con lo +ue a+u- )o& a e8plicar o %ien( intenta
amoldarte a como el O$$ice te presente el dise#ador de $ormularios***
La cuestin es +ue si lo a+u- dic,o no se adapta al <77= a lo +ue tu tienes*** 4+ue
te lo curres5 1racias*

Empezar con el IDE de VB: Configurar un formulario.
En cuanto iniciamos el Visual Basic( se nos presenta un cuadro de dilogo para +ue
seleccionemos el tipo de pro&ecto +ue +ueremos crear( .para ms detalles( )er
Iniciar el VB6CCE/( para este e'emplo( elegiremos un pro&ecto normal .Standard
E>E/*
Nota:
Si no se muestra el cuadro de dilogo de nue)o pro&ecto( puede ser +ue ,a&as
marcado la casilla 2Don't show this dialog in the future2( lo cual )iene a decir +ue
no muestre ese cuadro de dilogo nunca ms? si ese es tu caso( tendrs +ue crear
un nue)o pro&ecto seleccionando New Project .@ue)o Pro&ecto/ del men0 File
.Aic,ero/ o %ien pulsando la com%inacin de teclas CtrlB@*
Al crear un nue)o pro&ecto de tipo E>E( tendremos un $ormulario llamado Aorm<*
Por a,ora )amos a de'ar ese nom%re para +ue sea ms $cil de comprender todo lo
+ue )o& a e8plicar*
Vamos a con$igurar el $ormulario para +ue sepas 2adaptarlo2 a tu gusto*
Para poder con$igurar el $ormulario( tendremos +ue tenerlo a la )ista*
Un $ormulario se compone de dos partes3 Lo +ue mostrar & el cdigo*
Para poder a#adir controles al $ormulario o para cam%iar la apariencia del mismo(
tendremos +ue tenerlo a la )ista( es decir( tendremos +ue mostrar el 2dise#ador de
$ormularios2*
Cuando +ueramos usar el dise#ador de $ormularios( tendremos +ue seleccionar el
$ormulario de la )entana de pro&ectos & pulsar la com%inacin de teclas
Ca&0sculasBAD .S,i$tBAD/ o %ien pulsar en el icono con $orma de $ormulario +ue
,a& en la )entana de pro&ectos( .)er $igura </*
Figura 1
Para mostrar la )entana del cdigo( podemos pulsar AD o %ien en el icono +ue est
a la i!+uierda del +ue muestra el $ormulario( .)er $igura </
Una )e! +ue tenemos el $ormulario en modo de dise#o( podemos pulsar A: para
mostrar la )entana de propiedades*
En esta )entana .)er $igura E/ se mostrarn las propiedades +ue podemos cam%iar
mientras estamos 2dise#ando2 el $ormulario( es decir( no se mostrarn todas las
propiedades( &a +ue algunas de ellas puede +ue no sean 2con$igura%les2 en tiempo
de dise#o( es decir( +ue no a$ecten al aspecto )isual*
9am%in ,a& +ue tener en cuenta de +ue( .como compro%aremos en un momento/(
en la )entana de propiedades se mostrarn las propiedades del 2o%'eto2 +ue est
seleccionado* En este caso( se mostrar sin pro%lemas las propiedades del
$ormulario por la sencilla ra!n de +ue no tenemos ning0n otro 2o%'eto2 dentro del
$ormulario .ni en la aplicacin/*
Figura 2, Ventana de propiedade
Como podemos compro%ar( la )entana de propiedades est di)idida en tres partes3
FLa parte superior nos indica el 2o%'eto2 +ue tenemos seleccionado( en este caso es
el $ormulario* Podemos usar esa lista desplega%le para seleccionar el o%'eto +ue
+ueremos con$igurar* A,- se nos indica el nom%re del o%'eto( el cual estar en
negrita( & el tipo de o%'eto se mostrar en letra normal*
FLa parte del centro nos muestra las propiedades( en esa )entana tenemos dos
$ic,as .o solapas/( para mostrar la in$ormacin de $orma al$a%tica .Alp,a%etic/ o
%ien por categor-as .Categori!ed/* En la columna de la i!+uierda est el nom%re de
la propiedad & en la de la derec,a est el )alor*
FEn la parte in$erior tenemos la descripcin de la propiedad +ue tenemos
actualmente seleccionada* En el caso de la $igura E( la propiedad seleccionada es
Caption & a%a'o nos dice .en ingls/ +ue esa propiedad sir)e para mostrar el te8to
en la %arra de t-tulo*
Si +uisiramos +ue en la %arra de t-tulos del $ormulario se mostrara otra cosa
distinta a lo +ue actualmente se muestra( simplemente tendr-amos +ue escri%ir en
la casilla +ue est a la derec,a de la propiedad el te8to +ue +ueremos mostrar*
Las propiedades ms importantes .o las ms usadas/ del $ormulario las iremos
)iendo con algo de detalle en este o en otros 2apndices2* Lo importante es +ue
sepas cmo poder cam%iar los )alores &( si te atre)es( +ue )a&as pro%ando por tu
cuenta & riesgo*** & como resulta +ue &a sa%es cmo cam%iar .& dnde/ cam%iar
esos )alores( a,ora no tienes e8cusa*
Para muestra un %otn3 La propiedad !uto"edra# nos puede ser)ir cuando
+ueremos mostrar las prue%as ,ec,as en las primeras entregas del curso( en las
+ue ten-amos +ue incluir 2S,oG2 al principio del e)ento AormHLoad para +ue se
pudiera )er lo +ue se 2escri%e2 en el $ormulario* Si +ueremos darle un )alor
)erdadero .9rue/ a esa propiedad( simplemente seleccionaremos ese )alor de la
casilla +ue est a la derec,a de la propiedad & asunto arreglado*
9am%in decirte +ue en las )ersiones ms recientes de Visual Basic ,a& ms
propiedades +ue en las )ersiones anteriores( por e'emplo( en la )ersin 6 tenemos
algunas propiedades +ue no esta%an disponi%les en la )ersin :*
9al es el caso de la propiedad +ue le indica a IindoGs dnde de%e situar el
$ormulario cuando se muestre* Si %uscamos la propiedad $tart%p&oition(
tenemos unos )alores a elegir( por de$ecto tendr un )alor de ' ( )indo#
Default( lo cual +uiere decir +ue ser el IindoGs el +ue posicione el $ormulario .o
la )entana/( pero si elegimos el )alor 2 ( Center$creen( el $ormulario se
posicionar en el centro de la pantalla* Si seleccionamos el )alor * ( +anual( el
$ormulario se posicionar en la posicin +ue manualmente le indi+uemos en las
propiedades ,eft & -op* Por 0ltimo( si elegimos 1 ( Ceter.#ner se centrar en el
$ormulario +ue es 2el propietario2( esto lo )eremos cuando se trate el mane'o de
ms de un $ormulario*
Pero de'emos las propiedades del $ormulario( .en otra ocasin intentaremos ,acer
un repaso de algunas de ellas & el e$ecto +ue conseguiremos al aplicar distintos
)alores/( & sigamos )iendo otras cosas*

!/adir controle al formulario.
Esta es otra de las cosas +ue con ms asiduidad ,aremos( &a +ue no es ,a%itual
+ue un $ormulario est )ac-o( sino +ue tenga controles*
Los controles ms usados son las eti+uetas .La%el/( las ca'as de te8to .9e8tBo8/ &
los %otones .CommandButton/( seguidos de las listas .ListBo8/( listas desplega%les
.Com%oBo8/ .+ue algunos traducen tam%in por ca'as com%inadas/( los C,ecJBo8 &
OptionBo8 .o RadioButton/ & por 0ltimo los controles +ue suelen ,acer de
contenedores de otros controles3 los marcos .Arame/ & los cuadros de imgenes
.PictureBo8/*
Empecemos a#adiendo una eti+ueta( una ca'a de te8tos & un %otn*
Para a#adir cual+uier control al $ormulario( usaremos la %arra de ,erramientas +ue
est en la parte i!+uierda del I"E de Visual Basic .)er $igura K/*
Figura '
Si posicionas el ratn encima de los iconos( te mostrar un 9ool9ip .una ca'ita
emergente/ con el nom%re del control*
La eti+ueta es la ! +ue ,a& en la segunda $ila de controles( la ca'a de te8tos es el
+ue est a la derec,a( tam%in en la segunda $ila & el %otn es el +ue est a la
derec,a en la tercera $ila*
Para a#adir un control( podemos ,acer do%le pulsacin .do%leFclicJ/ so%re el
elemento de la %arra de ,erramientas & se a#adir al $ormulario( posicionndose en
el centro del mismo & teniendo el tama#o predeterminado*
9am%in podemos pulsar una )e!( & a continuacin 2di%u'arlo2 en el $ormulario(
dndole el tama#o +ue +ueramos & posicionndolo tam%in en el sitio +ue
+ueramos*
Por a,ora )amos a elegir el primer mtodo & despus cam%iaremos el tama#o &
posicin*
La! do%leFclicJ en la eti+ueta( esto a#adir una eti+ueta al $ormulario( el nom%re
de ese o%'eto se llamar La%el<( para cam%iar la posicin de la eti+ueta La%el<(
podemos seleccionarla en el $ormulario & mo)erla con el ratn* Vamos a situarla en
la parte superior i!+uierda( para +ue de'e el centro del $ormulario li%re( &a +ue el
resto de los controles se posicionarn en el mismo sitio & si de'amos la eti+ueta a,-
& a#adimos nue)os controles( los nue)os controles ocultarn la eti+ueta*
A continuacin a#adiremos una ca'a de te8tos( por tanto ,a! do%leFclicJ en el icono
correspondiente & una )e! +ue est incluido en el $ormulario( lo posicionaremos en
la parte superior( a la i!+uierda de la eti+ueta* El nom%re +ue tendr esa ca'a de
te8tos ser 9e8t<*
Por 0ltimo a#adiremos un %otn( as- +ue pulsa en el icono correspondiente & d'alo
donde lo ,a posicionado el dise#ador de $ormularios( el nom%re +ue tendr ser
Command<*
El aspecto del $ormulario con estos controles ser el mostrado en la $igura :*
Figura 0
A-'ate en los nom%res de los controles( +ue son los mismos +ue los 2te8tos2
mostrados* El dise#ador de $ormularios de Visual Basic siempre )a nom%rando los
controles usando el mismo 2algoritmo2( .dic,o as- parece ,asta algo importante( 'e(
'e/( osea3 usando un nom%re 2reducido2 del tipo de control seguido de un n0mero(
el cual se )a incrementando cada )e! +ue a#adimos un nue)o control del mismo
tipo* Si a#adimos una nue)a eti+ueta .control La%el/( M+u nom%re tendr-aN .la
respuesta dentro de un ratillo/*

Cam1iar el tama/o 2 poicin de lo controle.
Por regla general( no se suelen de'ar los controles con el tama#o +ue el dise#ador
le ,a dado al insertarlos en el $ormulario( por tanto( ser algo ,a%itual el +ue
tengamos +ue cam%iar el tama#o de los controles*
Ese cam%io del tama#o de los controles podemos ,acerlo de dos $ormas distintas3
1. Usando el dise#ador de $ormularios & el ratn( para ello simplemente
tendremos +ue seleccionar el control +ue +ueramos redimensionar(
mantener el ratn pulsado en el %orde +ue nos interese usar para cam%iar el
tama#o & a'ustarlo a nuestro gusto*
Por e'emplo( para cam%iar la altura del %otn( pulsaremos en ese control( &
desde el %orde in$erior iremos cam%iando el tama#o( por e'emplo( para +ue
tenga una altura de KD6( )er la $igura 6* Si +ueremos cam%iar( en una sola
accin( tanto el anc,o como el alto( podemos ,acerlo desde una de las
es+uinas del control( )er la $igura 6*
Cientras se est cam%iando el tama#o del control( se mostrar un 29ool9ip2
con el nue)o tama#o*
2. La segunda $orma de cam%iar el tama#o es usando la )entana de
propiedades & usar las propiedades 3eig4t & )idt4( las cuales cam%iarn
respecti)amente la altura & anc,ura del control*
Figura 5
Figura 6
Vamos a cam%iar el tama#o de los controles para +ue tengan los +ue a+u- te indico3
La eti+ueta .La%el</( tendr un tama#o de <E:6 8 E66 .anc,o 8 alto/
La ca'a de te8tos .9e8t</( tendr un tama#o de EOP6 8 K<6
El %otn .Command</( tendr el tama#o <E:6 8 KD6
Para cam%iar la posicin de los controles( como puedes imaginarte( tam%in
podemos ,acerlo de dos $ormas( arrastrando el control ,asta la nue)a posicin o
%ien asignando )alores a las propiedades ,eft & -op( las cuales representarn los
)alores i!+uierdo & superior respecti)amente*
Posiciona la eti+ueta en la posicin <O7( <67 .i!+uierda( arri%a/( la ca'a de te8tos en
la posicin <667( <E7 & el %otn d'alo en el mismo sitio +ue esta%a3 <D:7( <K67*
Nota:
Como te coment en la primera parte del Apndice A( podemos cam%iar el
espaciado de puntos del grid .o re'illa/ del dise#ador de $ormularios( en a+uella
ocasin te di'e +ue usaras 67 8 67( pero &o suelo usar K7 8 K7( por tanto para +ue
los controles se 2puedan mo)er2 en tiempo de dise#o a las posiciones +ue te indico(
es posi%le +ue tengas +ue cam%iar esos )alores( .)er la $igura : de la primera parte
del Apndice A/*
9odos estos cam%ios son en tiempo de dise#o( es decir( mientras estamos
2dise#ando2 el $ormulario( &a +ue esos a'ustes de tama#o tam%in podemos ,acerlo
en tiempo de e'ecucin( es decir( cuando pulsemos A6 para e'ecutar la aplicacin*
El sitio ,a%itual para ,acer esos cam%ios en tiempo de e'ecucin es en el e)ento
Load del $ormulario o %ien en el e)ento Resi!e del mismo* Aun+ue( la )erdad sea
dic,a( no es com0n cam%iar el tama#o de los controles( sal)o en contadas
ocasiones( por e'emplo( cuando +ueremos adaptarlos al nue)o tama#o del
$ormulario( etc*( pero ese tema no lo )amos a )er( al menos a,ora( &a +ue( aun+ue
sea de paso( se toc en la entrega )eintinue)e*
Las propiedades Le$t( 9op( Leig,t & Iidt, tam%in las podemos usar en tiempo de
e'ecucin para asignar un nue)o )alor en cual+uiera de ellas( 9am%in +uiero
2recordarte2 +ue e8iste un mtodo en casi todos los controles .incluso en los
$ormularios/ +ue sir)e para cam%iar la posicin &Qo el tama#o de los controles de
una )e! .es decir con una sola instruccin/? ese mtodo es3 +o7e & se usa de la
siguiente $orma3
RcontrolS*Co)e I!+uierda( Arri%a( Anc,o( Alto
El 0nico )alor re+uerido es el primero .posicin i!+uierda/( pero si se especi$ica
cual+uiera de los otros tres( los anteriores tam%in se de%en especi$icar? aun+ue los
siguientes no tenemos la o%ligacin de indicarlos( adems de +ue seguirn
conser)ando los )alores +ue &a tu)ieran* Por e'emplo( si slo +ueremos cam%iar la
posicin del control( podemos indicar los dos primeros parmetros de ese
procedimiento* Pero si adems de la posicin +ueremos cam%iar el alto( estamos
o%ligados a indicar tam%in el alto*** &a +ue no podemos de'ar ese 2,ueco2*
Como conse'o( decirte +ue es ms 2rpido2 usar el mtodo Co)e +ue asignar
indi)idualmente las propiedades*
Otra cosa( la posicin siempre se considera relati)a a la posicin superior i!+uierda
del $ormulario( la cual estar indicada por 7(7* El $ormulario a su )e! estar
posicionado relati)amente a la pantalla .Screen/( considerndose igualmente +ue la
posicin superior i!+uierda es la posicin 7(7*

!/adir m8 controle 2 uar el die/ador para a9utar
el tama/o 2 la poicin.
Una )e! +ue tenemos estos controles( pueden ocurrir dos cosas( +ue lo de'emos
como est( por+ue no necesitemos ms controles( o %ien +ue +ueramos a#adir ms
controles( & puede +ue ,asta ocurra +ue lo +ue necesitemos sea a#adir ms
eti+uetas & ca'as de te8tos( los cuales +ueremos +ue tengan el mismo tama#o +ue
los +ue &a tenemos*
Esto es algo ,a%itual & mu& com0n( por e'emplo si +ueremos ,acer un $ormulario
+ue pida datos al usuario*
Para )er cmo solucionar de una $orma $cil & rpida esta situacin( )amos a a#adir
dos nue)as eti+uetas & dos ca'as de te8tos* :Epera; -ran<ui... no te precipite,
<ue te 7o2 a e=plicar un par de tru<uillo...
Esto podemos ,acerlo como te ,e e8plicado ,ace unos prra$os( es decir( ,aciendo
do%leFclicJ so%re el icono en la %arra de ,erramientas( pero tam%in podemos
,acerlo de otra $orma* A,ora )eremos estos dos sistemas( para +ue practi+ues un
poco & de paso te e8plico cmo usar algunas de las 2$acilidades2 +ue nos da el
dise#ador de $ormularios*
Empecemos usando la $orma 2clsica2( es decir ,acer do%leFclicJ so%re el icono de
la %arra de ,erramientas*
A#ade una eti+ueta & una ca'a de te8tos( estos dos controles estarn a,ora
posicionados en el centro del $ormulario( si no ,as cam%iado el %otn del sitio +ue
esta%a( la ca'a de te8tos ,a%r ocultado tanto la eti+ueta como el %otn* @o te
preocupes( &a +ue esto es algo +ue puede ocurrir & siempre es %ueno sa%er cmo
2salir del paso2*
As- +ue( seleccionaremos la ca'a de te8tos( para seleccionarla( simplemente pulsa
U@A )e! en ella( a,ora ,aremos +ue tenga el mismo tama#o +ue la otra ca'a*
Cantn pulsada la tecla Control .Ctrl/ & ,a! un clicJ en la otra ca'a de te8tos .la
+ue tenemos en la parte de arri%a/( de esta $orma tendremos las dos ca'as
seleccionadas*** .1uille( dile +ue &a puede soltar la tecla Control/* A,ora para
cam%iar el tama#o & ,acer +ue las dos tengan el mismo tama#o( podemos ,acerlo
de dos $ormas( .como )iene siendo ,a%itual/( la primera( ser-a mostrando la
)entana de propiedades & asignado a las propiedades Leig,t & Iidt, un )alor( el
cual se asignar a los controles +ue estn seleccionados( .esta es la $orma +ue &o
lo ,e estado ,aciendo durante un montn de tiempo( incluso tra%a'ando con el VB6
& 6( la $uer!a de la costum%re/( pero ,a& otra $orma ms 2prctica2 & es mediante
el men0 Format .Aormato/( seleccionando el su%Fmen0 ake !ame !i"e .,acer del
mismo tama#o/( el cual a su )e! nos mostrar tres opciones3 #idth .anc,o/( $eight
.alto/( Both .am%os/( por tanto seleccionaremos la 0ltima3 Bot,( de $orma +ue se
,agan iguales tanto en altura como en anc,ura( )er la $igura D*
Figura >, El men? Format
"e ese mismo men0 Format( podemos seleccionar %lign .alinear/ para +ue estn
alineados a la i!+uierda( por tanto( selecciona la opcin &efts de AormatSAlign( .se
supone +ue los dos controles siguen estando seleccionados/*
Otra cosa +ue podemos ,acer es pegar el segundo control al primero( de $orma +ue
estn 2'untitos2( pero no re)ueltos( para ello( selecciona Format'Vertical
!pacing'(emo)e & los dos controles estarn 'untos( uno de%a'o de otro* Por a,ora
)amos a de'ar los controles 2pegados2*
Nota:
"ecirte +ue cuando seleccionamos controles para usar las opciones del men0
Aormat( el 0ltimo +ue se ,a&a seleccionado ser el +ue 2tenga el mando2 & el resto
se adaptar a ese 0ltimo control seleccionado*
Una )e! +ue ,emos cam%iado el segundo te8t%o8 de sitio( en el centro del
$ormulario tendremos el %otn & 2de%a'o2 estar la eti+ueta( como resulta +ue la
eti+ueta es ms alta +ue el %otn( de%a'o del %otn so%resaldr la eti+ueta( as-
+ue( podemos seleccionarla( pulsar la tecla Control & pulsar so%re la otra eti+ueta &
,aremos lo mismo +ue con la ca'a de te8tos( Format'ake !ime !i"e'Both & a
continuacin Format'%lign'&efts & por 0ltimo3 Format'Vertical !pacing'(emo)e*
-ruco:
9am%in puedes seleccionar esa eti+ueta usando la )entana de propiedades( de la
lista desplega%le( selecciona La%elE & a,ora pulsa la tecla Control( etc*( es decir( si
no puedes seleccionarla en el $ormulario( por+ue est oculta( por e'emplo( siempre
nos +ueda el recurso de seleccionarla desde la )entana de propiedades*
A,ora tendremos las dos eti+uetas & las dos ca'as de te8tos del mismo tama#o &
con la misma posicin i!+uierda( aun+ue demasiado pegados con sus compa#eros(
as- +ue a,ora( manualmente( )amos a cam%iar la posicin* Ba'a un po+uito la
segunda ca'a de te8tos & posiciona la eti+ueta K7 puntos ms %a'o +ue la ca'a de
te8tos( .+ue es una distancia 2con)eniente2/( es decir si el )alor de la propiedad 9op
de la segunda ca'a de te8tos .9e8tE/ tiene un )alor de 6<7( la segunda eti+ueta
.La%elE/ de%er-a tener 6:7*
A,ora )amos a a#adir una nue)a eti+ueta & una ca'a de te8tos( pero usando otro
2truco2*
En este caso( tam%in +ueremos +ue tanto la eti+ueta como la ca'a de te8tos
tengan el mismo tama#o +ue las dos 0ltimas +ue aca%amos de a#adir( por tanto(
selecciona la eti+ueta & la ca'a de te8tos +ue est a su derec,a? &a sa%es cmo
,acerlo3 selecciona la eti+ueta & manteniendo pulsada la tecla Control( pulsa en la
ca'a de te8to( aun+ue tam%in puedes ,acerlo de otra $orma3 primero pulsa en
cual+uier parte del $ormulario para +uitar cual+uier seleccin +ue ,u%iera( a
continuacin( con el ratn( selecciona la eti+ueta & la ca'a de te8tos( .de la misma
$orma +ue seleccionar-as )arios o%'etos en cual+uier aplicacin( incluso en el
e8plorador de IindoGs( )er la $igura O/
Figura @
Una )e! +ue tenemos los dos controles seleccionados( copiaremos los dos controles(
%ien mediante el men0 *dit'+op,( %ien mediante el men0 conte8tual .pulsando con
el %otn secundario del ratn/ & seleccionando +op, .Copiar/*
A,ora )amos a pegar lo +ue ,emos copiado( &a sa%rs cmo*** .)er la $igura P/
Figura A
Al pulsar en pegar( se nos mostrar un cuadro de dilogo preguntndonos si
+ueremos crear un arra& de controles( .)er la $igura <7/( pulsa en el %otn @O( &a
+ue no +ueremos crear ning0n arra& de controles* Primero te preguntar por si
+uieres crear el arra& de La%elE & despus de 9e8tE .aun+ue puede +ue el orden
sea al re)s( pero eso no es importante/*
El tema de los arra&s de controles( lo )imos en la segunda parte de la entrega <<*
Figura 1*
Esto ,ar +ue se 2peguen2 dos nue)os controles( los cuales tendrn el mismo
tama#o +ue los copiados( incluso estarn posicionados 2relati)amente2 a la misma
distancia( pero se pegarn en la parte superior del $ormulario( como estarn los dos
seleccionados( podemos arrastrarlos ,asta +ue estn en la posicin +ue +ueramos(
en este caso( los posicionaremos de%a'o de los anteriores* Si necesitas a'ustar las
posiciones( &a sa%es +ue puedes recurrir al men0 Aormat & posicionarlos
correctamente*
Un detalle a tener en cuenta( es +ue los controles tendrn como nom%re La%elK &
9e8tK( pero mostrar el mismo 2te8to2 +ue los dos +ue se usaron para la copia*
Para cam%iar el te8to mostrado( tendrs +ue asignar un )alor a la propiedad
Caption de la eti+ueta & para cam%iar el te8to mostrado en la ca'a de te8tos(
tendrs +ue cam%iar la propiedad -e=t*

Nota:
Como puede ser +ue te ,a&a ocurrido( so%re todo si no tienes muc,a prctica con el
ratn o %ien por+ue tu ratn sea mu& sensi%le( es posi%le +ue al 2intentar2 ,acer un
clicJ en un control( realmente ,a&as ,ec,o un do%leFclicJ( si es eso lo +ue te ,a
ocurrido( )ers +ue se muestra la )entana de cdigo con el e)ento
2predeterminado2 de ese control( no te preocupes( simplemente cierra la )entana
de cdigo & )uel)e a intentarlo*

A,ora &a sa%es dnde est el men0 Aormat( as- +ue*** 'uega un po+uito con las
distintas opciones & practica( por e'emplo centrando los controles en el $ormulario(
etc*

A,ora +ue ests entretenido 2'ugueteando2 con las opciones del men0 Aormat(
)amos a de'ar a+u- esta segunda parte del Apndice A( entre otras cosas( por+ue te
,e e8plicado lo +ue +uer-a e8plicarte3 cmo agregar controles a un $ormulario(
poder cam%iarle el tama#o & posicin( as- como e8plicarte cmo cam%iar otras
propiedades*** adems de +ue &a se ,a ,ec,o un po+uito larga*** .'e( 'e*** es una
e8cusa como otra cual+uiera/*
En otra ocasin )eremos ms cosillas +ue podemos ,acer con el I"E de Visual
Basic( as- como otras cosas relacionadas con los controles & $ormularios*
Espero +ue estos apndices )a&an rellenando las lagunas +ue se ,a&an +uedado en
las entregas 2normales2*
@o te )o& a adelantar ms cosas +ue contendrn estos apndices( pero si te dir
+ue no se +uedarn en cosas relacionadas con el I"E .entorno de desarrollo/(
pero*** como siempre( tendrs +ue esperar para poder sa%er de +u tratarn***
mientras tanto( sigue practicando & le&endo cosas so%re el Visual Basic*
LECCION 1
A estas alturas no es $cil ,acer un curso de introduccin a la programacin con
Visual Basic* Si $uese a ra-! de la primera o segunda )ersin( incluso con la tercera(
ser-a ms $cil* Pero a,ora est ms crudo( por a+uello de +ue soporta <6 & KE %its
& te en$ocas en una u otra direccin o***
Pero como el t-tulo indica( esto ser una cosa para introducir al +ue +uiere empe!ar
a programar( incluso para el +ue )iene de otro lengua'e( aun+ue seguramente(
so%re todo al principio( se encontrar con conceptos demasiados 18ico*
Como este curso no se pu%lica so%re algo +ue &a est terminado( ir ,acindolo
so%re la marc,a( espero tus indicaciones so%re si )o& demasiado rpido o si
realmente me esto& pasando en cuanto a Tsimple!aT* "e cual+uier $orma( me
gustar-a o-r tu comentario & tus impresiones( eso me animar a seguir & so%re todo
a terminar*
Bueno, manos a la obra.
A ver como me sale el tema, (al final no he encontrado los auntes !ue "a ten#a hechos,
de cuando daba clases a ni$os " a no tan ni$os, de esto hace "a 1% a$illos de nada&
Lo advierto, a los !ue saben al'o " a los !ue lo saben todo (o casi todo&, lo !ue viene a
continuaci(n es super bsico. ) ensando tambi*n en los !ue or una ra+(n u otra no
tienen unos conocimientos !ue a otros les arecer, absurdo, s* !ue a-n ha" 'ente !ue
no tienen ni .rea/olera. idea de lo !ue es una e0resi(n, una variable " ni !ue decir tiene
sobre las matrices, los n-meros binarios o la notaci(n he0adecimal...
BCue e una 7aria1leD
En cual+uier programa siempre necesitaremos ,acer clculos( usar in$ormacin(
procesarla & mostrarla*
En la ma&or-a de los casos( necesitaremos un lugar temporal en el cual guardar
parte de esa in$ormacin( incluso toda*
9odos los lengua'es( & el Basic no i%a a ser menos( nos permiten guardar datos en
la memoria( para +ue cuando los necesitemos( podamos tomarlos( modi$icarlos &
)ol)erlos a guardar para usarlos ms tarde* Si no seguimos unas normas o usamos
unas reglas( de poco nos i%a a ser)ir el guardar esa in$ormacin( si despus no
podemos almacenarla en ning0n sitio( pero ese ser tema de otro cap-tulo*** a,ora
centrmosno en la memoria*
B,a memoriaD Espero +ue este concepto lo tengas claro( pero si no es as-( a,- )a
un poco de TrolloT3
La memoria es el lugar donde el ordenador almacena de $orma temporal los
programas & parte de la in$ormacin +ue necesita o utili!a* As- pues( los lengua'es
de programacin usan tam%in esa memoria para guardar in$ormacin propia del
lengua'e & del programa +ue +ueramos reali!ar*
El programa una )e! +ue se est e'ecutando puede necesitar tam%in guardar
in$ormacin( aun+ue esta in$ormacin slo estar disponi%le mientras se est
e'ecutando* Esas posiciones o lugares de la memoria donde los programas pueden
almacenar in$ormacin son las 7aria1le* El +ue se llamen de esta $orma es por+ue
podemos ,acer +ue el contenido de ese lugar de almacenamiento 7arEe( es como si
tu)isemos una serie de ca'as & en ellas pudisemos guardar cosas( con la
sal)edad de +ue en cada ca'a slo puede ,a%er una cosa a la )e!? aun+ue tam%in
)eremos cmo ,acer +ue el contenido pueda )ariar & +ue )ar-e dependiendo de lo
+ue conten-a antes***
Veamos un e'emplo3
Imag-nate +ue +uieres guardar tu nom%re en una )aria%le( para ello tendr-amos
+ue TguardarT el nom%re en la memoria( es decir asignar a una )aria%le un )alor* En
este caso nuestro nom%re* Para ello el lengua'e de programacin pone a nuestra
disposicin unos lugares donde almacenar nuestro nom%re( pero nos impone una
serie de reglas de conducta*
Si +ueremos guardar en una de nuestras ca'as una ,o'a( por lo menos tendremos
una ca'a con el tama#o adecuado & +ue tenga una T$ormaT( para +ue el papel no
)uele al menor soplo de )iento*
Eta e la regla 18ica para poder uar eo lugare de almacenamiento
F7aria1leG3
Llamar a esas posiciones de memoria con un nom%re* Simple( M)erdadN
En principio( es todo el re+uisito necesario3 +ue le demos un nom%re al sitio en el
+ue +ueremos guardar la in$ormacin*
Por tanto( si +ueremos guardar un nom%re( .el nuestro( por e'emplo/( en la
memoria( podr-amos llamarlo nombre*
; a,ora tendremos +ue seguir otra norma de conducta .o $uncionamiento/( +ue en
este caso el lengua'e Basic nos dicta3
Para guardar en una )aria%le .posicin de memoria/ algo( de%es ,acerlo de la
siguiente manera3
FFFPon el nom%re con el +ue +uieres llamar a esa parte de la memoria(
FFFa continuacin pones el signo igual .U/ &
FFFdespus lo +ue +uieras guardar*
Por tanto para guardar Guillermo en la )aria%les nombre( tendr-amos +ue ,acer
.o casi/3
Nombre = Guillermo
Pero esto pod-a lle)ar a con$usin( &a +ue el Basic no nos dice nada so%re cmo
de%emos llamar .o si lo pre$ieres( cmo ,a& +ue escri%ir/ el nom%re de una
)aria%le( por tanto Guillermo tam%in podr-a ser una )aria%le( .es +ue el Basic( a
pesar de +ue lle)o tantos a#os %regando con l( no sa%e +ue ese es mi nom%re555/*
As- pues( cuando +ueramos guardar en una )aria%le una pala%ra( una $rase(
nom%re o cual+uier tipo de in$ormacin al$a%tica( tendremos +ue indicarlo
poniendo dic,a in$ormacin dentro de comillas do%les( el e'emplo +uedar-a as-3
Nombre = "Guillermo"
A,ora no ,a& con$usin posi%le( ,emos seguido lo +ue el Basic nos ,a dic,o3
)aria%le( signo igual( )alor a almacenar*
Si +ueremos guardar un n0mero en una )aria%le( la cosa es ms simple3
Numero = 7
M9e ests enterandoN
Pero( M+ue ocurre si +uisiramos repetir D )eces a 1uillermoN
Podr-as ,acer esto( multiplicar a 1uillermo por D .como no ,a& %astante con uno***/
Paliza = "Guillermo" * 7
Pero el Basic te dir-a +ue eso no est %ien( no por+ue 1uillermo .&o/ no sea un
pali!a( sino por+ue te dir-a +ue no coinciden los tipos .9&pe Cismatc,/
BCue on lo tipoD Los distintos tipos de datos* .+ue es$uer!o mental***/
Los datos pueden ser( %sicamente( de dos tipos3
NumHrico3 slo n0meros &
!lfanumHrico3 cual+uier cosa( letras &Qo n0meros( pero es tratada como si
$uesen pala%ras( $rases( etc*
Para el Basic D & 2D2 son dos tipos de datos di$erentes*
El primero es el n0mero D & en el segundo caso( es el literal .o pala%ra/ 2D2
As- +ue cuando )eas algo entrecomillado( piensa +ue no es un n0mero( sino una
pala%ra .ms )ulgarmente llamada cadena de caractere o tring en ingls/
Lemos )isto +ue no podemos multiplicar una pala%ra .cadena/ por un n0mero(
pero si podemos multiplicar una )aria%le por un n0mero .siempre +ue la )aria%le
sea numrica( por supuesto/
Seg0n esto( el Basic de%er-a permitir ,acer esto3
Guillermo = 5
Paliza = Guillermo * 7
El Basic tomar-a el 5 & lo almacenar-a en una )aria%le numrica llamada
Guillermo*
"espus se encuentra con3 Paliza = Guillermo * 7 & a+u- lo +ue ,ace es e)aluar
la e8presin +ue est despus del signo igual( lo calcula & el resultado lo guarda en
la )aria%le +ue est a la i!+uierda del signo de asignacin .U/
BE=preinD E8presin es cual+uier cosa +ue el Basic tenga +ue TdesglosarT para
poder entenderla( incluso a )eces ni eso***
Por e'emplo cuando el Basic se encuentra con 5 * 2 tiene +ue Te)aluarT lo +ue
signi$ica( para poder ,acer el clculo( de esta $orma sa%r +ue tenemos una
operacin en la cual +ueremos multiplicar dos n0meros( una )e! +ue ,a e)aluado
nuestra intencin de multiplicar esos dos n0meros( e$ectuar el clculo &
almacenar el resultado en*** si no le decimos dnde( lo ,ar en una memoria +ue
tiene para esas cosas( pero si no le indicamos +ue de%e ,acer con ese resultado(
nos dar un error***
Si le decimos simplemente3 5 * 2
El Basic no sa%r +ue ,acer con el resultado de esta Te8presinT .+ue por cierto es
<7/ & nos dir3
o te epa1ila o lo tiene crudo conmigo*
As- +ue lo ms 'uicioso ser-a decirle3 )ale( )ale( gurdalo en una )aria%le( as- +ue3
Resultado = 5 * 2 guardar-a un <7 en la )aria%le Resultado*
9am%in podr-amos decirle +ue nos mostrara el resultado( en lugar de guardarlo en
una )aria%le( & a+u- llega nuetra primera intruccin: &rint* Con ella le
decimos al Basic +ue lo imprima .o sea +ue los muestre( ms adelante )eremos
dnde/( seg0n lo dic,o( ,aciendo esto3
Print 5 * 2( el Basic dir-a +ue mu& %ien & mostrar-a un <7
Pero( )ol)amos al Paliza del Guillermo( es decir al e'emplo de Paliza =
Guillermo * 7
Si +uisiramos mostrar el )alor de Paliza( tendr-amos +ue ,acer algo como esto3
Print Paliza( & nos mostrar-a K6( &a +ue el )alor de Paliza ser-a K6( por+ue el
contenido de Guillermo es 6 & 5 * 7 es K6 .& sin calculadora555/
Veamos si es cierto +ue Guillermo )ale 6* Laciendo Print Guillermo( mostrar un
6*
Antes de seguir TimaginandoT las cosas( )amos a )erla en $uncionamiento* Es decir
)amos a pro%ar +ue todo esto es cierto*
Carga el Visual Basic .si es +ue a0n no lo ,as ,ec,o/*
9e crear un Aorm nue)o( +ue estar )ac-o*
Cirralo & muestra la )entana de cdigo*
Costrar la parte de las declaraciones 1enerales del Aormulario*
Si tiene escrito Option E8plicit( .estar en la parte superior/( %rralo( ms adelante
te e8plicar para +ue sir)e*
A,ora sit0ate en Aorm .seleccinalo de la lista desplega%le +ue est a la i!+uierda/(
te mostrar3
Private Sub Form_Load()
End Sub
Sit0ate en medio( es decir( en una l-nea en %lanco despus del Pri)ate*** & escri%e el
e'emplo( +uedar-a as-3
Private Sub Form_Load()
Show
Guillermo = 5
Paliza = Guillermo * 7
Print Paliza
End Sub
Pulsa A6( para e'ecutar el programa( & )ers +ue se escri%e el K6*
Bien( &a tienes una $orma de mostrar datos* A,ora )eamos otros e'emplos( antes
de%es parar el programa( para ello cierra el Aorm( pulsando en el %otn +ue tiene
una >( o %ien pulsa en el %otn detener de la %arra de ,erramientas del VB*
Sit0ate de nue)o en el cdigo del AormHLoad( escri%e despus de la l-nea del Print(
lo siguiente3
Print Guillermo
Pulsa de nue)o A6 & )ers +ue a,ora adems del K6( ,a& un 6 de%a'o* El )alor de la
)aria%le 1uillermo*
Pero( M+ue ocurrir-a si cam%isemos el )alor de 1uillermoN
A#ade estas l-neas a continuacin de la anteriores( para +ue +uede de esta $orma3
Private Sub Form_Load()
Show
Guillermo = 5
Paliza = Guillermo * 7
Print Paliza
Print Guillermo
Guillermo = 1
Print Guillermo
Print Paliza
End Sub
"espus de pulsar A6( te mostrar los siguientes )alores .cada n0mero en una
l-nea/( K6( 6( <7( K6
MEspera%as +ue el 0ltimo $uese D7N
A-'ate +ue cuando asignamos a Paliza el contenido de Guillermo( ste era 6( por
tanto el Basic e)alu la e8presin 6 V D & almacen el resultado .el K6/* Una )e!
almacenado el resultado( el Basic se ol)id de dnde ,a%-a sacado ese 6*
Si +ueremos +ue se TactualiceT el )alor de Paliza( tendremos +ue indicrselo de
nue)o al Basic( para +ue )uel)a a e)aluar la e8presin & ,acer la correspondiente
asignacin* Para ello( pon en medio de los dos 0ltimos prints la siguiente
asignacin3
Paliza = Guillermo * 7
Esta )e!( al e'ecutar el programa( mostrar un D7( +ue ser el nue)o contenido de
Paliza*
;a para terminar( %orra todo lo anterior & escri%e3 .por supuesto de%es detener el
programa***/
Private Sub Form_Load()
Show
!ombre = "Guillermo"
Print !ombre
End Sub
Pulsa A6 & )ers +ue se muestra el contenido de la )aria%le Nombre( es decir
1uillermo*
Prue%a a,ora con esto otro .es un clsico/3
Print "Hola Mundo"
; para rematar( & de camino )er otra posi%ilidad del Print( escri%e en lugar del
Print Nombre3
Print "Hola " ; Nombre
El punto & coma( se usa para indicarle al Basic +ue se de%en mostrar las cosas una
a continuacin de la otra*
A,ora te ,a%r mostrado3 Lola 1uillermo( $-'ate +ue despus de ,ola & antes de
cerrar las comillas ,a& un espacio*
Bien( creo +ue con esto es su$iciente por ,o&*** o por a,ora*
No 7emo(
Nota: En todo lo F."+I,.!D de1er8 poner $3.) al
principio para <ue e muetre lo <ue e imprime.
,ECCI.N 2
Realizamos programas para la gestin de empresas. Empresas medianas y pequeas.
Programas de contabilidad, cartera de pedidos clientes proveedores, facturacin
control de albaranes, tesorera cartera de cobros y pagos y estadsticas.
Nuestro agradecimiento a todos los que por unas causas o por otras visitan nuestra
eb. !estin de empresas P"#E$. %urso de programacin de &isual 'asic.
Seguimos con este cursillo %sico* Antes de nada una pe+ue#a aclaracin( para +ue
los e'emplos +ue se dieron en la entrega anterior( de%ers poner un S,oG en el
$orm Load antes de los Prints( para +ue se muestre algo*** sino no se )er nada*
Una )e! ,ec,a esta pe+ue#a puntuali!acin( )amos a la tarea*
El tema de ,o& ser so%re el mane'o de entrada de datos & una $orma un poco ms
prctica de mostrar los datos( empe!aremos a )ernos &a con lo +ue es programar
con IindoGs( es decir el mane'o de e)entos( o al menos el mo)ernos dentro de los
e)entos & sa%er 2controlarlos2 para las cosas +ue +ueramos ,acer*
Con el 2%asic clsico2( no ,a%-a pro%lemas* Las cosas se produc-an de $orma lineal(
es decir empe!a%an por el principio del programa & se i%an e'ecutando a medida
+ue se a)an!a%a por l* Sal)o en las ocasiones en las +ue en un momento dado
2salt%amos2 a otro sitio( pero era por+ue nosotros as- lo ,a%-amos programado* "e
una $orma u otra ten-amos control total so%re lo +ue pod-a ocurrir* Pero en IindoGs
.o los entornos dominados por los e)entos/( la cosa no es tan sencilla*
"e%emos controlar todas .o casi/ las posi%ilidades +ue se pueden producir***
Antes )amos a de'ar un par de cosillas claras* Seg0n como tengas con$igurado el
entorno de desarrollo( ,a%rs tenido pro%lemas con los e'emplos de la entrega
anterior* La ra!n es +ue el Visual Basic nos permite controlar un poco me'or el
tema de las )aria%les +ue +ueremos usar* Ese control lo da la instruccin3 .ption
E=plicit* Si ponemos esto en la parte destinada a las declaraciones de cual+uier
mdulo( nos o%ligar a declarar las )aria%les +ue )amos a usar en dic,o mdulo*
En el 0ltimo e'emplo de la entrega anterior( ten-amos una )aria%le llamada @om%re(
en la cual almacenamos un nom%re( por tanto podr-amos ,a%erle a)isado a Visual
Basic +ue reser)ara espacio para una )aria%le( & para ,acerlo usamos la
intruccin DI+( con sta le indicamos +ue nos guarde un 2cac,illo2 de la
memoria para nuestro uso3
Dim Nombre
9am%in nos o$rece una )ariante con respecto al 2%asic clsico2 & es( precisamente(
el tipo de datos 7ariant* Con este tipo podemos asignar a una )aria%le cual+uier
tipo de dato* "esde un n0mero ,asta una cadena de caracteres( pasando por
cual+uier tipo de o%'eto +ue Visual Basic pueda mane'ar .ms o menos/*
Los +ue ,a&an tenido e8periencias anteriores( con Basic u otro lengua'e( sa%rn
+ue cada )aria%le de%e ser del tipo de datos +ue +ueramos asignarle* En VB por
supuesto esto tam%in es posi%le & recomenda%le*
;a )imos +ue los tipos de datos pod-an ser numricos o de caracteres* Pero dentro
de los numricos( tenemos cuatro tipos %sicos3 enteros( enteros largos( simples &
do%les* Cada uno de ellos tienen unas capacidades determinadas( adems de
ocupar ms memoria o menos( .a,ora lo )eremos/( lo ms importante es +ue los
n0meros enteros & entero largo slo admiten n0meros enteros .de a,- sus
nom%res/( es decir +ue no admiten decimales* Sin em%argo los otros dos si admiten
decimales*
Estas capacidades puedes encontrarlas en el manual del %asic o en la a&uda( lo +ue
a mi me interesa +ue sepas es cmo poder indicarle al Visual Basic +ue reser)e ese
espacio de memoria para un tipo determinado* ;a te ,e dic,o +ue el espacio +ue
ocupa en memoria es di$erente para cada uno de estos tipos( )eamos en la
siguiente ta%la cmo declararlos & cuanto ocupa3
-ipo
Epacio
ocupado
-ipo de
declaracin
E9emplo
Entero E %&tes Integer "im @umero As Integer
Entero Largo : %&tes Long "im @umero As Long
Simple : %&tes Single "im @umero As Single
"o%le O %&tes "ou%le "im @umero As "ou%le
En el caso de las )aria%les +ue )an a guardar nom%res .cadenas de caracteres/( se
de%en declarar como String & el espacio +ue ocupa ser : %&tes ms un %&te por
cada caracter +ue tenga( en el caso de VB de KE %its realmente ocupar E %&tes por
cada caracter +ue tenga*
La longitud m8ima de una )aria%le del tipo String ser de apro8imadamente
KE*777 caracteres & la $orma de declararla ser3
Dim Cadena ! $tring
Una )e! declarada podemos asignarle la cantidad de caracteres +ue +ueramos .sin
pasarnos/ & cuantas )eces +ueramos*
La& +ue tener en cuenta +ue en cual+uier )aria%le slo se +ueda el 0ltimo )alor
asignado* ;a lo )imos en la entrega anterior( pero )amos a re$rescarlo un poco3
#im !$mero %& 'nte(er
!$mero = 5
Print !$mero
!$mero = 1)
Print !$mero
En este e'emplo( el 0ltimo )alor almacenado en @0mero es el <E* El 6 +ue ten-a en
un principio se perdi*
Pero( M+ue tengo +ue ,acer para sumarle una cantidad al )alor almacenado en una
)aria%leN
Es decir( Mcmo incrementar el )alor de una )aria%le numricaN
La respuesta la tienes en cmo se mane'an las e8presiones & las asignaciones a las
)aria%les* Como &a )imos anteriormente( al asignar a una )aria%le una e8presin(
primero se calcula la e8presin & una )e! o%tenido el resultado( se asigna a la
)aria%le*
MRecuerdas lo +ue ocurr-a con la )aria%le Pali!aN Vamos a )erlo de nue)o( pero
usando otros nom%res menos 2cac,ondos2
#im ! %& 'nte(er
#im * %& 'nte(er
! = 1
* = ! * +
Print *
El resultado de este programa ser-a K7( +ue es lo +ue resulta de multiplicar <7 por
K* Cuando se asigna a la )aria%le C el )alor de @ .+ue es <7/ multiplicado por K( el
VB toma el contenido de @ & lo multiplica por K* Una )e! +ue sa%e la solucin(
asigna ese )alor( en este caso K7/ a la )aria%le +ue ,a& a la i!+uierda del signo
igual*
Sa%iendo esto( podr-amos simpli$icar la cosa & ,acer los siguiente3
! = ! * +
Print !
9am%in o%tendr-amos K7* ;a +ue cuando el Basic calcula la e8presin de la
derec,a del signo igual( @ )ale <7( una )e! o%tenido el resultado del clculo lo
asigna a la )aria%le de la i!+uierda del signo de asignacin( sin importarle lo ms
m-nimo de +ue )aria%les es & como en este caso ,emos usado la misma( pues se
+ueda el 0ltimo )alor( perdindose el +ue originalmente esta%a 2guardado2* Esto es
0til cuando necesitamos 2contar2 de $orma secuencial( para as- incrementar el )alor
de una )aria%le*
;a )eremos alguna 2utilidad2 para estos casos* A,ora )amos a )er cmo podemos
mane'ar las cadenas de caracteres( es decir las )aria%les de tipo String*
Con estas )aria%les ocurre lo mismo +ue con las numricas( pero la 0nica operacin
+ue podemos reali!ar es la suma*
Realmente una suma en una cadena de caracteres es 2pegar2 dos cadenas en una
sola*
Por e'emplo si ,acemos esto3 @ U K B E* El )alor o%tenido es 6 & eso es lo +ue se
guarda en @*
Sin em%argo con los strings ,acer esto3 Cadena U 2A2 B 2B2( se guardar 2AB2( es
decir se unirn las dos cadenas en una sola* Para este tipo de operacin se
recomienda usar me'or el signo W* Xue entre otras cosas le indica al Visual Basic
+ue lo +ue pretendemos ,acer es unir dos cadenas( no sumarlas*
Aun+ue 2tericamente2 no se pueden sumar cadenas( slo conFcatenarlas( )eremos
cmo podemos llegar a producir 2pro%lemillas2 de entendimiento entre el VB &
nuestras 2mentes poderosas2*
Como te ,e comentado al principio el tipo de datos Variant acepta de todo(
n0meros( nom%res( etc*
Si no le indicamos de $orma correcta al VB cual es nuestra intencin( podemos
con$undirle & ,acer +ue el resultado de algo +ue nosotros d%amos 2por ,ec,o2( al
$inal se con)ierte en un pe+ue#o caos para nuestras po%res mentes*
Vamos a )erlo con un par de e'emplos( en estos casos3 .al no indicarle de +ue tipo
son las )aria%les( el Basic entiende +ue nuestra intencin es usar el tipo Variant/
#im !um1
#im !um)
!um1 = 5
!um) = +
!um1 = !um1 , !um)
Print !um1
MXue imprimirN Pru%alo & saldrs de duda* Bueno( imprimir un O*
A,ora )eamos este otro e'emplo3
#im !um1
#im !um)
!um1 = "5"
!um) = "+"
!um1 = !um1 , !um)
Print !um1
A-'ate +ue lo +ue )ar-a es slo las comillas* El resultado en este caso es 6K( es decir
,a unido las dos cadenas*
A,ora +uita las comillas del 6( para de'arlo as-3
#im !um1
#im !um)
!um1 = 5
!um) = "+"
!um1 = !um1 , !um)
Print !um1
Ale,op5 MXue ,a pasadoN Pues +ue ,a impreso un O( es decir ,a 2pasado2 de +ue el
tres sea una cadena de caracteres & lo ,a tomado por un n0mero***
En esta ocasin( slo )amos a cam%iar la l-nea de la asignacin para de'arla de esta
$orma3
!um1 = !um1 - !um)
El resultado ser 6K* Por+ue le ,emos indicado +ue una las dos cadenas( por tanto
al encontrase con esta 2operacin2 ,a considerado al n0mero 6 como una cadena(
en lugar de un n0mero*
Cam%ia a,ora la asignacin del @umE( para +ue sea3 @umE U K
Vuel)e a mostrar 6K( el signo W tiene unos poderes enormes*** & a pesar de ser dos
n0meros la 0nica operacin +ue puede reali!ar es la concatenacin de cadenas( por
tanto el tipo Variant se con)ierte por arte de magia en cadena*
Pero $-'ate si es 2$uerte2 el poder de con)iccin +ue tiene este operador( +ue aun+ue
cam%iemos el tipo de las )aria%les( sigue 2con)enciendo2 al %asic +ue tipo de
operacin de%e ,acer* Esto no de%er-a ocurrir as-( pero ocurre*
#im !um1 %& 'nte(er
#im !um) %& 'nte(er
!um1 = 5
!um) = +
!um1 = !um1 - !um)
Print !um1
Sigue mostrando 6K( aun+ue en este caso de%er-a producir un error( &a +ue un
Integer no es una cadena*
As- +ue 2cuidad-n2 con las operaciones +ue reali!amos* ;a +ue si a#ades esta l-nea3
Print !um1 * )
Vers +ue realmente @um< tiene guardado un n0mero & el resultado ser3 <76
MA dnde nos lle)a todo estoN A +ue de%emos usar los signos .operadores/ de
$orma adecuada* ; si nuestra intencin es sumar n0meros( empleemos el signo B(
en caso de +ue +ueramos unir cadenas de caracteres( usaremos el W
Para rematar esta segunda entrega( )amos a usar un te8t%o8 para +ue se puedan
introducir datos & empecemos a mane'ar los e)entos( me'or dic,o empecemos a
2,a%ituarnos2 a los e)entos*
A#ade al $orm dos La%el( un 9e8tBo8 & un %otn de comandos* El aspecto ser algo
parecido al de la siguiente $igura3
A#ade el siguiente cdigo & despus e'ecuta el programa( &a sa%es A6* Escri%e algo
en el cuadro de te8to & pulsa en el %otn*
Private Sub Form_Load()
Label) = ""
.e/t1 = ""
End Sub
Private Sub 0ommand1_0li12()
Label) = "3ola " - .e/t1
End Sub
Cuando pulsas A6( se produce el e)ento AormHLoad( por tanto se asigna al La%elE &
al 9e8t< una cadena )ac-a( con lo cual %orramos el contenido anterior( +ue es el +ue
se muestra en la Aigura*
Lasta +ue no pulsemos el %otn mostrar( no ocurrir nada & el programa estar
esperando a +ue ocurra algo*
Una )e! pulsado el %otn( se produce el e)ento ClicJ del Command< & se ,ace lo
+ue se indica en su interior( +ue es tomar lo +ue ,a& en la ca'a de te8to & unirla a
la pala%ra Lola( para asignarla al La%elE*
A,ora( imag-nate +ue +uieres mostrar el nom%re en ma&0sculas* Lo 0nico +ue
tendr-as +ue ,acer es lo siguiente3
Private Sub 0ommand1_0li12()
Label) = "3ola " - 40a&e(.e/t1)
End Sub
Lo +ue se ,a ,ec,o es decirle al VB +ue con)ierta en ma&0sculas lo +ue &a est en
9e8t<* Esa es la 2utilidad2 del UCase*
Pero & Msi +uisiramos +ue con$orme se )a escri%iendo se )a&an con)irtiendo los
caracteres a ma&0sculasN
A+u- entrar-an ms instruccionesQ$unciones del Visual Basic( as- cmo otro de los
e)entos +ue pone a nuestra disposicin( en este caso el e)ento +ue se produce
cada )e! +ue se modi$ica el contenido del te8t%o83 C,ange( escri%e lo siguiente3
Private Sub .e/t1_0han(e()
.e/t1 = 40a&e(.e/t1)
End Sub
Pru%alo & )ers lo +ue ocurre* Xueda 2gua&2 M)erdadN Pero no es lo +ue nosotros
pretend-amos* Vamos a intentar remediarlo & de camino )emos nue)as
instruccionesQpropiedades( en este caso del 9e8tBo8*
Private Sub .e/t1_0han(e()
.e/t1 = 40a&e(.e/t1)
.e/t15SelStart = Len(.e/t1)
End Sub
La l-nea +ue se ,a a#adido .realmente la ,a%rs tecleado t0/( lo +ue le indica al
Visual Basic es +ue ,aga lo siguiente3
Calcula la longitud del contenido del 9e8t<( .Len cuenta los caracteres de una
cadena & lo de)uel)e como n0mero/( SelStart es una propiedad del 9e8tBo8 +ue
entre otras cosas( le indica la posicin en la +ue se insertar el siguiente caracter
+ue se escri%a o %ien nos puede indicar la posicin actual del cursor* Por tanto
o%liga a poner el cursor( .el palico ese +ue parpadea & +ue nos indica +ue podemos
escri%ir/( al $inal de la 0ltima letra +ue contiene el 9e8t<*
A,ora &a sa%es +ue cada )e! +ue 2cam%ie2 el 9e8t<( se produce un e)ento C,ange*
Pero ,a& otra $orma de ,acer esto mismo & es controlando cada tecla +ue se pulsa*
Esto lo podemos 2controlar2 en el e)ento Ye&Press( el cual se produce cada )e! +ue
se pulsa una tecla* Borra el procedimiento anterior & escri%e este otro3
Private Sub .e/t1_6e7Pre&&(6e7%&1ii %& 'nte(er)
#im & %& Strin(
& = 40a&e(0hr(6e7%&1ii))
6e7%&1ii = %&1(&)
End Sub
A,ora ,an entrado dos nue)as $unciones en accin3 C,r( la cual con)ierte un
n0mero en una cadena*** realmente con)ierte un cdigo ASCII en la letra +ue
representa .%usca en la a&uda ASCII & lete lo +ue dice en las opciones +ue te
muestra/* Por otra parte Asc ,ace lo contrario( es decir con)ierte una letra en el
cdigo ASCII* ; lo +ue nosotros ,acemos es3 con)ertir el cdigo de la tecla pulsada(
representado por la )aria%le Ye&Ascii( en una cadena( la pasamos a ma&0sculas &
despus la )ol)emos a asignar a la )aria%le( para 2enga#ar2 al Visual Basic & as-
,acerle pensar +ue realmente ,emos tecleado una letra en ma&0sculas*
Bueno( a+u- )o& a de'ar la cosa( pues creo +ue con esto es te puedes ir
2entreteniendo2*
LECCION 1
Realizamos programas para la gestin de empresas. Empresas medianas y pequeas.
Programas de contabilidad, cartera de pedidos clientes proveedores, facturacin
control de albaranes, tesorera cartera de cobros y pagos y estadsticas.
Nuestro agradecimiento a todos los que por unas causas o por otras visitan nuestra
eb. !estin de empresas P"#E$. %urso de programacin de &isual 'asic.
Bien( despus de un mes & pico( seguimos con la tercera entrega del curso 2superF
%sico2 de programacin con Visual Basic*
Esta entrega la )o& empe!ar con recomendaciones e instrucciones del %uen ,acer
en Visual Basic( espero +ue sigas algunas( pre$eri%lemente todas( estas normas*
;a ,as )isto cmo mane'a el Visual Basic las )aria%les( si a esta 2li%ertad2 .aun+ue
ms %ien es li%ertina'e/( le a#adimos +ue no nos o%liga a nada( es decir el VB nos
est diciendo3 2puede uar la 7aria1le para lo <ue <uiera, cmo <uiera
.o casi/ 2 cuando <uiera2
; esto en principio podr-a parecer una %uena cosa( pero realmente es un mal
,%ito( +ue muc,os de los +ue )en-s del BASIC( &a tenis $ormado & creo +ue a,ora
ser-a un %uen momento para empe!ar a cam%iar*
Lo primero +ue de%es ,acer es ir al men0 Lerramientas .9ools/ & en Opciones
.Options/ marca la casilla +ue indica 2Re+uerir declaracin de )aria%les2 .Re+uire
Varia%le "eclaration/( esto a#adir a cada nue)o mdulo .ARC( BAS o CLS/ la
siguiente instruccin3 .ption E=plicit( de esta $orma tendrs la o%ligacin de
declarar cada una de las )aria%les +ue uses en el programa* ; tu preguntars3
B&ara <ue o1ligar a <ue e declaren la 7aria1leD La respuesta es %ien
sencilla3 para +ue las declares*** .algunas )eces me asom%ro de la lgica tan
aplastante de mis comentarios/
Bromas aparte( es recomenda%le +ue declares las )aria%les +ue )a&as a usar & te
dir-a ms3 no slo es %ueno declarar las )aria%les( sino +ue me'or a0n es
declararlas del tipo adecuado*
;a )imos +ue ,a& di$erentes tipos de )aria%les( no slo de tipos genricos como
podr-an ser para almacenar caracteres & n0meros( sino +ue dentro de las numricas
,a& )arios tipos( & cada uno de ellos tiene una ra!n de ser*
En mis tiempos del BASIC normalito( es decir del CSF"OS( no e8ist-a esta
o%ligacin de declarar 2$or!osamente2 las )aria%les & cuando esta%as escri%iendo un
programa .pro&ecto +ue lo llaman a,ora/( grande( aca%a%as 2ine)ita%lemente2
usando ms )aria%les de la cuenta por+ue &a no recorda%as si la )aria%le 2i2 o 2'2
esta%a siendo usada a ni)el glo%al o no*** .&o es +ue con el despiste +ue gasto( me
)e-a creando las )aria%les 2ii2( 2'E2( etc*( para no 2meter la pata2/ & esto no era lo
peor( al $in & al ca%o lo 0nico +ue ocurr-a era +ue esta%a 2desperdiciando2 memoria(
por no tener un control de las )aria%les +ue esta%a usando? lo malo era +ue se
pod-an escri%ir errneamente los nom%res de las )aria%les de $orma +ue al $inal( el
programa no $unciona%a %ien por+ue al escri%ir un nom%re de )aria%le( ,a%-amos
cam%iado el nom%re*** era $rustrante & algunas )eces te )ol)-as loco %uscando el
$allo***
La )enta'a de usar el .ption E=plicit( es +ue si escri%es mal una )aria%le( el VB te
a)isa*** %ueno( algunas )eces te a)isa( so%re todo cuando se encuentra con la
)aria%le 2mal escrita2*
A+u- )iene la egunda recomendacin del dEa3 cuando e'ecutes un programa(
,a!lo con ControlBA6( de esta $orma se ,ace una compilacin completa & 2ms o
menos2 e8,austi)a del cdigo( a)isndote cuando ,a& algo +ue no 2cuadra2( con el
VBK no ,a%-a pro%lemas( &a +ue siempre se ,ac-a la compilacin completa( pero
desde el VB: se puede pulsar A6 & ,asta +ue no llega al procedimiento actual( no
comprue%a si todo lo +ue ,a& en l est correcto*
As- +ue para 2curarte en salud2 procura ,acer la compilacin completa
,a tercera recomendacin no es o%ligatoria( siempre +ue sigas la +ue )o& a dar
despus( esta es una norma +ue tam%in ,e usado desde mis tiempos de CSF"OS
.aun+ue recono!co +ue 0ltimamente no la pongo en prctica( &a +ue ,ago lo +ue
despus comentar en la cuarta recomendacin/*
En todos los mdulos( antes slo eran BAS( pon-a al principio la siguiente l-nea3
DEFIN- !(J
de esta $orma le indica%a al BASIC +ue mi intencin era usar todas las )aria%les del
tipo Integer .entero/( .realmente despus usa%a del tipo +ue me da%a la gana( pero
mi primera intencin era no complicarme la )ida con la ma&or-a de las )aria%les/(
cuando +uer-a usar una )aria%le di$erente de Integer( le indica%a 2e8pl-citamente2
de +ue tipo era & as- me o%liga a usar la ma&or-a de ellas de este tipo +ue a la larga
es o era el ms usado( &a +ue para ,acer %ucles .&a te e8plicar en un ratillo +ue
es eso de los %ucles & cmo ,acerlos en VB/ & otros clculos 2normales2( era ms
+ue su$iciente & en la ma&or-a de los casos3 m8 r8pido*
En Basic( & por supuesto toda)-a en Visual Basic( aun+ue cada )e! )a a menos( se
puede indicar el tipo de una )aria%le de )arias $ormas( al declararlas con "im(
)imos +ue se ,ac-a de la siguiente $orma3
#im un!umero %& 'nte(er
#im un!umeroLar(o %& Lon(
#im otro!umero %& Sin(le
#im ma&!umero& %& #ouble
#im un!ombre %& Strin(
#im multi4&o %& 8ariant
Cada una de estas )aria%les es de un tipo distinto( las cuatro primeras numricas(
la +uinta para almacenar cadenas de caracteres & la 0ltima del tipo por de$ecto del
VB3 Variant +ue como su nom%re indica .aun+ue en ingls/( es Variante & puede
almacenar prcticamente cual+uier cosa( o%'etos incluidos( .&a )eremos los o%'etos
en otra ocasin/* Lo del tipo por de$ecto( es siempre +ue no se ,a&a especi$icado un
tipo determinado para todas las )aria%les( por e'emplo usando el "EAI@9 AFZ( el
tipo por de$ecto &a no es Variant( sino Integer*
Al grano( 2+uesnoc,e2( a lo +ue i%a era +ue adems de declarar las )aria%les de
esta $orma( tam%in se puede ,acer de de esta otra3
#im un!umero9
#im un!umeroLar(o-
#im otro!umero:
#im ma&!umero&;
#im un!ombre<
En el caso de Variant no e8iste un caracter especial para indicar +ue es de ese tipo(
as- +ue cuando +uieras usar una )aria%le Variant( tendrs +ue declararla como en el
primer e'emplo*
A0n +ueda otro carcter para otro tipo de datos numrico( el tipo Currenc& +ue se
puede declarar con [* Este tipo ocupa O %&tes & permite guardar n0meros de tipo
moneda( es decir n0meros no enteros( pero con un n0mero determinado & $i'o de
decimales( a,ora no recuerdo( pero en la a&uda o en los manuales podrs )er la
2retaila2 de n0meros +ue cada tipo admite*
Para terminar con las recomendaciones de ,o&( )o& a indicarte algo +ue de%es
tener en cuenta cuando declaras )aria%les & +ue a0n los ms e8pertos caen en la
trampa*
Adems de declarar las )aria%les con "im( poniendo cada declaracin en una l-nea(
cosa +ue por otro lado +ueda %astante claro & es como suelo ,acerlo( aun+ue
0ltimamente esto& )ol)iendo a coger malos ,%itos*** Mser la edadN
9am%in se pueden declarar ms de una )aria%le con un mismo "IC( )amos a )erlo
con un e'emplo3
Dim Numero ! Integer, Numero,argo ! ,ong, otroNum ! $ingle,
Nom1re ! $tring, Numerazo ! Dou1le
por supuesto tam%in )aldr-a de esta otra $orma3
Dim NumeroK, Numero,argoL, otroNum;, Nom1reM, NumerazoN
; si me apuras( tam%in de esta otra3
Dim NumeroK, Numero,argo ! ,ong, otroNum ! $ingle, Nom1reM,
NumerazoN
Pero sea como $uere( en todos los e'emplos se ,a especi$icado el tipo +ue +ueremos
asignar*
Por supuesto tam%in podremos declarar )aria%les de esta $orma3
Dim unaVaria1le, otraVaria1le, terceraVaria1le
Pero( surge esta pregunta Mde +ue tipo son estas tres )aria%lesN .al menos se
espera +ue te sur'a***/
La respuesta es %ien sencilla( si se ,a entendido toda la 2reta,ila2 +ue te ,e soltado
anteriormente3
Sern del tipo Variant o del especi$icado con el DEFIN- !(J .es decir Integer/
Vo& a suponer +ue la tercera recomendacin no la ests poniendo en prctica( por
tanto ser-an del tipo Variant*
Pero $-'ate +ue podr-as caer en el error( so%re todo si ,as programado algo en C( de
pensar +ue esta l-nea3
Dim Numero, otroNumeroInt, el-ercero ! Integer
o esta otra3
Dim Numero ! Integer, otroNumeroInt, el-ercero
estn declarando tres n0meros Integer & no es as-( lo +ue se est declarando ser-a(
en el primer caso3
Numero & otroNumeroInt como Variant & el-ercero como entero*
en el segundo caso slo Numero ser-a del tipo entero & las otras dos )aria%les del
tipo Variant*
Ser-a 2ideal2 +ue $uese como aparenta( pero el VB no ,ace estas 2)irguer-as2( ni
incluso en la )ersin 6*
Por tanto( cuando declares )aria%les( $-'ate %ien de +ue tipo son las +ue ests
declarando( para no lle)arte sorpresas( so%re todo con los redondeos & errores de
des%ordamiento***
Un des%ordamiento se produce cuando asignamos a un n0mero un )alor ma&or del
+ue est capacitado para almacenar( as- si un entero slo acepta )alores de BQF
KED6D .realmente acepta ,asta FKED6O/( al asignarle un )alor de :7777( nos dir
+ue 2turur?2 & dar error*
En cuanto a +ue tipo de )aria%le usar en cada caso( tendrs +ue tener en cuenta
+ue +uieres ,acer* @ormalmente en los %ucles se suelen usar )aria%les enteras(
%ien Integer( si sa%emos +ue no nos )amos a pasar de KED6D( %ien Long Integer
+ue puede almacenar un )alor de dos mil & pico millones*** .4+uien los tu)iera(
aun+ue $uese en calderilla5/
Vamos a )er un e'emplo .al $in algo de cdigo se escuc,a entre el p0%lico***/( con
este cdigo podrs compro%ar la )elocidad de los %ucles con los distintos tipos de
)aria%les & as- poder compro%ar cual es la ms adecuada*
Crea un nue)o pro&ecto & asigna unos cuantos La%els .6 en total/ & un %otn*
Cuando e'ecutes este programilla( puedes ir tran+uilamente a tomar ca$( por+ue
se tomar su tiempo***
En teor-a nos mostrar el tiempo +ue emplea en ,acer unos %ucles con tipos
di$erentes de datos* Para +ue sea $ia%le( de%ers especi$icar unos )alores altos( &a
+ue con n0meros pe+ue#os no es demasiado $ia%le( e incluso con n0meros altos
tampoco*** la cosa era poner algo de cdigo para 2rematar2 el cap-tulo de ,o&***
En la pr8ima entrega e8plicar las instrucciones +ue se ,an usado & en algunos
casos( e8plicar ,asta el por <uH de usarlas*
O sea esto es lo +ue se dice un programa in0til +ue adems de consumir recursos
del sistema & ,acernos perder el tiempo( no )ale para nada*** .es +ue despus de
pro%arlo( me ,e dado cuenta de +ue o todos los $ormatos son prcticamente igual
de rpidos o &o ,e estado 2enga#ado2 durante todo este tiempo***/
=>tion E/>li1it
Private Sub 0ommand1_0li12()
#im n'nt %& 'nte(er
#im nLn( %& Lon(
#im nSn( %& Sin(le
#im n#ob %& #ouble
#im n0ur %& 0urren17
#im n8ar %& 8ariant
#im timer1;? timer) %& #ouble
0on&t min@u1le = 1? ma/@u1le = 1
0ommand150a>tion = "0al1ulando555"
timer1 = .imer
For n'nt = min@u1le .o ma/@u1le
0ontar 0'nt(n'nt)? Label1
!e/t
timer) = 0#bl(.imer A timer1)
Label1 = "#ura1iBn 1on 'nte(erC " - timer)
#oEvent&
timer1 = .imer
For nLn( = min@u1le .o ma/@u1le
0ontar 0'nt(nLn()? Label)
!e/t
timer) = 0#bl(.imer A timer1)
Label) = "#ura1iBn 1on Lon(C " - timer)
#oEvent&
timer1 = .imer
For nSn( = min@u1le .o ma/@u1le
0ontar 0'nt(nSn()? Label+
!e/t
timer) = 0#bl(.imer A timer1)
Label+ = "#ura1iBn 1on Sin(leC " - timer)
#oEvent&
timer1 = .imer
For n#ob = min@u1le .o ma/@u1le
0ontar 0'nt(n#ob)? LabelD
!e/t
timer) = 0#bl(.imer A timer1)
LabelD = "#ura1iBn 1on #oubleC " - timer)
#oEvent&
timer1 = .imer
For n0ur = min@u1le .o ma/@u1le
0ontar 0'nt(n0ur)? Label5
!e/t
timer) = 0#bl(.imer A timer1)
Label5 = "#ura1iBn 1on 0urren17C " - timer)
#oEvent&
timer1 = .imer
For n8ar = min@u1le .o ma/@u1le
0ontar 0'nt(n8ar)? LabelE
!e/t
timer) = 0#bl(.imer A timer1)
LabelE = "#ura1iBn 1on 8ariantC " - timer)
#oEvent&
0ommand150a>tion = "0al1ular"
End Sub
Private Sub 0ontar(valor %& 'nte(er? etiFueta %& 0ontrol)
#im i %& 'nte(er
#im un#oble %& #ouble
0on&t el*a/imo = 1-
For i = 1 .o el*a/imo
un#oble = un#oble , 1
etiFueta50a>tion = valor * el*a/imo , un#oble
#oEvent&
!e/t
End Sub
LECCION 4
Buenaaas( a+u- estamos de nue)o .tu( &o & mi otro &o/( empie!o con correcciones(
&a sa%es( $allos +ue tiene uno( & otras aclaraciones*
El primero es un $allo garra$al( +ue gracias a Antonio Banderas( al +ue le tengo +ue
agradecer tam%in otras cosas( +ue espero +ue )a&a en %ene$icio de los +ue estis
le&endo todas estas cosas so%re el VB( .si( aparte de nosotros tres ,a& otros +ue
siguen este curso/* Bueno( a lo +ue i%a( +ue siempre me despisto*** en la segunda
entrega( en el 0ltimo e'emplo de @um<( @umE( la asignacin3 Num1 O Num1 P
Num2( de%er-a ser3 Num1 O Num1 L Num2 .s +ue te ,a%rs dado cuenta del
detalle( so%re todo por la e8plicacin posterior/( este 2desli!2 &a est corregido( as-
+ue si lo ,as le-do despus del K7 de \unio .del PD/( &a est como ten-a +ue estar*
La siguiente aclaracin( es un despiste( no demasiado grande( &a +ue do& por
,ec,o de +ue algo ,a%rs le-do so%re VB( %ien los manuales( %ien la A&uda o alg0n
li%ro so%re este lengua'e* Pues la cosa consiste +ue en la tercera entrega se crea un
procedimiento3 Contar( para crear procedimientos o $unciones( tienes +ue usar el
men0 Insert & seleccionar Procedure .esto en VB:/( en VBK si no recuerdo mal(
esta%a en el men0 2VieG2 & en VB6 est en 9ools .Lerramientas/
Bien( ,ec,as estas aclaraciones( )o& a e8plicar( tengo +ue ,acerlo( &a +ue me
compromet- &*** lo prometido es deuda o eso dicen( a sa%er***
Antes del cdigo ,ice este comentario3
- sea esto es lo que se dice un programa in.til que adem/s de consumir recursos
del sistema , hacernos perder el tiempo, no )ale para nada... 0es que despu1s de
pro2arlo, me he dado cuenta de que o todos los formatos son pr/cticamente igual
de r/pidos o ,o he estado 3enga4ado3 durante todo este tiempo...5
; la cosa es +ue antes de ,acer este e'emplo( 2o creEa +ue algunos tipos de datos
eran ms rpidos +ue otros( .& a pesar de +ue el e'emplo demuestra( o casi( lo
contrario( sigo cre&ndolo***/* La cosa es +ue en KE %its un Long de%er-a ser ms
rpido +ue el resto* ; los enteros ms rpidos +ue los de coma $lotante*** )o& a
pro%arlo en un KO6 sin copro( a )er*** a,ora )uel)o***
;a puestos a pro%ar( ,e pro%ado( a+u- se demuestra lo 2morr0o2 .o ca%e!n/ +ue
so&( & en esta ta%la .pulsando en el linJ/( tienes los di$erentes )alores en distintos
e+uipos & con distintas )ersiones de VB*
Vers +ue sorpresilla te lle)as*** MLo ,as )istoN
"e'ar este tema( +ue &a es muc,o lo +ue le ,e dedicado( )amos a )er el programa
& as- cam%iamos de tercio***
Para introducir cdigo en cual+uiera de los e)entos de los controles o del
$ormulario( lo 0nico +ue tienes +ue ,acer es seleccionar el control & el e)ento +ue
+ueremos codi$icar de las listas desplega%les( en el mdulo de cdigo( pulsando en
Cdigo en la )entana en la +ue se muestra los mdulos & $ormularios +ue $orma un
pro&ecto* En la lista de la i!+uierda seleccionamos el control & en el de la derec,a
nos mostrar todos los e)entos soportados por VB para ese control* Si sa%emos el
nom%re del control & el del e)ento( podemos teclearlo directamente o %ien si
copiamos cdigo de otro sitio( simplemente con pegarlo( se )a a su sitio*
En el caso de +uerer a#adir al cdigo( una $uncin o procedimiento se puede ,acer
de )arias $ormas( lo aca%o de decir( pero lo repito un poco ms claro3
1. Directa: Escri%ir el cdigo directamente( con lo cual se crear un nue)o
2apartado2 en la lista de las $uncionesQ procedimientos* En caso de +ue no
sea un e)ento soportado por los controles de nuestro $ormulario( se
mostrar en la lista de la i!+uierda( estando seleccionada en la derec,a
21eneral2
2. CopiarQ&egar: Pues eso( si copias una $uncinQprocedimiento & lo pegas en
la )entana de cdigo***
1. &or men? de VB: Seg0n las distintas )ersiones de VB( ser un men0 u
otro( de%ers especi$icar el nom%re del procedimiento o la $uncin(
marcando la casilla correspondiente* En VB:QVB6 )ers +ue aparte de los
Procedimientos .Su%/ & las Aunciones .Aunction/ ,a& tam%in Propiedades
.Propert&/( estas las )eremos en otra ocasin* 9am%in )ers +ue puedes
declararlas P0%licas o Pri)adas* Esto no es posi%le en VBK( al menos en los
procedimientos & $unciones de los $ormularios*
En otra ocasin )eremos todas estas cosas & con e'emplos( +ue es lo +ue 2mola2*
Bueno( toda esta 2reta,-la2 )en-a a cuento de cmo introducir cdigo en los e)entos
de los controles o del $ormulario & cmo crear nuestras propias instrucciones .esto
es lo +ue ms me gust del XuicJBasic :*7( poder crear mis propias instrucciones
.su%s/ & $unciones/*
;a es ,ora de coger el listado de la entrega anterior & 2destriparlo2* Vamos a )er
cada cosa por separado( +ue aun+ue pare!ca +ue es muc,o cdigo( realmente est
2repetido2( o casi***
.ption E=plicit
Esto nos o%liga a declarar todas las )aria%les +ue usemos en el mdulo( ponerlo es
una recomendacin( incluso te la impondr-a como norma* Para +ue salga de $orma
automtica en cada nue)o mdulo( selecciona del men0 9oolsQAd)anced la opcin
"eclare )aria%les re+uired .o algo parecido( +ue )iene a signi$icar Re+uiere la
declaracin de )aria%les/
Siguiendo nuestro recorrido por el cdigo( no encontramos con3
&ri7ate $u1 Command1IClicRFG
Lo de &ri7ate signi$ica +ue slo se puede acceder a este procedimiento desde
dentro del mdulo en el +ue est declarado* Es decir no se puede llamar desde otro
$orm o mdulo BAS*
$u1 indica +ue es un procedimiento( no una $uncin( ni una propiedad* Los Su%s
act0an como instrucciones propias del lengua'e* Las $unciones tam%in( pero
de)uel)en un )alor( mientras +ue los su%s no de)uel)en nada( lo +ue cogen se los
+uedan ellos( aun+ue en su momento )eremos +ue tam%in nos pueden dar algo a
cam%io*
Command1IClicR( este es el nom%re +ue ,a%r +ue usar para acceder a l desde
cual+uier punto de ste mdulo*
Los parntesis sin nada dentro( indica +ue este procedimiento no reci%e
parmetros? los parmetros lo )eremos dentro de un 2ratillo2
9oda esta l-nea es la descripcin del procedimiento & cuando se le llame( %ien desde
nuestro propio cdigo( %ien por+ue se pulse so%re el %otn( se e'ecutar todo lo
+ue est dentro de l* El $inal del procedimiento est marcado por End $u1*
Las l-neas con DI+ indican +ue estamos declarando las )aria%les & lo +ue se
especi$ica despus del !$ es el tipo de )aria%le( los cinco primeros son de cada uno
de los tipos numricos soportados .otro d-a )eremos otro tipo cuasiFnumrico/( el
se8to es Variant( el multiFuso( el +ue )ale para todo*
Veamos a,ora +ue es lo +ue se ,ace con esta l-nea3
Dim timer1N, timer2 ! Dou1le
A+u- ,e declarado dos )aria%les del tipo Dou1le* Al separarlas con comas no ,a&
+ue repetir la pala%ra DI+( pero s- el tipo de cada )aria%le* ;a )imos en la entrega
anterior +ue algunos tipos de )aria%les se pod-an indicar mediante unos caracteres
especiales( .estos tipos son los ,eredados de )ersiones anteriores al Visual Basic E(
en esa )ersin( se introdu'o el tipo Variant/( en este caso N es lo mismo +ue
Dou1le( por tanto se podr-a ,a%er ,ec,o tam%in de cual+uiera de estas tres
$ormas3
Dim timer1N, timer2N
Dim timer1 ! Dou1le, timer2N
Dim timer1 ! Dou1le, timer2 ! Dou1le
A,ora $-'ate +ue esta otra no ,ar-a la misma tarea3
Dim timer1, timer2 ! Dou1le
Esto $uncionar-a con lengua'es como el C( .realmente el tipo se pone delante/( pero
en Basic no declara las dos )aria%les como "ou%le* La segunda )aria%le si es
"ou%le( pero la primera es del tipo por de$ecto( en nuestro caso Variant*
As- +ue muc,o o'ito con las declaraciones de las )aria%les* En alg0n sitio( no )o& a
decir dnde( por+ue lo mismo $ue un 2lapsus2 del autor( pero dec-a +ue de esta
$orma declara%an tres )aria%les de tipo Integer3
"im i( '( J As Integer
Sigamos nuestra andadura( a,ora )eamos esta declaracinQasignacin3
Cont minBucle O 1, ma=Bucle O 1*
A+u- lo +ue se declaran son dos constantes( stas a di$erencia de las )aria%les( no
pueden cam%iar de )alor( de a,- su nom%re( por tanto permanecern siempre con el
mismo )alor* Cuando se declara una constante( no es necesario especi$icar el tipo(
VB se encarga de adi)inarlo & usar el tipo adecuado( realmente lo +ue ,ace es
sustituir estas 2pala%ras2 por el )alor +ue ,a& despus del signo igual* En caso de
,acer esto3 cNom1re O S%na pala1raS* Visual Basic sa%e +ue es una cadena de
caracteres & cada )e! +ue se encuentre con cNom1re lo sustituir por S%na
pala1raS*
A,ora )iene la e8plicacin del 2por +u2 usar constantes* Adems de 2esclarecer2
los listados( los ,ace ms $ciles de comprender( tam%in nos permite modi$icar un
)alor en un slo sitio( con lo +ue ganamos en 2con$ian!a2( al asegurarnos de +ue no
omitiremos alguno de los sitios dnde tengamos o +ueramos cam%iar el )alor
antiguo por uno nue)o*
En nuestro e'emplo( minBucle & ma8Bucle se usan en seis partes di$erentes del
procedimiento( si +uisieras pro%ar con otros )alores( tendr-as +ue cam%iar en seis
sitios esos )alores( pero al declararlos como constantes( slo cam%iando el )alor
asignado( tenemos todo el tra%a'o ,ec,o* Esto adems de ser ms $ia%le & legi%le(
nos puede a,orrar alg0n +ue otro +ue%radero de ca%e!a & si adems le a#adimos
+ue no ocupan espacio e8tra( sal)o en la ta%la de s-m%olos( una )e! compilado el
programa slo se 2compilarn2 las constantes usadas* Sin em%argo con las
)aria%les no ocurre esto( &a +ue aun+ue no se usen( ocupan memoria*
Un inciso( esto de e8plicar tan detalladamente los listados( no )a a ser norma( &a
+ue al $inal todos nos a%urrir-amos( slo lo ,ar cuando lo crea con)eniente o %ien
si lo solicitas( en este caso( no tendr ms remedio +ue cumplir tu deeo***
Command1.Caption O SCalculando...S
Cam%iamos el te8to mostrado en el %otn( para a)isarnos de +ue est ,aciendo
algo***
timer1 O -imer
Asignamos el )alor de la $uncin 9imer a la primera de las dos )aria%les +ue
usaremos para calcular el tiempo empleado por cada uno de los %ucles* Esta
$uncin de)uel)e el n0mero de segundos transcurridos desde la media noc,e*
For nInt O minBucle -o ma=Bucle
Esto es un %ucle( +ue se repetir desde minBucle .</ ,asta ma8Bucle .<7/ & la
)aria%le nInt es la +ue lle)ar la cuenta o la +ue se usar para sa%er el )alor actual
del %ucle*
"e%er-amos )er primero la declaracin del procedimiento Contar( para entender lo
+ue ,ace la l-nea +ue )iene despus del Aor*
&ri7ate $u1 ContarF7alor ! Integer, eti<ueta ! ControlG
"eclaramos un procedimiento pri)ado llamado Contar .act0a como una instruccin
ms del VB( &a +ue no representa a ning0n control ni e)ento/( entre los parntesis
estn declarados los dos parmetros +ue espera reci%ir en la llamada( el primero es
un n0mero entero & el segundo .separado por una coma/( un Control( +ue puede
ser cual+uier control de VB*
El resto del procedimiento a,ora no es demasiado signi$icati)o
A,ora )eamos esta l-nea3
Contar CIntFnIntG, ,a1el1
Contar es el nom%re del procedimiento & a continuacin se de%en indicar los
parmetros +ue espera reci%ir* En este caso no ser-a necesario CIN- &a +ue lo +ue
,ace esta $uncin es con)ertir el n0mero +ue se pone dentro de los parntesis en
un n0mero entero & como resulta +ue nInt es un n0mero entero*** pues 4no ,a&
nada +ue con)ertir5
El segundo parmetro es el control La%el<( &a sa%es +ue tenemos 6 eti+uetas en
nuestro programa desde La%el< a La%el6
Cuando llegue estos datos al procedimiento Contar( )alor tomar lo +ue )alga nInt &
eti+ueta se adue#ar de La%el<*
Ne=t
Contin0a repitiendo el %ucle ,asta +ue se alcance el )alor m8imo( realmente el
@e8t lo +ue ,ace es lo siguiente3
nInt U nInt B <
MEs nInt menor o igual +ue ma8BucleN Si la respuesta es SI( sigue con lo +ue ,a&a
despus de la l-nea AOR( en caso negati)o contin0a con la l-nea siguiente al @e8t
.realmente en la siguiente instruccin despus del @e8t( &a )eremos esto en otra
ocasin/
timer2 O CD1lF-imer ( timer1G
Asignamos a la segunda )aria%le +ue usamos para el clculo del tiempo la
di$erencia entre el nue)o )alor de los segundos transcurridos desde la media noc,e
.9imer/ & el )alor +ue ten-a timer<( es decir cuantos segundos*** antes de empe!ar
el %ucle*
El C"BL es una $ucin +ue de)uel)e un )alor "o%le* Es decir ,ace la resta & ese
)alor resultante lo con)ierte en do%le*
,a1el1 O SDuracin con Integer: S L timer2
Esta asignacin realmente es La%el<*Caption( si se omite la propiedad( Visual Basic
usa la +ue tiene por de$ecto( +ue seg0n los manuales( suele ser la propiedad +ue se
usa con ms $recuencia* En este caso el Caption( es decir lo +ue se muestra en la
eti+ueta*
DoE7ent
Esta es una instruccin 2contro)ertida2 & a la +ue muc,os programadores no les
,ace demasiada gracia usar( no por+ue no tenga su utilidad( sino por+ue ,a& +ue
sa%er realmente lo +ue ,ace & tener cuidado cuando la usamos( &a +ue algunas
)eces puede crear errores o con$usin*** realmente no es tan drstico( pero casi***
"oE)ents( detiene la e'ecucin del programa & de)uel)e el control a IindoGs( para
+ue e'ecute los mensa'es +ue tiene pendientes en la cola de mensa'es*** MN no te
preocupes si no te enteras( es as- & punto* Mpor +u la usoN Pues para dar tiempo a
+ue se )ea el contenido del La%el? prue%a a +uitarla & )ers lo +ue ocurre( o
de%er-a ocurrir*** +ue &a a estas alturas no me sorprender-a nada +ue se mostrara***
El resto del programa es idntico a este %ucle( pero usando distintas )aria%les & las
dems eti+uetas* El caso es +ue Contar espera una )aria%le de n0mero entero & un
control( en el caso del control es o%)io +ue se estn poniendo las distintas eti+uetas
& en el caso del n0mero se con)ierte a entero( por+ue eso es lo +ue espera nuestra
instruccin & si no lo ,acemos as-( se +ue'ar*
;a slo +ueda )er una l-nea del procedimiento Contar3
eti<ueta.Caption O 7alor T el+a=imo P unDo1le
un"o%le contar desde < ,asta elCa8imo( en cada )uelta del %ucle( se asignar al
caption de la eti+ueta pasada al procedimiento & el "oEVents +ue )iene a
continuacin se encargar de +ue se muestre ese contenido* Bueno( tam%in se
asigna )alor V elCa8imo( es decir +ue cuando )alor )alga <( se estar mostrando
<777 B un"o%le( realmente para ,acer un contador se tendr-a +ue ,a%er usado lo
siguiente3
eti<ueta.Caption O F7alor (1G T el+a=imo P unDo1le( para +ue mostrara
desde el <( en lugar de empe!ar desde el <77<*
Una )e! +ue Contar termina( por el End Su%( )uel)e el control al %ucle +ue lo llam
& se e'ecuta la siguiente instruccin* Por tanto Contar se llamar tantas )eces como
dure el %ucle en el +ue se encuentra*
Creo +ue +ueda todo ms o menos claro & aun+ue este cdigo no es mu& 0til por
s-( ,a ser)ido para )er algunas cosillas del VB*
Para terminar )amos a )er una serie de cam%ios & a )er si adi)inis +ue es lo +ue
,ace*** as- os ser)ir de e'ercicio( cosa +ue algunos me ,a%is pedido( pero +ue a0n
no es el momento de ,acerlos*
En las declaraciones generales a#ade esta declaracin3
Dim Contando ! Integer
En Contar( a#ade lo siguiente despus del "oE)ents3
If Contando O * -4en E=it For
Al principio del Command<HClicJ( a#ade estas l-neas3
'G 0ontando .hen
0ommand150a>tion = "0al1ular"
0ontando =
#oEvent&
E/it Sub
End 'G
0ontando = 1
En cada uno de los %ucles( pon esto despus de llamar a Contar***
If Contando O * -4en E=it $u1
; antes del End Su% a#ade esto otro3
Command1.Caption O SCalcularS
Contando O *
Bueno( a,- de'o esto & como e'ercicio podr-as a#adir dos controles 9e8tBo8 para
especi$icar los )alores de ma8Bucle & elCa8imo( de $orma +ue seg0n los )alores
introducidos( +ue por de$ecto de%en ser <7 & <777( se usen los +ue especi$i+ues en
cada 9e8tBo8 & se tengan en cuenta cuando pulsas .,aces clicJ/ en el %otn*
Como pista te dir +ue las )aria%les usadas &Qo declaradas dentro de un
procedimiento son slo )isi%les dentro de ese procedimiento* @o te +ue'ars del
2peda!o2 de pista +ue te ,e dado***
LECCION 5
Lo& no tengo nada +ue recti$icar de la entrega anterior*** sal)o )arios errores
tipogr$icos*** "e todas $ormas si lees estas entregas & ,a& posteriores( ser-a
con)eniente +ue $ueses a la siguiente & te le&eras el principio( &a +ue aparte de
poner alg0n comentario 2c,orra2( suelo dar un repaso a los 2errores2 de la entrega
anterior*
!4ora 7iene el contenido real de la <uinta entrega.
@o )o& a dar la solucin al pro%lemaQe'ercicio planteado en la entrega anterior( )o&
a de'ar +ue la dedu!cas* Para +ue tengas %ase su$iciente( te )o& a contar un poco
cmo $unciona el Visual Basic & por e8tensin todas las aplicaciones de IindoGs*
En la segunda entrega creamos un programa +ue mostra%a un $orm en el +ue
ten-amos una ca'a de te8to .9e8tBo8/( un %otn .CommandButton/ & dos eti+uetas
.La%el/*
Cuando( despus de pulsar A6 o CR9LBA6( se e'ecuta la aplicacin( de lo 0nico +ue
podemos tener certe!a es +ue se e'ecutar el cdigo +ue se encuentra en el
procedimiento AormHLoad* Este procedimiento .su%/ en concreto es lo +ue se llama
un e)ento( & se produce cada )e! +ue el $ormulario .$orm/ se carga .load/ en la
memoria* Antes de entrar en detalles del por+u podemos tener la certe!a de +ue
ese cdigo se )a a e'ecutar( tengo +ue seguir con mi TponenciaT de cmo $uncionan
las aplicaciones IindoGs*
Se dice( .otros lo dicen & &o me lo creo/( +ue IindoGs es un sistema o entorno
operati)o TdominadoT por los e)entos* Esto &a lo de' caer al principio de la segunda
entrega* En IindoGs cada )e! +ue mo)emos el ratn( pulsamos una tecla( tocamos
una )entana o cual+uiera de los controles +ue estn en ellas( se produce un e)ento*
Cuando se TdisparaT( .los anglosa'ones usan T$ireT para indicar +ue se produce el
e)ento/( uno de estos e)entos( IindoGs le dice al $orm( .de $orma %astante rpida(
aun+ue en algunas ocasiones no tanto como nos ,u%iera gustado/( +ue se ,a
mo)ido el ratn & +ue el ratn ,a pasado por encima de tal )entana o de ese
control & as- con todas las cosas* La )erdad( no es de e8tra#ar +ue de )e! en
cuando $alle el sistema( 444es +ue no para de disparar555 & algunos disparos se le
puede escapar &***
***+ue c,iste ms malo( M)erdadN ;a pensa%as +ue el comentario ese del T$ireT era
por+ue 2el 1uille se cree +ue est traduciendo un art-culo de VB nline2***
Lo +ue +uiero de'ar claro es +ue a di$erencia de los lengua'es +ue $uncionan en CSF
"OS( en IindoGs no podemos TpredecirT cual ser el cdigo +ue se )a a e'ecutar*
@o de%es Tplani$icarT tu programa dando por sentado +ue*** 2despus de esto el
usuario TtieneT +ue ,acer esto otro & as- &o podr ,acer una compro%acin para***2 :
N. ; A+u- .en IindoGs/ no e8iste la programacin lineal( no des nunca por ,ec,o
+ue esto es lo +ue )a a ocurrir***( por+ue casi con toda seguridad :no ocurrir8;
Veremos cmo podemos TcontrolarT +ue algunas cosas se ,agan cuando nosotros
+ueramos( pero esto ser slo cuando el usuario de nuestra aplicacin realice una
TaccinT +ue esta%a pre)ista? tam%in codi$icaremos para +ue se e'ecute parte del
cdigo cuando el usuario no ,aga lo +ue ,a%-amos pre)isto +ue ,iciera* Pero eso lo
iremos )iendo poco a poco***
9odo programa de IindoGs tiene un punto de entrada? en el caso de Visual Basic(
puede ser %ien un $ormulario o %ien un procedimiento de un mdulo BAS( .de de%e
llamarse o%ligatoriamente Cain/? los mdulos los )eremos en otra ocasin*
@ormalmente las aplicaciones suelen tener ms de un $ormulario & alg0n +ue otro
mdulo* Pero tenga uno o ciento( siempre ,a& un 0nico punto de entrada .o de
inicio/* Por regla general suele ser un $ormulario* En nuestro e'emplo slo tenemos
un $orm en el pro&ecto( por tanto no ,a& duda alguna de cual ser el punto de
entrada del programa*
Perdona si me e8tiendo en esto( pero tanto si t? lo sa%es como si no( creo +ue t?
a,ora lo sa%es*** .es di$-cil esto de escri%ir una cosa para tanta gente con distintos
ni)eles***/
Cuando IindoGs inicia el programa( Tde%eT cargar el $ormulario en la memoria* ;
desde el momento +ue se prepara para ,acerlo( &a est con los TtiritosT & mandando
Tmensa'esT a la )entana .todo $ormulario es una )entana/( pero no slo le est
a)isando a la nuestra +ue la accin ,a empe!ado( sino +ue lo ,ace prcticamente a
los cuatro )ientos? si otra aplicacin +uiere enterarse de lo +ue ocurre en IindoGs(
slo tiene +ue conectarse a la Tmensa'er-aT de ste entorno operati)o & leer las
TnoticiasT*** pero esto &a es complicarse la )ida & toda)-a no nos la )amos a
complicar tanto*** o ms*** .pensar alguno despus de respirar ali)iado***/
Lo +ue a,ora interesa es sa%er +ue el Te)entoT AormHLoad se produce cuando esta
)entana pasa del anonimato a la )ida p0%lica( aun+ue no la )eamos( estar en la
memoria de IindoGs & se producir el primer e)ento del +ue tenemos Tcerte!aT(
por tanto este es un %uen sitio para poner cdigo de iniciali!acin*
Realmente el AormHLoad no es lo primero +ue puede ocurrir al iniciarse un
$ormulario( pero por a,ora )amos a pensar +ue s-? por+ue sino esta entrega no la
termino ,asta despus del )erano*** 444+ue me gusta darle )ueltas a las cosas555
A,ora +ue se ,a cargado el $orm en la memoria*** M+ue ocurrirN Pues( si el usuario
se )a a tomar unas ca#as3 nada* Slo ocurrir algo cuando interactuemos con el
$orm( es decir( le demos ra!ones a IindoGs para Tpegar tiritosT*
@uestra aplicacin( .te recuerdo +ue ten-a( entre otras cosas( un te8t%o8 & un
%otn/( esperar a +ue se produ!ca algunas de las acciones para las +ue est
preparada*
; la pregunta es M+ue es lo +ue puede ocurrirN Para sa%er TtodasT las cosas +ue
pueden ocurrir en nuestra )entana( .no recuerdo si ,as pulsado A6 o no/( $inali!a el
programa & muestra la )entana de cdigo*
En la parte superior de la )entana ,a& dos listas desplega%les( la de la i!+uierda
tiene todos los controles( .en otra ocasin )eremos +ue no siempre es as-/( +ue
tenemos en el $orm( incluido ste( adems de uno especial +ue se llama 1eneral*
Pulsa en la lista de la i!+uierda( para +ue se despliegue & te mostrar esto3
Estos son los cinco controles( inclu&endo el $orm( +ue pueden reci%ir mensa'es de
IindoGs* Pulsa en cual+uiera de ellos* En la lista de la derec,a estn todos los
procedimientos .e)entos/ soportados por el control de la i!+uierda* Cada control
mostrar los e)entos +ue VB &Qo IindoGs permite +ue se produ!can* Estos
ocurrirn por distintos moti)os( cada uno tiene su TtareaT( nos pueden a)isar de +ue
se ,a pulsado el ratn( +ue se aca%a de pulsar una tecla( +ue se ,a modi$icado lo
+ue antes ,a%-a( etc*
%na llamada a la precaucin.
Los e)entos son TprocedimientosT & no slo se puede llegar a ellos por+ue se
produ!ca una accin del usuario o del propio IindoGs & si me apuras( incluso de
Visual Basic*** @osotros podemos Tpro)ocarlosT McmoN simplemente ,aciendo una
llamada al SUB +ue +ueramos o actuando en el control de manera +ue ocurra
alguno de los e)entos soportados*
Por e'emplo( en el AormHLoad tenemos +ue se asignan cadenas )ac-as tanto al
La%elE como al 9e8t<3
Label) = ""
.e/t1 = ""
Cuando VB asigna una cadena )ac-a .o cual+uier otra cosa/( al La%elE est %orrando
el contenido del TCaptionT de esta eti+ueta & asignando algo nue)o( es decir lo est
cam%iando* En nuestro programa no ocurre nada( sal)o +ue se %orra lo +ue all-
,u%iera( pero realmente se est produciendo el e)ento La%elEHC,ange( por+ue
,emos cam%iado el contenido* VB sa%e +ue no ,emos escrito cdigo para mane'ar
esta situacin( as- +ue*** ,ace la )ista gorda & simplemente cam%ia el contenido del
La%elE*Caption sin ,acer nada ms*
Pero al asignar una cadena )ac-a al 9e8t<( tam%in se %orra el contenido & se
produce un C,ange( slo +ue en este caso( al no tener Caption( lo +ue se %orra es
el 9e8t? de todas $ormas sea como $uere( se produce el e)ento 9e8t<HC,ange*
@uestro +uerido amigo Visual Basic( sa%e +ue ,emos escrito cdigo para este
e)ento & sa%e +ue tiene +ue ,acer lo +ue all- se dice***
En este caso( nuestro cdigo se e'ecuta( pero realmente no ,ace nada de inters o
por lo menos nada +ue se pueda apreciar de $orma )isual* @o )o& a e8plicar para
+ue sir)e ese cdigo( por+ue &a lo ,ice en su d-a( lo +ue espero es +ue ,o& lo
entiendas me'or***
MCmoN +ue no sa%es de +u cdigo esto& ,a%lando*** pues del e'emplo de la
segunda entrega( creo +ue &a lo di'e al principio*** a )er si prestamos ms atencin
& de'amos de pensar en las )acaciones*** 4estos ni#os5
El cdigo interesante es el +ue se e'ecuta cuando se pulsa en el %otn3
Label) = "3ola " - .e/t1
A+u- se asigna al Caption del La%elE lo +ue ,a& despus del signo igual( en este
caso act0a TcasiT como una )aria%le* ; &a sa%rs +ue antes de asignar un )alor a
una )aria%le( se procesa todo lo +ue est despus del signo igual( por tanto( Visual
Basic tomar el contenido del 9e8t<( es decir lo +ue se ,a&a escrito & lo unir .W/ a
la pala%ra 2Lola 2( una )e! ,ec,o esto( lo almacena en el Caption del La%elE*
; si en lugar de guardarlo en un control la%el( lo asignramos a una )aria%le*** & si
en lugar de escri%ir nuestro nom%re( escri%isemos un n0mero*** & si la )aria%le en
la +ue guardamos ese n0mero se llamara( por e'emplo( ma8Bucle o elCa8imo***
Pues +ue tendr-amos una parte resuelta de la tarea esa +ue puse como e'ercicio en
la entrega anterior*
Pero( este $orm de la segunda entrega no nos sir)e* 9endremos +ue cargar el de la
)e! pasada & a#adirle un par de ca'as de te8tos & un par de eti+uetas( para +ue
indi+ue lo +ue se de%e introducir en cada te8t%o8? el aspecto ser-a este3
Pero nos encontramos con un pro%lema3 Mcmo puedo asignar un )alor a ma8Bucle(
si las constantes no pueden cam%iar de )alorN Acil( con)irtela en )aria%le* Pero
de%es recordar la pista +ue di al $inal3 2Las )aria%les declaradas dentro de un
procedimiento son solamente )isi%le dentro de ese procedimiento2*
"e este tipo de )aria%les se dice +ue son locales*
!lumno: MXue signi$ica estoN
Uuille: Xue slo pueden usarse dentro del procedimiento en el +ue se ,an
DI+ensionado o declarado*
!: Vale( 2mu %onito2 & M+ue pasaN
U: Esto*** +ue no pueden usarse en otro sitio***
MRecuerdas la recomendacin de usar .ption E=plicitN
Pues gracias a Option E8plicit( se solucionan el PP= de los $allos Tin)oluntariosT con
las )aria%les*** & no e8agero555
Es superF$cil escri%ir de $orma incorrecta el nom%re de una T%aria%leT & no )engas
con el cuento de +ue a t- nunca te ocurre( por+ue no me lo )o& a creer*** %ueno( de
ti si( pero no todos son tan minuciosos como t0***
.para +ue nadie se sienta o$endidoQa( +uiero +ue )eas en esto +ue aca%o de
poner*** la intencin +ue tiene( es decir +ue me diri'o a ms de un 2ti2*** &a s +ue
no eres tan torpe como para no ,a%erlo TcaptadoT( pero con esta aclaracin me
+uedo ms tran+uilo*/
Seg0n cmo & dnde se declare una )aria%le( su T)isi%ilidadT o rea de co%ertura(
ser di$erente*** tam%in se puede usar la pala%ra m%ito*** es +ue como en las
emisoras de radio se ,a%la de la co%ertura*** pues***
Una )aria%le puede tener estas co%erturas3
FFPri)ada o Local a ni)el de procedimiento .Su%( Aunction( etc*/
FFPri)ada o Local a ni)el de mdulo .ARC( BAS( etc*/
FFP0%lica o 1lo%al a ni)el de aplicacin .en este tipo ,a& una $orma especial de usar
las )aria%les +ue )eremos en otra ocasin/
E8plicando los dos primeros puntos*
Cuando declaramos o dimensionamos una )aria%le Tdentro deT un procedimiento(
sta slo es )isi%le en ese procedimiento? $uera de l no es conocida & cual+uier
uso +ue se intente ,acer de ella( producir un error*** si ,as sido o%ediente & ,as
usado el Option E8plicit* En caso de +ue no ,a&as puesto la To%ligacinT de declarar
todas las )aria%les( te lle)ars una sorpresa de +ue no tiene el )alor esperado*
!: 4\A5
U: M@o te lo creesN Vale* Vamos a compro%arlo*
A%re un pro&ecto nue)o( pon un te8t%o8 & un %otn**
A%re la )entana de cdigo( %orra el Option E8plicit*
En el AormHLoad ,a! esta asignacin3 'n1redulo = "!o me lo 1reo"
En el Command<HClicJ escri%e esto otro3 .e/t1 = 'n1redulo
Pulsa A6 & ,a! clicJ en el %otn***
MXue ,a pasadoN
.9engo +ue compro%arlo( para no meter la pata( pero se supone +ue el te8to se
%orrar sin poner nada***/
Bien( eso ocurre por+ue la )aria%le usada en el AormHLoad no tiene nada +ue )er
con la usada en el Command<HClicJ*
Con esto compro%amos o demostramos +ue podemos tener )aria%les di$erentes con
el mismo nom%re* La 0nica condicin es +ue no pueden estar 'untas( aun+ue ,a&
un truco para 'untarlas sin +ue ellas se enteren***
En este 0ltimo e'emplo( nuestra intencin es tener una )aria%le +ue sea TconocidaT
en todo el $orm* Cuando necesitemos )aria%les con un m%ito a ni)el de mdulo(
tenemos +ue declararla o dimensionarla en la seccin de las declaraciones
generales? &a sa%es( en la lista i!+uierda de la )entana de cdigo seleccionas
1eneral & en la de la derec,a "eclarations . "eclaraciones/*
Cuestra la )entana de cdigo & en 1eneralQ"eclaraciones escri%e3
=>tion E/>li1t Hretornamo& a la& buena& 1o&tumbre&
#im 'n1redulo %& Strin(
Pulsa A6 para e'ecutar el programa( pulsa en el %otn &*** 4ALORA SI5
9enemos una )aria%le +ue puede ser T)istaT en todo el $orm* ;a puedes usar
TIncreduloT donde +uieras( a,ora siempre ser la misma )aria%le & contendr lo
0ltimo +ue se le ,a&a asignado*
A partir de la )ersin : del VB( entra en 'uego una nue)a pala%ra( TPri)ateT( +ue
suele usarse en las declaraciones de las )aria%les a ni)el de mdulo( de esta $orma
es ms $cil entender la intencin de la misma? por tanto la declaracin anterior
podemos ,acerla tam%in as-3
Private 'n1redulo %& Strin(
La& )eces( so%re todo si &a ,as programado antes en CSF"OS( +ue usamos
)aria%les como a( %( c( i( '( J***etc*( .al menos &o esto& acostum%rado a llamar i( '(
J a las )aria%les +ue uso en los %ucles AOR/( cuando ,ago un %ucle dentro de un
procedimiento uso i como )aria%le -ndice( .o )aria%le TcontadoraT/( pero M+ue ocurre
si esta Tcostum%reT +uiero aplicarla en )arios procedimientosN Pues +ue dimensiono
una )aria%le i en cada uno de ellos & a+u- no ,a pasado nada555
%ar el mimo nom1re de 7aria1le en ditinto procedimiento
Como indica el enca%e!ado de este nue)o prra$o( cosa +ue &a ,e comentado
antes( podemos tener distintas )aria%les con el mismo nom%re en distintos
procedimientos? para ello( slo ,a& +ue dimensionarlas & el VB las almacenar en
distintas posiciones de la memoria para +ue no se Tme!clenT*
En la entrega anterior( ten-amos un procedimiento llamado 0ontar +ue se usa%a
para eso( contar***
En este e'emplo )amos a usar un su% tam%in llamado contar( para )er en accin
todo esto +ue esto& diciendo*
Sit0ate en la parte 1eneralQ"eclarations de la )entana de cdigo & escri%e o
2copiaQpega2 lo siguiente3
Private Sub 0ontar()
#im i %& 'nte(er
For i = 1 .o )
Print "i en 1ontar= "I i
!e/t
End Sub
A,ora en el AormHLoad( escri%e esto otro3
#im i %& 'nte(er
Show
For i = 1 .o +
Print "i en el Form_Load= "I i
0ontar
!e/t
E'ecuta el programa & ***
Las )isto lo +ue ocurre*** A pesar de +ue am%as )aria%les tienen el mismo nom%re(
son di$erentes* La )aria%le i del AormHLoad no es la misma +ue la )aria%le i de
Contar*
Cuando usamos )aria%les locales es como si cam%isemos el nom%re & se llamaran
@om%reProcedimientoHVaria%le*
S +ue puede ser una $orma Tre%uscadaT de e8plicarlo( pero as- te ,aces una idea*
9odas las )aria%les declaradas en un procedimiento( slo son )isi%les en ese
procedimiento* Si ,as usado XuicJBasic o el compilador Basic de Cicroso$t .+ue
usa%a el XuicJBasic E8tended XB>/( esto &a e8ist-a & tam%in e8ist-a la $orma de
,acer +ue una )aria%le declarada en un procedimiento( $uese )isi%le $uera de l?
para ello declara%as la )aria%le como S,ared .compartida/? pero en VB eso @O
E>IS9E* La 0nica $orma de compartir una )aria%le es declarndola en la seccin
1eneral de las declaraciones*
Prue%a a,ora esto* Sustitu&e el procedimiento Contar por este otro3
Private Sub 0ontar(J %& 'nte(er)
#im i %& 'nte(er
For i = 1 .o J
Print "i en 1ontar= "I i
!e/t
End Sub
A+u- ,acemos +ue Contar reci%a un parmetro & el )alor +ue reci%e lo usamos
como el l-mite $inal del %ucle Aor( es decir contar desde U@O ,asta el )alor de '*
Sustitu&e la llamada a Contar del AormHLoad por esta3
0ontar i
Le damos a Contar el parmetro i* Por tanto cada )e! +ue se llame a este
procedimiento le estamos diciendo +ue i es el )alor m8imo +ue tomar el %ucle Aor
+ue tiene dentro*
MCmo reaccionarN MSe con$undirN ***
@o( no )o& a de'arlo para la siguiente entrega( es tan o%)io +ue lo )o& a e8plicar
a,ora mismo3
Al procedimiento Contar le da igual +ue se use una )aria%le llamada i o cual+uier
otra( incluso un n0mero* Lo 0nico +ue necesita & espera( es reci%ir un )alor
numrico .del tipo Integer/ & lo asignar a la )aria%le '* Por tanto no ocurrir nada
e8tra#o* E'ecuta el programa & $-'ate en lo +ue ocurre* S +ue lo ,as deducido( eso
est %ien*** )as aprendiendo*** OF/
MCmoN MXue t0 a0n no lo ,as captadoN*
Otra cosa ser-a pretender usar una )aria%le declarada a ni)el de mdulo( dentro del
procedimiento( +ue tu)iese el mismo nom%re*
Si te ,as +uedado Tcon la coplaT( tu mismo sa%rs la respuesta*** 4E$ecti)amente5 Si
dentro de un procedimiento tenemos una )aria%le dimensionada con el mismo
nom%re de una declarada a ni)el de mdulo o a ni)el glo%al( .para usarla en
cual+uier sitio de la aplicacin/( tendr Tpre$erenciaT la )aria%le local*** ]sta TtaparT(
ocultar o como pre$ieras decirlo a cual+uier otra )aria%le del mismo nom%re***
En la pr8ima entrega )eremos ms casos & cosas de las )aria%les*
Compro%aremos cmo usarlas a ni)el 1lo%al* Pero por a,ora )amos a terminar con
el programa +ue ten-amos planteado en la entrega anterior3
Aun+ue realmente de%er-as sa%er cmo solucionarlo***
Lo +ue seguramente no sa%rs( es cmo ,acer +ue estas )aria%les tomen el )alor***
"e acuerdo( lo e8plicar* Carga el e'emplo de la cuarta entrega*
La& )arias soluciones a este pro%lema? una ser-a usar )aria%les locales( esta
decisin no T'usti$icaT el Tpeda!oT de pista +ue te di*** pero esto es lo +ue ,a&*
La l-nea Const minBucle U <( ma8Bucle U <7* "e%e +uedar as-3
0on&t min@u1le = 1
#im ma/@u1le %& 'nte(er
Esto ,ar +ue ma8Bucle de'e de ser una constante & pase a ser una )aria%le( con lo
cual podremos asignarle cual+uier )alor*
Pero( Mcmo le asignamos el )alorN
Vamos a dar por sentado +ue lo +ue se escri%a en el 9e8t< ser el )alor +ue de%e
tener ma8Bucle? entonces lo 0nico +ue ,aremos es asignar a ma8Bucle lo +ue se
escri%a en el 9e8t<***
Vale( pero MdndeN
Pues*** por e'emplo( despus de la declaracin( as- +ue en la siguiente l-nea al "im
ma8Bucle*** escri%e los siguiente3
ma/@u1le = .e/t1
Esto en teor-a no dar-a pro%lemas( al menos en condiciones normales( &a +ue el
contenido de un te8t%o8 es del tipo Variant & &a )imos +ue un Variant puede
almacenar cual+uier cosa( por tanto si es un n0mero TintentarT con)ertir al tipo de
la )aria%le +ue reci%ir el )alor*
Esto no siempre $unciona( so%re todo si el contenido del 9e8t< no es numrico* Por
a,ora )amos a ,acerlo simple( si el usuario .en este caso t0/( escri%e algo no
numrico lo )amos a considerar CERO*** o casi***
Cam%ia la asignacin anterior por esta otra***
::: !,-. ;;; Antes de ,acerlo( pru%alo e intenta escri%ir una pala%ra en lugar de
un n0mero*** M+ue ocurreN
Pues +ue VB no se complica la )ida & te dice +ue TnonesT*** .realmente dice 9&pe
Cismatc,*** Error de 9ipos( es decir +ue lo +ue ,as escrito no es capa! de
con)ertirlo a Integer/*** as- +ue escri%e esto otro3
ma/@u1le = 8al(.e/t1)
Con esto lo +ue ,acemos es con)ertir el contenido del 9e8t< a un V!,or numrico &
lo asignamos en la )aria%le***
MPro%lemasN Xue el )alor sea ma&or del +ue se puede guardar en un Integer( pero
eso &a no es asunto de esta entrega***
A,ora nos +ueda con)ertir elCa8imo en )aria%le & asignarle el )alor +ue ,a& en el
9e8tE* 4E$ecti)amente5 ,acemos lo mismo( slo +ue esta )e! dentro del
procedimiento Contar( por tanto la declaracin Const elCa8imo U <777W( la tienes
+ue +uitar & poner estas dos l-neas3
#im el*a/imo %& 'nte(er
el*a/imo = 8al(.e/t))
A+u- el 0nico incon)eniente es +ue esta asignacin se ,ace cada )e! +ue se entra
en este procedimiento*** & eso( amigo m-o( no es un %uen estilo de programacin***
So%recargamos de $orma innecesaria al procesador*** ten en cuenta +ue la
con)ersin a n0mero & la asignacin 444se e'ecuta cada )e! +ue se entra en
Contar555
Lo me'or para este caso ser-a declarar elCa8imo como )aria%le a ni)el de mdulo*
Por tanto( %orra el "im elCa8imo*** del su% Contar & colcalo en la parte de las
declaraciones generales del $orm*
A,ora*** Mdnde asignamos el )alor para e)itar la so%reFcargaN ;a +ue tenemos la
)aria%le a ni)el de mdulo( sta ser T)istaT en todos los procedimientos del
$ormulario( por tanto lo lgico ser-a ,acerlo en el Command<HClicJ( &a +ue cuando
nos interesa a nosotros sa%er cuanto tenemos +ue contar es precisamente cuando
pulsamos en el %otn***
Pero*** Mdnde e8actamenteN( despus de Contando U <
Prcticas & e'ercicios
MXuieres algo para practicarN
Este e'ercicio se lo pon-a a mis alumnos( cuando da%a clases de BASIC( ,ace &a
unos <7 a#os o ms*** & consist-a en pedir el nom%re( pedir la edad & mostrar el
nom%re tantas )eces como a#os tengamos***
Claro +ue con el BASIC del CSF"OS era ms directo & se sa%ia cuando se de%-a
empe!ar a mostrar el nom%re( para sol)entar esto( se mostrar el nom%re TedadT
)eces cuando se pulse en un %otn* El aspecto del $orm ser-a algo as-3
@o creo +ue sea complicado( as- +ue )amos a complicarlo un poco ms3
Costrar el nom%re TedadT )eces( dentro de un la%el( para ello el la%el de%er ocupar
la parte i!+uierda del $orm*
; una tercera )ersin( ser-a lo mismo +ue esta 0ltima( pero cada )e! +ue se
muestre el nom%re se ,aga en una l-nea di$erente*
,a pita: En la segunda entrega )imos de pasada el CLR* Pues decirte +ue si
a#adimos a una )aria%le un CLR.<K/( lo +ue ,acemos es a#adirle un retorno de
carro( es decir lo +ue )enga despus se mostrar en la siguiente l-nea*** siempre
+ue se TconcateneT* 9am%in e8iste una constante de$inida en VB: o superior +ue es
)%CrL$( esto es un retorno de carro .Cr/ & un cam%io de l-nea .L$/
4Xue te di)iertas5
Con esto aca%a el tema por a,ora*** no( no se aca%a el curso( no te alarmes? la
pr8ima entrega ser*** pues( es +ue*** &o creo +ue*** si no*** un d-a de estos*
LECCION 5.2
;a sa%es +ue mi segundo nom%re es3 "ESPIS9E( si no lo sa%-as( a,ora lo sa%es***
; es +ue con tanta e8plicacin de la Xuinta Entrega( al $inal e8pli+u cosas( pero no
todo*
Al $inal de la Cuarta Entrega se ,icieron una serie de cam%ios al programa ese de
los %ucles* La e8plicacin de la utilidad de todo ese cdigo es( en trminos
generales( para cancelar en cual+uier momento el programa*
MCmoN
Lemos declarado Contando a ni)el de mdulo( por tanto ser )isi%le en todo el
$orm*
Cuando se declara una )aria%le( el VB le asigna siempre un )alor predeterminado(
en caso de las cadenas de caracteres .string/ ese )alor es 22 .cadena )ac-a/? a los
n0meros se le asigna un )alor CERO* Por tanto( al iniciar el programa( la )aria%le
Contando )aldr CERO( as- +ue la primera )e! +ue se pulse en el %otn Command<
& se comprue%e esto3
I$ Contando 9,en***
A,( si*** no ,e e8plicado para +ue sir)e esto del I$***9,en***
Las instrucciones I$Q9,en se usan para compro%ar si la Te8presinT +ue se usa
despus del IA se cumple o no***
En caso de +ue se cumpla .sea cierta/( se e'ecutar todo lo +ue ,a&a despus de
9LE@*** algo as-3
'F KELPMES'N!O .3E! K'!S.M400'=!ESO
9am%in puede usarse de esta otra $orma3
'F KELPMES'N!O .3E!
K'!S.M400'=!ESO
PK*QS '!S.M400'=!ESOR
E!# 'F
En la primera $orma de uso( las instrucciones se ponen a continuacin de 9LE@
como en el caso de3
'G 0ontando = .hen E/it For
En la otra $orma de usarlo( las instrucciones se ponen en las siguientes l-neas &
podemos escri%ir tantas l-neas como +ueramos* 9odas se intentarn procesar***
Esto para el caso de +ue al e)aluar la e8presin se cumpla como )erdadero*
En las ocasiones en las +ue no se cumple la e8presin se ,ar lo siguiente( seg0n la
$orma de usar el IAQ9LE@3
FFEn el primer mtodo( se procesan las instrucciones +ue ,a& en la siguiente l-nea &
se contin0a a partir de a,- el programa*
FFEn el segundo caso( se %usca E@" IA & se contin0a por la siguiente l-nea***
Cs adelante( en otra entrega( )eremos otras $ormas de usar IA***9LE@***
A,ora )o& a e8plicar un poco esto de la e)aluacin de las e8presiones*
El IF espera encontrar un )alor CERO .AALSO/ o un )alor distinto de cero .por
e8tensin VER"A"ERO/
En If Contando = 0 Then Exit For, la e8presin es Contando O *( a+u-
no se est usando la asignacin( sino +ue se est e)aluando si el contenido de la
)aria%le Contando es igual a cero? en caso de +ue sea cierto( es decir +ue Contando
)alga cero( .algunas )eces me mara)illo de mi lgica aplastante***/( se de)uel)e un
)alor Verdadero .9RUE/*
Por otra parte si Contando @O )ale cero( se de)ol)er un )alor Aalso .AALSE(
CERO/*
En otros lengua'es se usa un s-m%olo distinto para el igual( seg0n sea una
asignacin o una comparacin*
En Pascal ."elp,i/ la asignacin es :O & la comparacin es O
En C( CBB( la asignacin es O & la comparacin OO .esto del OO puede TsonarteT
si ,as ,ec,o algo con \a)aScript/
En el caso de 'G 0ontando .hen( al no ,a%er una e8presin +ue e)aluar( lo +ue
se comprue%a es si el contenido de la )aria%le es cero o no es cero( en caso de +ue
sea @O CERO( se cumple la condicin & se procesa todo lo +ue )iene a
continuacin? pero si la )aria%le )ale CERO( el IA lo interpretar como AALSO & pasa
a e'ecutar lo +ue ,a&a a continuacin de End 'G.
Por tanto( .)ol)iendo por $in al listado/( la primera )e! +ue se pulse en el %otn
Command< & se comprue1e esto3
'G 0ontando .hen
@o se cumplir la condicin( &a +ue el contenido de Contando es cero( & se pasar a
lo +ue ,a& despus del End I$( es decir a3
0ontando = 1
& se contin0a con el programa como antes de a#adir todas estas cosas***
Pero( si pulsas de nue)o en el %otn( se )uel)e a procesar lo +ue ,a& dentro de
Command<HClicJ( .esto es posi%le por+ue al usar "oE)ents( permitimos +ue
IindoGs siga reci%iendo & procesando TtiritosT/( pero cuando entramos por segunda
)e!( Contando )ale < .uno/( .&a +ue al ser una )aria%le a ni)el de mdulo conser)a
el 0ltimo )alor +ue ,a&amos asignado/( & esta )e! al e)aluar3
I$ Contando 9,en
si se cumple( as- +ue se procesan las l-neas +ue )ienen a continuacin*** entre ellas
est Contando U 7 & "oE)ents +ue )uel)e a permitir a IindoGs +ue las otras cosas
+ue antes de pulsar en el %otn contin0en e'ecutndose( .esto se ,ace de $orma
aEncrona( es decir( IindoGs se da por enterado & da los a)isos .mensa'es/
cuando +uiera/( pero contin0a con la siguiente instruccin sin esperar a +ue esos
mensa'es se terminen de procesar( entonces se encuentra con el E8it Su% +ue lo
manda $uera del e)ento*** .Si no te ,a +uedado demasiado claro( no te preocupes
)eremos ms de esto a lo largo del curso***/
En caso de +ue ,a&amos pulsado el %otn cuando a0n no ,a%-a terminado todo lo
+ue este Su% esta%a ,aciendo( se contin0a igual +ue si se ,u%iese ,ec,o PAUSA &
despus PLA;*
Con la sal)edad de +ue si VB se encuentra con alguno de los I$ Contando U 7 9,en
E8it Su%( de'ar de procesar & se saldr del procedimiento*** Esta no es la me'or
$orma de cancelar una tarea &a iniciada( pero algo es algo***
9am%in es posi%le +ue al pulsar por segunda )e! en el %otn( se estu)iese dentro
del Su% Contar( en este caso( tam%in se e)aluar-a la e8presin & se saldr-a del
procedimiento*** as- +ue tam%in de'ar-a de procesarse todo*
Cuando pulsemos por tercera )e!*** iniciaremos el proceso de nue)o***
LECCION 5
Le pre$erido poner la solucin a los e'ercicios en una pgina separada( as- creo +ue
ser me'or*
Solucin al primero( preguntar el nom%re( preguntar la edad & mostrar el nom%re
2edad2 )eces3
9enemos dos 9e8tBo8es3 9e8t< & 9e8tE( un %otn3 Command<( el cdigo ser-a3
Private Sub 0ommand1_0li12()
#im i %& 'nte(er
#im J %& 'nte(er
#im !ombre %& Strin(
J = 8al(.e/t))
!ombre = .e/t1
For i = 1 .o J
Print !ombre
!e/t
End Sub
El segundo es un poco ms complicado( pero no tanto( espero*
Slo ,a& +ue asignar el nom%re al La%el( suponiendo +ue $uese La%elK( ser-a algo
como esto3
Private Sub 0ommand1_0li12()
#im i %& 'nte(er
#im J %& 'nte(er
#im !ombre %& Strin(
J = 8al(.e/t))
!ombre = .e/t1
For i = 1 .o J
Label+ = Label+ - !ombre
!e/t
End Sub
Por 0ltimo( para +ue cada nom%re se muestre en una l-nea di$erente( ,a& +ue
a#adirle a continuacin un retorno de carro & cam%io de l-nea( en VB: ,a& una
constante de$inida para ello3 )%CrL$( en el VBK ,a%r-a +ue declararla de esta $orma3
"im )%CrL$ As String
)%CrL$ U C,r^.<K/ W C,r^.<7/
Este ser-a el cdigo3
Private Sub 0ommand1_0li12()
#im i %& 'nte(er
#im J %& 'nte(er
#im !ombre %& Strin(
J = 8al(.e/t))
!ombre = .e/t1
For i = 1 .o J
Label+ = Label+ - !ombre - vb0rLG
!e/t
End Sub
Espero +ue te ,a&as apuntado un <7( pero si no ,as logrado ,acerlos %ien( no te
preocupes( poco a poco irs +uedndote con la copla*
LECCION 6
Como ,emos )isto en el apndice de la entrega anterior( la instruccin IA*** 9LE@***
nos permite tomar decisiones seg0n el )alor de una )aria%le o el resultado de una
e8presin* En esta entrega )eremos como sacarle rendimiento a esta instruccin*
Pero antes de entrar en detalles( )eamos cmo podemos decirle al Basic +ue ,aga
las cosas* En realidad )amos a )er la $orma en +ue se le puede decir +ue las ,aga***
Aorma de especi$icar las instrucciones en Visual Basic
Las instrucciones en Basic no tienen por+u estar cada una en una l-nea* Se pueden
escri%ir )arias instrucciones en la misma l-nea( pero separando cada una de ellas
con el signo : .dos puntos/*
Cuando VB encuentra los dos puntos( de'a de TinterpretarT la instruccin & pasa a la
accin( una )e! traducido a su lengua'e interno( toma lo +ue ,a& despus del signo
: & sigue su camino en %usca de ms instrucciones o el $inal de la l-nea*
Vemoslo de $orma prctica3
!ombre = "Pe>e" C Print !ombre
Esta l-nea tiene dos instrucciones3 una asignacin & una instruccin Print*
Podemos poner cuantas instrucciones +ueramos( separadas con los dos puntos*
Pero( .siempre ,a& un pero/( si una de las instrucciones es el IAQ9LE@ la cosa
puede cam%iar***
;a )imos +ue IA comprue%a la e8presin +ue )iene a continuacin( si es cierta(
E@9O@CES procesa lo +ue ,a&a despus de 9LE@* En caso de ser en la misma
l-nea( interpretar todas las instrucciones +ue estn a continuacin? en caso de ser
un %lo+ue IA*** 9LE@*** E@" IA( e'ecutar todo lo +ue est dentro de ese %lo+ue*
A,ora %ien( si la e8presin es $alsa pasa a la siguiente l-nea( tanto si es o no un
%lo+ue* En el caso del %lo+ue la siguiente l-nea a interpretar ser la +ue est
despus de E@" IA*
En los tiempos del BASIC interpretado de CSF"OS( era ,a%itual encontrar las l-neas
con )arias instrucciones separadas por dos puntos*
En mi caso( cuando empec a usar el XuicJBasic E*7 & al poder usar %lo+ues IA***
9LE@*** E@" IA( $ui de'ando a un lado el 2mogolln2 de instrucciones en la misma
l-nea***
A,ora( sal)o en contadas e8cepciones( escri%o cada instruccin en una l-nea* ; te
recomiendo +ue ,agas lo mismo( tu cdigo ganar en claridad & si alguna )e!
)uel)es a )erlo( te ser ms $cil de entender*
"espus de este pe+ue#o respiro( )eamos cmo estar-a $ormada una l-nea de VB
para usar con un IA*** 9LE@***
Pin&tru11ione&CR 'F Ke/>re&iBnO .3E! Kin&tru11ione& &i e& 1ierto PCmS&
in&tru11ione&555RO
A continuacin de 9LE@ podemos incluir cuantas instrucciones +ueramos(
separadas por dos puntos*
Estas slo se e'ecutarn cuando la e8presin sea cierta* Si el resultado de la
e8presin es $also( se o%)ia TtodoT lo +ue ,a& despus de 9LE@ & se pasa a la
siguiente l-nea*
Espero +ue lo ,a&as asimilado & +ue no te indigestes con lo siguiente***
Pero( .***/( e8iste otra instruccin +ue PUE"E acompa#ar al IA*** 9LE@*** & es para
los casos en los cuales el resultado de la e8presin sea AALSO*
Si( &a s +ue di'e +ue cuando es $also se pasa a la siguiente l-nea( pero eso es
cuando no se usa la clusula ELSE*
Con sta( la de$inicin de la instruccin 2tomadora de decisiones2 +uedar-a as-3
'F Ke/>re&iBnO .3E! K&i &e 1um>leO ELSE K&i no &e 1um>leO
9anto en 6si se cumple' como en 6si no se cumple' pondremos tantas
instrucciones como +ueramos( .separadas por dos puntos/*
Pero no te recomiendo +ue lo ,agas( es pre$eri%le( al menos para darle 2claridad2 a
nuestro cdigo( usar el %lo+ue3
'F Ke/>re&iBnO .3E!
K&i &e 1um>leO
ELSE
K&i no &e 1um>leO
E!# 'F
S +ue esto puede ocupar ms l-neas de cdigo( pero nuestro 2coco2 lo agradecer(
&a +ue es ms $cil de comprender( sino )eamos un e'emplo3
'F numero O limite .3E!
Print "tu n$mero e& (rande"
ELSE
Print "=6? *16e7:"
E!# 'F
A,ora )emoslo en una sla l-nea3
'F numero O limite .3E! Print "tu n$mero e& (rande" ELSE Print "=6?
*16e7:"
En este e'emplo( a0n +ueda claro( pero lo podr-amos complicar con ms
instrucciones para am%os casos( es decir( para cuando la e8presin es cierta &
tam%in cuando es $alsa*
En los tiempos del BASIC +ue )en-an incorporados con los ordenadores( cada l-nea
del programa ,a%-a +ue numerarla( &a +ue todo lo +ue se escri%-a sin n0mero de
l-nea( se e'ecuta%a inmediatamente? al igual +ue ocurre con lo +ue se escri%e en la
)entana Inmediate del Visual Basic*
Los n0meros de l-neas se usa%an( adems de por+ue era o%ligatorio( para cam%iar
el orden de e'ecucin( so%re todo despus de una comparacin* "e esta $orma( a0n
sin tener %lo+ues IAQ9LE@QELSEQE@" IA( se pod-an simular*
MCmo se logra%aN
Usando una instruccin +ue muc,os creen +ue es 2indecente( antisocial( etc*2
,a etrella del Baic: .redo2le de tam2ores/ SU.-.S
A partir de ,o&( ms de un purista de la programacin no me dirigir la pala%ra***
pero no me importa***
Se ,a 2denostado2 .in'uriado/ con e8ageracin el uso de esta instruccin*
Realmente es una instruccin de 2%i$urcacin2( es decir( sir)e para 2IR A2 otro sitio
de nuestro programa*
Su uso ,a sido el ms criticado de los @O PAR9I"ARIOS del Basic & siempre ,an
%asado sus cr-ticas en el e8agerado uso del 1O9O en todos los programas Basic*
Pero aclaremos +ue C tam%in tiene esta instruccin & +ue cual+uier programa en
cdigo m+uina .ensam%lador/ est 2plagado2 de \CP +ue para el caso es lo mismo
+ue el su$rido 1O9O( realmente una instruccin U.-. n?meroIlinea se con)ierte
en V+& n?meroIlinea*
@o )o& a recomendar el uso del 1O9O( para nada( &a +ue ,o& d-a es innecesario su
uso* Antes no ten-amos ms remedio( por+ue el BASIC no dispon-a de instrucciones
para poder estructurar el cdigo* Pero ser-a una tonter-a +uerer ,acer creer +ue no
e8iste esta instruccin* Sa%iendo +ue est & cmo podemos e)itarla( es pre$eri%le a
decir +ue no e8iste & si por casualidad la descu%res*** a +ue la uses*
Por tanto( insisto en mi recomendacin( .de esta $orma los PURIS9AS )ol)ern a
dirigirme la pala%ra/( @O USES EL 1O9O( ni a0n cuando creas +ue no tienes ms
remedio*** aun+ue( a+u- entre nosotros( algunas )eces es ms cmodo usarlo***
pero +ue no se entere nadie***
Este es un programa de los de antes( sir)e para mostrar en pantalla los n0meros
del < al <7 & sin usar el AORQ@E>9
1 % = 1
) Print %
+ % = % , 1
D 'F % K= 1 .3E! G=.= )
H0on el 0ommodore e&te >ro(rama &e &olTa e&1ribir a&TC
1 %=1
) PM'!.%C%=%,1C'F%K=1G=.=)
HSin ESP%0'=S !' !%#%555 .=#= %PEL*%U%#=555 VFue mS& daba u&ar el
G=.=W
7magine there's no hea)en... 0es que est/ sonando 8. &ennon... un momento...5
En este e'emplo( es o%)io +ue podr-amos sustituirlo con3
1 For % = 1 .o 1
) Print %
+ !e/t
El @E>9 ,ace lo mismo +ue la asignacin & la comparacin*
Pero ,a& otras maneras( para ello e8iste una serie de instrucciones +ue $uncionan
de manera similar( )eamos otros e'emplos con ms instrucciones para ,acer %ucles(
seguir usando los n0meros de l-nea por a+uello de la 2nostalgia2( pero sal)o en el
primer e'emplo( en los dems no es necesario*
1 % = 1
) Xhile % K= 1
+ Print %
D % = % , 1
5 Xend
El ILILEQIE@" &a casi ni se usa( por+ue tienen un sustituto ms )erstil( a,ora lo
)eremos( pero el uso ser-a3
X3'LE Ke/>re&iBnO
Kin&tru11ione& &i &e 1um>leO
XE!#
Es decir( CIE@9RAS la e8presin sea cierta( repite todo lo +ue ,a&a ,asta el IE@"*
Por supuesto podemos ponerlo todo en una sola l-nea3
1 % = 1 C Xhile % K= 1 C Print % C % = % , 1 C Xend
Pero esto tampoco es recomenda%le( +ueda algo 2di$uso2***
El IE@" $unciona como IA A RU<7 9LE@ 1O9O 888( con la )enta'a +ue e)itamos el
1O9O & lo +ue ,ace es compro%ar si la e8presin +ue ,a& tras el ILILE es cierta o
no( en caso de +ue sea )erdadero el resultado( .&a sa%es( distinto de CERO/( se
e'ecutar todo lo +ue ,a& entre ILILE & IE@"* Estas instrucciones &a e8ist-an en
el 1IBASIC .el %asic de los PCs/
La& +ue tener cuidado con esto de +ue la e8presiones e)al0an el cero como AALSO
& cual+uier otro )alor como VER"A"ERO( por e'emplo3
% = 1 o
Xhile % Xhile 1
Print % Print %
% = % , 1 % = % , 1
Xend Xend
En am%os casos el %ucle ser-a 2in$inito2( realmente se detendr-a en un momento
dado( &a +ue llegar-a a 2des%ordarse2 el )alor m8imo & en ese momento el
programa aca%ar-a por producirse un error*** pero prue%a esto & )ers3
Xhile 1
Print "3ola *undo"
Xend
Esto nunca $inali!ar( sal)o +ue pulses CR9LBBEAY .o I@9ERrumpir/( para detener
el programa*

+8 intruccione para 4acer 1ucle
Con el XuicJBasic K*7( .&o no llegu a tenerlo( pero creo +ue $ue a,- dnde se
introdu'o/( entr en $uncionamiento una nue)a $orma de ,acer %ucles3
"O*** LOOP
El 0ltimo e'emplo podr-amos escri%irlo as-3
#o
Print "3ola *undo"
Loo>
Pero la 2gracia2 de este tipo de %ucle es +ue podemos usar dos nue)as clusulas
para e)aluar cuanto durar el %ucle*
La primera es ILILE & $unciona igual +ue en ILILEQIE@"
% = 1
#o Xhile % K= 1
Print %
% = % , 1
Loo>
La )enta'a es +ue ILILE se puede poner tanto despus de "O como a continuacin
de LOOP*
Si lo usamos como "O ILILE Re8presinS*** la $orma de actuar es igual +ue
ILILEQIE@"( es decir( se e)al0a la e8presin & slo en caso de +ue sea cierta( se
e'ecuta lo +ue est dentro del %ucle( es decir entre "O & LOOP*
Pero si e)aluamos la e8presin en LOOP( se e'ecutar todo lo +ue ,a& tras el "O(
como m-nimo una )e! & se seguir repitiendo si se cumple la condicin* "e esta
$orma( como ,e dic,o( se e'ecutar el contenido del %ucle( como m-nimo una )e!*
Veamos un e'emplo3
% = 1
#o
Print %
% = % , 1
Loo> Xhile % K= 1
El pro%lema es +ue si A( en lugar de )aler <( tiene un )alor superior a <7( tam%in
se e'ecutar( al menos( una )e!*
% = 11 C #o C Print %C % = % , 1C Loo> Xhile % K= 1
Xue mal +ueda en una sola l-nea( M)erdadN
Pero con "OQLOOP tam%in puede usarse U@9IL( en este caso( el %ucle se repetir
LAS9A +ue se cumpla la e8presin
% = 1
#o 4ntil % O 1
Print %
% = % , 1
Loo>
A-'ate +ue la e8presin ,a cam%iado de RU .menor o igual/ a S .ma&or/( &a +ue
a,ora se e)al0a de esta $orma3
Lasta +ue A sea ma&or +ue die!( REPI9E todo ,asta LOOP*
Por supuesto tam%in podemos usarlo despus del LOOP3
% = 1
#o
Print %
% = % , 1
Loo> 4ntil % O 1
A+u- ,ago la misma aclaracin +ue antes( si el )alor inicial de A es ms de <7 se
e'ecutar como m-nimo una )e!*
Realmente para contar de $orma secuencial & prcticamente para casi todo tipo de
%ucle( no es necesario ,acer los %ucles con "OQLOOP( &a +ue AORQCE>9 lo ,ace
%astante %ien*
Sigamos con estos %ucles( pero en lugar de contar de menor a ma&or( )amos a
contar 2pa tr/s2( es decir de ma&or a menor*** +uin sa%e( lo mismo necesitas ,acer
un programa +ue cuente al re)s***
% = 1
#o Xhile % O= 1
Print %
% = % A 1
Loo>
Cuando se muestre el <( AUAF< se con)ertir en A U 7 & la comparacin A SU < no
se cumplir( por tanto de'ar de repetirse el %ucle( pero esto tam%in se puede
,acer con AORQ@E>93
For % = 1 .o 1
Print %
!e/t
El 0nico incon)eniente es +ue @O SE REPI9E @I U@A VEZ*** MPor +uN
Por+ue si no se le indica lo contrario( AORQ@E>9 siempre cuenta de $orma
ascendente & cuando )e +ue A de%e ir de <7 ,asta < & +ue eso no es ascendente***
pasa de e'ecutar el %ucle* Esto es una cosa a tener en cuenta( AOR siempre e)al0a
los )alores del %ucle +ue tiene +ue ,acer & si no est entre los )alores +ue de%e( no
se e'ecuta ni una sola )e!* En este caso de%e empe!ar por "IEZ & llegar ,asta
U@O( as- +ue se da cuenta de +ue &a ,a terminado*** incluso sin ,a%er empe!ado***
4+ue listo es el AOR5
Para +ue el AOR cuente ,acia atrs( necesitamos un nue)o pelda#o .esto en ingls
+uedar-a 2cla)ado2/( en la escala e)oluti)a del AORQ@E>9 .a,- +ueda eso555/
;a sin co#as( se necesita la pala%ra S9EP para indicarle +ue no +ueremos ir de uno
en uno de $orma ascendente( en nuestro e'emplo lo usar-amos as-3
For % = 1 .o 1 Ste> A1
Print %
!e/t
"e esta $orma contar desde <7 ,asta <( restando uno en cada repeticin*
Pero( M+ue ,acer si +ueremos usar otros )aloresN
Simplemente ponerlo despus de S9EP( por e'emplo3
For % = 1 .o 1 Ste> A1
For % = 1 .o 1 Ste> +? et1? et15
Insisto( todo esto est mu& %ien( pero en la prctica usaremos otras cosas adems
de contar de $orma lineal( con incrementos o sin ellos*** ,a%r )eces +ue +ueramos
salir de un %ucle*
;a lo ,emos )isto( por e'emplo E8it Su% sal-a del procedimiento( Mrecuerdas el E8it
AorN
Para salir de los %ucles podremos E8it & a continuacin Aor( "o( etc* Pero @O
podremos salir de un %ucle ILILEQIE@"*
;a )eremos e'emplos para estos casos & otros +ue surgirn ms adelante*
Bien( creo +ue &a ,emos dado demasiadas )ueltas con tanto %ucle( para terminar3
los e'ercicios esos +ue tanto os gustan*
<*/ La! un programa +ue al pulsar en un %otn .CommandButton/ ,aga un %ucle
entre dos )alores +ue ,a%rs introducido por medio de dos ca'as de te8tos .una
para el inicio & otra para el $inal/
E*/ Otro +ue tenga una tercera ca'a de te8tos & +ue el )alor introducido en ella sea
el incremento*
K*/ Como tercer e'ercicio( una )e! terminado el %ucle( +ue muestre en un La%el las
)eces +ue se ,a repetido*
Por e'emplo( si ,acemos un %ucle del uno al die! de uno en uno( se repetir die!
)eces? pero si lo ,acemos de dos en dos( se repetir cinco )eces***
Como pista( decirte +ue no tendrs +ue ,acer ninguna comparacin para o%tener el
resultado( la solucin es tan SICPLE +ue seguramente la descartars 2por+ue no
puede ser tan $cil2
Por supuesto( me gustar-a +ue los %ucles los ,icieras tanto con AORQ@E>9 &
"OQLOOP* ;a puestos( podr-as ,acerlo con el ILILEQIE@" e incluso con el 1O9O***
LECCION 7
Lola $ans del curso %sico( es +ue poco a poco se estn apuntando ms gente a
este cursillo & eso me pone en un compromiso*** 444me )ais a o%ligar a terminarlo555
Bromas aparte( espero +ue te siga interesando & +ue se lo digas a tus )ecinas(
compa#eros de clase( gente de tu curro & dems personal +ue te encuentres por la
calle( el %us( el metro( cuando llames a un P76 & so%re todo cuando te tomes unas
copas con los amigos*** a )er si al $inal entre todos me compris una casita de
)erdad***
Vamos a )er las soluciones de los e'ercicios de la se8ta entrega( para )er +ue ni)el
lle)as( por+ue me imagino +ue te ,as enterado de todo lo +ue pon-a( &a +ue
0ltimamente no reci%o preguntas ni dudas ni +ue'as por+ue algo estu)iera mal***
sal)o alg0n +ue otro despistadillo +ue ,a empe!ado por la primera entrega( ,ace
los e'ercicios & me 2mailea2 dicindome +ue no le muestra nada*** & eso +ue lo ,e
puesto al $inal de la primera entrega & en letra 1OR"A pa +ue se )ea %ien***
Esto pasa por %a'arse las pginas( guardarlas en el disco duro & despus leerla al
montn de d-as***
Bueno( despus del rapapol)o*** todo para +ue se te ol)ide +ue esta entrega i%a a
estar el mes pasado***
$.,%CI.NE$ ! ,.$ EVE"CICI.$ DE ,! $EW-! EN-"EU!:
15)
Private Sub 0ommand1_0li12()
#im % %& 'nte(er
#im @ %& 'nte(er
#im i %& 'nte(er
% = 8al(.e/t1)
@ = 8al(.e/t))
For i = % .o @
Print i
!e/t
Show
End Sub
H El bu1le tambiYn &e >uede ha1er de e&ta GormaC
i = %
#o Xhile i K= @
Print i
i = i , 1
Loo>
H Z de e&ta tambiYn
i = %
Xhile i K= @
Print i
i = i , 1
Xend

)5)
Private Sub 0ommand1_0li12()
#im % %& 'nte(er
#im @ %& 'nte(er
#im 0 %& 'nte(er
#im i %& 'nte(er
% = 8al(.e/t1)
@ = 8al(.e/t))
0 = 8al(.e/t+)
For i = % .o @ Ste> 0
Print i
!e/t
Show
End Sub
H =tra Gorma de &olu1ionarlo
i = %
#o Xhile i K= @
Print i
i = i , 0
Xend

+5)
H %[adir e&ta& lTnea&C
#im # %& 'nte(er
H555
H555For
# = # ,1
H555
!e/t
Label1 = "!$mero de re>eti1ione&C " - #
; eso es todo( no pongo otras posi%les $ormas de o%tener los resultados( por+ue tu
mismo ,a%rs compro%ado si estn %ien o no*

!4ora empezamo con la entrega real, e decir la Hptima.
;a disponemos de instrucciones su$icientes para empe!ar a 2pro$undi!ar2 en las
cosas ms di$-ciles*** o casi*
;a sa%es +ue ,a& +ue usar Option E8plicit en todos los mdulos de cdigo*** Esto no
es o%ligatorio( pero si no +uieres +ue perdamos la amistad( usalo* 1racias*
9am%in cmo usar las )aria%les & los di$erentes tipos( puedes ,acer %ucles( tomar
decisiones( realmente es ms correcto decir3 ,acer +ue VB tome decisiones( &a
sa%es cmo pedir datos al usuario & tam%in cmo mostrarlos* Sa%es crear tus
propias instrucciones*** 4\o5 4Cuanto sa%es5 Ce tienes 2anonadado2
Pero a0n no sa%es una cosa3 cmo crear Aunciones
MXu son las $uncionesN
Para simpli$icar( te dir +ue una $uncin es un procedimiento .como el Su%/( +ue
puede de)ol)er un )alor* @ormalmente se usa para +ue lo de)uel)a( aun+ue
)eremos +ue no siempre es necesario? de todas $ormas( cuando necesites un
procedimiento +ue no necesite de)ol)er un )alor( usa el Su%*
MCmo declararQcodi$icar una $uncinN
_m%ito Aunction @om%re .`parmetrosa/ As 9ipo
"nde _m%ito puede ser Pu%lic o Pri)ate( dependiendo de la 2co%ertura2 o
)isi%ilidad* ;a sa%es( Pri)ate slo es )isi%le en el propio mdulo en el +ue se
encuentra de$inido & Pu%lic es en todo el pro&ecto( incluso $uera de l***
Los parmetros son los )alores +ue esta $uncin puede necesitar para 2cumplir2 su
misin* ]stos son opcionales( es decir puede tenerlos o no( incluso si tiene( puede
ser uno o )arios( para declarar )arios parmetros ,a& +ue separarlos por comas***
Los corc,etes( +ue se suelen usar en los manuales( la a&uda( etc( sir)en para
indicar +ue son opcionales( :pero no e te ocurra ponerlo en ninguna
funcin;( &a +ue no $orman parte del lengua'e Basic***
El tipo es para sa%er +ue tipo de dato de)ol)er la $uncin*
El )alor de)uelto por una $uncin lo podemos usar para asignarlo a una )aria%le3 a
U CiAuncin./
o incluirlo en una e8presin3 I$ CiAuncin./ B <6 S LoXueSea 9,en
La )enta'a real $rente a los Su%s es la posi%ilidad de de)ol)er un )alor( imaginate
+ue +uieres crearte tu propio procedimiento para a)eriguar si un determinado
arc,i)o e8iste*** si lo ,ace como $uncin podr-as de)ol)er un )alor cero para indicar
+ue no e8iste el arc,i)o & un )alor distinto de cero indicar-a +ue el arc,i)o en
cuestin e8iste* Por tanto( podr-amos usarlo de esta $orma3
I$ E8iste.@om%reArc,i)o/ 9,en ***
;a +ue estamos puestos( )eamos cmo ,acer esta $uncin de $orma simple & as- te
e8plico una cosa mu& importante de toda $uncin3 4poder de)ol)er el )alor5
Publi1 Fun1tion E/i&te(&%r1hivo %& Strin() %& 'nte(er
E/i&te = Len(#ir<(&%r1hivo))
End Fun1tion
Para de)ol)er un )alor( ste se asigna a una )aria%le +ue tiene el m-smo nom%re
+ue la $uncin*
;a )imos +ue LE@ de)uel)e el n0mero de caracteres de la cadena +ue ponemos
entre los parntesis? si( LE@ tam%in es una $uncin( pero incluida en el propio
Visual Basic*
"ir^ es otra $uncin del VB +ue de)uel)e el nom%re de un arc,i)o( .slo el
nom%re/( o una cadena )ac-a( en caso de +ue no ,a&a ninguno en la direccin
pasada por el parmetro +ue se ,a usado* Para sa%er ms de esta $uncin( as-
como de otras( puedes %uscar en la a&uda***
Lemos )isto +ue en las e8presiones usamos unos operadores para ,acer las
comparaciones( a+u- tienes los seis posi%les3
U igual( S ma&or +ue( R menor +ue( SU ma&or o igual( RU menor o igual & RS
distinto*
Recuerda +ue el signo igual $unciona de $orma di$erente( seg0n se use en un
e8presin o en una asignacin*
Pero adems de estos signos( podemos usar en nuestras e8presiones unos
operadores lgicos( estos son3 A@"( OR & @O9
Podr-amos desear ,acer una comparacin & compro%ar si )arias cosas se cumplen(
por e'emplo3
I$ AS<7 And Len.@om%re/RS7 9,en ***
Para +ue esta e8presin se cumpla( de%en ser ciertas las dos condiciones( es decir
+ue A sea ma&or +ue <7 2&2 +ue la longitud de @om%re sea distinta de cero*
Podemos usar tantas condiciones como +ueramos( sin pasarnos demasiado para
+ue la cosa $unciones me'or* A+u- las dos condiciones de%en cumplirse( pero en este
otro e'emplo3
I$ AS<7 Or Len.@om%re/RS7 9,en ***
cumplindose cual+uiera de las dos( se acepatar-a como )lido*
Cuando el I$ se procesa( se toma todo lo +ue ,a& entre IA & 9LE@ & se considera
como una sla e8presin*
Si +uieres puedes asignar a una )aria%le el resultado de una e8presin( el )alor
de)uelto siempre ser 7 .cero/ en caso de +ue no se cumpla todo lo e8puesto & F<
cuando sea cierta*
Para mane'ar estos )alores de Cierto .F</ & Aalso .7/( Visual Basic tiene un tipo
especial llamado Boolean( los )alores +ue puede aceptar una )aria%le de este tipo
son3 9rue .)erdadero/ & Aalse .$also/*
Veamos un e'emplo3
#im b %& @oolean? i %& 'nte(er
#im a %& 'nte(er? !ombre %& Strin(
Show
a = 15
!ombre = "Guille"
b = (a O 1 %nd Len(!ombre) KO )
i = (a O 1 =r Len(!ombre) KO )
Print "8alor de @ "I b
Print "8alor de i "I i
M9e ,as $i'ado en el detalleN B )ale 9rue .)erdadero/( sin em%argo i )ale F<* Pero
para el caso los dos )alores signi$ican lo mismo3 si estas e8presiones se ,u%iesen
usado en una comparacin( las dos ,u%iesen de)uelto un )alor )erdadero*
El tercer operador lgico .@ot/ sir)e para negar algo( es decir in)ertir el )alor
contenido en una )aria%le( o casi***
I$ @ot AS<7 9,en ***
Parece lgico el resultado( M)erdadN( si no se cumple +ue A sea ma&or +ue die!(
ser cierto? compro%moslo3
#im % %& 'nte(er
HVre1ueda& Fue tiene& Fue >oner ShowW
% = 5
'G !ot % O 1 .hen
Print %I "no e& ma7or Fue 1"
End 'G
4BI@1O5 4Aunciona5
2Cu2 %onito( pero*** M+ue es lo +ue ocurreN
Se toma A S <7 & se procesa( como A no es ma&or +ue <7( se de)uel)e un )alor
$also .7/ & despus se ,ace @ot 7 +ue da como resultado F< .)erdadero/( por tanto
se cumple la condicin*
;a )imos +ue el )alor de)uelto por una )aria%le se puede usar en una comparacin(
si es cero se toma como $also & si es distinto de cero( como )erdadero*
Prue%a a,ora esto3
% =
'G !ot % .hen
Print %I "e& 1ero"
El&e
Print %I "e& di&tinto de 1ero"
End 'G
9am%in $unciona( &a +ue @ot 7 es F<( por tanto el I$ lo da por cierto( si cam%iamos
el )alor incial de A por un )alor distinto de cero3
% = 5
'G !ot % .hen
Print %I "e& 1ero"
El&e
Print %I "e& di&tinto de 1ero"
End 'G
MXue ,a pasado a+u-N Simple( +ue no es lo +ue esper%amos*** Cuando ,icimos @ot
7 era e)idente( &a +ue se con)ierte en F<( pero @ot 6 no se con)ierte en cero( sino
en3 F6 & &a sa%es +ue el IA considera como )erdadero todo lo +ue no sea cero*
@o +uiero entrar en detalles de por+u ocurre esto( slo decirte +ue la responsa%le
de todo es la notacin %inaria*** los ceros & unos +ue dicen +ue es el lengua'e
nati)o de los cac,arros estos*** tal)e! ms adelante tratemos un poco de la
notacin %inaria( pero no por a,ora*** recuerdo +ue en mis tiempos del 1GBasic la
usa%a %astante( incluso ten-a rutinas para 2representar2 en ceros & unos un
n0mero***
Vale( para +ue te entretengas pro%ando*** .este linJ es para el programa completo
"ecEBin*!ip <*D6 YB/
Private Fun1tion #e1)@in(&!um#e1 %& Strin() %& Strin(
H Me1ibe una 1adena Fue &erS un n$mero de1imal
H #evuelve e&e n$mero re>re&entado >or 1ero& 7 uno&
H
#im i %& 'nte(er
#im ln(!um %& Lon( H Lon(? >or &i la& mo&1a&
#im &.m> %& Strin( H 0adena tem>oral
ln(!um = 8al(&!um#e1)
&.m> = ""
For i = *a/@it& A 1 .o Ste> A1
'G ln(!um %nd ) \ i .hen
&.m> = &.m> - "1"
El&e
&.m> = &.m> - ""
End 'G
!e/t
#e1)@in = &.m>
End Fun1tion
A,ora puedes compro%ar por+u @O9 6 da como resultado F6( usa esta rutina para
pro%arlo( si escri%es 6( te mostrar3
77777<7< & si escri%es F6 lo +ue muestra es3 <<<<<7<7( $i'ate +ue ,a cam%iado
todos los ceros por unos & )ice)ersa*
Eso es lo +ue ,ace el @O9( in)ertir los )alores %inarios & como un )alor %inario slo
puede ser 7 <( no se complica demasiado la )ida* Prue%a a escri%ir el )alor 7 & el
)alor F< & con)iertelo a notacin %inaria( $i'ate lo +ue el Visual Basic normalmente
)e*
Prue%a con el tema de la notacin %inaria( as- sa%rs realmente cmo $unciona todo
esto de las comparaciones .por dentro/*
Lo +ue nunca $alla es completar la e8presin( por e'emplo si ,aces esto3
'G !ot %KO .hen
Print %I "e& 0EM="
El&e
Print %I "!= e& 0EM="
End 'G
Esto siempre $uncionar de la $orma esperada*
Pero ser-a ms $cil( o al menos ms inteligi%le( ,acerlo as-3
'G % = .hen
Print %I "e& 0EM="
El&e
Print %I "!= e& 0EM="
End 'G
Es +ue algunas )eces se puede uno complicar la )ida ms de lo necesario***
Cuando +uieras compro%ar un )alor de)uelto por cual+uier e8presin( puedes
,acerlo asignndolo a una )aria%le o %ien mostrando el )alor3 Print @ot A
Cuando se usa A@" pra e)aluar )arias partes de una e8presin ,a& +ue tener
presente +ue siempre se procesan todas las condiciones & $inalmente se decide si
es cierto o no el )alor de)uelto* Esto +ue parece lgico( algunas )eces puede lle)ar
a con$usin e incluso producir e$ectos no deseados en el programa*
Prue%a con esta nue)a )ersin de la $uncin E8iste* En un $orm de%es poner una
eti+ueta La%el<*
Private Fun1tion E/i&te(%r1hivo %& Strin() %& 'nte(er
E/i&te = Len(#ir<(%r1hivo))
'G E/i&te .hen
Label1 = %r1hivo - " Si e/i&te"
El&e
Label1 = %r1hivo - " !o e/i&te"
End 'G
H E&to e& mS& 1orto? >ero talvez meno& evidenteC
H Label1 = %r1hivo - ''G(E/i&te? " Si"? " !o") - " e/i&te"
#oEvent&
End Fun1tion
Private Sub Form_Load()
#im % %& 'nte(er? !ombre %& Strin(
Show
Label1 = ""
!ombre = "0C]%utoe/e15@'!"
% = 5
'G % O 1 %nd E/i&te(!ombre) .hen
Print %I "ma7or de 1 7 " - !ombre - " e/i&te"
El&e
Print %I "no e& ma7or de 1 o " - !ombre - " no e/i&te"
End 'G
End Sub
En el e'emplo compro%ars +ue a pesar de +ue la segunda parte de la comparacin
no se cumpla( a no ser +ue tengas en tu disco C un arc,i)o +ue se llame as-( el
caption del La%el se ,a cam%iado* Es decir +ue se ,a procesado la segunda parte de
la e8presin a pesar de +ue la primera AS<7 es AALSA* Imag-nate +ue en lugar de
ser una $uncin rpida( ,u%iese sido otra cosa +ue tardara un po+uito ms de la
cuenta***
Para casos como estos( .la )erdad es +ue no son demasiado ,a%ituales/( de%er-as
,acerlo as-3
Private Sub Form_Load()
#im % %& 'nte(er? !ombre %& Strin(
Show
Label1 = ""
!ombre = "0C]%utoe/e15@'!"
% = 5
'G % O 1 .hen
'G E/i&te(!ombre) .hen
Print %I "ma7or de 1 7 " - !ombre - " e/i&te"
El&e
Print %I "e& ma7or de 1 >ero " - !ombre - " no e/i&te"
End 'G
El&e
Print %I "no e& ma7or de 1 o " - !ombre - " no e/i&te"
End 'G
End Sub
9al)e! sea ms largo & ,a&a +ue usar ms cdigo( pero en ocasiones es ms
2resultn2*
Usando este nue)o 2estilo2( slo se compro%ar si e8iste el arc,i)o cuando A sea
ma&or +ue die!*
Lo +ue de%es sacar en claro de todo esto es +ue despus de un 9LE@ puedes
2anidar2 ms e8presiones IA***9LE@***ELSE* Incluso se puede usar en una sola l-nea(
slo +ue el resultado 2)isual2 del cdigo no es tan 2presenta%le2***
If A > 10 And Existe(Nombre) Then Print A; "mayor de 10 y " & Nombre & " existe"
Else Print A;
"no es mayor de 10 o " & Nombre & " no existe"
Aun+ue podr-amos usar el caracter H +ue se puede usar en VB para separar l-neas
largas( pero es como si estu)iese toda en la misma l-nea( as- +ue la l-nea anterior(
se +uedar-a as-3
'G % O 1 %nd E/i&te(!ombre) .hen _
Print %I "ma7or de 1 7 " - !ombre - " e/i&te" _
El&e _
Print %I "no e& ma7or de 1 o " - !ombre - " no e/i&te"
A-'ate +ue a pesar de aparentar +ue es un BLOXUE IA( no tiene el E@" IA del $inal(
esto es por+ue &o lo ,e 2estructurado2 de esa $orma( no por+ue sea lo mismo* El
uso de H es slo esttico & para VB todo se trata de una misma l-nea( por tanto
tendr un l-mite de caracteres posi%les a usar( el l-mite +ue VB le ponga( +ue creo
+ue es <7E:*** pero no me ,agas demasiado caso***
Antes ,e mencionado la pala%ra 2anidacin2( sta se usa para indicar +ue una serie
de instrucciones estn dentro de otras* En este caso ,emos anidado dos IA*** 9LE@(
pero lo ms ,a%itual es ,acerlo con los %ucles .AOR( "O( etc*/( )emoslo3
#im i9? J9? 19
For i = 1 .o 1
For J = 1 .o 1
1 = 1 , 1
!e/t
!e/t
Print 1
Lo +ue de%es sa%er( o al menos tener en cuenta( es +ue cuando anidamos )arios
%ucles( lo e8ternos empie!an antes .elemental +uerido Iatson/( pero los internos
$inali!an primero .***/ & ,asta +ue no lo ,agan( no podrn continuar los de $uera*
En el e'emplo( por cada repeticin del %ucle i( se completa un %ucle '* Por eso el
)alor de c es <77 .<7V<7/
Esto( en ocasiones( puede ralenti!ar el programa( & dar la impresin de +ue el
programa se ,a +uedado 2colgado2( prue%a a poner otro %ucle dentro del ' &
cam%ia los )alores m8imo de los dos %ucles internos a <777( te recomiendo +ue la
)aria%le c sea LO@1 & +ue te sientes*** @o ,ace $alta +ue ,agas la prue%a( es una
c,orrada***
Lo +ue interesa es +ue dentro de un proceso cual+uiera & por supuesto tam%in en
los %ucles( podr-amos necesitar +ue el Visual Basic nos mostrara alguna indicacin
de +ue est 2ocupado2( por e'emplo cam%iando la $orma del cursor del ratn( como
,acen otros programas( incluso el propio VB cuando est 2atareado2* Para ello
tendremos +ue cam%iar la propiedad CousePointer para +ue muestre el relo' de
arena3
*ou&ePointer = vb3ourGla&& H vb3our(la&& e& i(ual a 11? >or &i tiene&
u&a& el 8@+
H555 lo Fue &ea
*ou&ePointer = vb#eGault H &i u&a& 8@+
Pero algunas )eces el cursor no se cam%ia*** para asegurarnos +ue cam%ie( usa el
"oE)ents despus de asignar el )alor para el relo' de arena* "e esta $orma
permitimos +ue IindoGs procese sus mensa'es .MrecuerdasN/ & as- tiene ocasin
de cam%iar el puntero del ratn*
Bueno( ,asta a+u- llega esta entrega* @o ,a& e'ercicios( slo te pedir-a +ue
re)isaras la a&uda & te le&eras lo +ue all- pone re$erente a las instrucciones +ue
)amos )iendo*** aun+ue me imagino +ue tendrs otras cosas +ue ,acer***
El caso es +ue no ,a& e'ercicios & &a est*
,ECCI.N @
;a estamos de nue)o por a+u-( esta )e! ,e procurado ser un poco ms rpido para
+ue no pierdas el ,ilo***
.realmente ,e sido demasiado rpido( pero no te acostum%res/
El pro%lema de escri%ir las entregas( no es por+ue no sepa +ue poner*** a este ni)el
a0n se %astantes cosas*** e'em5 Lo +ue ocurre es +ue normalmente suelo ,acerlo
en papel*** +uien lo dir-a M)erdadN
; es por+ue no tengo ordenador en mi 2piso2 & all- es dnde apro)ec,o( por a+uello
de la tran+uilidad( para concentrarme en las cuatro c,orradillas +ue )o& a decir***
despus toca pasarlo a 2limpio2 & como no so& demasiado diestro en esto de
escri%ir a m+uina( ,ice ra%ona cuando ten-a clases de mecanogra$-a( pues algunas
)eces tardo ms de la cuenta* Pero como a,ora esto& en unas )acaciones
2)irtuales2( ,e apro)ec,ado & le ,e mangado el porttil a mi 'e$e( con la e8cusa de
+ue se lo )o& a limpiar de 2%asura2 & todo ese rollo*
Vale( no me enrollo ms con mis cosillas & )amos a pasar a un tema +ue( por su
e8tensin( seguramente lo )o& a dar en dos entregas*
Empezamo con la octa7a*
A,ora ,a& +ue ponerse 2$ormales2***
;a ,as )isto todo el tema de las )aria%les & sa%es para +ue sir)en( .al menos as-
de%er-a ser( &a +ue nadie me ,a preguntado so%re el tema/( pero ,a& )eces +ue
necesitamos ms*
Imag-nate +ue +uieres sa%er cuantas )eces por ,ora te rascas la ca%e!a intentando
comprender lo +ue ,a& en mis pginas***
Podr-amos tener unas cuantas )aria%les( una por cada ,ora del d-a( con nom%res
como3 Lora<( LoraE( etc* & cuando te arras+ues a las EE ,oras( ,ar-as esto3
LoraEE U LoraEE B <
Con lo +ue aumentas en uno el contenido de la )aria%le LoraEE*** & tu dirs*** M+ue
pro%lema ,a&N @inguno( pero es +ue se me ,a ocurrido contarte esto como podr-a
,a%erte contado otra cosa* Pero imag-nate +ue +uieres sumar las )eces +ue te ,as
rascado la ca%e!a en todo el d-a( podr-as ,acer3
Veces"ia U Lora< B LoraE B ***B LoraE:
9ampoco ,a& pro%lema( sumamos todas las )aria%les .E: en este caso/ &
guardamos el total en la )aria%le Veces"ia*
Pero la cosa se )a complicando( M)erdadN M@o lo creesN Pues toma un poco ms de
complicacin3
MCmo ,ar-as para sa%er la ,ora en +ue ms )eces te ,as rascado la ca%e!aN
@o te do& la solucin*** Es demasiado largo & seguramente ,asta complicado como
para ponerlo como e'emplo para +ue salgas de tu incredulidad*** A,ora %ien( si
+uieres ,acerlo( ,a!lo( pero despus no me preguntes si est %ien o no*** ser-a una
prdida de tiempo( &a +ue( como )as a )er dentro de mu& pocas l-neas( ,a& una
$orma de ,acerlo %astante ms simple*
9oda esta reta,-la( es para e8plicarte la $orma con +ue el Basic( & otros lengua'es(
nos $acilita la )ida en tareas de este tipo*** realmente no creo +ue ,a&a nadie +ue
tenga una utilidad de este tipo( &a +ue no es 0til esto de sa%er cuantas )eces nos
rascamos la ca%e!a por no comprender algo*** ni a0n cuando ese algo sea lo +ue &o
escri%o***
Un poco de ,istoria .la m-a/
La primera )e! +ue me top con los ARRA;S .de eso )a esta entrega/( $ue con un
programa de dados( en mi +uerido VICFE7* Lo copi de un li%ro ingls +ue ten-a 67
'uegos para el VicFE7( sa%-a +ue $unciona%a( pero no sa%-a cmo***
"urante un montn de tiempo( .a lo me'or $ue una o dos semanas( es +ue antes los
d-as dura%an ms +ue a,ora/( us mtodos parecidos( sin sa%er por+u
$unciona%a*** slo sa%-a +ue $unciona%a & simplemente lo acepta%a* "espus ca&
en mis manos un li%ro( esta )e! en espa#ol( & me puse a leer la parte +ue e8plica%a
esto de las 2matrices2( antes no eran arra&s*** la )erdad es +ue lo le- como E7 )eces
o ms*** & parec-a +ue nunca i%a a lograr asimilarlo( es +ue so& %astante duro de
mollera & antes( +ue era ms 'o)en( calculo +ue unas <: )eces ms 'o)en +ue
a,ora( ten-a la ca%e!a ms dura* En a+uella ocasin si +ue me ,u%iese )enido %ien
el programilla este de rascarme la ca%e!a***
Esto es lo +ue dec-a( el susodic,o li%ro3
3*l lenguaje B%!7+ permite definir otro tipo de )aria2les num1ricas9
%0:5, %0;5...%0N5
se llaman )aria2les con <ndice , est/n formadas por un nom2re de )aria2le, =...>,
seguido de un n.mero natural entre par1ntesis. =...> el conjunto ordenado de estas
)aria2les se llama lista. =...>3
A,ora +ue lo ,e )uelto a leer( casi lo entiendo? pero para un po%re cateto ignorante
como &o( a+uello sona%a a c,ino* ; si tu lo entiendes( me alegro por ti***
Como te ,e comentado( el prra$o ese est sacado de un li%ro +ue $ue de los pocos
+ue tu)e( al menos en castellano( de los ingleses slo me interesa%an los listados(
+ue era lo 0nico +ue prcticamente tra-an* La cosa es( +ue a pesar de eso( ,asta
aprend- un poco( a duras penas( so%re todo por+ue en a+uellos tiempos no ten-a a
+uin preguntarle( ni +uin me e8plicara algunas de las muc,as dudas +ue ten-a***
& si no ten-a ms dudas era por+ue tampoco ,a%-a pro$undi!ado demasiado* Pero lo
+ue ,e sacado en claro es +ue para aprender a programar ,a& +ue practicar(
practicar & seguir practicando*** es como todo( cuanto ms practicas*** o terminas
por a%urrirte o aprendes***
Vamos al tema( pero sin teor-as( las teor-as se las de'o a los eruditos*** ellos sa%en
cmo e8plicar 2%ien2 las cosas*** ; +ue conste +ue no tengo nada en contra de las
teor-as( lo +ue ocurre( al menos a mi( es +ue pre$iero entender las cosas de $orma
prctica( +ue so& 2mu2 torpe &o & si no lo )eo $uncionar( no me entero***
En el e'emplo ese de las ,oras( nos )endr-a mu& %ien +ue pudisemos usar otra
)aria%le para la ,ora de nuestro 2picor2 & ,acer algo como3
LoradelPicor U LoradelPicor B <( dnde 2delPicor2 ser-a la ,ora en +ue nos
rascamos la ca%e!a( as- si 2delPicor2 es EE( incrementar LoraEE* S-( lo recono!co(
una )e! intent ,acerlo( cre-a +ue se pod-a ,acer as-3
delPicor U EE
LoradelPicor U LoradelPicor B <
Pero el %asic no ,ac-a lo +ue &o +uer-a( ni si+uiera me da%a error( si en a+uellos
tiempos ,u%iese e8istido el Option E8plicit( me ,a%r-a percatado de muc,as cosas
antes de tiempo***
Por suerte para todos( e8isten los ARRA;S .o )aria%les con -ndice/ & realmente la
$orma de ,acerlo es casi como &o cre-a( lo 0nico +ue cam%ia%a era la $orma*** total(
por un par de parntesis***
Lora.delPicor/ U Lora.delPicor/ B<
Con esto le decimos al Basic3 coge lo +ue ,a& guardado en la )aria%le +ue est en
la posicin delPicor del arra& Lora***
Vale( captado* Ce esto& lan!ando & a0n no te ,e presentado a los arra&s*
Un Arra& es una serie de )aria%les +ue tienen el mismo nom%re & para acceder a
cual+uiera de esas )aria%les( usamos un n0mero .-ndice/ para indicar cual de esas
)aria%les es la +ue nos interesa*** M9e ,as enterado de +ue esto& ,a%lando de
)aria%les o tengo +ue decirlo ms )ecesN Vale( admito +ue tampoco ,e sido
demasiado claro( es +ue realmente no es tan $cil de asimilar( pero en cuanto lo
)eas con algunos e'emplos( seguro +ue lo 2asimilas2*
El %asic( +ue es 2mu2 listo( cuando )e esto3
Lora.delPicor/( dice3 2MCuanto )ale lo +ue est dentro del parntesisN2 .en caso de
+ue sea una e8presin en lugar de un n0mero o una )aria%le( la e)aluar-a primero &
usar-a el resultado/( una )e! +ue sa%e cuanto )ale lo +ue est dentro del
parntesis*** 2a,ora co'amos( del arra&( el contenido de la )aria%le +ue est en esa
posicin2 .para el %asic un arra& no es ms +ue una serie de )aria%les +ue tienen el
mismo nom%re & lo 0nico +ue )ar-a es 2la direccin2 en la +ue est guardado el
)alor*
O sea +ue mane'a los arra&s de la misma $orma +ue a las )aria%les simples( pero
ampliando nuestros ,ori!ontes 2)aria%il-sticos2*
A,ora $-'ate cmo podemos sumar las )eces +ue nos ,emos rascado la ca%e!a a lo
largo del d-a3
Aor iU < to E:
)eces"ia U )eces"ia B Lora.i/
@e8t
Cada )e! +ue i cam%ia de )alor( .en este caso tomando )alores desde < ,asta E:/(
el Basic usa una )aria%le di$erente del arra& Lora( cuando i )ale < est usando
Lora.</ & cuando i )ale EE( usa Lora.EE/*
Lo de sa%er a +ue ,ora te ,as rascado ms )eces la ca%e!a te lo de'o como
e'ercicio( slo te dir +ue si ,aces esto3
masVeces U Loras.LoraCasVeces/
sa%rs cuantas )eces te ,as rascado a la ,ora LoraCasVeces***
Los elementos de un arra& se comportan como )aria%les normales( pudiendo
usarlas en e8presiones & en cual+uier otro sitio en el +ue podamos usar una
)aria%le( realmente uno de los pocos sitios donde no puede usarse es como -ndice
de un %ucle AOR( pero por lo dems( en cual+uier parte*
Imag-nate +ue en la posicin EE del arra& Lora( es decir en Lora.EE/ tenemos
guardado un )alor <6( al ,acer esto3
Print Lora.EE/ V <7
mostrar-a <67( por+ue el VB ,a sustituido Lora.EE/ por su )alor & lo ,a multiplicado
por <7( es como si internamente ,u%iese ,ec,o3 Print <6V<7*
; tu dirs3 esto mismo es lo +ue ,ace con las dems )aria%les***
E$ecti)amente( &a +ue es una )aria%le( especial( pero una )aria%le al $in & al ca%o*
Sigamos imaginando*** suponte +ue +uieres guardar en una )aria%le a +ue ,oras te
pones a leer( cada d-a( las pginas del 1uille & +ue sa%es +ue sern tres )eces
diarias( lo ,a& maso+uistas*** Podr-as ,acer algo como esto3
Ve!.</ U E73 Ve!.E/ U EE3 Ve!.K/ U EK T***.de nue)e a die! )as a cenar/
con lo cual tendr-as un arra& con tres -ndices* El )alor de cada una de las )aria%les
del arra& 2Ve!2( ser-a la ,ora en +ue 2guilleas2 *** & si +uieres incrementar los
2rascones2 de la ,ora +ue est en la posicin L( .+ue puede ser <( E K/3
A,ora U Ve!.L/ T Si L )ale <( A,ora ser-a igual a E7
Lora.A,ora/ U Lora.A,ora/ B <
Pero esto podr-as ,acerlo a,orrndotela )aria%le A,ora( ser-a as-3
Lora.Ve!.L// U Lora.Ve!.L// B <
MComplicadoN Pues si*** +ue +uieres +ue te diga*** pero de'moslo estar***
Veamos cmo podemos usar en nuestros programas este tipo especial de )aria%les*
Antes &o las llama%a3 2)aria%les dimensionadas2( entre otras cosas por+ue era
0nicamente cuando necesita%a usar "IC( al menos si i%a a usar ms de <7
2posiciones2( aun+ue tam%in puede ser +ue lo le&era en alg0n sitio( no importa***
Para decirle al Basic +ue )as a usar tres )aria%les en el arra& Ve!( ,a& +ue ,acerlo
de esta $orma3
"im Ve!.K/
A,ora lo +ue necesitamos es un arra& para guardar los picores de las E: ,oras del
d-a3
"im Lora.E:/
Bueno( &a sa%es casi todo lo +ue tienes +ue sa%er de los arra&s*** a,ora cmprate
un %uen li%ro 2terico2 & est0diatelo*** o lete lo +ue dice el manual del Visual
Basic*** +ue tam%in puede )aler*
MA0n sigues por a,-***N
Bueno( &a +ue insistes( te e8plicar algunas cosillas ms***
Los arra&s son )aria%les( algo especiales( pero )aria%les al $in & al ca%o*
Por tanto( podemos tener arra&s numricas( de carateres & en de$initi)a de
cual+uier tipo +ue el Basic permita( lo 0nico +ue tenemos +ue ,acer es indicrselo
al reser)ar memoria3
"im Ve!.K/ As Integer
"im Amigos.<777/ As String
"im Salario.<777/ As Currenc&
Cuando declaramos un arra&( el Basic reser)a memoria para cada una de las
)aria%les +ue )amos a usar( o casi( &a +ue en realidad reser)a una posicin ms( no
por nada en especial( sino por+ue empie!a a contar desde cero? por e'emplo en el
arra& Ve!( el -ndice ms %a'o +ue podr-amos usar es el 7 & el ms alto el K*
Esto ,a sido as- desde siempre*** aun+ue en un intento de 2cam%iar2 las cosas( un
listillo di'o3 2El Basic de%er-a empe!ar a contar desde uno2 & se sacaron una nue)a
instruccin de la manga( desde mi punto de )ista lo podr-an ,a%er ,ec,o me'or(
pero como mis 2pre$erencias2 no las tu)ieron en cuenta*** .tampoco tu)e la
oportunidad( la )erdad sea dic,a***/( el caso es +ue di'eron3
OP9IO@ BASE < para +ue el -ndice menor de un arra& sea U@O &
OP9IO@ BASE 7 para empe!ar por CERO( esta ser la predeterminada*
Por tanto si usamos este cdigo3
Option Base <
"im Ve!.K/ As Integer
Crea un arra& con tres )aria%les .del < al K/
Cs adelante( otro listillo( .este $ue un poco ms inteligente/( di'o3 2; si el usuario
pudiera decidir el )alor menor & el ma&or del -ndice de una arra&2*** 2pues +ue
%ien2( contest otro***
; as- $ue* Imag-nate +ue tu slo te rascas la ca%e!a de <7 a EK( puedes
dimensionar as- el arra& Lora3
"im Lora.<7 9o EK/ As Integer
"e esta $orma slo 2reser)as2 la memoria +ue necesitas*** ;a )es +ue todo son
$acilidades( aun+ue ,a& una cosa 2mu&2 importante +ue ,a& +ue tener en cuenta3
Si pretendes acceder a una posicin del arra& +ue no est reser)ada( el Visual Basic
te a)isa de +ue ,a& un error & detiene .termina/ el programa* Esto es lo 0nico
gra)e( pero si tu aplicacin tiene in$ormacin importante pendiente de guardar( o se
encontra%a en medio de un proceso largo de clculo*** realmente si +ue ser
gra)e*** en otra ocasin )eremos cmo detectar los errores & poder 2mane'arlos2
para +ue no nos de'en en la 2estacada2*** Por tanto si declaras un arra& +ue reser)a
tres posiciones( siempre consecuti)as( no podremos acceder a ninguna posicin
anterior o posterior a las +ue tenemos declarada*
Pero*** M& si necesito ms espacioN Lo 0nico +ue tienes +ue ,acer es reFdimensionar
el Arra&3
Re"im Ve!.6/ As Integer
MPro%lemasN Si( +ue &a ,as perdido lo +ue antes ,a%-a almacenado***
Cuando &o empec con el Basic .Motra %atallitaN( ,a%r +ue seguirle la corriente***/(
no e8ist-a el Re"im* Pero si e8ist-a una $orma de conseguir esto mismo* El truco
consist-a en 2%orrar2 el arra& creado & )ol)er a dimensionarlo*** tam%in recuerdo
+ue me dio muc,os +ue%raderos de ca%e!a adaptar mi cdigo .escrito en el
intrprete 1GBasic*** la 1I Mser 1ates( IilliamN/ a un compilador*** eso de usar
)arias )eces el "IC no lo diger-a %ien*** pero eso es otra ,istoria( +ue seguramente
no contar***
Para %orrar un arra& de la memoria( ,a& +ue usar ERASE seguido por el nom%re del
arra&( por e'emplo3 Erase Lora
Con esto conseguimos lo mismo +ue con Re"im Ve!.6/ As Integer3
Erase Ve!
Redim Ve!.6/ As Integer
Pero( & si no +uisiramos perder los )alores anteriores***
Pues copia los datos en otro Arra& temporal( %orras el primero( lo )uel)es a
dimensionar con el nue)o n0mero de elementos & a continuacin copias los datos
del arra& temporal en el arra& +ue aca%as de redimensionar( despus %orras el
arra& temporal( &a +ue no lo necesitars***
@o( no es necesario tantas cosas( pero esto es lo +ue ,a%-a +ue ,acer con el VB
antes de la )ersin K & con el XuicJBasic antes de la )ersin :( a,ora slo ,ars
esto3
Re"im Preser)e Ve!.6/
Adems cuando se Re"imensiona un arra& no ,ace $alta )ol)er a especi$icar el tipo
de dato( &a +ue tomar el mismo +ue se us inicialmente al declararlo*
La )enta'a del Re"im( con o sin Preser)e( .podr-a ,a%er ,ec,o un c,iste malo con
esto del Preser)e( pero me a%stengo***/( es +ue puedes ampliar o reducir el n0mero
de )aria%les de un arra&*** supn +ue despus de dimensionar Ve! a cinco( lo
piensas me'or & decides +ue con dos )eces es su$iciente( pues nada( ,aces esto3
(edim Preser)e Ve"0;5 & &a est* Lo importante es +ue slo reser)es la memoria
+ue )as a necesitar*
En la siguiente entrega )eremos ms cosas de los arra&s( as- como algunas otras
instrucciones( pero no te )o& a adelantar nada( no sea +ue despus no est lo +ue
tengo pensado & te mos+uees*
A,ora )amos al apartado de los e'ercicios( +ue adems del +ue te di'e casi al
principio( te )o& a poner otro ms3
<*/ 9ienes un arra& con un n0mero cual+uiera de elementos( a)erigua cual de las
)aria%les de ese arra& es la +ue tiene el )alor ma&or*
E*/ La +ue tiene el )alor menor & +ue no sea cero*
Como )es no te +uiero +ue te es$uerces demasiado*
LECCION 2
Lola( &a )es +ue no puedo dedicarle todo el tiempo +ue &o +uisiera a esto del curso
%sico* Pero lo importante es +ue ste siga 2pa lante2 aun+ue ,a&a un poco de
lapso de tiempo entre cada una de las entregas*** @o )o& a prometerte +ue )o& a
ser ms aplicado & no tardar tanto entre cada entrega por+ue a lo me'or no cumplo
& despus me ec,as la %ronca***
"e todas $ormas intentar ,acer un pe+ue#o es$uer!o*** & con la a&uda &
compresin de todos )osotros espero conseguirlo*** McmoN pues mu& $cil( me
gustar-a +ue las consultas +ue reci%o no tu)iera +ue contestarlas todas*** es +ue
son muc,as( so%re todo se me acumulan los 'ue)es & )iernes( &a +ue esos d-as los
dedico por completo a la ma+uetacin de un peridico semanal de in$ormacin local
+ue editamos en nuestra empresa*** & no slo la ma+uetacin sino +ue me tengo
+ue encargar de lle)ar & recoger la $ilmacin & ,a& +ue ,acerlo $uera de @er'a( por
lo +ue( a la 2pali!a2 de la autoedicin( ,a& +ue a#adirle la pali!a del )ia'e de
idaQespera .algunas )eces larga/Q)uelta*
"espus de la presentacin & el 2comecoco2( )amos con las soluciones de los
e'ercicios*
$olucin a lo e9ercicio de la .cta7a entrega
El primero3
HPoner e&te 1Bdi(o en el Form_Load
#im 3ora()D) %& 'nte(er
#im i %& 'nte(er? *a7or %& 'nte(er
HLlenar el arra7 1on n$mero&555
H(en e&ta entre(a veremo& 1Bmo ha1erlo de Gorma aleatoria)
H555
H0om>robar 1ual e& el ma7or
For i = 1 .o )D
'G 3ora(i) O *a7or .hen
*a7or = 3ora(i)
End 'G
!e/t
Print "El n$mero ma7or e&C"I *a7or
Un poco de e8plicacin( &a +ue no creo +ue sea su$iciente con ense#ar la solucin*
El pro%lema +ue te ,as podido encontrar es( seguramente( la $orma de asignar
)alores al arra&( aun+ue siempre +ueda el recurso de poder 2llenarlo
manualmente2? pero eso lo )eremos en esta misma entrega*
La cuestin es comparar el contenido de cada una de las ,oras con la )aria%le +ue
guardar el n0mero ma&or* Al principio esta )aria%le( como &a de%er-as sa%er( tiene
el )alor CERO( as- +ue cuando se ,aga la comparacin I$ Lora.i/SCa&or 9,en( si la
)aria%le +ue est en la posicin 2i2 del arra& 2Lora2 tiene un )alor ma&or +ue cero(
se cumplir la condicin & se pasar a asignar ese )alor a la )aria%le +ue contendr
el n0mero ma&or de los E: +ue tenemos en el arra&*
El %ucle contin0a & cada )e! +ue se cumpla la condicin de +ue el contenido de
Lora.i/ es ma&or +ue el +ue tenemos en la )aria%le Ca&or( se asignar este & as-
,asta +ue se termine de dar )ueltas***
Si no te ,as enterado*** preprate para la solucin del segundo e'ercicio*
El segundo3
HLo& mi&mo& 1omentario& ini1iale& Fue el >rimero
#im 3ora()D) %& 'nte(er
#im i %& 'nte(er? *enor %& 'nte(er
H
For i = 1 .o )D
'G 3ora(i) .hen HSBlo &i no vale 1ero
'G *enor = .hen HSi a$n no tiene un valor
*enor = 3ora(i) H&e lo a&i(namo&
El&e
'G 3ora(i) K *enor .hen HSi el 1ontenido de 3ora(i) e&
menor
*enor = 3ora(i) Hlo a&i(namo& 1omo menor
End 'G
End 'G
End 'G
!e/t
Print "El n$mero menor e& "I *enor
Este est ms o menos e8plicado en los comentarios( pero )o& a de'rtelo un poco
ms claro3
La cuestin consiste en compro%ar primero si el contenido del elemento 2i2 del
arra& 2Lora2 tiene un )alor distinto de cero( .si )ale cero no lo tendremos en
cuenta/( lo siguiente +ue se ,ace es compro%ar si el contenido de 2Cenor2 )ale
cero( si es as-( +uiere decir +ue a0n no le ,emos asignado ning0n )alor( por tanto le
asignamos lo +ue tenga Lora.i/* En posteriores compro%aciones lo +ue se ,ace es
a)eriguar si el )alor guardado en el elemento del arra& es menor +ue el +ue
tenemos en nuestra )aria%le 2Cenor2 & si es as-( +uiere decir +ue tenemos un
n0mero ms pe+ue#o( por tanto lo asignamos para +ue siempre 2Cenor2 tenga el
n0mero menor .)alga la redundancia/*
Pero & si +uisiramos tener en cuenta tam%in el CERO*** Pues +ue tendr-amos +ue
,acerlo de otra $orma( &a +ue esta es slo para el caso e8puesto*** te de'o +ue lo
pienses( pero no es demasiado di$-cil( incluso ms simple +ue esta solucin( lo +ue
ocurre es +ue entran en 'uego pe+ue#os detalles +ue seguramente )eremos en esta
entrega***
!4ora 7amo a empezar la No7ena Entrega.
@o )o& a empe!ar( o me'or dic,o( no )o& a continuar con los arra&s( pero no te
preocupes +ue slo ser un pe+ue#o alto en el camino( lo +ue )eremos primero es
algo +ue nos )a a $acilitar ,acer prue%as con los arra&s*** se trata*** .redo%le de
tam%ores/ de3
N?mero !leatorio
En algunos casos )amos a necesitar generar n0meros aleatorios( .n0meros sacados
al a!ar( al menos en teor-a***/( & si no necesitas usar n0meros aleatorios( )amos a
usarlos en algunos de los e'ercicios( as- +ue )o& a e8plicar cmo )a esto3
La $uncin +ue se usa para generar n0meros aleatorios es3 "ND
Esta $uncin de)uel)e un n0mero +ue ser ma&or o igual a CERO & menor +ue
U@O* Creo +ue se representa as-3 7RR@"R<( pero si no es as-( da igual o alg0n
2e8perto2 me lo dir* Lo +ue interesa sa%er es +ue nunca llegar a )aler uno & +ue
puede ser igual a cero*
Si ,acemos esto3 8 U Rnd V 6 El )alor > nunca llegar a 6( en la ma&or-a de los
casos se suelen +uitar los decimales usando I@9( en este caso( ,aciendo 8 U
Int.Rnd V 6/( 8 podr )aler 7( <( E( K( : 6 & si ,acemos esto otro3 8 U Int.Rnd V
6/ B <* Los )alores sern de < a 6*
Si +ueremos )alores del 66 al P7 la e8presin ser-a esta3 8 U Int.Rnd V E6/ B 66*
;a +ue Int.Rnd V E6/ producir un n0mero +ue estar entre el 7 & el E6 .am%os
inclusi)es/( al sumarle 66*** pues eso( estar en el rango deseado*
Este e'emplo nos sir)e para cuando necesitemos o%tener un cdigo ASCII de una
letra de la A a la Z( .en ma&0sculas/( &a +ue los cdigos ASCII de las letras son3
AU66( BU66*** ZUP7 en caso de +ue sean ma&0sculas( para o%tener los )alores en
min0sculas slo ,a& +ue a#adirle KE & &a los tendremos por+ue aUPD( %UPO***
!U<EE*
En estos rangos se e8clu&e la e#e( tanto ma&0sculas como min0sculas & las )ocales
acentuadas*** es +ue los se#ores +ue crearon esta norma .%merican !tandard +ode
for 7nterchange 7nformation( o algo parecido & se suele pronunciar ASYI/( eran de
los USA & all- no usan esas letras*** recuerdo mis tiempos de comics( cuando !le=
Ni/o se llama%a !le= Nino( al menos en los crditos de los comics USA***
El pro%lema de los n0meros aleatorios( es +ue no son tan aleatorios( es decir cada
)e! +ue se inicia el programa produce el mismo n0mero( .al menos en los %asics
anteriores( ,e le-do +ue a,ora el VB: no genera la misma secuencia cada )e! +ue
se inicia el programa( eso lo )eremos despus/( )amos a )er un e'emplo para +ue
lo comprue%es( esto lo ,e compro%ado con el VBE .+ue es el +ue tengo en el
porttil +ue me ,e lle)ado a casa para escri%ir las entregas( ,asta +ue mi 'e$e me lo
pida*** +ue ser en pocos d-as( puede ser/( se supone +ue en los dems $uncionar
igual( pero como te digo para el VB: ,a& un 2truco2 +ue )eremos despus*** cuando
lo comprue%e( 'e*
Escri%e esto en el AormHLoad del nue)o pro&ecto +ue ,a%rs tenido +ue crear para
pro%ar*** si no lo ,as ,ec,o( &a tardas***
Private Sub Form_Load
Show H%FuT debe e&tar e&to? &ino no &e verS nada555 Vre1uerda&W
Print Mnd * )5
End Sub
A m- me ,a mostrado <D*6KO6P( e'ec0talo )arias )eces & )ers +ue siempre
muestra el mismo n0mero*** E8iste una $orma de solucionar esta $alta de
2aleatoriedad2 & es cam%iando la 2semilla2 +ue se usa como %ase para la
imPLA@9Acin de n0meros aleatorios( para ello se usa Randomi!e seguido de un
n0mero( pero si el n0mero es el mismo*** no conseguimos nada*** Prue%a poniendo
Randomi!e 6 despus del S,oG & antes del Print( prue%a a e'ecutarlo )arias )eces(
a mi me ,a mostrado O*<:K<:: todas las )eces +ue lo ,e e'ecutado* El pro%lema es
+ue al usar un n0mero 2$i'o2 como semilla para la generacin de nue)os n0meros(
el n0mero producido siempre es el mismo( esto est %ien para ,acer prue%as $i'as o
cuando +ueremos 2drnosla2 de mago con los colegas +ue sa%en menos +ue
nosotros( &a +ue podemos 2predecir2 los n0meros +ue mostrar en una secuencia
seguida*** con este 2truco2 de'a%a 2alucinado2 a los c,a)ales a los +ue le da%a
clases*** slo ten-a +ue memori!ar una serie de n0meros & se +ueda%an
2alucinados2 cuando les dec-a el +ue i%a a salir*** claro +ue despus ten-a +ue poner
2pies en pol)orosa2 cuando les e8plica%a 2la trampa2*
Bueno( al tema( +ue no es plan de contar %atallitas*** El VB nos proporciona una
$uncin +ue de)uel)e el n0mero de segundos transcurridos desde la media noc,e
.9ICER/ & usando esta $uncin como 2semilla2 lograremos producir n0meros +ue
2casi2 ser aleatorios*** al menos sern ms di$-ciles de 2pronosticar2( cam%ia el
Randomi!e 6 por Randomi!e 9imer & )ers +ue &a no se produce el mismo n0mero
cuando e'ecutes )arias )eces el programa***sal)o +ue ,agas 2trampas2 cam%iando
la ,ora del e+uipo***
En VB: & superior( se puede ,acer esto mismo poniendo Randomi!e F<( de esta
$orma la 2semilla2 es di$erente cada )e! +ue se e'ecuta( pero pre$iero usar el 9imer
&a +ue es ms 2compati%le2*
MXue tal un 'ueguecito para practicarN
La& +ue ,acer un programa +ue genere un n0mero entre uno & cien & ,a& +ue
intentar adi)inarlo***
Si el n0mero +ue damos es ma&or o menor( +ue el VB nos a)ise & cuando
acertemos +ue nos lo comuni+ue & termine el programa***
Para +ue VB se comuni+ue( te )o& a decir cmo ,acerlo***
Para preguntarte el n0mero & guardarlo en la )aria%le @( ,a! esto3
@ U Val.InputBo8.2Escri%e un n0mero entre < & <772//*
El InputBo8 muestra una pantalla preguntando & de)uel)e lo +ue escri%amos o una
cadena )ac-a si pulsamos en cancelar( el Val con)ierte esa cadena en n0mero*
Para a)isar +ue el n0mero @( .el +ue nosotros le decimos al VB/( es menor o ma&or(
cam%iar 8888 por lo +ue corresponda3
CsgBo8 2El n0mero 2 W CStr.@/ W 2 es 88882
"e esta $orma se mostrar un cuadro de dilogo indicando si )amos %ien
encaminados o no***
;a me'oraremos o ampliaremos este 2e'ercicio2 para ,acer ms cosas( incluso +ue
el ordenador a)erigbe el n0mero*** +ue sin ning0n tipo de 2suerte2 lo adi)inar en 6
6 )eces( lo mismo +ue tu de%ers ,acer si sigues algunas normas o trucos*** slo
decirte lo de 2di)ide & )encers2 .no s por+u me ,a dado a,ora por esa cita***/
En la pr8ima entrega )eremos ms cosas so%re los arra&s***
Si te atre)es podr-as ,acer los siguientes cam%ios al 2pro%lemilla2 planteado
anteriormente3
<* Compro%ar +ue el n0mero introducido en el InputBo8 est entre < & <77( en caso
de +ue no sea as-( )ol)er a preguntar*
E* Si se escri%e CERO mostrar el n0mero +ue el VB ,a%-a 2pensado2 & terminar*
K* Cuando lo acertemos +ue nos indi+ue en cuantos intentos lo ,emos conseguido*
:* Un programa +ue sea al re)s( es decir3 +ue nosotros pensemos un n0mero del
< al <77 & el VB intente adi)inarlo( para ello de%er mostrarnos un n0mero &
nosotros indicarle si lo ,a acertado*
6* Otro igual( pero indicndole si nuestro n0mero es Cenor( Ca&or o es correcto***
,a%r +ue darle las mismas oportunidades*** .este es el +ue tiene el 2truco2 del
di)ide & )encers***
En los casos : & 6 +ue muestre tam%in el n0mero de intentos +ue le ,a lle)ado
solucionarlo***
La pista para +ue el ordenador sepa si es menor o ma&or es usar el CsgBo8( pero
como $uncin3
'G *&(@o/("*i n$mero e&C " - 0Str(/) - 0hr<(1+) - "V3e a1ertadoW"? D)
= E .hen
*&(@o/ "Lo he a1ertado en " - 0Str(v) - " ve1e&5"
E/it #o
H555
"e esta $orma mostrar un cuadro de dilogo con dos opciones 2SI2 & 2@O2( el
n0mero : es el encargado de eso* El )alor de)uelto ser 6 si se pulsa en SI & D si
se pulsa en @O*
Esto en VB: se podr-a ,acer as-3
(f #sg'o)*+#i n,mero es- + . %$tr*)/ . vb%r0f . +12e acertado3+, vb"esNo/ 4 vb"es 56en
#sg'o) +0o 6e acertado en + . %$tr*v/ . + veces.+
E)it 7o 8...
Con lo cual( aun+ue sea en ingls( es ms intuiti)o* Esto de los CsgBo8 lo )eremos
en una entrega 2especial2

Las soluciones estn en este linJ*** no +uiero +ue ests esperando las soluciones
,asta la pr8ima entrega*** para +ue )eas +ue algunas )eces so& un poco 2ms
considerado2
LECCION 2
Pues a+u- estn las soluciones( creo +ue esta $orma de darlas ser la me'or( &a +ue
no tendrs +ue esperar a +ue est lista la siguiente entrega para sa%er si ,as
conseguido resol)er los pro%lemillasQe'ercicios con 8ito***
El 9uego 18ico:
#im n %& 'nte(er
#im / %& 'nte(er
Mandomize .imer
/ = 'nt(Mnd * 1) , 1
#o
n = 8al('n>ut@o/<("E&1ribe un n$mero del 1 al 1"))
'G n = / .hen E/it #o
'G n K / .hen
*&(@o/ "El n$mero " - 0Str(n) - " e& menor5"
El&e
*&(@o/ "El n$mero " - 0Str(n) - " e& ma7or5"
End 'G
Loo>
*&(@o/ "Lo ha& a1ertado5"
1. Compro1ar <ue el n?mero introducido en el InputBo= etH entre 1 2 1**,
en cao de <ue no ea aE, 7ol7er a preguntar. %na de la olucione, in
uar el U.-.:
#im n %& 'nte(er
#im / %& 'nte(er
Mandomize .imer
/ = 'nt(Mnd * 1) , 1
#o
#o
n = 8al('n>ut@o/<("E&1ribe un n$mero del 1 al 1"))
Loo> Xhile n K 1 =r n O 1
'G n = / .hen E/it #o
'G n K / .hen
*&(@o/ "El n$mero " - 0Str(n) - " e& menor5"
El&e
*&(@o/ "El n$mero " - 0Str(n) - " e& ma7or5"
End 'G
Loo>
*&(@o/ "Lo ha& a1ertado5"
2. $i e ecri1e CE". motrar el n?mero <ue el VB 4a1Ea SpenadoS 2
terminar.
#im n %& 'nte(er
#im / %& 'nte(er
Mandomize .imer
/ = 'nt(Mnd * 1) , 1
#o
#o
n = 8al('n>ut@o/<("E&1ribe un n$mero del 1 al 1"))
'G n = .hen
*&(@o/ "*i n$mero era el " - 0Str(/)
4nload *e
End
End 'G
Loo> Xhile n K 1 =r n O 1
'G n = / .hen E/it #o
'G n K / .hen
*&(@o/ "El n$mero " - 0Str(n) - " e& menor5"
El&e
*&(@o/ "El n$mero " - 0Str(n) - " e& ma7or5"
End 'G
Loo>
*&(@o/ "Lo ha& a1ertado5"
'. Cuando lo acertemo <ue no indi<ue en cuanto intento lo 4emo
coneguido.
#im n %& 'nte(er
#im / %& 'nte(er
#im v %& 'nte(er
Mandomize .imer
/ = 'nt(Mnd * 1) , 1
#o
#o
n = 8al('n>ut@o/<("E&1ribe un n$mero del 1 al 1"))
'G n = .hen
*&(@o/ "*i n$mero era el " - 0Str(/)
HSi e&tS en el Form_Load
HEnd
HSi e&tS en un >ro1edimiento
E/it Sub
End 'G
Loo> Xhile n K 1 =r n O 1
v = v , 1
'G n = / .hen E/it #o
'G n K / .hen
*&(@o/ "El n$mero " - 0Str(n) - " e& menor5"
El&e
*&(@o/ "El n$mero " - 0Str(n) - " e& ma7or5"
End 'G
Loo>
*&(@o/ "Lo ha& a1ertado en " - 0Str(v) - " ve1e&5"
0. !4ora al re7H, e decir: <ue nootro penemo un n?mero del 1 al 1**
2 el VB intente adi7inarlo, para ello de1er8 motrarno un n?mero 2
nootro indicarle i lo 4a acertado.
#im / %& 'nte(er
#im v %& 'nte(er
Mandomize .imer
#o
/ = 'nt(Mnd * 1) , 1
v = v , 1
'G *&(@o/("*i n$mero e&C " - 0Str(/) - 0hr<(1+) - "V3e a1ertadoW"? D) = E .hen
*&(@o/ "Lo he a1ertado en " - 0Str(v) - " ve1e&5"
E/it #o
End 'G
Loo>
6. .tro igual, pero indic8ndole i nuetro n?mero e +enor, +a2or o e
correcto... 4a1r8 <ue darle la mima oportunidade... Fete e el <ue
tiene el StrucoS del di7ide 2 7encer8...
#im / %& 'nte(er
#im v %& 'nte(er
#im a %& 'nte(er
#im z %& 'nte(er
a = 1
z = 1
HEn e&te 1a&o no ne1e&itamo& n$mero& aleatorio&
#o
/ = (z A a) ^ ) , a
v = v , 1
'G *&(@o/("*i n$mero e&C " - 0Str(/) - 0hr<(1+) - "V3e a1ertadoW"? D) = E .hen
*&(@o/ "Lo he a1ertado en " - 0Str(v) - " ve1e&5"
E/it #o
El&e
'G *&(@o/("Enton1e&555 V " - 0Str(/) - " e& ma7orW"? D) = E .hen
HEl n$mero del ordenador e& ma7or
Hdebe e&tar entre /A1 7 a
z = / A 1
El&e
HEl n$mero del ordenador e& menor
Hdebe e&tar entre /,1 7 z
a = / , 1
End 'G
End 'G
Loo>

A,ora a esperar a la dcima entrega +ue ser dentro de po+uito*** un mes( un
a#o*** M+uin sa%eN
LECCION 1%
!rra2 +ultidimenionale
En algunas ocasiones ,asta los arra&s se +uedan cortos*** al menos los arra&s
simples o unidimensionales( .una sola dimensin/( si en el e'emplo de la octa)a
entrega( el de los rascamientos( +uisieras sa%er las )eces +ue te ,as rascado cada
d-a del mes*** tendr-amos otra )e! el pro%lema( podr-amos usar un arra& para cada
d-a del mes3 "ia<.E:/( "iaE.E:/*** pero de nue)o tendr-amos complicaciones para
algunos clculos***
Por suerte para nosotros( e8iste otra $orma de usar los arra&s*
En nuestro caso nos ser)ir-a el +ue los arra&s tu)iesen dos dimensiones( al estilo de
una ta%la con $ilas para cada d-a del mes & columnas para cada una de las ,oras del
d-a en cuestin( para ,acer esto( dimensionaremos un arra& de esta $orma3
"im "ias.K<( E:/ As Integer
Para guardar o recuperar un )alor lo ,aremos de la misma $orma +ue con un arra&
simple( pero especi$icando dos )alores separados por una coma3
"ias."iaCes( Lora"ia/ U <
& por supuesto( podemos usarlo con %ucles AOR3
For #ia = 1 .o +1
For 3ora = 1 .o )D
Ma&1ada&*e& = Ma&1ada&*e& , #ia&(#ia? 3ora)
!e/t
!e/t
"espus +ue estos dos %ucles terminen( la )aria%le RascadasCes tendr el total de
)eces +ue nos ,emos rascado cada uno de los d-as del mes +ue estamos
procesando*
Si +ueremos almacenar las rascadas de cada d-a de cada mes de un a#o( No
Pro2lem?
"im Ceses.<E( K<( E:/ As Integer
"e esta $orma solucionar-amos en pro%lema( &a +ue al a#adir una tercera
dimensin( podemos usar esta para cada uno de los meses( por e'emplo( el total de
)eces +ue nos ,a&amos rascado a las EE ,oras del d-a K7 del mes P .septiem%re/(
estar-a en3 Ceses.P( K7( EE/
Recono!co +ue este e'emplo de las rascada no es 0til( pero por lo menos ,emos
)isto cmo usar los arra&s*
Recuerda +ue los arra&s pueden ser de cual+uier tipo3 Integer( String( "ou%le( etc*

BCu8nto elemento tiene un arra2D
En algunas ocasiones podemos necesitar sa%er el n0mero de elementos contenidos
en un arra&( para estos casos e8isten dos $unciones( una para sa%er el -ndice menor
& otra para sa%er el ma&or*
Por e'emplo si tenemos este arra&3 Loras.O 9o EE/
El menor ser-a O & el ma&or EE( para a)eriguarlo3
Cenor U LBound.Loras/
Ca&or U UBound.Loras/
Esta $orma es para los arra&s unidimensionales( para a)eriguar estos )alores en
arra&s con ms de una dimensin( tendremos +ue especi$icar la dimensin de la
+ue +ueremos a)eriguar ese )alor menor o ma&or( por e'emplo( si tenemos "ias.<
9o K<( 7 9o EK/
CenorCes U LBound."ias(</ T"e)ol)er-a <
Ca&orCes U U%ound."ias( </ T"e)ol)er-a K<
CenorLora U LBound."ias( E/ T"e)ol)er-a 7
Ca&orLora U UBound."ias( E/ T"e)ol)er-a EK
Redimensionando arra&s multidimensionales
Veamos a,ora cmo $unciona el Redim & Redim Preser)e con los arra&s con )arias
dimensiones3 igual
S-( da lo mismo +ue el arra& tenga una o muc,as dimensiones* Lo 0nico +ue
de%emos sa%er es +ue no podemos cam%iar el n0mero de dimensiones( aun+ue s-
el n0mero de elementos de cada una de las dimensiones*
Un e'emplo3
9enemos inicialmente esta declaracin3 "im Ceses.< 9o 6( < 9o K<( 7 9o EK/ As
Integer
& necesitamos ampliar la primera dimensin de 6 a <E3
Redim Ceses.< 9o <E( < 9o K<( 7 9o EK/ o
Redim Preser)e Ceses.< 9o <E( < 9o K<( 7 9o EK/ si +ueremos conser)ar los )alores
almacenados*
Lo +ue no podemos ,acer es esto3 Redim Ceses.< 9o K<( 7 9o EK/
por+ue pasamos de tener tres dimensiones a pretender tener slo dos & eso( no
est permitido*
@i al re)s tampoco( es decir si tenemos un arra& con dos dimensiones & +ueremos
+ue tenga tres*
Si +ueremos ,acer esto 0ltimo( tendremos +ue eliminar el primer arra& & )ol)er a
dimensionarlo con las dimensiones +ue +ueramos tener3
"im "ias.K<( E:/
Erase "ias
"im "ias.<E( K<( E:/
El pro%lema es +ue perdemos los datos*** cosa +ue( en caso de necesidad(
podr-amos solucionar copiando los datos a otra )aria%le & )ol)iendo a asignarla al
nue)o arra& dimensionado***
Pero muc,os de estos pro%lemas se solucionan con las colecciones & el uso del tipo
Variant( as- como con los o%'etos o clases de$inidas por nosotros*** pero eso ser
ms adelante*** toda)-a ,a& muc,as otras cosas 2esenciales2 +ue aprender &
conceptos +ue siempre de%es tener en cuenta*** +ue poco a poco esto& intentando
recalcar para +ue tu 2coco2 )a&a asimilndolos*** espero conseguirlo*

BCuanta dimenione puede tener un arra2D
Si la mente no me $alla( el n0mero de dimensiones es E66* MXuin necesita tantasN
Los )alores menor & ma&or de los -ndices estn comprendidos dentro del rango de
un )alor Integer del VB( es decir entre FKED6O & KED6D o sea 666K6 )alores o
-ndices distintos* Esto lo comento como 2curiosidad2 pero de%er-as compro%arlo en
los manuales*

%na cadena, por fa7or
;a ,e comentado en la octa)a entrega +ue los arra&s tam%in permiten asignar
cadenas de caracteres( realmente se pueden tener arra&s de cual+uier tipo de
)aria%les* Pero no me!cladas* Si un arra& se dimensiona del tipo Integer slo
podremos almacenar )alores numricos enteros* Incluso cuando lo
Redimensionemos de%er tener el mismo tipo con el +ue en un principio lo
,a%-amos dimensionado* Este incon)eniente se solucionar en una pr8ima entrega
& con las colecciones*
Con lo +ue sa%emos ,asta a,ora es con lo +ue )amos a tra%a'ar* ; )amos a
practicar un poco con los arra&s de caracteres( para ello )amos a crear un arra& de
cadenas con caracteres aleatorios* @o tiene ninguna utilidad( pero ser)ir para uno
de los e'ercicios*
"imensionaremos un arra& de <77 elementos( a cada uno de esos elementos
asignarle entre <7 & 67 caracteres comprendidos entre la A & la Z( recuerda +ue los
cdigos ASCII de la A es el 66 & la Z el P7*
A,ora os pondr una $orma 2$cil2 de clasi$icar ese arra&( la parte de la asignacin
es la +ue t0 tendrs +ue ,acer*
H
0on&t *a/0adena& = 1
#im 1adena(1 .o *a/0adena&) %& Strin(
#im 1 %& 'nte(er
#im &.m> %& Strin(
#im i %& 'nte(er
#im J %& 'nte(er
Mandomize .imer
li&t150lear
H%&i(nar lo& valore&
H555E&1ribe aFuT tu 1Bdi(o555
H0la&iGi1ar
For i = 1 .o *a/0adena&
For J = 1 .o i A 1
H>ara ordenar de Gorma de&1endenteC
H'G 1adena(i) O 1adena(J) .hen
'G 1adena(i) K 1adena(J) .hen
Hinter1ambiar lo& valore&
&.m> = 1adena(i)
1adena(i) = 1adena(J)
1adena(J) = &.m>
End 'G
!e/t
!e/t
li&t150lear
For i = 1 .o *a/0adena&
li&t15%dd'tem 1adena(i)
!e/t
Creo +ue el procedimiento es lo su$icientemente 2simple2 como para +ue lo
entiendas*** M)erdadN
Lo +ue de%es 2o%ser)ar2 en este mtodo es +ue cada uno de los elementos del
%ucle i se compara con todos los anteriores( de $orma +ue si alguno anterior es
2ma&or2 se intercam%ien las posiciones***
Supn +ue en la posicin cadena.</ tienes almacenado 2LOLA2 & en la posicin E
est la pala%ra 2ACI1O2
La condicin se cumplir cuando la )aria%le i )alga E & ' )alga <( +uedando por
tanto en el orden correcto*
Lo +ue de%es sa%er de las cadenas de caracteres es +ue cuando se ,ace una
comparacin el Visual Basic comprue%a los )alores ASCII de las letras +ue
componen la pala%ra( en este caso la letra A est antes +ue la L( as- +ue A es
menor +ue L*
9am%in de%ers sa%er +ue los n0meros estn antes +ue las letras( por tanto si una
cadena de caracteres empie!a por una ci$ra del 7 al P( se ordenar antes +ue la 2A2
& +ue la 2a2 estar despus +ue la Z
Si +uieres sa%er los )alores ASCII de los caracteres 2ms o menos2 stndard( ,a!
este %ucle3
H0Bdi(o& %S0''
For i = +) .o 1))
#ebu(5Print iI 0hr<(i)
!e/t

!4ora lo aniado e9ercicio( .realmente ,a sido cortita esta entrega M)erdadN/
Para los e'ercicios( usando este tro!o para guardar n0meros aleatorios en un arra&
unidimensional( espero +ue no tengas pro%lemas para guardarlos en un arra&
multidimensional*
. = 'nt(Mnd * +1) , ) H!$mero de ra&1ada&? . valdrS de ) a 5
For i = 1 .o .
3 = 'nt(Mnd * )+) , 1 H3 valdrS de 1 a )+
3ora&(3) = 3ora&(3) , 1
!e/t
Los e'ercicios usando este e'emplo3
1. Sa%er +ue ,ora tiene el )alor ma&or & a +ue ,ora empe!aste a rascarte .es
decir la primera ,ora del arra& +ue contiene un )alor/
2. Xue ,ora $ue la 0ltima en +ue te arrascaste .no necesita e8plicacin***/
1. Codi$icar el e'emplo anterior para +ue el n0mero de )eces +ue te rascas
)alga .aleatoriamente/ de <77 a <777 & sa%er tam%in cual de estas ,oras
tiene el )alor menor .en caso de +ue ,a&a )arios( slo tienes +ue a)eriguar
uno de ellos/
Para +ue no te compli+ues muc,o la )ida( decirte +ue con un par de l-neas( puedes
a)eriguar el ma&or o el menor*** no sea +ue +uieras ,acer un mogolln de
comparaciones*
4A dis$rutarlo5
Esta entrega no da ms de s-( no es +ue ,a&a +uerido ,acerla deprisa & corriendo(
es +ue realmente lo 2%sico2 est a+u- e8plicado( si +uieres pro$undi!ar ms( &a
sa%es dnde %uscar in$ormacin*** en los li%racos esos +ue )en-an con tu VB*
Si a0n as-( piensas +ue no te ,as enterado*** repsatela unas diecisis )eces ms***

También podría gustarte