Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección...

Post on 01-Aug-2020

6 views 1 download

Transcript of Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección...

Comprenderelalcanceylavisibilidad

Elalcanceserefierealadisponibilidaddeunavariable,constante,oprocedimientoparaserusadoporotroprocedimiento.Haytresnivelesdealcance:niveldeprocedimiento,niveldemóduloprivadoyniveldemódulopúblico.

Elalcancedeunavariablesedeterminacuandosedeclara.esaconsejabledeclarartodaslasvariablesexplícitamenteparaevitarerroresdeconflictodenombresentrevariablesquetienealcancesdistintos.

Definirelalcancedeunniveldeprocedimiento

Unavariableoconstantedefinidadesdedentrodeunprocedimientonoesvisiblefueradeeseprocedimiento.Sóloelprocedimientoquecontieneladeclaracióndelavariablepuedeusarlos.Enelsiguienteejemplo,elprimerprocedimientopresentauncuadrodemensajequecontieneunacadenadetexto.ElsegundoprocedimientopresentauncuadrodemensajeenblancoyaquelavariablestrMensajeeslocalparaelprimerprocedimiento.

SubVariableLocal()

DimstrMensajeAsString

strMensaje="Estavariablenosepuedeusarfueradeesteprocedimiento."

MsgBoxstrMensaje

EndSub

SubFueraAlcance()

MsgBoxstrMensaje

EndSub

Definirelalcancedeniveldemóduloprivado

SepuedendefinirvariablesyconstantesdeniveldemóduloenlasecciónDeclarationsdeunmódulo.Lasvariablesdeniveldemódulopuedenserpúblicasoprivadas.Lasvariablespúblicasestándisponiblesparatodoslosprocedimientosdetodoslosmódulosdeunproyecto;lasvariablesprivadassóloestándisponiblesparalosprocedimientosdeesemódulo.LasvariablesdeclaradasconlainstrucciónDimenlasecciónDeclarationstieneunalcanceprivadoanoserqueseespecifiqueotracosa.Sinembargo,esaconsejablecolocarlapalabraclavePrivatedelantedelnombredelavariableparaqueelalcanceseaevidentealleerelcódigo.

Enelsiguienteejemplo,lavariabledecadenastrMensajeestádisponibleparacualquierprocedimientodefinidoenelmódulo.Cuandosellamaalsegundoprocedimiento,presentaelcontenidodelavariabledecadenastrMensajeenuncuadrodedialogo.

'AñadalosiguientealaseccióndeDeclarationsdelmódulo.

PrivatestrMensajesAsString

SubInicializaVariablePrivada()

strMensaje="Estavariablenosepuedeusarfueradeestemódulo."

EndSub

SubUsaVariablePrivada()

MsgBoxstrMensaje

EndSub

NotaLosprocedimientospúblicosdeunmóduloestándaromódulodeclaseestándisponiblesparacualquierproyectodereferenciaalproyectoactual.Paralimitarelalcancedetodoslosprocedimientosdeunmóduloalproyectoactual,añadaunainstrucciónOptionPrivateModulealasecciónDeclarationsdelmódulo.Lasvariablesyprocedimientospúblicosseguiránestandodisponiblesparalosrestantesprocedimientosdelproyectoactual,peronoloestaránparalosproyectosquealosquepuedanhacerreferencia.

Definirelalcancedeniveldemódulopúblico

Sisedeclaraunavariabledeniveldemódulocomopública,estarádisponibleparatodoslosprocedimientosdelmismoproyecto.Enelsiguienteejemplo,lavariabledecadenastrMensajesepuedeusarencualquierprocedimientodeunmódulodelproyecto.

'IncluyaestoenlasecciónDeclarationsdelmódulo.

PublicstrMensajeAsString

Todoslosprocedimientossonpúblicosamenosqueseespecifiquelocontrario,exceptoenelcasodelosprocedimientosevento.CuandoVisualBasiccreaunprocedimientoevento,lapalabraclavePrivateseinsertaautomáticamenteantesdeladeclaracióndelprocedimiento.Paralosrestantesprocedimientos,debedeclararexplícitamenteconlapalabraclavePrivatesinodeseaqueseanpúblicos.

Sepuedenusarprocedimientos,variablesyconstantespúblicasdefinidasenmódulosestándaromódulosdeclasedeproyectosquehaganreferenciaalactual.Sinembargo,esprecisoestablecerunareferenciaalproyectoenqueestándefinidos.

Losprocedimientos,variablesyconstantespúblicasdefinidasenmódulosquenoseanestándarodeclase,comopuedenserlosmódulosdeformularioomódulosdeinforme,noestándisponiblesdesdelosproyectosquehacenreferenciaalactual,yaqueestosmódulossonprivadosparaelproyectoenel

queresiden.

Comprenderlaautomatización

Laautomatización(antesllamadaautomatizaciónOLE)esunadelascaracterísticasdelComponentObjectModel(COM),unatecnologíaestándarenlaindustriausadaporlasaplicacionespararevelarsusobjetosalasherramientasdedesarrollo,lenguajesdemacrosyotrasaplicacionesqueseancompatiblesconlaautomatización.Porejemplo,unaaplicacióndehojasdecálculopuederevelarunahojadecálculo,undiagrama,celdaorangodeceldas,cadaunacomountipodiferentedeobjeto.Unprocesadordetextospuederevelarobjetoscomounaaplicación,undocumento,unpárrafo,unafrase,unmarcadorounaselección.

Cuandounaaplicaciónescompatibleconlaautomatización,VisualBasictieneaccesoalosobjetosreveladosporlaaplicación.UtiliceVisualBasicparamanipularesosobjetosmediantelaaplicacióndemétodossobreelobjetooleyendoydandovaloralaspropiedadesdelobjeto.Porejemplo,sepuedecrearunobjetodeAutomatizaciónllamadoMiObjyescribirelsiguientecódigoparateneraccesoalobjeto:

MiObj.Insert"Hola,amigos."'Sitúaeltexto.

MiObj.Bold=True'Daformatoaltexto.

IfMac=True'Compruebelaconstantedeplataforma

MyObj.SaveAs"HD:\WORDPROC\DOCS\TESTOBJ.DOC"'Guardaelobjeto(Macintosh).

Else

MyObj.SaveAs"C:\WORDPROC\DOCS\TESTOBJ.DOC"'Guardaelobjeto(Windows).

Utilicelassiguientesfuncionesparaaccederaunobjetodeautomatización:

Función DescripciónCreateObject Creaunnuevoobjetodeltipoespecificado.GetObject Recuperaunobjetodeunarchivo.

Sideseamásdetallessobrelaspropiedadesymétodoscompatiblesconunaaplicación,debeconsultarladocumentacióndelaaplicación.Losobjetos,funciones,propiedadesymétodoscompatiblesconunaaplicaciónestánnormalmentedefinidosenlabibliotecadeobjetosdelaaplicación.

Comprenderlacompilacióncondicional

Lacompilacióncondicionalsepuedeutilizarparaejecutardeformaselectivadeterminadosbloquesdecódigo,porejemplo,instruccionesdedepuraciónquecomparenlavelocidaddedistintosmétodosdeenfocarunatareadeprogramación,oadaptandounaaplicaciónparadistintosidiomas.

Enelcódigosedeclaraunaconstantedecompilacióncondicionalmedianteladirectiva#Constyseidentificanlosbloquesdecódigoquesedebencompilarcondicionalmentemedianteladirectiva#If...Then...#Else.Elsiguienteejemploejecutacódigodedepuraciónodeproducción,enfuncióndelvalorasignadoalavariableconDepurar.

'DeclaracomopubliclaconstantedecompilaciónenlasecciónDeclarations.

#ConstconDepurar=1

SubEjecucionSelectiva()

#IfconDepurar=1Then

.'Ejecutaelcódigoconlasinstruccionesdedepuración.

.

.

#Else

.'Ejecutaelcódigonormal.

.

.

#EndIf

EndSub

Comprenderlavidadelasvariables

Eltiempoduranteelqueunavariableconservasuvalorseconocecomovida.Elvalordelavariablepuedecambiardurantesuvida,peroconservaalgúnvalor.Cuandounavariablepierdesualcance,yanotieneningúnvalor.

Cuandounprocedimientocomienzaaejecutarse,seinicializantodaslasvariables.Lasvariablesnuméricasseinicializanacero,lascadenasdelongitudvariableseinicializanaunacadenavacíadelongitudcero("")yunacadenadelongitudfijasellenaconloscaracterescorrespondientesalcódigoASCII0,oChr(0).LasvariablesVariantseinicializanaEmpty.Cadaunodeloselementosdeunavariabledetipodefinidoporelusuarioseinicializacomosisetratasedeunavariableindependiente.

Cuandosedeclaraunavariabledeobjeto,sereservaelespaciocorrespondienteenmemoria,peroseledaelvalorNothinghastaqueseleasigneunareferenciaaobjetomediantelainstrucciónSet.

Sielvalordeunavariablenocambiadurantelaejecucióndelcódigo,conservasuvalordeinicializaciónhastaquepierdaalcance.

UnavariabledeniveldeprocedimientodeclaradamediantelainstrucciónDimconservasuvalorhastaqueelprocedimientoterminadeejecutarse.Sielprocedimientollamaaotrosprocedimientos,lavariableconservasuvalor

tambiénmientrasseejecutanesosprocedimientos.

SiunavariabledeniveldeprocedimientodedeclaraconlapalabraclaveStatic,lavariableconservasuvalormientrashayacódigoenejecución,seacualseaelmódulo.Cuandotodoelcódigohaterminadodeejecutarse,lavariablepierdesualcanceysuvalor.Suvidaeslamismaqueladeunavariabledeniveldemódulo.

Unavariabledeniveldemóduloesdistintaaunavariableestática.Enunmóduloestándarounmódulodeclase,conservasuvalorhastaqueseterminadeejecutarelcódigo.Enunmódulodeclaseconservasuvalormientrasexistaunadefinicióndelaclase.Lasvariablesdeniveldemóduloconsumenmemoriahastaquesusvaloressevuelvenainicializa,poresosólosedebenutilizarcuandoseanecesario.

SiseincluyelapalabraclaveStaticantesdeunainstrucciónSuboFunction,losvaloresdetodaslasvariablesdeniveldeprocedimientodelprocedimientoseconservaránentrelassucesivasllamadas.

ComprenderlasintaxisdeVisualBasic

EnlaseccióndeAyudadeVisualBasiccorrespondienteaunmétodo,instrucciónoprocedimientoFunctionlasintaxismuestratodosloselementosnecesariosparautilizarcorrectamenteesemétodo,instrucciónofunción.Losejemplossiguientesexplicancomodebeninterpretarseloselementossintácticosmáscomunes.

SintaxisdelmétodoActivate

objeto.Activate

EnlasintaxisdelmétodoActivate,lapalabra"objeto"encursivaeslaposiciónreservadaparalainformaciónqueintroduceelusuario—enestecaso,códigoquedevuelveunobjeto.Laspalabrasquesemuestranennegritadebenescribirseexactamentetalycomoseindica.Porejemplo,elsiguienteprocedimientoactivalasegundaventanaeneldocumentoactivo.

SubActivar()

Windows(2).Activate

EndSub

SintaxisdelafunciónMsgBox

MsgBox(texto[,botones][,título][,archivoayuda,contexto])

EnlasintaxisdelafunciónMsgBox,laspalabrasencursivaynegritasonargumentosconnombredelafunción.Losargumentosqueaparecenentrecorchetessonopcionales.(NoescribaloscorchetesenelcódigodeVisualBasic).EnelcasodelafunciónMsgBox,elúnicoargumentoquesedebeincluireseltextodelapregunta.

Losargumentosparafuncionesymétodossepuedenespecificarenelcódigomediantesuposiciónoporsunombre.Paraespecificarargumentosmediantesuposición,sigaelordenqueseindicaenlasintaxis,separandolosargumentosconunacoma,porejemplo:

MsgBox"¡Surespuestaescorrecta!",0,"CuadrodeRespuesta"

Paraespecificarunargumentomediantesunombrebastaconusarelnombredelargumentoseguidodedospuntosyunsignoigual(:=)yelvalordelargumento.Losargumentosconnombresepuedenespecificarencualquierorden,porejemplo:

MsgBoxTitle:="CuadrodeRespuesta",Prompt:="¡Surespuestaescorrecta!"

Lasintaxisdelasfuncionesyalgunosmétodosmuestranlosargumentosentreparéntesis.Estasfuncionesymétodosdevuelvenvalores,poresodebenencerrarselosargumentosentreparéntesisalasignarunvaloraunavariable.Siseignoraelvalorderetornoosinosepasanargumentosenformaalguna,nodebenincluirselosparéntesis.Losmétodosquenodevuelvenvaloresnonecesitanquesusargumentosaparezcanencerradosentreparéntesis.Estasnormassonaplicablestantosiseusanargumentosposicionalesonominativos.

Enelsiguienteejemplo,elvalorquedevuelvelafunciónMsgBoxesunnúmeroqueindicaelbotónseleccionadoalmacenadoenlavariablemiVar.Dadoqueseutilizaelvalorquedevuelvelafunción,esprecisoutilizarparéntesis.Otrocuadrodemensajepresentaentoncesenpantallaelvalordelavariable.

SubPregunta()

miVar=MsgBox(Prompt:="Megustamitrabajo.",_

Title:="Cuadroderespuesta",Buttons:="4")

MsgBoxmiVar

