![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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/1.jpg)
![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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/2.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/3.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/4.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/5.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/6.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/7.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/8.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/9.jpg)
.
.
#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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/10.jpg)
![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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/11.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/12.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/13.jpg)
![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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/14.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/15.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/16.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/17.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/18.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/19.jpg)
'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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/20.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/21.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/22.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/23.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/24.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/25.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/26.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/27.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/28.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/29.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/30.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/31.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/32.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/33.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/34.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/35.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/36.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/37.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/38.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/39.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/40.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/41.jpg)
'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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/42.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/43.jpg)
![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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/44.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/45.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/46.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/47.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/48.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/49.jpg)
![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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/50.jpg)
![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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/51.jpg)
![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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/52.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/53.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/54.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/55.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/56.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/57.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/58.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/59.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/60.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/61.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/62.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/63.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/64.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/65.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/66.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/67.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/68.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/69.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/70.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/71.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/72.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/73.jpg)
'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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/74.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/75.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/76.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/77.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/78.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/79.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/80.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/81.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/82.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/83.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/84.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/85.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/86.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/87.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/88.jpg)
![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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/89.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/90.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/91.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/92.jpg)
'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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/93.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/94.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/95.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/96.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/97.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/98.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/99.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/100.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/101.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/102.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/103.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/104.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/105.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/106.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/107.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/108.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/109.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/110.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/111.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/112.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/113.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/114.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/115.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/116.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/117.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/118.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/119.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/120.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/121.jpg)
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,](https://reader034.vdocumento.com/reader034/viewer/2022050408/5f851a78397a8c71ae1abd09/html5/thumbnails/122.jpg)
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)