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

122

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

Page 1: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,
Page 2: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Comprenderelalcanceylavisibilidad

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

Elalcancedeunavariablesedeterminacuandosedeclara.esaconsejabledeclarartodaslasvariablesexplícitamenteparaevitarerroresdeconflictodenombresentrevariablesquetienealcancesdistintos.

Definirelalcancedeunniveldeprocedimiento

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

SubVariableLocal()

DimstrMensajeAsString

Page 3: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 4: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 5: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

queresiden.

Page 6: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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:

Page 7: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 8: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 9: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

.

.

#EndIf

EndSub

Page 10: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,
Page 11: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 12: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 13: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,
Page 14: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 15: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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")

Page 16: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 17: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Enlasiguienteinstrucción,axeyselesasignaeltipodedatosVariant.SóloazseleasignaeltipodedatosInteger.

Dimx,y,zAsInteger

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

DimmiMatriz()

Page 18: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Comprenderlasmatricesdeparámetros

Unamatrizdeparámetrosseutilizaparapasarunamatrizdeargumentosaunprocedimiento.Noesnecesariosaberelnúmerodeelementosdelamatrizcuandosedefineelprocedimiento.

ParaidentificarunamatrizdeparámetrosseutilizalapalabraclaveParamArray.LamatrizdebeestardefinidacomounamatrizdeltipoVariantydebeserelúltimoargumentoenladefinicióndelprocedimiento.

Elsiguienteejemplomuestradequéformasepuededefinirunprocedimientoconunamatrizdeparámetros.

SubCualquierNumeroArgs(strNombreAsString,ParamArrayintPuntuacion()AsVariant)

DimintIAsInteger

Debug.PrintstrNombre;"Puntuaciones"

Page 19: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

'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"

Page 20: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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#

Page 21: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 22: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 23: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

ComprenderlostiposdedatosVariant

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

Page 24: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 25: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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()

Page 26: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 27: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 28: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Crearbuclesmediantecódigo

Medianteelusodeinstruccionescondicionalesyinstruccionesdebucle(tambiénconocidascomoestructurasdecontrol)esposibleescribircódigode

Page 29: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 30: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

For...Next:Utilizaruncontadorparaejecutarlasinstruccionesunnúmerodeterminadodeveces.

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

Ejecutarvariasinstruccionessobreelmismoobjeto

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

With:Ejecutarunaseriedeinstruccionessobreelmismoobjeto

Page 31: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Crearprocedimientosrecursivos

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

FunctionAgotar(Máximo)

Agotar=Agotar(Máximo)

EndFunction

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

Page 32: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 33: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Crearvariablesdeobjeto

Page 34: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 35: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 36: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 37: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Declararconstantes

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

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

Page 38: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 39: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Declararmatrices

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

Siunamatrizseindexadesde0ódesde1dependedelvalordelainstrucciónOptionBase.SiOptionBase1noseespecifica,todoslosíndicesdematrices

Page 40: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 41: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

'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)

Page 42: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 43: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,
Page 44: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 45: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 46: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 47: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 48: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

DimappAccessAsObject

SetappAccess=CreateObject("Access.Application")

Paradeterminarlasintaxisautilizarconunaaplicacióndeterminadadebeconsultarseladocumentacióndelaaplicación.

Page 49: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,
Page 50: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,
Page 51: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,
Page 52: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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$

Page 53: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

*Puedenoestardisponibleentodaslasaplicaciones.

Page 54: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Ejecutarcódigocuandoseestablecenpropiedades

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

LainstrucciónPropertyLetpermitecrearunprocedimientoqueasignaunvaloralapropiedad.UnejemplopodríaserunprocedimientoPropertyquecreaunapropiedadinvertidaparaunmapadebitsenundocumento.Lasintaxisutilizada

Page 55: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 56: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

propiedad.

Despuésdeasignarlo,procedimientosbasadosenelnuevovalor.

Page 57: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 58: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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?").

Page 59: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 60: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Escribirinstruccionesdedeclaración

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

Elsiguienteejemplocontienetresdeclaraciones.

SubDarFormato()

Page 61: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 62: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

EscribirinstruccionesdeVisualBasic

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

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

Lasinstruccionesdeasignación,queasignanunvaloroexpresiónauna

Page 63: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 64: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Comprobarerroresdesintaxis

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

Page 65: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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!"

Page 66: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

EndSub

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

LainstrucciónWithpuedeevitarquehayaqueescribirmuchasveceslasmismaspalabrasyaquelasinstruccionesquecontieneseejecutanautomáticamenteenelobjetoquesiguealapalabraclaveWith.

LainstrucciónNextllamaalasiguienteceldadelacoleccióndeceldascontenidaenMiIntervalo.

LafunciónMsgBox(quepresentaenpantallauncuadrodediálogodeVisualBasic)presentaunmensajeindicandoqueelprocedimientoSubhaterminadodeejecutarse.

Page 67: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

EscribirunprocedimientoFunction

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

Page 68: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 69: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

EscribirunprocedimientoProperty