EndSub

SintaxisdelainstrucciónOption

OptionCompare{Binary|Text|Database}

EnlasintaxisdelainstrucciónOptionCompare,lasllavesylalíneaverticalindicanunaelecciónobligatoriaentretresopciones.(NoescribalasllavesenlainstruccióndeVisualBasic).Porejemplo,lasiguienteinstrucciónespecificaquedentrodelmódulo,lascadenassecomparanenuncriteriodeordenaciónquenodependedelmayúsculasominúsculas.

OptionCompareText

SintaxisdelainstrucciónDim

Dimnombrevariable[([subscriptos])][Astipo][,nombrevariable[([subscriptos])][Astipo]]...

EnlasintaxisdelainstrucciónDim,lapalabraDimesunapalabraclaveexigida.Elúnicoelementonecesarioesnombrevariable(elnombredelavariable).Porejemplo,lasiguienteinstruccióncreatresvariables:miVar,siguienteVaryterceraVar.EstasvariablessedeclaranautomáticamentecomoVariant.

DimmiVar,siguienteVar,terceraVar

ElsiguienteejemplodeclaraunavariablecomoString.Alincluiruntipodedatosseahorramemoriaysepuedenevitarerroresenelcódigo.

DimmiRespuestaAsString

Paradeclararvariasvariablesenunainstrucción,debeincluirseeltipodedatosparacadavariable.LasvariablesdeclaradassinuntipodedatossedeclaranautomáticamentecomoVariant.

DimxAsInteger,yAsInteger,zAsInteger

Enlasiguienteinstrucción,axeyselesasignaeltipodedatosVariant.SóloazseleasignaeltipodedatosInteger.

Dimx,y,zAsInteger

Sisedeclaraunavariablematriz,debenincluirselosparéntesis.Lossubscriptossonopcionales.Lasiguienteinstruccióndefinelasdimensionesdeunamatrizdinámica,miMatriz.

DimmiMatriz()

Comprenderlasmatricesdeparámetros

Unamatrizdeparámetrosseutilizaparapasarunamatrizdeargumentosaunprocedimiento.Noesnecesariosaberelnúmerodeelementosdelamatrizcuandosedefineelprocedimiento.

ParaidentificarunamatrizdeparámetrosseutilizalapalabraclaveParamArray.LamatrizdebeestardefinidacomounamatrizdeltipoVariantydebeserelúltimoargumentoenladefinicióndelprocedimiento.

Elsiguienteejemplomuestradequéformasepuededefinirunprocedimientoconunamatrizdeparámetros.

SubCualquierNumeroArgs(strNombreAsString,ParamArrayintPuntuacion()AsVariant)

DimintIAsInteger

Debug.PrintstrNombre;"Puntuaciones"

'UtilizalafunciónUBoundparaencontrarellímitesuperiordelamatriz.

ForintI=0ToUBound(intPuntuacion())

Debug.Print"";intPuntuacion(intI)

NextintI

EndSub

Elsiguienteejemplomuestradequeformassepuedellamaresteprocedimiento.

CualquierNumeroArgs"Juan",10,26,32,15,22,24,16

CualquierNumeroArgs"Manuel","Alto","Bajo","Medio","Alto"

Comprenderlosargumentosconnombreyopcionales

CuandosehaceunallamadaaunprocedimientoSuboFunction,sepuedenincluirargumentosdeformaposicional,esdecir,enelordenenqueaparecenenladefinicióndelprocedimiento,osepuedenincluirlosargumentosconsunombresinrespetarningúnorden.

Porejemplo,elsiguienteprocedimientoSubaceptatresargumentos:

SubPasaArgs(strNombreAsString,intEdadAsInteger,dteNacimientoAsDate)

Debug.PrintstrNombre,intEdad,dteNacimiento

EndSub

Alllamaresteprocedimientosepuedenincluirsusargumentosenlaposicióncorrecta,todosseparadosporcomas,talycomomuestraelsiguienteejemplo:

PasaArgs"María",29,#21-2-69#

Tambiénsepuedehacerunallamadaaesteprocedimientoeincluirargumentosconnombre,separadosporcomas.

PasaArgsintEdad:=29,dteNacimiento:=#21/2/69#,strNombre:="Maria"

Unargumentonominativoestáformadoporelnombredelargumentoseguidopordospuntosyunsignoigual(:=),todoelloseguidoporelvalordelargumento.

Losargumentosconnombresonmuyútilescuandosellamaaprocedimientosconargumentosopcionales.Siseusanargumentosconnombrenoseránecesarioincluirsucesivascomasparasustituirargumentosposicionalesausentes.Alusarargumentosconnombreesmásfácilcontrolarquéargumentossepasanycuálesseomiten.

LosargumentosopcionalesvanprecedidosporlapalabraclaveOptionalenladefinicióndelprocedimiento.Enladefinicióndelprocedimientosepuedeespecificartambiénunvalorpredefinidoparaelargumentoopcional.Porejemplo:

SubArgsOpcionales(strProvinciaAsString,OptionalstrPaisAsString="MÉXICO")

...

EndSub

Cuandosehaceunallamadaaunprocedimientoconunargumentoopcional,sepuedeoptarporespecificaronoelargumentoopcional.Sinoseespecifica,seusaráelvalorpredefinidosiexiste.Sinosehaespecificadotampocounvalorpredefinido,elargumentotendráelvalordeinicializaciónquelecorrespondaaunavariabledelmismotipo.

Elsiguienteprocedimientoincluyeunargumentoopcional,lavariablevarPais.LafunciónIsMissingdeterminasisehapasadoonounargumentoopcionalalprocedimiento.

SubArgsOpcionales(strProvinciaAsString,OptionalintRegionAsInteger,_

OptionalstrPaisAsString="MÉXICO")

IfIsMissing(intRegion)ANDIsMissing(strPais)Then

Debug.PrintstrProvincia

ElseIfIsMissing(strPais)Then

Debug.PrintstrProvincia,intRegion

ElseIfIsMissing(intRegion)Then

Debug.PrintstrProvincia,strPais

Else

Debug.PrintstrProvincia,intRegion,strPais

EndIf

EndSub

Esteprocedimientosepuedellamarempleandoargumentosconnombretalycomomuestranlossiguientesejemplos.

ArgsOpcionalesstrPais:="MÉXICO",strProvincia:="SE"

ArgsOpcionalesstrProvincia:="SE",intRegion:=5

ComprenderlostiposdedatosVariant

EltipodedatosVariantseespecificaautomáticamentesinoseespecificaotrotipodedatosaldeclararunaconstante,variable,oargumento.LasvariablesdeclaradascomodeltipodedatosVariantpuedencontenervaloresnuméricos,cadenasdetexto,fecha,horaoBooleansypuedenconvertirlosvaloresquecontienendeformaautomática.LosvaloresnuméricosVariantocupan16bytesdememoria(loquesóloessignificativoenprocedimientosgrandesomóduloscomplejos)ysonmáslentosalahoradesuaccesoquelasvariablesdetipoexplícitodelosrestantestipos.EsmuyraroutilizareltipodedatosVariantpara

unaconstante.LosvaloresdecadenaVariantnecesitan22bytesdememoria.

LassiguientesinstruccionescreanvariablesVariant:

DimmiVar

DimtuVarAsVariant

laVar="Estoesuntexto."

LaúltimainstrucciónnodeclaraexplícitamentelavariablelaVar,sinoqueladeclaraimplícitamente,oautomáticamente.LasvariablesquesedeclaranimplícitamenteseespecificancomodeltipodedatosVariant.

SugerenciaSiseespecificauntipodedatosparaunavariableoargumentoyacontinuaciónseutilizauntipoerróneodedatos,seproduciráunerrordetipodedatos.Paraevitarerroresdetipodedatos,sedebenusarsólovariables(deltipodedatosVariant)odeclararexplícitamentetodaslasvariablesyespecificarparaellasuntipodedatos.Elúltimométodoeselpreferible.

Comprenderobjetos,propiedades,métodosyeventos

Unobjetorepresentaunelementodeunaaplicación,comounahojadecálculo,unacelda,undiagrama,unformularioouninforme.EncódigodeVisualBasic,unobjetodebeidentificarseantesdesepuedaaplicarunodelosmétodosdelobjetoocambiarelvalordeunadesuspropiedades.

Unacolecciónesunobjetoquecontienevariosobjetosquenormalmente,peronosiempre,sondelmismotipo.EnMicrosoftExcel,porejemplo,elobjetoWorkbookscontienetodoslosobjetosWorkbookabiertos.EnVisualBasic,lacolecciónFormscontienetodoslosobjetosFormexistentesenunaaplicación.

Loselementosdeunacolecciónsepuedenidentificarmediantesunúmeroosunombre.Porejemplo,enelsiguienteprocedimiento,Libro(1)identificaalprimerobjetoWorkbookabierto.

SubCierraPrimero()

Libro(1).Close

EndSub

ElsiguienteprocedimientoutilizaunnombreespecificadocomocadenaparaidentificarunobjetoForm.

SubCierraForm()

Forms("MiForm.frm").Close

EndSub

Tambiénesposibleoperaralmismotiemposobretodaunacoleccióndeobjetossiemprequelosobjetoscompartanmétodoscomunes.Porejemplo,elsiguienteprocedimientocierratodoslosformulariosabiertos.

SubCierraTodos()

Forms.Close

EndSub

Métodoestodaacciónquepuederealizarunobjeto.Porejemplo,AddesunmétododelobjetoComboBoxyaquesirveparaañadirunnuevoelementoauncuadrocombinado.

ElsiguienteprocedimientoutilizaelmétodoAddparaañadirunnuevoelementoaunComboBox.

SubAñadeElemen(nuevoElementoasString)

Combo1.AddnuevoElemento

EndSub

Propiedadesunatributodeunobjetoquedefineunadelascaracterísticasdelobjeto,talcomosutamaño,colorolocalizaciónenlapantalla,ounaspectodesucomportamiento,porejemplosiestávisibleoactivado.Paracambiarlascaracterísticasdeunobjeto,secambiaelvalordesuspropiedades

Paradarvaloraunapropiedad,hayquecolocarunpuntodetrásdelareferenciaaunobjeto,despuéselnombredelapropiedadyfinalmenteelsignoigual(=)yelnuevovalordelapropiedad.Porejemplo,elsiguienteprocedimientocambia

eltítulodeunformulariodeVisualBasicdandounvaloralapropiedadCaption.

SubCambiaNombre(nuevoTitulo)

miForm.Caption=nuevoTitulo

EndSub

Haypropiedadesalasquenosepuededarvalor.Eltemadeayudadecadapropiedadindicasiesposibleleerydarvaloresalapropiedad(lectura/escritura),leersóloelvalordelapropiedad(sólolectura)osólodarvaloralapropiedad(sóloescritura).

Sepuedeobtenerinformaciónsobreunobjetodevolviendoelvalordeunadesuspropiedades.Elsiguienteprocedimientoutilizauncuadrodediálogoparapresentareltítuloqueapareceenlapartesuperiordelformularioactivoenesemomento.

SubNombreFormEs()

formNonmbre=Screen.ActiveForm.Caption

MsgBoxformNombre

EndSub

Eventoestodaacciónquepuedeserreconocidaporunobjeto,comopuedeserelclicdelmouseolapulsacióndeunateclayparalaqueesposibleescribircódigocomorespuesta.Loseventospuedenocurrircomoresultadodeunaaccióndelusuarioodelcódigodelprograma,tambiénpuedenseroriginadosporelsistema.

Devolverobjetos

Cadaaplicacióntieneunaformadedevolverlosobjetosquecontiene.Sinembargoestosprocedimientosnosonsiempreiguales,porellodebeconsultareltemadeayudacorrespondientealobjetoocolecciónqueestáusandoenlaaplicaciónparadeterminarlaformadedevolverelobjeto.

Crearbuclesmediantecódigo

Medianteelusodeinstruccionescondicionalesyinstruccionesdebucle(tambiénconocidascomoestructurasdecontrol)esposibleescribircódigode

VisualBasicquetomedecisionesyrepitadeterminadasacciones.Otraestructuradecontrolútil,lainstrucciónWith,permiteejecutarunaseriedeinstruccionessinnecesidadderecalificarunobjeto.

Utilizarinstruccionescondicionalesparatomardecisiones

LasinstruccionescondicionalesevalúansiunacondiciónesTrueoFalseyacontinuaciónespecificanlasinstruccionesaejecutarenfuncióndelresultado.Normalmente,unacondiciónesunaexpresiónqueutilizaunoperadordecomparaciónparacompararunvalorovariableconotro.

Elegirlainstruccióncondicionalautilizar

If...Then...Else:SaltoaunainstruccióncuandounacondiciónesTrueoFalse

SelectCase:Seleccióndelainstrucciónaejecutarenfuncióndeunconjuntodecondiciones

Utilizarbuclespararepetircódigo

Empleandobuclesesposibleejecutarungrupodeinstruccionesdeformarepetida.AlgunosbuclesrepitenlasinstruccioneshastaqueunacondiciónesFalse,otroslasrepitenhastaquelacondiciónesTrue.Haytambiénbuclesquerepitenunconjuntodeinstruccionesunnúmerodeterminadodevecesounavezparacadaobjetodeunacolección.

Elegirelbucleautilizar

Do...Loop:SeguirenelbuclemientrasohastaunacondiciónseaTrue.

For...Next:Utilizaruncontadorparaejecutarlasinstruccionesunnúmerodeterminadodeveces.

ForEach...Next:Repeticióndelgrupodeinstruccionesparacadaunodelosobjetosdeunacolección.

Ejecutarvariasinstruccionessobreelmismoobjeto

Normalmente,enVisualBasic,debeespecificarseunobjetoantesdepoderejecutarunodesusmétodosocambiarunadesuspropiedades.SepuedeusarlainstrucciónWithparaespecificarunobjetounasolavezparaunaseriecompletadeinstrucciones.

With:Ejecutarunaseriedeinstruccionessobreelmismoobjeto

Crearprocedimientosrecursivos

Losprocedimientostienenunespaciolimitadoparaalmacenarvariables.Cadavezqueunprocedimientosellamaasimismo,consumemásdeeseespacio.Unprocedimientoquesellamaasimismoesloqueseconocecomounprocedimientorecursivo.Unprocedimientorecursivoquesellamacontinuamenteasimismoproduciráfinalmenteunerror.Porejemplo:

FunctionAgotar(Máximo)

Agotar=Agotar(Máximo)

EndFunction

Esteerrorpuederesultarmenosevidentecuandodosprocedimientossellamanunoalotrodeformaindefinida,ocuandonuncasecumplelacondicióndefinidacomofindeunbucle.Lasfuncionesrecursivostienensususos.Porejemplo,elsiguienteprocedimientoutilizaunafunciónrecursivoparacalcularfactoriales:

FunctionFactorial(N)

IfN<=1Then'Sehallegadoalfindelasllamadasrecursivos.

Factorial=1'(N=0)abandonalasllamadas.

Else'LlamanuevamenteaFactorialsiN>0.

Factorial=Factorial(N-1)*N

EndIf

EndFunction

Debeprobarelprocedimientorecursivoparacomprobarquenosellamaasimismotantasvecesqueagotalamemoriadisponible.Siseproduceunerror,compruebequeelprocedimientonosellamaasimismodeformaindefinida.Sinoesasí,tratedeahorrarmemoriamediante:

Laeliminacióndevariablesinnecesarias.

ElusodetiposdedatosdistintosaVariant.

Unnuevoestudiodelalógicadelprocedimiento.Amenudoesposiblesustituirbuclesanidadosporunprocedimientorecursivo.

Crearvariablesdeobjeto

Sepuedecrearunavariabledeobjetodelamismaformaqueelobjetoalquehacereferencia.Sepuedenactivarodevolverlaspropiedadesdelobjetooutilizarcualquieradesusmétodos.

Paracrearunavariabledeobjeto:

Declarelavariabledeobjeto.

Asignelavariabledeobjetoaunobjeto.

Declararvariablesdeobjeto

ParadeclararunavariabledeobjetosehadeusarlainstrucciónDimounadelasrestantesinstruccionesdedeclaración(Public,Private,oStatic).UnavariablequeserefiereaunobjetodebeserunaVariant,unObject,ountipoespecíficodeobjeto.Porejemplo,sonválidaslassiguientesdeclaraciones:

'DeclaraMiObjetocomotipodedatosVariant.

DimMiObjeto

'DeclaraMiObjetocomountipodedatosObject.

DimMiObjetoAsObject

'DeclaraMiObjetocomountipoFont.

DimMiObjetoAsFont

NotaSiutilizaunavariabledeobjetosinhaberladeclaradopreviamente,eltipodedatospredefinidodelavariabledeobjetoesVariant.

SepuededeclararunavariabledeobjetoconeltipodedatosObjectcuandoeltipodeobjetoespecíficonoseconocehastaqueseejecutaelprocedimiento.UtiliceeltipodedatosObjectparacrearunareferenciagenéricaacualquierobjeto.

Siconoceeltipoespecíficodeobjeto,debedeclararasílavariabledeobjeto.Porejemplo,silaaplicacióncontieneuntipodeobjetoEjemplo,sepuededeclararunavariabledeobjetoparaeseobjetoempleandounacualquieradelasdosinstruccionessiguientes:

DimMiObjetoAsObject'Sedeclaracomoobjetogenérico.

DimMiObjetoAsEjemplo'SedeclarasólocomounobjetoEjemplo.

Aldeclararobjetosespecíficosesposiblecomprobarautomáticamentelostipos,elcódigoesmásrápidodeejecuciónymejorasulegibilidad.

Asignarunavariabledeobjetoaunobjeto

ParaasignarunavariabledeobjetoaunobjetoseutilizalainstrucciónSet.EsposibleasignarunaexpresióndeobjetooNothing.Porejemplo,sonválidaslassiguientesasignacionesaunavariabledeobjeto:

SetMiObjeto=SuObjeto'Asignareferenciaaobjeto.

SetMiObjeto=Nothing'Deshacelarelación.

Sepuedeefectuaralmismotiempoladeclaracióndelavariabledeobjetoconlaasignacióndeunobjetoalamisma,paraelloseutilizalapalabraclaveNewenlainstrucciónSet.Porejemplo:

SetMiObjeto=NuevoObjeto'Creayasigna

AlasignaraunavariabledeobjetoelvalorNothingsedeshacelarelaciónquepudieraexistirentrelavariabledeobjetoycualquierobjetoespecífico.Asíseevitaque,accidentalmente,sepuedacambiarelobjetoalcambiarlavariable.UnavariabledeobjetoquedadefinidasiemprecomoNothingalcerrarelobjetoasociado,asíesposiblecomprobarsilavariabledeobjetoestáasociadaaun

objetoválido.Porejemplo:

IfNotMiObjetoIsNothingThen

'Lavariablehacereferenciaaunobjetoválido.

...

EndIf

Porsupuesto,estapruebanuncapodrádeterminarconabsolutacertezasiunusuariohacerradoonolaaplicaciónquecontienealobjetoalquesehacereferenciaporlavariabledeobjeto.

Hacerreferenciaaladefiniciónactualdeunobjeto

UtilicelapalabraclaveMeparahacerreferenciaaladefiniciónactualdelobjetodondeseestáejecutandoelcódigo.TodoslosprocedimientosasociadosconelobjetoactualtienenaccesoalobjetoalquesehacereferenciacomoMe.LautilizacióndeMeesespecialmenteútilparapasarinformaciónsobreladefiniciónactualdeunobjetoaunprocedimientodeotromódulo.Porejemplo,supongaqueexisteelsiguienteprocedimientoenunmódulo:

SubCambiaColorObjeto(MiObjetoNombreAsObject)

MiObjetoNombre.ColorFondo=RGB(Rnd*256,Rnd*256,Rnd*256)

EndSub

Sepuedehacerunallamadaalprocedimientoypasarle,comoargumento,ladefiniciónactualdelobjetoempleandolasiguienteinstrucción:

CambiaColorObjetoMe

Declararconstantes

Aldeclararunaconstante,sepuedeasignaraunvalorunnombrequetengaalgúnsignificadoapropiado.LainstrucciónConstseutilizaparadeclararunaconstanteydarlevalor.Unaconstantenopuedemodificarseocambiardevalorunavezquehasidodeclarada.

Sepuededeclararunaconstantedentrodeunprocedimientooalprincipiodeunmódulo,enlaseccióndeDeclarations.Lasconstantesaniveldemódulosonprivadas,amenosqueseespecifiquelocontrario.Paradeclararunaconstantepúblicaaniveldemódulo,lainstrucciónConstdebeirprecedidaporlapalabra

clavePublic.SepuededeclararexplícitamenteunaconstantecomoprivadacolocandolapalabraclavePrivateantesdelainstrucciónConstparafacilitarlalecturaycomprensióndelcódigo.Sideseamásinformación,consultelasección"Comprenderelalcanceylavisibilidad"enlaAyudadeVisualBasic.

ElsiguienteejemplodeclaralaconstantePublicEdadConcomounIntegeryleasignaelvalor34.

PublicConstEdadConAsInteger=34

Lasconstantessepuedendeclarardeunodelossiguientestiposdedatos:Boolean,Byte,Integer,Long,Currency,Single,Double,Date,String,oVariant.Dadoqueyaseconoceelvalordeunaconstante,esmuyfácilelegireltipodedatosenlainstrucciónConst.Sideseamásinformaciónsobretiposdedatos,consultelasección"TipodedatosSummary"enlaAyudadeVisualBasic.

Enunasolainstrucciónsepuedendeclararvariasconstantes.Paraespecificaruntipodedatos,debeincluirseeltipodedatosparacadaconstante.EnlasiguienteinstrucciónsedeclarancomoIntegerlasconstantesEdadConySalarioCon.

ConstEdadConAsInteger=34,SalarioConAsCurrency=35000

Declararmatrices

Lasmatricessedeclaranigualquelasrestantesvariables,utilizandoinstruccionesDim,Static,Private,oPublic.Ladiferenciaentrelasvariablesescalares(aquellasquenosonmatrices)ylasvariablesmatrizesquenormalmentesedebeespecificareltamañodelamatriz.Unamatrizconuntamañoespecificadoesunamatrizdetamañofijo.Unamatrizcuyotamañopuedecambiarmientraselprogramaseestáejecutandoesunamatrizdinámica.

Siunamatrizseindexadesde0ódesde1dependedelvalordelainstrucciónOptionBase.SiOptionBase1noseespecifica,todoslosíndicesdematrices

comienzanencero.

Declararunamatrizfija

EnlasiguientelíneadecódigosedeclaracomomatrizIntegerunamatrizdetamañofijocon11filasy11columnas:

DimMiMatriz(10,10)AsInteger

Elprimerargumentocorrespondealnúmerodefilasyelsegundoalnúmerodecolumnas.

Comosucedeencualquierotradeclaracióndevariable,amenosqueseespecifiqueparalamatrizuntipodedatos,loselementosdeéstaserándeltipoVariant.CadaelementonuméricoVariantdelamatrizutiliza16bytes.CadaelementodecadenaVariantutiliza22bytes.Paraescribircódigodelaformamáscompactaposible,debedeclararexplícitamentesusmatricesconuntipodedatosdistintoaVariant.Lassiguienteslíneasdecódigocomparaneltamañodevariasmatrices:

'UnamatrizIntegerutiliza22bytes(11elementos*2bytes).

ReDimMiMatrizInteger(10)AsInteger

'UnamatrizDouble-precisionutiliza88bytes(11elementos*8bytes).

ReDimMiMatrizDoble(10)AsDouble

'UnamatrizVariantutilizaalmenos176bytes(11elementos*16bytes).

ReDimMiMatrizVariant(10)

'LamatrizIntegerutiliza100*100*2bytes(20.000bytes).

ReDimMiMatrizInteger(99,99)AsInteger

'LamatrizDouble-precisionutiliza100*100*8bytes(80.000bytes).

ReDimMiMatrizDoble(99,99)AsDouble

'LamatrizVariantutilizaalmenos160.000bytes(100*100*16bytes).

ReDimMiMatrizVariant(99,99)

Eltamañomáximodeunamatrizdependedelsistemaoperativoydelacantidaddememoriadisponible.EsmáslentoutilizarunamatrizquesobrepasalacantidaddememoriaRAMdisponibleenelsistemayaquelosdatostienenqueserleídosyescritosdeldisco.

Declararunamatrizdinámica

Aldeclararunamatrizdinámicasepuedecambiareltamañodeunamatrizmientrasqueelcódigoseestáejecutando.ParadeclararunamatrizdinámicaseusanlasinstruccionesStatic,Dim,Private,oPublic,dejandolosparéntesisvacíos,talycomosemuestraenelsiguienteejemplo.

DimMatrizSingle()AsSingle

NotaSepuedeusarlainstrucciónReDimparadeclararimplícitamenteunamatrizdentrodeunprocedimiento.TengacuidadoparanocambiarelnombredelamatrizcuandouselainstrucciónReDim,yaquesecrearáunasegundamatrizinclusoenelcasodequesehayaincluidolainstrucciónOptionExplicitenelmódulo.

LainstrucciónReDimsepuedeutilizarenunprocedimiento,dentrodelalcancedelamatriz,paracambiarelnúmerodedimensiones,definirelnúmerodeelementosyparadefinirloslímitessuperioreinferiorparacadadimensión.SepuedeusarlainstrucciónReDimparamodificarlamatrizdinámicacuantasvecesseanecesario.Sinembargo,cadavezquesehace,sepierdenlosvaloresalmacenadosenlamatriz.SepuedeusarlainstrucciónReDimPreserveparaampliarunamatrizconservandolosvaloresquecontiene.Porejemplo,lasiguienteinstrucciónañade10nuevoselementosalamatrizMatrizVarsinperderlosvaloresalmacenadosenloselementosoriginales.

ReDimPreserveMatrizVar(UBound(MatrizVar)+10)

NotaCuandoseutilizalapalabraclavePreserveconunamatrizdinámica,sólosepuedecambiarellímitesuperiordelaúltimadimensión,nopudiendomodificarseelnúmerodedimensiones.

Declararvariables

ParadeclararvariablesseutilizanormalmenteunainstrucciónDim.Lainstruccióndedeclaraciónpuedeincluirseenunprocedimientoparacrearunavariabledeniveldeprocedimiento.Opuedecolocarsealprincipiodeunmódulo,enlasecciónDeclarations,paracrearunavariabledeniveldemódulo.

ElsiguienteejemplocrealavariableNombreTextoyespecíficamenteleasignaeltipodedatosString.

DimNombreTextoAsString