UnprocedimientoPropertyesunaseriedeinstruccionesVisualBasicquepermitenaunprogramadorcrearymanipularpropiedadespersonalizadas.

Page 70: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 71: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 72: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

EscribirunprocedimientoSub

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

ElsiguienteprocedimientoSubdisponedecomentariosexplicativosencadalínea.

'DeclaraunprocedimientollamadoObtenInformacion

'EsteprocedimientoSubnoaceptaargumentos

SubObtenInformacion()

'Declaraunavariabledecadenallamadarespuesta

DimrespuestaAsString

Page 73: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

'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

Page 74: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Evitarconflictosdenombres

Page 75: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 76: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 77: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

móduloconunainstrucciónOptionExplicitqueobligaadeclararexplícitamentelasvariablesantesdequepuedanserutilizadas.

Page 78: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 79: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 80: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 81: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 82: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 83: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

dePropertyLetoPropertySet.Porejemplo,elsiguientediagramamuestralacorrespondenciaexistenteentrelosargumentosdelallamadaalprocedimientoPropertyconlosargumentosdeladeclaraciónPropertyLet:

Enlapráctica,losprocedimientosdepropiedadesconmúltiplesargumentossólosirvenparacrearmatricesdepropiedades.

Page 84: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

LlamaraprocedimientosSubyFunction

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

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

SubPrincipal()

Page 85: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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."

Page 86: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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!"

Page 87: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

ElsiguienteejemplollamaalafunciónMsgBoxempleandoargumentosconnombre.Elvalorquedevuelvelafunciónseasignaalavariablerespuesta3.

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

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

Page 88: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,
Page 89: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 90: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 91: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Trabajarconotrasaplicaciones

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

Paracrearunnuevoobjetouobtenerunoyaexistentedeotraaplicación,seutilizanlasfuncionesCreateObjectoGetObject,respectivamente:

'ArrancaMicrosoftExcelycrearunnuevoobjetoWorksheet.

SetExcelWorksheet=CreateObject("Excel.Sheet")

'ArrancaMicrosoftExcelyabreunobjetoWorksheetyaexistente.

SetExcelWorksheet=GetObject("Hoja1.XLS")

Page 92: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

'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.

Page 93: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Transferirargumentoseficientemente

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

SepuedepasarunargumentoporvalorsiseincluyelapalabraclaveByValenladeclaracióndelprocedimiento.Losargumentosquesepasanporvalorconsumenentre2y16bytesdealmacenamientodelprocedimiento,dependiendodeltipo

Page 94: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 95: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Utilizarconstantes

Elcódigopuedecontenervaloresconstantesdeusofrecuente,opuededependerdeciertosnúmerosdifícilesderecordaroconunsignificadooscuro.Puedehacer

Page 96: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 97: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 98: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 99: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 100: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 101: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 102: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Loop

MsgBox"Elbucleseharepetido"&contador&"veces."

EndSub

NotaParadetenerlaejecucióndeunbuclesinfin,presionelateclaESCoCTRL+PAUSE.

Page 103: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

UtilizarinstruccionesForEach...Next

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

SubCierraFormul()

ForEachfrmInApplication.Forms

Page 104: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 105: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

ElsiguienteejemplodetectalaprimeraceldadelrangoA1:B5quenocontieneunnúmero.Siseencuentraunaceldaenesascondiciones,sepresentaunmensajeenpantallayExitForabandonaelbucle.

SubBuscaNumeros()

ForEachmiObjetoInMiColeccion

IfIsNumeric(miObjeto.Value)=FalseThen

MsgBox"Elobjetocontieneunvalornonumérico."

ExitFor

EndIf

Nextc

EndSub

Page 106: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

UtilizarinstruccionesFor...Next

LasinstruccionesFor...Nextsepuedenutilizarpararepetirunbloquedeinstruccionesunnúmerodeterminadodeveces.LosbuclesForusanunavariablecontadorcuyovalorseaumentaodisminuyecadavezqueseejecutaelbucle.

Elsiguienteprocedimientohacequeelequipoemitaunsonido50veces.LainstrucciónFordeterminalavariablecontadorxysusvaloresinicialyfinal.LainstrucciónNextincrementaelvalordelavariablecontadoren1.

SubBips()

Forx=1To50

Beep

Nextx

EndSub

Page 107: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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.

Page 108: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 109: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 110: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 111: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 112: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Bonificación=salario*0.07

CaseIs>8

Bonificación=100

CaseElse

Bonificación=0

EndSelect

EndFunction

Page 113: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 114: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 115: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 116: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

X=32768'Causaunerror.

X=5.9'Asignaaxelvalor6.

Page 117: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

Utilizarmatrices

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

Porejemplo,paraalmacenarlosgastosdiariosdetodoslosdíasdelañosepuededeclararunavariablematrizcon365elementos,mejorquedeclarar365

Page 118: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 119: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 120: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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

Page 121: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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"

Page 122: Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección Declarations tiene un alcance privado a no ser que se especifique otra cosa. Sin embargo,

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)