Siestainstrucciónaparecedentrodeunprocedimiento,lavariableNombreTextosepuedeusarsóloeneseprocedimiento.SilainstrucciónapareceenlasecciónDeclarationsdelmódulo,lavariableNombreTextoestarádisponibleentodoslosprocedimientosdentrodelmódulo,peroparalosrestantesmódulosdelproyecto.Parahacerqueestavariableestédisponibleparatodoslosprocedimientosdeunproyecto,bastaconcomenzarladeclaraciónconlainstrucciónPublic,talycomomuestraelsiguienteejemplo:

PublicNombreTextoAsString

Sideseamásinformaciónsobrecómodarnombreasusvariables,puedeconsultarlasección"VisualBasicNamingRules"enlaAyudadeVisualBasic.

Lasvariablessepuedendeclararcomodeunodelossiguientestiposdedatos:Boolean,Byte,Integer,Long,Currency,Single,Double,Date,String(paracadenasdelongitudvariable),String*longitud(paracadenasdelongitudfija),Object,oVariant.Sinoseespecificaeltipodedatos,eltipodedatosVarianteselpredefinido.TambiénesposiblecrearuntipodefinidoporelusuarioempleandolainstrucciónType.Sideseamásinformaciónsobretiposdedatospuedeconsultarlasección"TipodedatosSummary"enlaAyudadeVisualBasic.

Sepuedendeclararvariasvariablesenunainstrucción.Paraespecificareltipodedatossedebeincluiruntipodedatosparacadavariable.EnlasiguienteinstrucciónsedeclaranlasvariablesintX,intY,eintZcomodeltipoInteger.

DimintXAsInteger,intYAsInteger,intZAsInteger

Enlasiguienteinstrucción,intXeintYsedeclarancomodeltipoVariant;ysólointZsedeclaracomodeltipoInteger.

DimintX,intY,intZAsInteger

Noesnecesarioespecificareltipodedatosenlainstruccióndedeclaración.Siseomite,lavariableserádeltipoVariant.

UtilizarlainstrucciónPublic

LainstrucciónPublicsepuedeutilizarparadeclararvariablespúblicasdeniveldemódulo.

PublicNombreTextoAsString

Lasvariablespúblicassepuedenusarencualquierprocedimientodelproyecto.Siunavariablepúblicasedeclaraenunmóduloestándaroenunmódulodeclase,tambiénsepodráusarenlosproyectosreferenciadosporelproyectoenquesedeclaralavariablepública.

UtilizarlainstrucciónPrivate

LainstrucciónPrivatesepuedeusarparadeclararvariablesprivadasdeniveldemódulo.

PrivateMiNombreAsString

LasvariablesPrivatepuedenserusadasúnicamenteporprocedimientospertenecientesalmismomódulo.

NotaCuandoseutilizaaniveldemódulo,lainstrucciónDimesequivalentealainstrucciónPrivate.SeríaaconsejableusarlainstrucciónPrivateparafacilitarlalecturaycomprensióndelcódigo.

UtilizarlainstrucciónStatic

CuandoseutilizalainstrucciónStaticenlugardelainstrucciónDim,lavariabledeclaradamantendrásuvalorentrellamadassucesivas.

UtilizarlainstrucciónOptionExplicit

EnVisualBasicsepuededeclararimplícitamenteunavariableusándolaenunainstruccióndeasignación.TodaslasvariablesquesedefinenimplícitamentesondeltipoVariant.LasvariablesdeltipoVariantconsumenmásrecursosdememoriaquelamayorpartedelasotrostiposdevariables.Suaplicaciónserámáseficientesisedeclaranexplícitamentelasvariablesyselesasignauntipodedatosespecífico.Aldeclararseexplícitamentelasvariablessereducelaposibilidaddeerroresdenombresyelusodenombreserróneos.

SinodeseaqueVisualBasicrealicedeclaracionesimplícitas,puedeincluirenunmódulolainstrucciónOptionExplicitantesdetodoslosprocedimientos.Estainstrucciónexigequetodaslasvariablesdelmódulosedeclarenexplícitamente.SiunmóduloincluyelainstrucciónOptionExplicit,seproduciráunerrorentiempodecompilacióncuandoVisualBasicencuentreunnombredevariablequenohasidopreviamentedeclarado,ocuyonombresehaescritoincorrectamente.

SepuedeseleccionarunaopcióndelentornodeprogramacióndeVisualBasicparaincluirautomáticamentelainstrucciónOptionExplicitentodoslosnuevosmódulos.ConsulteladocumentacióndesuaplicaciónparaencontrarlaformademodificarlasopcionesdeentornodeVisualBasic.Tengaencuentaqueestaopciónnotieneningúnefectosobreelcódigoquesehayaescritoconanterioridad.

NotaLasmatricesfijasydinámicassiempresetienequedeclararexplícitamente.

Declararunavariabledeobjetoparaautomatización

Cuandoseutilizaunaaplicaciónparacontrolarlosobjetosdeotraaplicación,debeestablecerseunareferenciaalabibliotecadetiposdelaotraaplicación.Unavezquesehaestablecidolareferencia,sepuedendeclararvariablesdeobjetoconformeasutipomásespecífico.Porejemplo,sidesdeMicrosoftWordseestableceunareferenciaalabibliotecadetiposdeMicrosoftExcel,sepuededeclararunavariabledeltipoWorksheetdesdeMicrosoftWordpararepresentarunobjetoWorksheetdeMicrosoftExcel.

SiseutilizaotraaplicaciónparacontrolarobjetosdeMicrosoftAccess,esposible,enlamayorpartedeloscasos,declararvariablesobjetosdeltipomásespecífico.SepuedeusartambiénlapalabraclaveNewparacrearautomáticamenteunanuevadefinicióndeunobjeto.Sinembargo,puedesernecesarioindicarquesetratadeunobjetoMicrosoftAccess.Porejemplo,cuandosedeclaraunavariabledeobjetopararepresentarunformulariodeMicrosoftAccessdesdeMicrosoftVisualBasic,debedistinguirseentreelobjetoFormdeMicrosoftAccessyunobjetoFormdeVisualBasic.Paraelloseincluyeelnombredelabibliotecadetiposenladeclaracióndelavariable,comomuestraelsiguienteejemplo:

DimfrmPedidosAsNewAccess.Form

AlgunasaplicacionesnoreconocenalgunosdelostiposdeobjetosdeMicrosoftAccess.Enesecaso,inclusodespuésdeestablecerunareferenciaalabibliotecadetiposdeMicrosoftAccess,seránecesariodeclarartodaslasvariablesobjeto

deMicrosoftAccesscomodeltipoObject.TampocopuedeusarselapalabraclaveNewparacrearunanuevadefinicióndelobjeto.ElsiguienteejemplomuestracómodeclararunavariablequerepresenteunanuevadefinicióndelobjetoApplicationdeMicrosoftAccessdesdeunaaplicaciónquenoreconocelostiposdeobjetodeMicrosoftAccess.LaaplicacióncreaentoncesunanuevadefinicióndelobjetoApplication.

DimappAccessAsObject

SetappAccess=CreateObject("Access.Application")

Paradeterminarlasintaxisautilizarconunaaplicacióndeterminadadebeconsultarseladocumentacióndelaaplicación.

Devolvercadenasdesdefunciones

Algunasfuncionestienendosversiones:unaquedevuelveuntipodedatosVariantyotraquedevuelveuntipodedatosString.LasversionesVariantsonmásaconsejablesyaquelasvariantesrealizanautomáticamentelaconversiónentretiposdedatosdistintos.TambiénpermitenqueNullsepropagueatravésdeunaexpresión.LasversionesStringsonmáseficientesyaqueconsumenmenosmemoria.

ConsiderelaposibilidaddeusarlaversiónStringcuando:

Elprogramaseamuylargoyusemuchasvariables.

Seescribandatosdirectamenteenarchivosdeaccesodirecto.

LassiguientesfuncionesdevuelvenvaloresenunavariableStringcuandoseañadeelsignodólar($)alnombredefunción.EstasfuncionestienenelmismousoysintaxisquelasfuncionesequivalentesVariant(sinelsignodólar).

Chr$ ChrB$ *Command$CurDir$ Date$ Dir$Error$ Format$ Hex$Input$ InputB$ LCase$

Left$ LeftB$ LTrim$Mid$ MidB$ Oct$Right$ RightB$ RTrim$Space$ Str$ String$Time$ Trim$ Ucase$

*Puedenoestardisponibleentodaslasaplicaciones.

Ejecutarcódigocuandoseestablecenpropiedades

SepuedencrearprocedimientosPropertyLet,PropertySetyPropertyGetquecompartanelmismonombre.Asísepuedecrearungrupodeprocedimientosrelacionadosqueoperanconjuntamente.UnavezqueseutilizaunnombreparaunprocedimientoProperty,esenombreyanosepuedeusarparadenominarunprocedimientoSuboFunction,unavariable,ountipodefinidoporelusuario.

LainstrucciónPropertyLetpermitecrearunprocedimientoqueasignaunvaloralapropiedad.UnejemplopodríaserunprocedimientoPropertyquecreaunapropiedadinvertidaparaunmapadebitsenundocumento.Lasintaxisutilizada

paraefectuarlallamadaalprocedimientoPropertyLeteslasiguiente:

Form1.Invertido=True

ElprocesorealdeinvertirunmapadebitseneldocumentoserealizaenteramentedentrodelprocedimientoPropertyLet:

PrivateEstáInvertidoAsBoolean

PropertyLetInvertido(XAsBoolean)

EstáInvertido=X

IfEstáInvertidoThen

'(instrucciones)

Else

'(instrucciones)

EndIf

EndProperty

LavariabledeniveldedocumentoEstáInvertidoalmacenaelvalorasignadoalapropiedad.AldeclararlacomoPrivate,elusuariosólopuedecambiarlamedianteelprocedimientoPropertyLet.Utiliceunnombrequepermitafácilmenterecordarquelavariableseutilizaparalapropiedad.

EsteprocedimientoPropertyGetseutilizaparadevolverelvaloractualdelapropiedadInvertido:

PropertyGetInvertido()AsBoolean

Invertido=EstáInvertido

EndProperty

LosprocedimientosPropertyhacenmásfácillaejecucióndecódigoaltiempoqueseasignaunvaloralapropiedad.SepuedenusarlosprocedimientosPropertyparaejecutarlossiguientesprocesos:

Antesdeasignarunvaloralapropiedad,paradeterminarelvalordela

propiedad.

Despuésdeasignarlo,procedimientosbasadosenelnuevovalor.

Escribirdatosenarchivos

Cuandosetrabajacongrandescantidadesdedatos,esamenudoconvenienteescribiroleerdatosdeunarchivo.LainstrucciónOpenpermitecrearyaccederaarchivosdirectamente.Openproporcionatrestiposdeaccesoaarchivos:

Accesosecuencial(modosInput,OutputyAppend)seutilizaparaescribirarchivosdetexto,talescomoregistrosdeerroreseinformes.

Accesodirecto(modoRandom)seutilizaparaleeryescribirdatosenunarchivosincerrarlo.Losarchivosdeaccesodirectoconservanlainformaciónenregistros,loquepermiterecuperarladeformarápida.

Accesobinario(modoBinary)seutilizaparaleeryescribirencualquierbytedeunarchivo,sirveparaalmacenaropresentarunaimagendemapadebits.NotaLainstrucciónOpennosedebeutilizarparaabrirarchivosdelmismotipoquelaaplicación.Porejemplo,nouseOpenparaabrirundocumentodeWord,unahojadecálculodeMicrosoftExcelounabasededatosdeMicrosoftAccess.Sisehiciera,seperderíalaintegridaddelarchivosecorromperíanlosdatosalmacenados.

Lasiguientetablamuestralasinstruccionesnormalmenteutilizadasparaescribiryleerdatosenodeunarchivo.

Tipodeacceso Escribirdatos LeerdatosSecuencial Print#,Write# Input#Directo Put GetBinario Put Get

Escribirinstruccionesdeasignación

Lasinstruccionesdeasignaciónasignanunvaloroexpresiónaunavariableoconstante.Lasinstruccionesdeasignaciónincluyensiempreunsignoigual(=).ElsiguienteejemploasignaelvalorquedevuelvelafunciónInputBoxalavariablesuNombre.

SubPregunta()

DimsuNombreAsString

suNombre=InputBox("¿Cómosellama?")

MsgBox"Sunombrees"&suNombre

EndSub

LainstrucciónLetesopcionalynormalmenteseomite.Porejemplo,lainstruccióndeasignaciónanteriorpodríahaberseescritoasí:

LetsuNombre=InputBox("¿Cómosellama?").

LainstrucciónSetseutilizaparaasignarunobjetoaunavariablequehasidodeclaradacomoobjeto.LapalabraclaveSetesnecesaria.Enelsiguienteejemplo,lainstrucciónSetasignaunrangodeHoja1alavariabledeobjetomiCelda:

SubDarFormato()

DimmiCeldaAsRange

SetmiCelda=Worksheets("Hoja1").Range("A1")

WithmiCelda.Font

.Bold=True

.Italic=True

EndWith

EndSub

Lasinstruccionesqueestablecenvalorespropiedadsontambiéninstruccionesdeasignación.ElsiguienteejemploasignalapropiedadBolddelobjetoFontparalaceldaactiva:

ActiveCell.Font.Bold=True

Escribirinstruccionesdedeclaración

Lasinstruccionesdedeclaraciónseusanparadarnombreydefinirprocedimientos,variables,matricesyconstantes.Cuandosedeclaraunprocedimiento,variableoconstante,tambiénsedefinesualcancequedependedellugarenquesecoloqueladeclaraciónydelaspalabrasclavequeseusanparaello.

Elsiguienteejemplocontienetresdeclaraciones.

SubDarFormato()

ConstlimiteAsInteger=33

DimmiCeldaAsRange

'Masinstrucciones

EndSub

LainstrucciónSub(conlacorrespondienteinstrucciónEndSub)declaraunprocedimientollamadoDarFormato.TodaslasinstruccionesqueaparecenentrelasinstruccionesSubyEndSubseejecutancuandoelprocedimientoDarFormatoseejecutaosellama.

EscribirunprocedimientoSub

LainstrucciónConstdeclaralaconstantelimite,especificandoeltipodedatosIntegeryunvalorde33.

Declararconstantes

LainstrucciónDimdeclaralavariablemiCelda.Eltipodedatosesobjeto,enestecaso,unobjetoRangedeMicrosoftExcel.Sepuededeclararunavariablequeseacualquieradelosobjetosqueestánaccesiblesalaaplicaciónqueseestáusando.LasinstruccionesDimsonuntipodeinstrucciónqueseutilizaparadeclararvariables.OtraspalabrasclaveutilizadasenlasdeclaracionessonReDim,Static,Public,PrivateyConst.

Declararvariables

EscribirinstruccionesdeVisualBasic

UnainstruccióndeVisualBasicesunainstruccióncompleta.Puedeincluirpalabrasclave,operadores,variables,constantesyexpresiones.Todaslasinstruccionespertenecenaunadelastrescategoríassiguientes:

Lasinstruccionesdedeclaración,quedannombreaunavariable,constanteoprocedimientoypuedentambiénespecificarsutipodedatos.Escribirinstruccionesdedeclaración

Lasinstruccionesdeasignación,queasignanunvaloroexpresiónauna

variableoconstante.Escribirinstruccionesdeasignación

Lasinstruccionesejecutables,queinicianacciones.Estasinstruccionespuedenejecutarunmétodoofunciónypuedensaltaraoevitarbloquesdecódigo.Lasinstruccionesejecutablesamenudocontienenoperadorescondicionalesomatemáticas.Escribirinstruccionesejecutables

Continuarinstruccionesenmúltipleslíneas

Unainstruccióncabenormalmenteenunalínea,peropuedecontinuarseenlasiguienteutilizandouncarácterdecontinuacióndelínea.Enelsiguienteejemplo,lainstrucciónejecutableMsgBoxseextiendeporlastreslíneasquelesiguen:

SubCuadroDemo()'Esteprocedimientodeclaraunavariabledecadena,

'leasignaelvalorJuanyacontinuación

'presentaenpantallaunmensajeconcatenado.

DimmiVarAsString

miVar="Juan"

MsgBoxPrompt:="Hola"&myVar,_

Title:="Cuadrodesaludo",_

Buttons:=vbExclamation

EndSub

Añadircomentarios

Loscomentariospuedenexplicarunprocedimientoounainstrucciónenparticularacualquierpersonaquetengaqueleerelcódigo.VisualBasicignoraloscomentarioscuandoejecutalosprocedimientos.Laslíneasdecomentariocomienzanporunapóstrofe(')oconlapalabraclaveRemseguidaporunespacioypuedecolocarseencualquierlugardelprocedimiento.Paraañadirun

comentarioalamismalíneaqueocupaunainstrucción,debeinsertarseunapóstrofedespuésdeesta,seguidoporelcomentario.Loscomentariosaparecenenpantallaencolorverde,colorpredefinido.

Comprobarerroresdesintaxis

SisepresionalateclaENTRARdespuésdeescribirunalíneadecódigoylalíneaapareceenpantallaencolorrojo(puedequeaparezcatambiénunmensajedeerror),debeaveriguarcuáleselproblemaenesainstrucciónycorregirlo.

Escribirinstruccionesejecutables

Unainstrucciónejecutableiniciaunaacción.Puedeejecutarunmétodoofunciónysaltarabloquesdecódigoonoejecutarotros.Lasinstruccionesejecutablesincluyenamenudooperadorescondicionalesomatemáticos.

ElsiguienteejemploutilizalainstrucciónForEach...NextparapasarporcadaunadelasceldasdeunrangollamadoMiIntervaloenlaHoja1deunlibroMicrosoftExcelactivo.LavariablecesunaceldaenlacoleccióndeceldasquecomponenMiIntervalo.

SubDarFormato()

ConstlimiteAsInteger=33

ForEachcInWorksheets("Hoja1").Range("MiIntervalo").Cells

Ifc.Value>limiteThen

Withc.Font

.Bold=True

.Italic=True

EndWith

EndIf

Nextc

MsgBox"¡Fin!"

EndSub

LainstrucciónIf...Then...Elsedelejemplocompruebaelvalordelacelda.Sielvaloresmayorde33,lainstrucciónWithestablecelaspropiedadesBoldeItalicdelobjetoFontparaesacelda.LasinstruccionesIf...Then...ElseacabanconunainstrucciónEndIf.

LainstrucciónWithpuedeevitarquehayaqueescribirmuchasveceslasmismaspalabrasyaquelasinstruccionesquecontieneseejecutanautomáticamenteenelobjetoquesiguealapalabraclaveWith.

LainstrucciónNextllamaalasiguienteceldadelacoleccióndeceldascontenidaenMiIntervalo.

LafunciónMsgBox(quepresentaenpantallauncuadrodediálogodeVisualBasic)presentaunmensajeindicandoqueelprocedimientoSubhaterminadodeejecutarse.

EscribirunprocedimientoFunction

UnprocedimientoFunctionesunaseriedeinstruccionesdeVisualBasicencerradasentredosinstruccionesFunctionyEndFunction.UnprocedimientoFunctionessimilaraunprocedimientoSub,aunqueunafunciónpuededevolverademásunvalor.UnprocedimientoFunctionaceptaargumentos,comopuedenserconstantes,variablesoexpresionesquelepasaelprocedimientoqueefectúalallamada.SiunprocedimientoFunctionnotieneargumentos,lainstrucciónFunctiondebeincluirunpardeparéntesisvacíos.Unafuncióndevuelveunvalorasignándoloasunombreenunaomásinstruccionesdelprocedimiento.

Enelsiguienteejemplo,lafunciónCelsiuscalculagradoscentígradosapartirdegradosFahrenheit.CuandosellamaalafuncióndesdeelprocedimientoPrincipal,selepasaunavariablequecontieneelvalordelargumento.Elresultadodeloscálculossedevuelvealprocedimientoqueefectúolallamadaysepresentaenuncuadrodemensaje.

SubPrincipal()

temp=Application.InputBox(Texto:=_

"Porfavor,introduzcalatemperaturaengradosF.",Tipo:=1)

MsgBox"Latemperaturaes"&Celsius(temp)&"gradosC."

EndSub

FunctionCelsius(GradosF)

Celsius=(GradosF-32)*5/9

EndFunction

EscribirunprocedimientoProperty

UnprocedimientoPropertyesunaseriedeinstruccionesVisualBasicquepermitenaunprogramadorcrearymanipularpropiedadespersonalizadas.

LosprocedimientosPropertysepuedenusarparacrearpropiedadesdesólolecturaparaformularios,módulosestándarymódulosdeclase.

LosprocedimientosPropertydebenutilizarseenelcódigoenlugardelasvariablesPublicquedebenserejecutadascuandoseasignaunvaloralapropiedad.

AdiferenciadelasvariablesPublic,losprocedimientosPropertypuedentenercadenasdeAyudaasignadasenelExaminadordeobjetos.

CuandosecreaunprocedimientoProperty,seconvierteenunapropiedaddelmóduloquecontienealprocedimiento.VisualBasicproporcionalossiguientestrestiposdeprocedimientosProperty:

Procedimiento DescripciónPropertyLet Unprocedimientoquedavaloraunapropiedad.PropertyGet Unprocedimientoquedevuelveelvalordeunapropiedad.PropertySet Unprocedimientoqueestableceunareferenciaaunobjeto.

LasintaxisparadeclararunprocedimientoPropertyeslasiguiente:

[Public|Private][Static]Property{Get|Let|Set}nombrepropiedad_[(argumentos)][Astipo]

instrucciones

EndProperty

LosprocedimientosPropertyseusannormalmenteenparejas:PropertyLetconPropertyGetyPropertySetconPropertyGet.SisedeclaraunprocedimientoPropertyGetsóloescomosisedeclararaunapropiedadsólodelectura.ElusocombinadodelostresprocedimientosPropertysóloesútilenelcasodevariablesVariant,dadoquesólounavariableVariantpuedecontenerinformacióndeunobjetouotrotipodedatos.PropertySetestápensadopara

serusadoconobjetos,mientrasquePropertyLetnoloestá.

LosargumentosnecesariosparaunprocedimientoPropertysonlosqueaparecenenlatablasiguiente:

Procedimiento SintaxisdeladeclaraciónPropertyGetPropertyGetnombreprop(1,…,n)AstipoPropertyLetPropertyLetnombreprop(1,…,,,,n,n+1)PropertySet PropertySetnombreprop(1,…,n,n+1)

Desdeelprimerargumentohastaelpenúltimo(1,…,n)debencompartirlosmismosnombresytipodedatosentodoslosprocedimientosPropertyconelmismonombre.

LadeclaracióndeunprocedimientoPropertyGetaceptaunargumentomenosquelasdeclaracionesPropertyLetyPropertySet.EltipodedatosdelprocedimientoPropertyGetdebeserelmismoqueeltipodedelúltimoargumento(n+1)delasdeclaracionesPropertyLetyPropertySetcorrespondientes.Porejemplo,sisedeclaraelsiguienteprocedimientoPropertyLet,ladeclaraciónPropertyGetdebeusarargumentosconelmismonombreytipodedatosquelosargumentosdelprocedimientoPropertyLet.

PropertyLetNombres(intXAsInteger,intYAsInteger,varZAsVariant)

'Aquíunainstrucción.

EndProperty

PropertyGetNombres(intXAsInteger,intYAsInteger)AsVariant

'Aquíunainstrucción.

EndProperty

EltipodedatosdelúltimoargumentoenunadeclaraciónPropertySetdeberserdeltipodeobjetooVariant.

EscribirunprocedimientoSub

UnprocedimientoSubesunaseriedeinstruccionesVisualBasic,encerradasentreunpardeinstruccionesSubyEndSub,querealizanaccionesespecíficasperonodevuelvenningúnvalor.UnprocedimientoSubpuedeaceptarargumentos,comoconstantes,variablesoexpresionesquelepasaelprocedimientoquehaefectuadolallamada.SiunprocedimientoSubnotieneargumentos,lainstrucciónSubdebeincluirunpardeparéntesisvacío.

ElsiguienteprocedimientoSubdisponedecomentariosexplicativosencadalínea.

'DeclaraunprocedimientollamadoObtenInformacion

'EsteprocedimientoSubnoaceptaargumentos

SubObtenInformacion()

'Declaraunavariabledecadenallamadarespuesta

DimrespuestaAsString

'AsignaelvalorquedevuelvelafuncionInputBoxalavariablerespuesta

respuesta=InputBox(Prompt:="¿Cómosellama?")

'InstruccióncondicionalIf...Then...Else

Ifrespuesta=EmptyThen

'LlamaalafunciónMsgBox

MsgBoxPrompt:="Nohaescritosunombre."

Else

'FunciónMsgBoxconcatenadaconlavariablerespuesta

MsgBoxPrompt:="Sunombrees"&respuesta

'FindelainstrucciónIf...Then...Else

EndIf

'FindelprocedimientoSub

EndSub

Evitarconflictosdenombres

UnconflictodenombresSeproducealtratardecrearoutilizarunidentificadorqueyaestabadefinido.Enalgunoscasos,losconflictosdenombresgeneranerroresdeltipo"Detectadonombreambiguo"o"Declaraciónduplicadaenelalcance".Losconflictosdenombresquenosedetectanpuedenproducirfallosdeprogramaciónenelcódigoygenerarresultadoserróneos,especialmente,sinosedeclaranexplícitamentetodaslasvariablesantesdeutilizarlasporprimeravez.

Lamayorpartedelosconflictosdenombressepuedenevitarcomprendiendolascaracterísticasdealcancedelosidentificadoresdedatos,objetosyprocedimientos.VisualBasictienetresnivelesdealcance:niveldeprocedimiento,niveldemóduloprivadoyniveldemódulopúblico.

Elconflictodenombressepuedeproducircuandounidentificador:

Esvisibleenmásdeunniveldealcance.

Tienedossignificadosdistintosenelmismonivel.

Porejemplo,losprocedimientospertenecientesamódulosdistintospuedencompartirelmismonombre.Esposible,portanto,definirunprocedimientollamadoMiSubenlosmódulosMod1yMod2.Noseproduciráningúnconflictosicadaunodeestosprocedimientosesllamadoúnicamenteporotrosprocedimientosdesumismomódulo.Sinembargo,puedeproducirseunerrorsihayunallamadaaMiSubdesdeuntercermóduloynosehaproporcionadoningunaidentificaciónadicionalquepermitadistinguirentrelosdosMiSubexistentes.

Lamayorpartedelosconflictosdenombressepuedenevitarasignandoacada

identificadorunprefijoqueconsistaenelnombredelmóduloy,siesnecesario,unnombreproyecto.Porejemplo:

MiProyecto.MiMódulo.MiSubMiProyecto.MiMódulo.MiVariable

ElcódigoanteriorefectúaunallamadaalprocedimientoSubMiSubypasacomoargumentolavariableMiVariable.Sepuedeutilizarcualquiercombinacióndecalificadoresparadiferenciaridentificadoresinicialmenteidénticos.

VisualBasichacecorrespondercadareferenciaaunidentificadoraladeclaracióndeidentificador"másparecida"queencuentra.Porejemplo,siMiIdsedeclaracomoPublicendosmódulosdeunproyecto(Mod1yMod2),seráposibleespecificarsinningunacalificaciónelidentificadorMiIddeclaradoenMod2desdeelmismomóduloMod2,perodeberácalificarsecomoMod2.MyIdparaespecificarloenMod1.LomismoestambiénciertoenelcasodequeMod2estéenunproyectoalquesehacereferenciadirectamente,aunqueseadistinto.Sinembargo,siMod2estáenunproyectoalquesehacereferenciaindirectamente,esdecir,enunproyectoalquesehacereferenciaenelproyectodirectamentedereferencia,lasreferenciasalavariableMiIddelmóduloMod2debenirsiempreprecedidasporelnombredelproyectocomocalificador.SisehaceunareferenciaaMiIddesdeuntercermódulo,alquesehacereferenciadirectamente,larelaciónseestableceráconlaprimeradeclaraciónqueselocalicedurantelabúsqueda:

Proyectosalosquesehacereferenciadirectamente,enelordenenqueaparecenenelcuadrodediálogoReferenciasdelmenúHerramientas.

Losmódulosdecadaproyecto.Observequenohayningúnordeninherentealosmódulosdeunproyecto.

Nosepuedenutilizarnuevamentenombresdeobjetosdelaaplicaciónhost,porejemploR1C1enMicrosoftExcel,adistintosnivelesdealcance.

SugerenciaNombresambiguos,declaracionesduplicadas,identificadoresnodeclaradosyprocedimientosnolocalizablessonalgunosdeloserroresmáscomunescausadosporconflictosdenombres.Esposibleevitaralgunosposiblesconflictosdenombresyloserroresdeprogramaciónasociados,iniciandocada

móduloconunainstrucciónOptionExplicitqueobligaadeclararexplícitamentelasvariablesantesdequepuedanserutilizadas.

HacerbuclesFor...Nextmásrápidos

LosenterosutilizanmenosmemoriaquelostiposdedatosVariantysuactualizaciónesalgomásrápida.Sinembargo,ladiferenciasóloesapreciablesiserealizanmuchosmilesdeoperaciones.Porejemplo:

DimCuentaRápidoAsInteger'Primercaso,utilizaInteger.

ForCuentaRápido=0to32766

NextCuentaRápido

DimCuentaLentoAsVariant'Segundocaso,utilizaVariant.

ForCuentaLento=0to32766

NextCuentaLento

Elprimerodelosdoscasosconsumeuntiempoligeramentemenorensuejecución.Sinembargo,siCuentaRápidotomaunvalorsuperiora32.767,seproduciráunerror.ParacorregirelerrorsepuedehacerqueCuentaRápidopasea

serdeltipodedatosLong,queadmiteunagamamásampliadevaloresenteros.Engeneral,cuantomáspequeñoseaeltipodedatos,menostiemposeconsumiráensuactualización.SiseutilizaVariantseconsumiráalgomásdetiempoquesiseempleaunodelostiposdedatosequivalentes.

Llamaraprocedimientosconelmismonombre

Esposibleefectuarunallamadaaunprocedimientoubicadoencualquiermódulodelmismoproyectoqueelmóduloactivodelamismaformaenqueseharíaunallamadaaunodelosprocedimientosdelmóduloactivo.Sinembargo,sidosomásmóduloscontienenunprocedimientodelmismonombre,esnecesarioespecificarelnombredelmóduloenlainstruccióndellamada,talycomomuestraelsiguienteejemplo:

SubPrincipal()

Módulo1.MiProcedimiento

EndSub

Siseasignaelmismonombreadosprocedimientosdistintosdedosproyectosdiferentes,esprecisoespecificarelnombredeproyectocuandosehagaunallamadaalprocedimiento.Porejemplo,elsiguienteprocedimientoefectúaunallamadaalprocedimientoPrincipaldelmóduloMiMóduloenelproyecto

MiProyecto.vbp.

SubPrincipal()

[MiProyecto.vbp].[MiMódulo].Principal

EndSub

NotaLasdistintasaplicacionesdandiversosnombresaunproyecto.Asíporejemplo,enMicrosoftAccess,aunproyectoseleconocecomounabasededatos(.mdb);enMicrosoftExcel,sedenominalibrodetrabajo(.xls)

Sugerenciasparaefectuarllamadasaprocedimientos

Sicambiaelnombredeunmódulooproyecto,asegúresedecambiartodaslasreferenciasalnombredelmódulooproyectosentodaslasinstruccionesdellamada,delocontrario,VisualBasicnoserácapazdelocalizarelprocedimientollamado.PuedeutilizarelcomandoReemplazardelmenúEditarparaencontraryreemplazareltextocorrespondienteenunmódulo.

Paraevitarconflictosdenombresentreproyectosalosquesehacereferenciaesaconsejabledaracadaprocedimientounnombreúnicodeformaqueseaposiblehacerllamadasalosprocedimientossintenerqueespecificarunnombredemódulooproyecto.

LlamaraprocedimientosProperty

EnlasiguientetablasemuestralasintaxisaemplearenlasllamadasaprocedimientosProperty:

ProcedimientoProperty SintaxisPropertyLet [objeto.]nombreprop(argumentos)]=argumentoPropertyGet nombrevar=[objeto.]nombreprop(argumentos)]PropertySet Set[objeto.]nombreprop[.(argumentos)]=

nombrevar

CuandoseefectúaunallamadaalosprocedimientosPropertyLetoPropertySet,aladerechadelsignoigual(=)debesiempreaparecerunargumento.

CuandosedeclaranunprocedimientoPropertyLetoPropertySetconmúltiplesargumentos,VisualBasicpasaelargumentosituadoaladerechadelainstruccióndellamadaalúltimodelosargumentosqueapareceenladeclaración

dePropertyLetoPropertySet.Porejemplo,elsiguientediagramamuestralacorrespondenciaexistenteentrelosargumentosdelallamadaalprocedimientoPropertyconlosargumentosdeladeclaraciónPropertyLet:

Enlapráctica,losprocedimientosdepropiedadesconmúltiplesargumentossólosirvenparacrearmatricesdepropiedades.

LlamaraprocedimientosSubyFunction

ParaefectuarunallamadaaunprocedimientoSubdesdeotroprocedimiento,escribaelnombredelprocedimientoeincluyavaloresparatodoslosargumentosrequeridos.NoesnecesariaunainstrucciónCall,perosilautiliza,losargumentosdebenaparecerencerradosentreparéntesis.

SepuedeutilizarunprocedimientoSubparaorganizarotrosprocedimientosdeformaqueseanmásfácilesdeentenderydepurar.Enelsiguienteejemplo,elprocedimientoSubPrincipalefectúaunallamadaalprocedimientoSubMultiBeep,pasandocomoargumentoelvalor56.DespuésdequeMultiBeepacabasuejecución,elcontrolvuelveaPrincipalyPrincipalllamaalprocedimientoSubMensaje.Mensajepresentaenpantallauncuadrodemensaje;cuandoelusuariohaceclicenAceptar,elcontrolvuelveaPrincipalyPrincipaltermina.

SubPrincipal()

MultiBeep56

Mensaje

EndSub

SubMultiBeep(númbips)

Forcontador=1Tonúmbips

Beep

Nextcontador

EndSub

SubMensaje()

MsgBox"¡Eshoradedescansar!"

EndSub

LlamaraprocedimientosSubconmásdeunargumento

ElsiguienteejemplomuestradosformasdellamaraunprocedimientoSubconmásdeunargumento.LasegundavezquesellamaaCalcuCasa,esnecesarioutilizarparéntesisaambosladosdelosargumentosyaqueseutilizalainstrucciónCall.

SubPrincipal()

CalcuCasa99800,43100

CallCalcuCasa(380950,49500)

EndSub

SubCalcuCasa(precioAsSingle,salarioAsSingle)

If2.5*salario<=0.8*precioThen

MsgBox"Nopuedepermitirseestacasa."

Else

MsgBox"Estacasaestáasualcance."

EndIf

EndSub

UtilizarparéntesisalefectuarllamadasaprocedimientosFunction

Parautilizarelvalorquedevuelveunafuncióndebeasignarlafunciónaunavariableyencerrarlosargumentosentreparéntesis,talycomomuestraelsiguienteejemplo.

Respuesta3=MsgBox("¿Estácontentoconsusalario?",4,"Pregunta3")

Sinoestáinteresadoenelvalorquedevuelveunafunción,puedeefectuarlallamadaalafuncióndelamismaformaquesillamaraaunprocedimientoSub.Noutilicelosparéntesis,incluyaunalistadeargumentosynoasignelafunciónaunavariable,todoellocomomuestraelsiguienteejemplo.

MsgBox"¡Tareaconcluida!",0,"Cuadrodetarea"

PrecauciónSienelejemploanteriorseincluyenparéntesis,lainstrucciónpuedeproducirunerrordesintaxis.

Transferirargumentosconnombre

UnainstruccióndeunprocedimientoSuboFunctionpuedepasarvaloresalosprocedimientosquellamamedianteargumentosconnombre.Losargumentosconnombrepuedenaparecerencualquierorden.Unargumentoconnombresecomponedelnombredelargumentoseguidopordospuntosyunsignoigual(:=)yelvalorasignadoalargumento.

ElsiguienteejemploefectúaunallamadaalafunciónMsgBoxutilizandoargumentosconnombrequenodevuelvenningúnvalor.

MsgBoxTitulo:="Cuadrodetarea",Mensaje:="¡Tareaconcluida!"

ElsiguienteejemplollamaalafunciónMsgBoxempleandoargumentosconnombre.Elvalorquedevuelvelafunciónseasignaalavariablerespuesta3.

respuesta3=MsgBox(Titulo:="Pregunta3",_

Mensaje:="¿Estásatisfechoconsusalario?",Botones:=4)

ReglasdeasignacióndenombresenVisualBasic

Paradarnombreaprocedimientos,constantes,variablesyargumentosenunmódulodeVisualBasichandeseguirselassiguientesreglas:

Elprimercarácterdebeserunaletra.

Enelnombrenosepuedenutilizarespacios,puntos(.),signosdeinterjección(!),niloscaracteres@,&,$,#.

Elnombrenopuedetenermásde255caracteresdelongitud.

Comoreglageneral,nosedebenusarnombresigualesalosdelosprocedimientosFunction,instruccionesymétodosdeVisualBasic.Alfinalpuedeterminarusandolasmismaspalabrasclavequeutilizaellenguaje.Parautilizarunafunciónintrínsecadellenguaje,ounainstrucciónométodo,cuyonombrecoincideconunodelosnombresasignados,esprecisoidentificarlosexplícitamente.Paraellosesitúadelantedelnombredelafunciónintrínseca,instrucciónométodo,elnombredelabibliotecadetiposasociada.Porejemplo,siutilizaunavariablellamadaLeft,laúnicaformadeutilizarlafunciónLeftesescribiendoVBA.Left.

Losnombresnosepuedenrepetirdentrodelmismoniveldealcance.Porejemplo,nosepuedendeclarardosvariablesconelnombreedaddentrodelmismoprocedimiento.Sinembargo,sepuededeclararunavariableprivadaedadyunavariabledeniveldeprocedimientollamadaedaddentrodelmismomódulo.NotaVisualBasicnodiferenciaentremayúsculasyminúsculas,perorespetalaformaenqueseescribenlasinstruccionesdedeclaracióndenombres.

Trabajarconotrasaplicaciones

VisualBasicpuedecrearnuevosobjetosyrecuperarotrosyaexistentesenmuchasaplicacionesMicrosoft.OtrasaplicacionespuedenproporcionartambiénobjetosquesepuedencrearusandoVisualBasic.Consulteladocumentacióndelaaplicaciónparamásdetalles.

Paracrearunnuevoobjetouobtenerunoyaexistentedeotraaplicación,seutilizanlasfuncionesCreateObjectoGetObject,respectivamente:

'ArrancaMicrosoftExcelycrearunnuevoobjetoWorksheet.

SetExcelWorksheet=CreateObject("Excel.Sheet")

'ArrancaMicrosoftExcelyabreunobjetoWorksheetyaexistente.

SetExcelWorksheet=GetObject("Hoja1.XLS")

'ArrancarMicrosoftWord.

SetWordBasic=CreateObject("Word.Basic")

LamayorpartedelasaplicacionesdisponendeunmétodoExitoQuitquepermitecerrarlaaplicacióninclusocuandonoestávisible.Sideseamásinformaciónsobreobjetos,métodosypropiedadesqueproporcionaunadeterminadaaplicación,consultesudocumentación.

AlgunasaplicacionespermitenusarlapalabraclaveNewparacrearunobjetodecualquieradelasclasesqueexistenensubibliotecadetipos.Porejemplo:

DimXAsNewField

Enestecaso,Fieldesunejemplodeunadelasclasesexistentesenlabibliotecatipodeaccesodedatos.Secreaasí,conestasintaxis,unanuevadefinicióndelobjetoField.Consulteladocumentacióndelaaplicacióncorrespondienteparadeterminarlasclasesdeobjetoquesepuedencreardeestaforma.

Transferirargumentoseficientemente

Todoslosargumentossepasanalosprocedimientosporreferencia,amenosqueseespecifiquelocontrario.Estaformadeactuareseficienteyaqueseconsumeelmismotiempoyelmismoespaciodealmacenamientodentrodelprocedimiento(4bytes)parapasartodoslosargumentos,seacualseasutipodedatos.

SepuedepasarunargumentoporvalorsiseincluyelapalabraclaveByValenladeclaracióndelprocedimiento.Losargumentosquesepasanporvalorconsumenentre2y16bytesdealmacenamientodelprocedimiento,dependiendodeltipo

dedatosdelargumento.Lostiposdedatosmáslargosconsumenmástiempoalpasarporvalorquelostiposmáspequeños.Porestarazón,lostiposdedatosStringyVariantnodeberíanpasarsenormalmenteporvalor.

Alpasarunargumentoporvalorsecopialavariableoriginal.Loscambiosquepuedasufrirelargumentodentrodelprocedimientonotienenningúnefectosobrelavariableoriginal.Porejemplo:

FunctionFactorial(ByValMiVarAsInteger)'Functiondeclaration.

MiVar=MiVar-1

IfMiVar=0Then

Factorial=1

ExitFunction

EndIf

Factorial=Factorial(MiVar)*(MiVar+1)

EndFunction

'LlamaaFactorialconunavariableS.

S=5

PrintFactorial(S)'Muestraenpantalla120(factorialde5)

PrintS'Muestraenpantalla5.

SinoseincluyeByValenladeclaracióndelafunción,lasinstruccionesPrintpresentaríanenpantallalosvalores1y0.LacausaesqueMiVarharíareferenciaentoncesalavariableS,quebajadevalorde1en1hastaquevale0.

DadoqueByValhaceunacopiadelargumento,permitepasarunavariantealafunciónFactorialdelejemploanterior.Nosepuedepasarunavarianteporreferenciasielprocedimientoquedeclaraelargumentoesdeuntipodedatosdistinto.

Utilizarconstantes

Elcódigopuedecontenervaloresconstantesdeusofrecuente,opuededependerdeciertosnúmerosdifícilesderecordaroconunsignificadooscuro.Puedehacer

quesucódigoseademásfácillecturaymantenimientoempleandoconstantes.Unaconstanteesunnombreconsignificadoquereemplazaaunnúmeroocadenadetextoquenovaasufrircambios.Noesposiblemodificarunaconstante,niasignarleunnuevovalor,comoaunavariable.

Haytrestiposdeconstantes:

Constantesintrínsecasoconstantesdefinidasporelsistema,quesonproporcionadasporlasaplicacionesycontroles.Otrasaplicacionesqueproporcionanbibliotecasdeobjetos,comoMicrosoftAccess,MicrosoftExcel,MicrosoftProject,yMicrosoftWord,tambiénproporcionanunalistadeconstantesquesepuedenutilizarconsusobjetos,métodosypropiedades.EnelExaminadordeobjetosesposibleobtenerunalistadelasconstantesproporcionadasporcadabibliotecadeobjetosindividual

LasconstantesdeVisualBasicaparecenrelacionadasenlabibliotecadeVisualBasicforApplicationsyenlabibliotecaDataAccessObject(DAO).

NotaVisualBasicsiguereconociendoconstantesdeaplicacionescreadasconversionesanterioresdeVisualBasicoVisualBasicforApplications.EsposibleactualizarlasconstantesparautilizarsólolasqueaparecenenelExaminadordeobjetos.LasconstantesqueaparecenenelExaminadordeobjetosnotienequedeclararseensuaplicación.

Constantessimbólicasodefinidasporelusuario,sedeclaranmediantelainstrucciónConst.

Constantesdecompilacióncondicionalquesedeclaranempleandolainstrucción#Const.

EnversionesanterioresdeVisualBasic,losnombresdeconstantesserepresentabannormalmenteenmayúsculasyconguionesdesubrayado.Porejemplo:

MOSAICO_HORIZONTAL

Lasconstantesintrínsecascuentanahoraconuncalificadorparaevitarlas

confusionescuandohayconstantesconelmismonombreenmásdeunabibliotecadeobjetos,oconstantesquepuedentenerasignadosvaloresdistintos.Haydosformasdecualificarlosnombresdelasconstantes:

Conunprefijo

Conunareferenciaalabiblioteca

Calificarconstantesporprefijo

Lasconstantesintrínsecasproporcionadasportodoslosobjetostienennombresenmayúsculasyminúsculas,conunprefijode2caracteresqueindicalabibliotecadeobjetosquedefinelaconstante.LasconstantesdelabibliotecadeobjetosVisualBasicforApplicationstienenelprefijo"vb"ylasconstantesdelabibliotecadeobjetosMicrosoftExcelllevanelprefijo"xl".Lossiguientesejemplosmuestranlasvariacionesentrelosprefijosdeloscontroles,enfuncióndelabibliotecadetipos.

vbTileHorizontal

xlDialogBorder

Calificarconstantesporreferenciaabiblioteca

Tambiénesposiblecualificarlareferenciaaunaconstanteempleandolasiguientesintaxis:

[nombrebiblioteca.][nombremodulo.]nombreconstante

Lasintaxisparacualificarconstantesconstadeestaspartes:

Parte Descripciónnombrebiblioteca Opcional.Elnombredelabibliotecatipoquedefineala

constante.Paralamayorpartedeloscontroles(noestádisponibleenMacintosh),setratatambiéndelnombredeclasedelcontrol.Sinorecuerdaelnombredeclasedelcontrol,sitúeelpunterodelmouse(ratón)sobreelcontrolenlacajadeherramientas.ElnombredeclaseapareceráenelToolTip.

nombremodulo Opcional.Elnombredelmódulo,dentrodelabibliotecatipoquedefinealaconstante.SepuedeconocerelnombredelmóduloempleandoelExaminadordeobjetos.

nombreconstante Elnombredefinidoparalaconstanteenlabibliotecatipo..

Porejemplo:

Threed.LeftJustify

UtilizarinstruccionesDo...Loop

SepuedenusarinstruccionesDo...Loopparaejecutarunbloquedeinstruccionesunnúmeroindefinidodeveces.LasinstruccionesserepitenmientrasunacondiciónseaTrueohastaquellegueaserTrue.

RepetirinstruccionesmientrasunacondiciónesTrue

HaydosformasdeutilizarlapalabraclaveWhileparacomprobarelestadodeunacondiciónenunainstrucciónDo...Loop.Sepuedecomprobarlacondiciónantesdeentrarenelbucle,odespuésdequeelbuclesehayaejecutadoalmenosunavez.

EnelsiguienteprocedimientoComPrimeroWhile,lacondiciónsecompruebaantesdeentrarenelbucle.SimiNumvale9envezde20,lasinstruccionescontenidasenelbuclenoseejecutaránnunca.EnelprocedimientoComFinalWhile,lasinstruccionescontenidasenelbuclesóloseejecutaránunavezantesdequelacondiciónllegueaserFalse.

SubComPrimeroWhile()

contador=0

miNum=20

DoWhilemiNum>10

miNum=miNum-1

contador=contador+1

Loop

MsgBox"Elbucleseharepetido"&contador&"veces."

EndSub

SubComFinalWhile()

contador=0

miNum=9

Do

miNum=miNum-1

contador=contador+1

LoopWhilemiNum>10

MsgBox"Elbucleseharepetido"&contador&"veces."

EndSub

RepetirinstruccioneshastaqueunacondiciónllegueaserTrue

HaydosformasdeutilizarlapalabraclaveUntilparacomprobarelestadodeunacondiciónenunainstrucciónDo...Loop.Sepuedecomprobarlacondiciónantesdeentrarenelbucle(comomuestraelprocedimientoComPrimeroUntil)osepuedencomprobardespuésdequeelbuclesehayaejecutadoalmenosunavez(comomuestraelprocedimientoComFinalUntil).ElbuclesigueejecutándosemientraslacondiciónsigasiendoFalse.

SubComPrimeroUntil()

contador=0

miNum=20

DoUntilmiNum=10

miNum=miNum-1

contador=contador+1

Loop

MsgBox"Elbucleseharepetido"&contador&"veces."

EndSub

SubComFinalUntil()

contador=0

miNum=1

Do

miNum=miNum+1

contador=contador+1

LoopUntilmiNum=10

MsgBox"Elbucleseharepetido"&counter&"veces."

EndSub

InstruccióndesalidadeDo...Loopdesdedentrodelbucle

EsposiblesalirdeDo...LoopusandolainstrucciónExitDo.Porejemplo,parasalirdeunbuclesinfin,sepuedeusarlainstrucciónExitDoenelbloquedeinstruccionesTruedeunainstrucciónIf...Then...ElseoSelectCase.SilacondiciónesFalse,elbucleseguiráejecutándosenormalmente.

Enelsiguienteejemplo,seasignaamiNumunvalorquecreaunbuclesinfin.LainstrucciónIf...Then...Elsecompruebaesacondiciónyejecutaentonceslasalida,evitandoasíelbuclesinfin.

SubEjemploSalida()

contador=0

miNum=9

DoUntilmiNum=10

miNum=miNum-1

contador=contador+1

IfmiNum<10ThenExitDo

Loop

MsgBox"Elbucleseharepetido"&contador&"veces."

EndSub

NotaParadetenerlaejecucióndeunbuclesinfin,presionelateclaESCoCTRL+PAUSE.

UtilizarinstruccionesForEach...Next

LasinstruccionesForEach...Nextrepitenunbloquedeinstruccionesparacadaunodelosobjetosdeunacolecciónoparacadaelementodeunamatriz.VisualBasicasignavalorautomáticamenteaunavariablecadavezqueseejecutaelbucle.Porejemplo,elsiguienteprocedimientocierratodoslosformulariosexceptoelquecontienealprocedimientoqueseestáejecutando.

SubCierraFormul()

ForEachfrmInApplication.Forms

Iffrm.Caption<>Screen.ActiveForm.CaptionThenfrm.Close

Next

EndSub

ElsiguientecódigorecorretodosloselementosdeunamatrizeintroduceencadaunodeelloselvalordelavariableíndiceI.

DimPruebaMatriz(10)AsInteger,IAsVariant

ForEachIInPruebaMatriz

PruebaMatriz(I)=I

NextI

Recorrerunconjuntodeceldas

SepuedeusarelbucleForEach...Nextpararecorrerlasceldaspertenecientesaunrangodeterminado.ElsiguienteprocedimientorecorrelasceldasdelrangoA1:D10delaPágina1yconviertecualquiervalorabsolutomenorde0,01en0(cero).

SubRedondeoACero()

ForEachmiObjetoinmiColeccion

IfAbs(miObjeto.Value)<0.01ThenmiObjeto.Value=0

Next

EndSub

SalirdeunbucleForEach...Nextantesdequefinalice

SepuedesalirdeunbucleForEach...NextmediantelainstrucciónExitFor.Porejemplo,cuandoseproduceunerrorsepuedeusarlainstrucciónExitForenelbloquedeinstruccionesTruedeunainstrucciónIf...Then...ElseoSelectCasequedetecteespecíficamenteelerror.Sielerrornoseproduce,lainstrucciónIf…Then…ElseesFalseyelbucleseseguiráejecutandonormalmente.

ElsiguienteejemplodetectalaprimeraceldadelrangoA1:B5quenocontieneunnúmero.Siseencuentraunaceldaenesascondiciones,sepresentaunmensajeenpantallayExitForabandonaelbucle.

SubBuscaNumeros()

ForEachmiObjetoInMiColeccion

IfIsNumeric(miObjeto.Value)=FalseThen

MsgBox"Elobjetocontieneunvalornonumérico."

ExitFor

EndIf

Nextc

EndSub

UtilizarinstruccionesFor...Next

LasinstruccionesFor...Nextsepuedenutilizarpararepetirunbloquedeinstruccionesunnúmerodeterminadodeveces.LosbuclesForusanunavariablecontadorcuyovalorseaumentaodisminuyecadavezqueseejecutaelbucle.

Elsiguienteprocedimientohacequeelequipoemitaunsonido50veces.LainstrucciónFordeterminalavariablecontadorxysusvaloresinicialyfinal.LainstrucciónNextincrementaelvalordelavariablecontadoren1.

SubBips()

Forx=1To50

Beep

Nextx

EndSub

MediantelapalabraclaveStep,sepuedeaumentarodisminuirlavariablecontadorenelvalorquesedesee.Enelsiguienteejemplo,lavariablecontadorjseincrementaen2cadavezqueserepitelaejecucióndelbucle.Cuandoelbucledejadeejecutarse,totalrepresentalasumade2,4,6,8y10.

SubDosTotal()

Forj=2To10Step2

total=total+j

Nextj

MsgBox"Eltotales"&total

EndSub

ParadisminuirlavariablecontadorutiliceunvalornegativoenStep.Paradisminuirlavariablecontadoresprecisoespecificarunvalorfinalqueseamenorqueelvalorinicial.Enelsiguienteejemplo,lavariablecontadormiNumsedisminuyeen2cadavezqueserepiteelbucle.Cuandoterminalaejecucióndelbucle,totalrepresentalasumade16,14,12,10,8,6,4y2.

SubNuevoTotal()

FormiNum=16To2Step-2

total=total+miNum

NextmiNum

MsgBox"Eltotales"&total

EndSub

NotaNoesnecesarioincluirelnombredelavariablecontadordespuésdelainstrucciónNext.Enlosejemplosanteriores,elnombredelavariablecontadorsehaincluidoparafacilitarlalecturadelcódigo.

SepuedeabandonarunainstrucciónFor...Nextantesdequeelcontadoralcancesuvalorfinal,paraelloseutilizalainstrucciónExitFor.Porejemplo,siseproduceunerrorsepuedeusarlainstrucciónExitForenelbloquedeinstruccionesTruedeunainstrucciónIf...Then...ElseoSelectCasequedetecteespecíficamenteeseerror.Sielerrornoseproduce,lainstrucciónIf…Then…ElseesFalseyelbuclecontinuaráejecutándosenormalmente.

UtilizarinstruccionesIf...Then...Else

SepuedeusarlainstrucciónIf...Then...Elseparaejecutarunainstrucciónobloquedeinstruccionesdeterminadas,dependiendodelvalordeunacondición.LasinstruccionesIf...Then...Elsesepuedenanidarentantosnivelescomoseanecesario.Sinembargo,parahacermáslegibleelcódigoesaconsejableutilizarunainstrucciónSelectCaseenvezderecurriramúltiplesnivelesdeinstruccionesIf...Then...Elseanidadas.

EjecutarunasolainstruccióncuandounacondiciónesTrue

ParaejecutarunasolainstruccióncuandounacondiciónesTrue,sepuedeusarlasintaxisdelíneaúnicadelainstrucciónIf...Then...Else.Elsiguienteejemplomuestralasintaxisdelíneaúnica,enlaqueseomiteelusodelapalabraclaveElse:

SubFijarFecha()

miFecha=#13/2/95#

IfmiFecha<NowThenmiFecha=Now

EndSub

Paraejecutarmásdeunalíneadecódigo,esprecisoutilizarlasintaxisdemúltipleslíneas.EstasintaxisincluyelainstrucciónEndIf,talycomomuestraelsiguienteejemplo:

SubAvisoUsuario(valorasLong)

Ifvalor=0Then

Aviso.ForeColor="Red"

Aviso.Font.Bold=True

Aviso.Font.Italic=True

EndIf

EndSub

EjecutarunasinstruccionesdeterminadassiunacondiciónesTrueyejecutarotrassiesFalse

UseunainstrucciónIf...Then...Elseparadefinirdosbloquesdeinstruccionesejecutables:unbloquequeseejecutarácuandolacondiciónesTrueyelotroqueseejecutarásilacondiciónesFalse.

SubAvisoUsuario(valorasLong)

Ifvalor=0Then

Aviso.ForeColor=vbRed

Aviso.Font.Bold=True

Aviso.Font.Italic=True

Else

Aviso.Forecolor=vbBlack

Aviso.Font.Bold=False

Aviso.Font.Italic=False

EndIf

EndSub

Comprobarunasegundacondiciónsilaprimera

condiciónesFalse

SepuedenañadirinstruccionesElseIfaunainstrucciónIf...Then...ElseparacomprobarunasegundacondiciónsilaprimeraesFalse.Porejemplo,elsiguienteprocedimientofuncióncalculaunabonificaciónsalarialdependiendodelaclasificacióndeltrabajador.LainstrucciónquesiguealainstrucciónElsesóloseejecutacuandolascondicionesdetodaslasrestantesinstruccionesIfyElseIfsonFalse.

FunctionBonificación(rendimiento,salario)

Ifrendimiento=1Then

Bonificación=salario*0.1

ElseIfrendimiento=2Then

Bonificación=salario*0.09

ElseIfrendimiento=3Then

Bonificación=salario*0.07

Else

Bonificación=0

EndIf

EndFunction

UtilizarinstruccionesSelectCase

LainstrucciónSelectCaseseutilizacomoalternativaalasinstruccionesElseIfeninstruccionesIf...Then...Elsecuandosecomparaunaexpresiónconvariosvaloresdiferentes.MientrasquelasinstruccionesIf...Then...ElsepuedencompararunaexpresióndistintaparacadainstrucciónElseIf,lainstrucciónSelectCasecomparaúnicamentelaexpresiónqueevalúaalcomienzodelaestructuradecontrol.

Enelsiguienteejemplo,lainstrucciónSelectCaseevalúaelargumentorendimientoquesepasaalprocedimiento.ObservequecadainstrucciónCasepuedecontenermásdeunvalor,unagamadevalores,ounacombinacióndevaloresyoperadoresdecomparación.LainstrucciónopcionalCaseElseseejecutasilainstrucciónSelectCasenoencuentraningunaigualdadconlosvaloresdelainstruccionesCase.

FunctionBonificación(rendimiento,salario)

SelectCaserendimiento

Case1

Bonificación=salario*0.1

Case2,3

Bonificación=salario*0.09

Case4To6

Bonificación=salario*0.07

CaseIs>8

Bonificación=100

CaseElse

Bonificación=0

EndSelect

EndFunction

UtilizarinstruccionesWith

LainstrucciónWithpermiteespecificarunavezunobjetootipodefinidoporelusuarioenunaserieenteradeinstrucciones.LasinstruccionesWithaceleranlaejecucióndelosprocedimientosyayudanaevitareltenerqueescribirrepetidasveceslasmismaspalabras.

Elsiguienteejemplointroduceenunrangodeceldaselnúmero30,aplicaaesasceldasunformatoennegritayhacequesucolordefondoseaelamarillo.

SubRangoFormato()

WithWorksheets("Hoja1").Range("A1:C10")

.Value=30

.Font.Bold=True

.Interior.Color=RGB(255,255,0)

EndWith

EndSub

LasinstruccionesWithsepuedenanidarparaaumentarsueficiencia.ElsiguienteejemploinsertaunaformulaenlaceldaA1yseleccionaacontinuacióneltipodeletra.

SubMiEntrada()

WithWorkbooks("Libro1").Worksheets("Hoja1").Cells(1,1)

.Formula="=SQRT(50)"

With.Font

.Name="Arial"

.Bold=True

.Size=8

EndWith

EndWith

EndSub

Utilizarlostiposdedatoseficientemente

Amanosqueseespecifiquelocontrario,alasvariablesnodeclaradasselesasignaeltipodedatosVariant.Estetipodedatosfacilitalaescrituradeprogramas,peronosiempreeseltipodedatosmáseficienteensuutilización.

Esaconsejablepensarenusarotrostiposdedatossi:

Elprogramaesmuygrandeyutilizamuchasvariables.

Elprogramadebeejecutarseconlamáximarapidez.

Seescribendatosenarchivosdeaccesodirecto.

AdemásdeVariant,sepuedenutilizarlossiguientestiposdedatosByte,Boolean,Integer,Long,Single,Double,Currency,Decimal,Date,ObjectyString.UselainstrucciónDimparadeclararunavariabledeuntipodeterminado,porejemplo:

DimXAsInteger

EstainstruccióndeclaraquelavariableXesunentero—unnúmeronodecimal

comprendidoentre32.768y32.767.SisetratadeasignaraXunnúmerofueradeesemargen,seproduciráunerror.SisetratadeasignaraXunafracción,elnúmeroseredondeará.Porejemplo:

X=32768'Causaunerror.

X=5.9'Asignaaxelvalor6.

Utilizarmatrices

Sepuededeclararunamatrizparaoperarconunconjuntodevaloresdelmismotipodedatos.Unamatrizesunaúnicavariableconmuchoselementosenquesepuedenalmacenarvalores,mientrasqueunavariablenormaltienesólounáreadealmacenamientoenelquesólosepuedearchivarunvalor.Puedereferirsealamatrizcomountodocuandosetratadehacerreferenciaatodoslosvaloresquecontiene,obienhacerreferenciaasuselementosindividuales.

Porejemplo,paraalmacenarlosgastosdiariosdetodoslosdíasdelañosepuededeclararunavariablematrizcon365elementos,mejorquedeclarar365

variables.Cadaelementodeunamatrizcontieneunvalor.LasiguienteinstruccióndeclaralavariablematrizcurGastoscon365elementos.Sinoseespecificalocontrario,elíndicedeunamatrizcomienzaporelcero,conloqueellímitesuperiordelamatrizes364envezde365.

DimcurGastos(364)AsCurrency

Paradarvaloraunelementoindividual,esprecisoespecificarelíndicedelelemento.Elsiguienteejemploasignaunvalorinicialde20atodosloselementosdelamatriz.

SubLlenarMatriz()

DimcurGastos(364)AsCurrency

DimintIAsInteger

ForintI=0to364

curGastos(intI)=20

Next

EndSub

Cambiarellímiteinferior

SepuedeusarlainstrucciónOptionBasealprincipiodeunmóduloparacambiarelíndicepredefinidodelprimerelementodel0al1.Enelsiguienteejemplo,lainstrucciónOptionBasecambiaelíndicedelprimerelementoylainstrucciónDimdeclaralavariablematrizcurGastoscon365elementos.

OptionBase1

DimcurGastos(365)AsCurrency

TambiénsepuedefijardeformaexplícitaellímiteinferiordeunamatrizmedianteelusodelacláusulaTotalycomomuestraelsiguienteejemplo.

DimcurGastos(1To365)AsCurrency

DimstrDiaSemana(7To13)AsString

AlmacenarvaloresVariantenmatrices

HaydosformasdecrearmatricesdevaloresVariant.UnaformaconsisteendeclararunamatrizcomodeltipodedatosVariant,talycomomuestraelsiguienteejemplo:

DimvarDatos(3)AsVariant

varDatos(0)="CristinaMartínez"

varDatos(1)="C/DonRamóndelaCruz,73"

varDatos(2)=38

varDatos(3)=Format("06-09-1952","Fechageneral")

LaotraformaconsisteenasignarlamatrizquedevuelvelafunciónMatrizaunavariableVariant,talycomomuestraelsiguienteejemplo.

DimvarDatosAsVariant

varDatos=Array("CristinaMartínez","C/DonRamóndelaCruz,73",38,_

Format("06-09-1952","Fechageneral"))

LoselementosdeunamatrizdevaloresVariantseidentificanmediantesuíndice,seacualsealatécnicaquesehayausadoparacrearlamatriz.Porejemplo,lasiguienteinstrucciónpodríaañadirseacualquieradelosejemplosanteriores.

MsgBox"Losdatosde"&varDatos(0)&"sehanguardado."

Utilizarmatricesconmúltiplesdimensiones

EnVisualBasicsepuedendeclararmatricesconhasta60dimensiones.Porejemplo,lasiguienteinstruccióndeclaraunamatrizdedosdimensiones,de5por10.

DimsngMulti(1To5,1To10)AsSingle

Siconsideraalamatrizcomounatabladedosentradas,elprimerargumento

representaríaalasfilasyelsegundoalascolumnas.

UtiliceinstruccionesFor...Nextparaoperarconmatricesdedimensionesmúltiples.ElsiguienteprocedimientollenaunamatrizbidimensionalconvaloresSingle.

SubLlenaMatrizMulti()

DimintIAsInteger,intJAsInteger

DimsngMulti(1To5,1To10)AsSingle

'Llenamatrizconvalores.

ForintI=1To5

ForintJ=1To10

sngMulti(intI,intJ)=intI*intJ

Debug.PrintsngMulti(intI,intJ)

NextintJ

NextintI

EndSub

Utilizarparéntesisenelcódigo

LosprocedimientosSub,lasinstruccionesintegradasyalgunosmétodosnodevuelvenvaloralguno,porloquelosargumentosnoaparecenentreparéntesis.Porejemplo:

MiSub"stringArgumento",integerArgumento

LosprocedimientosFunction,lasfuncionesintegradasyalgunosmétodosdevuelvenalgúnvalor,quepuedeserignorado.Sisevaaignorarelvalordevuelto,noesnecesarioincluirparéntesis.LallamadaalafunciónseharáigualquesiseestuvierallamandoaunprocedimientoSub.Omitiendolosparéntesis,incluyendounalistadeargumentos(siloshay)ynoasignandolafunciónaunavariable.Porejemplo:

MsgBox"¡Tareaconcluida!",0,"Cuadrodetarea"

Parautilizarelvalorquedevuelveunafunción,losargumentosdebenencerrarseentreparéntesistalycomomuestraelsiguienteejemplo.

Respuesta3=MsgBox("¿Estásatisfechoconsusalario?",4,"Pregunta3")

UnainstruccióndeunprocedimientoSuboFunctionpuedepasarvaloresalprocedimientoalquellamamedianteargumentosconnombre.Lasnormasparaelusodeparéntesisseaplicantantosiseusanargumentosconnombrecomosino.Cuandoseusanargumentosconnombresepuedencolocarencualquierordenysepuedenomitirlosargumentosopcionales.Losargumentosconnombrevansiempreseguidospordospuntosyunsignoigual(:=)yfinalmenteelvalordelargumento.

ElsiguienteejemploefectúaunallamadaalafunciónMsgBoxutilizandoargumentosconnombre,altiempoqueignoraelvalorquedevuelvelafunción:

MsgBoxTitle:="Cuadrodetarea",Prompt:="¡Tareaconcluida!"

ElsiguienteejemploefectúaunallamadaalafunciónMsgBoxutilizandoargumentosconnombreyasignaelvalordevueltoalavariablerespuesta3:

respuesta3=MsgBox(Title:="Pregunta3",_

Prompt:="¿Estácontentoconsusalario?",Buttons:=4)