Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección...
Transcript of Comprender el alcance y la visibilidad · declaradas con la instrucción Dim en la sección...
Comprenderelalcanceylavisibilidad
Elalcanceserefierealadisponibilidaddeunavariable,constante,oprocedimientoparaserusadoporotroprocedimiento.Haytresnivelesdealcance:niveldeprocedimiento,niveldemóduloprivadoyniveldemódulopúblico.
Elalcancedeunavariablesedeterminacuandosedeclara.esaconsejabledeclarartodaslasvariablesexplícitamenteparaevitarerroresdeconflictodenombresentrevariablesquetienealcancesdistintos.
Definirelalcancedeunniveldeprocedimiento
Unavariableoconstantedefinidadesdedentrodeunprocedimientonoesvisiblefueradeeseprocedimiento.Sóloelprocedimientoquecontieneladeclaracióndelavariablepuedeusarlos.Enelsiguienteejemplo,elprimerprocedimientopresentauncuadrodemensajequecontieneunacadenadetexto.ElsegundoprocedimientopresentauncuadrodemensajeenblancoyaquelavariablestrMensajeeslocalparaelprimerprocedimiento.
SubVariableLocal()
DimstrMensajeAsString
strMensaje="Estavariablenosepuedeusarfueradeesteprocedimiento."
MsgBoxstrMensaje
EndSub
SubFueraAlcance()
MsgBoxstrMensaje
EndSub
Definirelalcancedeniveldemóduloprivado
SepuedendefinirvariablesyconstantesdeniveldemóduloenlasecciónDeclarationsdeunmódulo.Lasvariablesdeniveldemódulopuedenserpúblicasoprivadas.Lasvariablespúblicasestándisponiblesparatodoslosprocedimientosdetodoslosmódulosdeunproyecto;lasvariablesprivadassóloestándisponiblesparalosprocedimientosdeesemódulo.LasvariablesdeclaradasconlainstrucciónDimenlasecciónDeclarationstieneunalcanceprivadoanoserqueseespecifiqueotracosa.Sinembargo,esaconsejablecolocarlapalabraclavePrivatedelantedelnombredelavariableparaqueelalcanceseaevidentealleerelcódigo.
Enelsiguienteejemplo,lavariabledecadenastrMensajeestádisponibleparacualquierprocedimientodefinidoenelmódulo.Cuandosellamaalsegundoprocedimiento,presentaelcontenidodelavariabledecadenastrMensajeenuncuadrodedialogo.
'AñadalosiguientealaseccióndeDeclarationsdelmódulo.
PrivatestrMensajesAsString
SubInicializaVariablePrivada()
strMensaje="Estavariablenosepuedeusarfueradeestemódulo."
EndSub
SubUsaVariablePrivada()
MsgBoxstrMensaje
EndSub
NotaLosprocedimientospúblicosdeunmóduloestándaromódulodeclaseestándisponiblesparacualquierproyectodereferenciaalproyectoactual.Paralimitarelalcancedetodoslosprocedimientosdeunmóduloalproyectoactual,añadaunainstrucciónOptionPrivateModulealasecciónDeclarationsdelmódulo.Lasvariablesyprocedimientospúblicosseguiránestandodisponiblesparalosrestantesprocedimientosdelproyectoactual,peronoloestaránparalosproyectosquealosquepuedanhacerreferencia.
Definirelalcancedeniveldemódulopúblico
Sisedeclaraunavariabledeniveldemódulocomopública,estarádisponibleparatodoslosprocedimientosdelmismoproyecto.Enelsiguienteejemplo,lavariabledecadenastrMensajesepuedeusarencualquierprocedimientodeunmódulodelproyecto.
'IncluyaestoenlasecciónDeclarationsdelmódulo.
PublicstrMensajeAsString
Todoslosprocedimientossonpúblicosamenosqueseespecifiquelocontrario,exceptoenelcasodelosprocedimientosevento.CuandoVisualBasiccreaunprocedimientoevento,lapalabraclavePrivateseinsertaautomáticamenteantesdeladeclaracióndelprocedimiento.Paralosrestantesprocedimientos,debedeclararexplícitamenteconlapalabraclavePrivatesinodeseaqueseanpúblicos.
Sepuedenusarprocedimientos,variablesyconstantespúblicasdefinidasenmódulosestándaromódulosdeclasedeproyectosquehaganreferenciaalactual.Sinembargo,esprecisoestablecerunareferenciaalproyectoenqueestándefinidos.
Losprocedimientos,variablesyconstantespúblicasdefinidasenmódulosquenoseanestándarodeclase,comopuedenserlosmódulosdeformularioomódulosdeinforme,noestándisponiblesdesdelosproyectosquehacenreferenciaalactual,yaqueestosmódulossonprivadosparaelproyectoenel
queresiden.
Comprenderlaautomatización
Laautomatización(antesllamadaautomatizaciónOLE)esunadelascaracterísticasdelComponentObjectModel(COM),unatecnologíaestándarenlaindustriausadaporlasaplicacionespararevelarsusobjetosalasherramientasdedesarrollo,lenguajesdemacrosyotrasaplicacionesqueseancompatiblesconlaautomatización.Porejemplo,unaaplicacióndehojasdecálculopuederevelarunahojadecálculo,undiagrama,celdaorangodeceldas,cadaunacomountipodiferentedeobjeto.Unprocesadordetextospuederevelarobjetoscomounaaplicación,undocumento,unpárrafo,unafrase,unmarcadorounaselección.
Cuandounaaplicaciónescompatibleconlaautomatización,VisualBasictieneaccesoalosobjetosreveladosporlaaplicación.UtiliceVisualBasicparamanipularesosobjetosmediantelaaplicacióndemétodossobreelobjetooleyendoydandovaloralaspropiedadesdelobjeto.Porejemplo,sepuedecrearunobjetodeAutomatizaciónllamadoMiObjyescribirelsiguientecódigoparateneraccesoalobjeto:
MiObj.Insert"Hola,amigos."'Sitúaeltexto.
MiObj.Bold=True'Daformatoaltexto.
IfMac=True'Compruebelaconstantedeplataforma
MyObj.SaveAs"HD:\WORDPROC\DOCS\TESTOBJ.DOC"'Guardaelobjeto(Macintosh).
Else
MyObj.SaveAs"C:\WORDPROC\DOCS\TESTOBJ.DOC"'Guardaelobjeto(Windows).
Utilicelassiguientesfuncionesparaaccederaunobjetodeautomatización:
Función DescripciónCreateObject Creaunnuevoobjetodeltipoespecificado.GetObject Recuperaunobjetodeunarchivo.
Sideseamásdetallessobrelaspropiedadesymétodoscompatiblesconunaaplicación,debeconsultarladocumentacióndelaaplicación.Losobjetos,funciones,propiedadesymétodoscompatiblesconunaaplicaciónestánnormalmentedefinidosenlabibliotecadeobjetosdelaaplicación.
Comprenderlacompilacióncondicional
Lacompilacióncondicionalsepuedeutilizarparaejecutardeformaselectivadeterminadosbloquesdecódigo,porejemplo,instruccionesdedepuraciónquecomparenlavelocidaddedistintosmétodosdeenfocarunatareadeprogramación,oadaptandounaaplicaciónparadistintosidiomas.
Enelcódigosedeclaraunaconstantedecompilacióncondicionalmedianteladirectiva#Constyseidentificanlosbloquesdecódigoquesedebencompilarcondicionalmentemedianteladirectiva#If...Then...#Else.Elsiguienteejemploejecutacódigodedepuraciónodeproducción,enfuncióndelvalorasignadoalavariableconDepurar.
'DeclaracomopubliclaconstantedecompilaciónenlasecciónDeclarations.
#ConstconDepurar=1
SubEjecucionSelectiva()
#IfconDepurar=1Then
.'Ejecutaelcódigoconlasinstruccionesdedepuración.
.
.
#Else
.'Ejecutaelcódigonormal.
.
.
#EndIf
EndSub
Comprenderlavidadelasvariables
Eltiempoduranteelqueunavariableconservasuvalorseconocecomovida.Elvalordelavariablepuedecambiardurantesuvida,peroconservaalgúnvalor.Cuandounavariablepierdesualcance,yanotieneningúnvalor.
Cuandounprocedimientocomienzaaejecutarse,seinicializantodaslasvariables.Lasvariablesnuméricasseinicializanacero,lascadenasdelongitudvariableseinicializanaunacadenavacíadelongitudcero("")yunacadenadelongitudfijasellenaconloscaracterescorrespondientesalcódigoASCII0,oChr(0).LasvariablesVariantseinicializanaEmpty.Cadaunodeloselementosdeunavariabledetipodefinidoporelusuarioseinicializacomosisetratasedeunavariableindependiente.
Cuandosedeclaraunavariabledeobjeto,sereservaelespaciocorrespondienteenmemoria,peroseledaelvalorNothinghastaqueseleasigneunareferenciaaobjetomediantelainstrucciónSet.
Sielvalordeunavariablenocambiadurantelaejecucióndelcódigo,conservasuvalordeinicializaciónhastaquepierdaalcance.
UnavariabledeniveldeprocedimientodeclaradamediantelainstrucciónDimconservasuvalorhastaqueelprocedimientoterminadeejecutarse.Sielprocedimientollamaaotrosprocedimientos,lavariableconservasuvalor
tambiénmientrasseejecutanesosprocedimientos.
SiunavariabledeniveldeprocedimientodedeclaraconlapalabraclaveStatic,lavariableconservasuvalormientrashayacódigoenejecución,seacualseaelmódulo.Cuandotodoelcódigohaterminadodeejecutarse,lavariablepierdesualcanceysuvalor.Suvidaeslamismaqueladeunavariabledeniveldemódulo.
Unavariabledeniveldemóduloesdistintaaunavariableestática.Enunmóduloestándarounmódulodeclase,conservasuvalorhastaqueseterminadeejecutarelcódigo.Enunmódulodeclaseconservasuvalormientrasexistaunadefinicióndelaclase.Lasvariablesdeniveldemóduloconsumenmemoriahastaquesusvaloressevuelvenainicializa,poresosólosedebenutilizarcuandoseanecesario.
SiseincluyelapalabraclaveStaticantesdeunainstrucciónSuboFunction,losvaloresdetodaslasvariablesdeniveldeprocedimientodelprocedimientoseconservaránentrelassucesivasllamadas.
ComprenderlasintaxisdeVisualBasic
EnlaseccióndeAyudadeVisualBasiccorrespondienteaunmétodo,instrucciónoprocedimientoFunctionlasintaxismuestratodosloselementosnecesariosparautilizarcorrectamenteesemétodo,instrucciónofunción.Losejemplossiguientesexplicancomodebeninterpretarseloselementossintácticosmáscomunes.
SintaxisdelmétodoActivate
objeto.Activate
EnlasintaxisdelmétodoActivate,lapalabra"objeto"encursivaeslaposiciónreservadaparalainformaciónqueintroduceelusuario—enestecaso,códigoquedevuelveunobjeto.Laspalabrasquesemuestranennegritadebenescribirseexactamentetalycomoseindica.Porejemplo,elsiguienteprocedimientoactivalasegundaventanaeneldocumentoactivo.
SubActivar()
Windows(2).Activate
EndSub
SintaxisdelafunciónMsgBox
MsgBox(texto[,botones][,título][,archivoayuda,contexto])
EnlasintaxisdelafunciónMsgBox,laspalabrasencursivaynegritasonargumentosconnombredelafunción.Losargumentosqueaparecenentrecorchetessonopcionales.(NoescribaloscorchetesenelcódigodeVisualBasic).EnelcasodelafunciónMsgBox,elúnicoargumentoquesedebeincluireseltextodelapregunta.
Losargumentosparafuncionesymétodossepuedenespecificarenelcódigomediantesuposiciónoporsunombre.Paraespecificarargumentosmediantesuposición,sigaelordenqueseindicaenlasintaxis,separandolosargumentosconunacoma,porejemplo:
MsgBox"¡Surespuestaescorrecta!",0,"CuadrodeRespuesta"
Paraespecificarunargumentomediantesunombrebastaconusarelnombredelargumentoseguidodedospuntosyunsignoigual(:=)yelvalordelargumento.Losargumentosconnombresepuedenespecificarencualquierorden,porejemplo:
MsgBoxTitle:="CuadrodeRespuesta",Prompt:="¡Surespuestaescorrecta!"
Lasintaxisdelasfuncionesyalgunosmétodosmuestranlosargumentosentreparéntesis.Estasfuncionesymétodosdevuelvenvalores,poresodebenencerrarselosargumentosentreparéntesisalasignarunvaloraunavariable.Siseignoraelvalorderetornoosinosepasanargumentosenformaalguna,nodebenincluirselosparéntesis.Losmétodosquenodevuelvenvaloresnonecesitanquesusargumentosaparezcanencerradosentreparéntesis.Estasnormassonaplicablestantosiseusanargumentosposicionalesonominativos.
Enelsiguienteejemplo,elvalorquedevuelvelafunciónMsgBoxesunnúmeroqueindicaelbotónseleccionadoalmacenadoenlavariablemiVar.Dadoqueseutilizaelvalorquedevuelvelafunción,esprecisoutilizarparéntesis.Otrocuadrodemensajepresentaentoncesenpantallaelvalordelavariable.
SubPregunta()
miVar=MsgBox(Prompt:="Megustamitrabajo.",_
Title:="Cuadroderespuesta",Buttons:="4")
MsgBoxmiVar
EndSub
SintaxisdelainstrucciónOption
OptionCompare{Binary|Text|Database}
EnlasintaxisdelainstrucciónOptionCompare,lasllavesylalíneaverticalindicanunaelecciónobligatoriaentretresopciones.(NoescribalasllavesenlainstruccióndeVisualBasic).Porejemplo,lasiguienteinstrucciónespecificaquedentrodelmódulo,lascadenassecomparanenuncriteriodeordenaciónquenodependedelmayúsculasominúsculas.
OptionCompareText
SintaxisdelainstrucciónDim
Dimnombrevariable[([subscriptos])][Astipo][,nombrevariable[([subscriptos])][Astipo]]...
EnlasintaxisdelainstrucciónDim,lapalabraDimesunapalabraclaveexigida.Elúnicoelementonecesarioesnombrevariable(elnombredelavariable).Porejemplo,lasiguienteinstruccióncreatresvariables:miVar,siguienteVaryterceraVar.EstasvariablessedeclaranautomáticamentecomoVariant.
DimmiVar,siguienteVar,terceraVar
ElsiguienteejemplodeclaraunavariablecomoString.Alincluiruntipodedatosseahorramemoriaysepuedenevitarerroresenelcódigo.
DimmiRespuestaAsString
Paradeclararvariasvariablesenunainstrucción,debeincluirseeltipodedatosparacadavariable.LasvariablesdeclaradassinuntipodedatossedeclaranautomáticamentecomoVariant.
DimxAsInteger,yAsInteger,zAsInteger
Enlasiguienteinstrucción,axeyselesasignaeltipodedatosVariant.SóloazseleasignaeltipodedatosInteger.
Dimx,y,zAsInteger
Sisedeclaraunavariablematriz,debenincluirselosparéntesis.Lossubscriptossonopcionales.Lasiguienteinstruccióndefinelasdimensionesdeunamatrizdinámica,miMatriz.
DimmiMatriz()
Comprenderlasmatricesdeparámetros
Unamatrizdeparámetrosseutilizaparapasarunamatrizdeargumentosaunprocedimiento.Noesnecesariosaberelnúmerodeelementosdelamatrizcuandosedefineelprocedimiento.
ParaidentificarunamatrizdeparámetrosseutilizalapalabraclaveParamArray.LamatrizdebeestardefinidacomounamatrizdeltipoVariantydebeserelúltimoargumentoenladefinicióndelprocedimiento.
Elsiguienteejemplomuestradequéformasepuededefinirunprocedimientoconunamatrizdeparámetros.
SubCualquierNumeroArgs(strNombreAsString,ParamArrayintPuntuacion()AsVariant)
DimintIAsInteger
Debug.PrintstrNombre;"Puntuaciones"
'UtilizalafunciónUBoundparaencontrarellímitesuperiordelamatriz.
ForintI=0ToUBound(intPuntuacion())
Debug.Print"";intPuntuacion(intI)
NextintI
EndSub
Elsiguienteejemplomuestradequeformassepuedellamaresteprocedimiento.
CualquierNumeroArgs"Juan",10,26,32,15,22,24,16
CualquierNumeroArgs"Manuel","Alto","Bajo","Medio","Alto"
Comprenderlosargumentosconnombreyopcionales
CuandosehaceunallamadaaunprocedimientoSuboFunction,sepuedenincluirargumentosdeformaposicional,esdecir,enelordenenqueaparecenenladefinicióndelprocedimiento,osepuedenincluirlosargumentosconsunombresinrespetarningúnorden.
Porejemplo,elsiguienteprocedimientoSubaceptatresargumentos:
SubPasaArgs(strNombreAsString,intEdadAsInteger,dteNacimientoAsDate)
Debug.PrintstrNombre,intEdad,dteNacimiento
EndSub
Alllamaresteprocedimientosepuedenincluirsusargumentosenlaposicióncorrecta,todosseparadosporcomas,talycomomuestraelsiguienteejemplo:
PasaArgs"María",29,#21-2-69#
Tambiénsepuedehacerunallamadaaesteprocedimientoeincluirargumentosconnombre,separadosporcomas.
PasaArgsintEdad:=29,dteNacimiento:=#21/2/69#,strNombre:="Maria"
Unargumentonominativoestáformadoporelnombredelargumentoseguidopordospuntosyunsignoigual(:=),todoelloseguidoporelvalordelargumento.
Losargumentosconnombresonmuyútilescuandosellamaaprocedimientosconargumentosopcionales.Siseusanargumentosconnombrenoseránecesarioincluirsucesivascomasparasustituirargumentosposicionalesausentes.Alusarargumentosconnombreesmásfácilcontrolarquéargumentossepasanycuálesseomiten.
LosargumentosopcionalesvanprecedidosporlapalabraclaveOptionalenladefinicióndelprocedimiento.Enladefinicióndelprocedimientosepuedeespecificartambiénunvalorpredefinidoparaelargumentoopcional.Porejemplo:
SubArgsOpcionales(strProvinciaAsString,OptionalstrPaisAsString="MÉXICO")
...
EndSub
Cuandosehaceunallamadaaunprocedimientoconunargumentoopcional,sepuedeoptarporespecificaronoelargumentoopcional.Sinoseespecifica,seusaráelvalorpredefinidosiexiste.Sinosehaespecificadotampocounvalorpredefinido,elargumentotendráelvalordeinicializaciónquelecorrespondaaunavariabledelmismotipo.
Elsiguienteprocedimientoincluyeunargumentoopcional,lavariablevarPais.LafunciónIsMissingdeterminasisehapasadoonounargumentoopcionalalprocedimiento.
SubArgsOpcionales(strProvinciaAsString,OptionalintRegionAsInteger,_
OptionalstrPaisAsString="MÉXICO")
IfIsMissing(intRegion)ANDIsMissing(strPais)Then
Debug.PrintstrProvincia
ElseIfIsMissing(strPais)Then
Debug.PrintstrProvincia,intRegion
ElseIfIsMissing(intRegion)Then
Debug.PrintstrProvincia,strPais
Else
Debug.PrintstrProvincia,intRegion,strPais
EndIf
EndSub
Esteprocedimientosepuedellamarempleandoargumentosconnombretalycomomuestranlossiguientesejemplos.
ArgsOpcionalesstrPais:="MÉXICO",strProvincia:="SE"
ArgsOpcionalesstrProvincia:="SE",intRegion:=5
ComprenderlostiposdedatosVariant
EltipodedatosVariantseespecificaautomáticamentesinoseespecificaotrotipodedatosaldeclararunaconstante,variable,oargumento.LasvariablesdeclaradascomodeltipodedatosVariantpuedencontenervaloresnuméricos,cadenasdetexto,fecha,horaoBooleansypuedenconvertirlosvaloresquecontienendeformaautomática.LosvaloresnuméricosVariantocupan16bytesdememoria(loquesóloessignificativoenprocedimientosgrandesomóduloscomplejos)ysonmáslentosalahoradesuaccesoquelasvariablesdetipoexplícitodelosrestantestipos.EsmuyraroutilizareltipodedatosVariantpara
unaconstante.LosvaloresdecadenaVariantnecesitan22bytesdememoria.
LassiguientesinstruccionescreanvariablesVariant:
DimmiVar
DimtuVarAsVariant
laVar="Estoesuntexto."
LaúltimainstrucciónnodeclaraexplícitamentelavariablelaVar,sinoqueladeclaraimplícitamente,oautomáticamente.LasvariablesquesedeclaranimplícitamenteseespecificancomodeltipodedatosVariant.
SugerenciaSiseespecificauntipodedatosparaunavariableoargumentoyacontinuaciónseutilizauntipoerróneodedatos,seproduciráunerrordetipodedatos.Paraevitarerroresdetipodedatos,sedebenusarsólovariables(deltipodedatosVariant)odeclararexplícitamentetodaslasvariablesyespecificarparaellasuntipodedatos.Elúltimométodoeselpreferible.
Comprenderobjetos,propiedades,métodosyeventos
Unobjetorepresentaunelementodeunaaplicación,comounahojadecálculo,unacelda,undiagrama,unformularioouninforme.EncódigodeVisualBasic,unobjetodebeidentificarseantesdesepuedaaplicarunodelosmétodosdelobjetoocambiarelvalordeunadesuspropiedades.
Unacolecciónesunobjetoquecontienevariosobjetosquenormalmente,peronosiempre,sondelmismotipo.EnMicrosoftExcel,porejemplo,elobjetoWorkbookscontienetodoslosobjetosWorkbookabiertos.EnVisualBasic,lacolecciónFormscontienetodoslosobjetosFormexistentesenunaaplicación.
Loselementosdeunacolecciónsepuedenidentificarmediantesunúmeroosunombre.Porejemplo,enelsiguienteprocedimiento,Libro(1)identificaalprimerobjetoWorkbookabierto.
SubCierraPrimero()
Libro(1).Close
EndSub
ElsiguienteprocedimientoutilizaunnombreespecificadocomocadenaparaidentificarunobjetoForm.
SubCierraForm()
Forms("MiForm.frm").Close
EndSub
Tambiénesposibleoperaralmismotiemposobretodaunacoleccióndeobjetossiemprequelosobjetoscompartanmétodoscomunes.Porejemplo,elsiguienteprocedimientocierratodoslosformulariosabiertos.
SubCierraTodos()
Forms.Close
EndSub
Métodoestodaacciónquepuederealizarunobjeto.Porejemplo,AddesunmétododelobjetoComboBoxyaquesirveparaañadirunnuevoelementoauncuadrocombinado.
ElsiguienteprocedimientoutilizaelmétodoAddparaañadirunnuevoelementoaunComboBox.
SubAñadeElemen(nuevoElementoasString)
Combo1.AddnuevoElemento
EndSub
Propiedadesunatributodeunobjetoquedefineunadelascaracterísticasdelobjeto,talcomosutamaño,colorolocalizaciónenlapantalla,ounaspectodesucomportamiento,porejemplosiestávisibleoactivado.Paracambiarlascaracterísticasdeunobjeto,secambiaelvalordesuspropiedades
Paradarvaloraunapropiedad,hayquecolocarunpuntodetrásdelareferenciaaunobjeto,despuéselnombredelapropiedadyfinalmenteelsignoigual(=)yelnuevovalordelapropiedad.Porejemplo,elsiguienteprocedimientocambia
eltítulodeunformulariodeVisualBasicdandounvaloralapropiedadCaption.
SubCambiaNombre(nuevoTitulo)
miForm.Caption=nuevoTitulo
EndSub
Haypropiedadesalasquenosepuededarvalor.Eltemadeayudadecadapropiedadindicasiesposibleleerydarvaloresalapropiedad(lectura/escritura),leersóloelvalordelapropiedad(sólolectura)osólodarvaloralapropiedad(sóloescritura).
Sepuedeobtenerinformaciónsobreunobjetodevolviendoelvalordeunadesuspropiedades.Elsiguienteprocedimientoutilizauncuadrodediálogoparapresentareltítuloqueapareceenlapartesuperiordelformularioactivoenesemomento.
SubNombreFormEs()
formNonmbre=Screen.ActiveForm.Caption
MsgBoxformNombre
EndSub
Eventoestodaacciónquepuedeserreconocidaporunobjeto,comopuedeserelclicdelmouseolapulsacióndeunateclayparalaqueesposibleescribircódigocomorespuesta.Loseventospuedenocurrircomoresultadodeunaaccióndelusuarioodelcódigodelprograma,tambiénpuedenseroriginadosporelsistema.
Devolverobjetos
Cadaaplicacióntieneunaformadedevolverlosobjetosquecontiene.Sinembargoestosprocedimientosnosonsiempreiguales,porellodebeconsultareltemadeayudacorrespondientealobjetoocolecciónqueestáusandoenlaaplicaciónparadeterminarlaformadedevolverelobjeto.
Crearbuclesmediantecódigo
Medianteelusodeinstruccionescondicionalesyinstruccionesdebucle(tambiénconocidascomoestructurasdecontrol)esposibleescribircódigode
VisualBasicquetomedecisionesyrepitadeterminadasacciones.Otraestructuradecontrolútil,lainstrucciónWith,permiteejecutarunaseriedeinstruccionessinnecesidadderecalificarunobjeto.
Utilizarinstruccionescondicionalesparatomardecisiones
LasinstruccionescondicionalesevalúansiunacondiciónesTrueoFalseyacontinuaciónespecificanlasinstruccionesaejecutarenfuncióndelresultado.Normalmente,unacondiciónesunaexpresiónqueutilizaunoperadordecomparaciónparacompararunvalorovariableconotro.
Elegirlainstruccióncondicionalautilizar
If...Then...Else:SaltoaunainstruccióncuandounacondiciónesTrueoFalse
SelectCase:Seleccióndelainstrucciónaejecutarenfuncióndeunconjuntodecondiciones
Utilizarbuclespararepetircódigo
Empleandobuclesesposibleejecutarungrupodeinstruccionesdeformarepetida.AlgunosbuclesrepitenlasinstruccioneshastaqueunacondiciónesFalse,otroslasrepitenhastaquelacondiciónesTrue.Haytambiénbuclesquerepitenunconjuntodeinstruccionesunnúmerodeterminadodevecesounavezparacadaobjetodeunacolección.
Elegirelbucleautilizar
Do...Loop:SeguirenelbuclemientrasohastaunacondiciónseaTrue.
For...Next:Utilizaruncontadorparaejecutarlasinstruccionesunnúmerodeterminadodeveces.
ForEach...Next:Repeticióndelgrupodeinstruccionesparacadaunodelosobjetosdeunacolección.
Ejecutarvariasinstruccionessobreelmismoobjeto
Normalmente,enVisualBasic,debeespecificarseunobjetoantesdepoderejecutarunodesusmétodosocambiarunadesuspropiedades.SepuedeusarlainstrucciónWithparaespecificarunobjetounasolavezparaunaseriecompletadeinstrucciones.
With:Ejecutarunaseriedeinstruccionessobreelmismoobjeto
Crearprocedimientosrecursivos
Losprocedimientostienenunespaciolimitadoparaalmacenarvariables.Cadavezqueunprocedimientosellamaasimismo,consumemásdeeseespacio.Unprocedimientoquesellamaasimismoesloqueseconocecomounprocedimientorecursivo.Unprocedimientorecursivoquesellamacontinuamenteasimismoproduciráfinalmenteunerror.Porejemplo:
FunctionAgotar(Máximo)
Agotar=Agotar(Máximo)
EndFunction
Esteerrorpuederesultarmenosevidentecuandodosprocedimientossellamanunoalotrodeformaindefinida,ocuandonuncasecumplelacondicióndefinidacomofindeunbucle.Lasfuncionesrecursivostienensususos.Porejemplo,elsiguienteprocedimientoutilizaunafunciónrecursivoparacalcularfactoriales:
FunctionFactorial(N)
IfN<=1Then'Sehallegadoalfindelasllamadasrecursivos.
Factorial=1'(N=0)abandonalasllamadas.
Else'LlamanuevamenteaFactorialsiN>0.
Factorial=Factorial(N-1)*N
EndIf
EndFunction
Debeprobarelprocedimientorecursivoparacomprobarquenosellamaasimismotantasvecesqueagotalamemoriadisponible.Siseproduceunerror,compruebequeelprocedimientonosellamaasimismodeformaindefinida.Sinoesasí,tratedeahorrarmemoriamediante:
Laeliminacióndevariablesinnecesarias.
ElusodetiposdedatosdistintosaVariant.
Unnuevoestudiodelalógicadelprocedimiento.Amenudoesposiblesustituirbuclesanidadosporunprocedimientorecursivo.
Crearvariablesdeobjeto
Sepuedecrearunavariabledeobjetodelamismaformaqueelobjetoalquehacereferencia.Sepuedenactivarodevolverlaspropiedadesdelobjetooutilizarcualquieradesusmétodos.
Paracrearunavariabledeobjeto:
Declarelavariabledeobjeto.
Asignelavariabledeobjetoaunobjeto.
Declararvariablesdeobjeto
ParadeclararunavariabledeobjetosehadeusarlainstrucciónDimounadelasrestantesinstruccionesdedeclaración(Public,Private,oStatic).UnavariablequeserefiereaunobjetodebeserunaVariant,unObject,ountipoespecíficodeobjeto.Porejemplo,sonválidaslassiguientesdeclaraciones:
'DeclaraMiObjetocomotipodedatosVariant.
DimMiObjeto
'DeclaraMiObjetocomountipodedatosObject.
DimMiObjetoAsObject
'DeclaraMiObjetocomountipoFont.
DimMiObjetoAsFont
NotaSiutilizaunavariabledeobjetosinhaberladeclaradopreviamente,eltipodedatospredefinidodelavariabledeobjetoesVariant.
SepuededeclararunavariabledeobjetoconeltipodedatosObjectcuandoeltipodeobjetoespecíficonoseconocehastaqueseejecutaelprocedimiento.UtiliceeltipodedatosObjectparacrearunareferenciagenéricaacualquierobjeto.
Siconoceeltipoespecíficodeobjeto,debedeclararasílavariabledeobjeto.Porejemplo,silaaplicacióncontieneuntipodeobjetoEjemplo,sepuededeclararunavariabledeobjetoparaeseobjetoempleandounacualquieradelasdosinstruccionessiguientes:
DimMiObjetoAsObject'Sedeclaracomoobjetogenérico.
DimMiObjetoAsEjemplo'SedeclarasólocomounobjetoEjemplo.
Aldeclararobjetosespecíficosesposiblecomprobarautomáticamentelostipos,elcódigoesmásrápidodeejecuciónymejorasulegibilidad.
Asignarunavariabledeobjetoaunobjeto
ParaasignarunavariabledeobjetoaunobjetoseutilizalainstrucciónSet.EsposibleasignarunaexpresióndeobjetooNothing.Porejemplo,sonválidaslassiguientesasignacionesaunavariabledeobjeto:
SetMiObjeto=SuObjeto'Asignareferenciaaobjeto.
SetMiObjeto=Nothing'Deshacelarelación.
Sepuedeefectuaralmismotiempoladeclaracióndelavariabledeobjetoconlaasignacióndeunobjetoalamisma,paraelloseutilizalapalabraclaveNewenlainstrucciónSet.Porejemplo:
SetMiObjeto=NuevoObjeto'Creayasigna
AlasignaraunavariabledeobjetoelvalorNothingsedeshacelarelaciónquepudieraexistirentrelavariabledeobjetoycualquierobjetoespecífico.Asíseevitaque,accidentalmente,sepuedacambiarelobjetoalcambiarlavariable.UnavariabledeobjetoquedadefinidasiemprecomoNothingalcerrarelobjetoasociado,asíesposiblecomprobarsilavariabledeobjetoestáasociadaaun
objetoválido.Porejemplo:
IfNotMiObjetoIsNothingThen
'Lavariablehacereferenciaaunobjetoválido.
...
EndIf
Porsupuesto,estapruebanuncapodrádeterminarconabsolutacertezasiunusuariohacerradoonolaaplicaciónquecontienealobjetoalquesehacereferenciaporlavariabledeobjeto.
Hacerreferenciaaladefiniciónactualdeunobjeto
UtilicelapalabraclaveMeparahacerreferenciaaladefiniciónactualdelobjetodondeseestáejecutandoelcódigo.TodoslosprocedimientosasociadosconelobjetoactualtienenaccesoalobjetoalquesehacereferenciacomoMe.LautilizacióndeMeesespecialmenteútilparapasarinformaciónsobreladefiniciónactualdeunobjetoaunprocedimientodeotromódulo.Porejemplo,supongaqueexisteelsiguienteprocedimientoenunmódulo:
SubCambiaColorObjeto(MiObjetoNombreAsObject)
MiObjetoNombre.ColorFondo=RGB(Rnd*256,Rnd*256,Rnd*256)
EndSub
Sepuedehacerunallamadaalprocedimientoypasarle,comoargumento,ladefiniciónactualdelobjetoempleandolasiguienteinstrucción:
CambiaColorObjetoMe
Declararconstantes
Aldeclararunaconstante,sepuedeasignaraunvalorunnombrequetengaalgúnsignificadoapropiado.LainstrucciónConstseutilizaparadeclararunaconstanteydarlevalor.Unaconstantenopuedemodificarseocambiardevalorunavezquehasidodeclarada.
Sepuededeclararunaconstantedentrodeunprocedimientooalprincipiodeunmódulo,enlaseccióndeDeclarations.Lasconstantesaniveldemódulosonprivadas,amenosqueseespecifiquelocontrario.Paradeclararunaconstantepúblicaaniveldemódulo,lainstrucciónConstdebeirprecedidaporlapalabra
clavePublic.SepuededeclararexplícitamenteunaconstantecomoprivadacolocandolapalabraclavePrivateantesdelainstrucciónConstparafacilitarlalecturaycomprensióndelcódigo.Sideseamásinformación,consultelasección"Comprenderelalcanceylavisibilidad"enlaAyudadeVisualBasic.
ElsiguienteejemplodeclaralaconstantePublicEdadConcomounIntegeryleasignaelvalor34.
PublicConstEdadConAsInteger=34
Lasconstantessepuedendeclarardeunodelossiguientestiposdedatos:Boolean,Byte,Integer,Long,Currency,Single,Double,Date,String,oVariant.Dadoqueyaseconoceelvalordeunaconstante,esmuyfácilelegireltipodedatosenlainstrucciónConst.Sideseamásinformaciónsobretiposdedatos,consultelasección"TipodedatosSummary"enlaAyudadeVisualBasic.
Enunasolainstrucciónsepuedendeclararvariasconstantes.Paraespecificaruntipodedatos,debeincluirseeltipodedatosparacadaconstante.EnlasiguienteinstrucciónsedeclarancomoIntegerlasconstantesEdadConySalarioCon.
ConstEdadConAsInteger=34,SalarioConAsCurrency=35000
Declararmatrices
Lasmatricessedeclaranigualquelasrestantesvariables,utilizandoinstruccionesDim,Static,Private,oPublic.Ladiferenciaentrelasvariablesescalares(aquellasquenosonmatrices)ylasvariablesmatrizesquenormalmentesedebeespecificareltamañodelamatriz.Unamatrizconuntamañoespecificadoesunamatrizdetamañofijo.Unamatrizcuyotamañopuedecambiarmientraselprogramaseestáejecutandoesunamatrizdinámica.
Siunamatrizseindexadesde0ódesde1dependedelvalordelainstrucciónOptionBase.SiOptionBase1noseespecifica,todoslosíndicesdematrices
comienzanencero.
Declararunamatrizfija
EnlasiguientelíneadecódigosedeclaracomomatrizIntegerunamatrizdetamañofijocon11filasy11columnas:
DimMiMatriz(10,10)AsInteger
Elprimerargumentocorrespondealnúmerodefilasyelsegundoalnúmerodecolumnas.
Comosucedeencualquierotradeclaracióndevariable,amenosqueseespecifiqueparalamatrizuntipodedatos,loselementosdeéstaserándeltipoVariant.CadaelementonuméricoVariantdelamatrizutiliza16bytes.CadaelementodecadenaVariantutiliza22bytes.Paraescribircódigodelaformamáscompactaposible,debedeclararexplícitamentesusmatricesconuntipodedatosdistintoaVariant.Lassiguienteslíneasdecódigocomparaneltamañodevariasmatrices:
'UnamatrizIntegerutiliza22bytes(11elementos*2bytes).
ReDimMiMatrizInteger(10)AsInteger
'UnamatrizDouble-precisionutiliza88bytes(11elementos*8bytes).
ReDimMiMatrizDoble(10)AsDouble
'UnamatrizVariantutilizaalmenos176bytes(11elementos*16bytes).
ReDimMiMatrizVariant(10)
'LamatrizIntegerutiliza100*100*2bytes(20.000bytes).
ReDimMiMatrizInteger(99,99)AsInteger
'LamatrizDouble-precisionutiliza100*100*8bytes(80.000bytes).
ReDimMiMatrizDoble(99,99)AsDouble
'LamatrizVariantutilizaalmenos160.000bytes(100*100*16bytes).
ReDimMiMatrizVariant(99,99)
Eltamañomáximodeunamatrizdependedelsistemaoperativoydelacantidaddememoriadisponible.EsmáslentoutilizarunamatrizquesobrepasalacantidaddememoriaRAMdisponibleenelsistemayaquelosdatostienenqueserleídosyescritosdeldisco.
Declararunamatrizdinámica
Aldeclararunamatrizdinámicasepuedecambiareltamañodeunamatrizmientrasqueelcódigoseestáejecutando.ParadeclararunamatrizdinámicaseusanlasinstruccionesStatic,Dim,Private,oPublic,dejandolosparéntesisvacíos,talycomosemuestraenelsiguienteejemplo.
DimMatrizSingle()AsSingle
NotaSepuedeusarlainstrucciónReDimparadeclararimplícitamenteunamatrizdentrodeunprocedimiento.TengacuidadoparanocambiarelnombredelamatrizcuandouselainstrucciónReDim,yaquesecrearáunasegundamatrizinclusoenelcasodequesehayaincluidolainstrucciónOptionExplicitenelmódulo.
LainstrucciónReDimsepuedeutilizarenunprocedimiento,dentrodelalcancedelamatriz,paracambiarelnúmerodedimensiones,definirelnúmerodeelementosyparadefinirloslímitessuperioreinferiorparacadadimensión.SepuedeusarlainstrucciónReDimparamodificarlamatrizdinámicacuantasvecesseanecesario.Sinembargo,cadavezquesehace,sepierdenlosvaloresalmacenadosenlamatriz.SepuedeusarlainstrucciónReDimPreserveparaampliarunamatrizconservandolosvaloresquecontiene.Porejemplo,lasiguienteinstrucciónañade10nuevoselementosalamatrizMatrizVarsinperderlosvaloresalmacenadosenloselementosoriginales.
ReDimPreserveMatrizVar(UBound(MatrizVar)+10)
NotaCuandoseutilizalapalabraclavePreserveconunamatrizdinámica,sólosepuedecambiarellímitesuperiordelaúltimadimensión,nopudiendomodificarseelnúmerodedimensiones.
Declararvariables
ParadeclararvariablesseutilizanormalmenteunainstrucciónDim.Lainstruccióndedeclaraciónpuedeincluirseenunprocedimientoparacrearunavariabledeniveldeprocedimiento.Opuedecolocarsealprincipiodeunmódulo,enlasecciónDeclarations,paracrearunavariabledeniveldemódulo.
ElsiguienteejemplocrealavariableNombreTextoyespecíficamenteleasignaeltipodedatosString.
DimNombreTextoAsString
Siestainstrucciónaparecedentrodeunprocedimiento,lavariableNombreTextosepuedeusarsóloeneseprocedimiento.SilainstrucciónapareceenlasecciónDeclarationsdelmódulo,lavariableNombreTextoestarádisponibleentodoslosprocedimientosdentrodelmódulo,peroparalosrestantesmódulosdelproyecto.Parahacerqueestavariableestédisponibleparatodoslosprocedimientosdeunproyecto,bastaconcomenzarladeclaraciónconlainstrucciónPublic,talycomomuestraelsiguienteejemplo:
PublicNombreTextoAsString
Sideseamásinformaciónsobrecómodarnombreasusvariables,puedeconsultarlasección"VisualBasicNamingRules"enlaAyudadeVisualBasic.
Lasvariablessepuedendeclararcomodeunodelossiguientestiposdedatos:Boolean,Byte,Integer,Long,Currency,Single,Double,Date,String(paracadenasdelongitudvariable),String*longitud(paracadenasdelongitudfija),Object,oVariant.Sinoseespecificaeltipodedatos,eltipodedatosVarianteselpredefinido.TambiénesposiblecrearuntipodefinidoporelusuarioempleandolainstrucciónType.Sideseamásinformaciónsobretiposdedatospuedeconsultarlasección"TipodedatosSummary"enlaAyudadeVisualBasic.
Sepuedendeclararvariasvariablesenunainstrucción.Paraespecificareltipodedatossedebeincluiruntipodedatosparacadavariable.EnlasiguienteinstrucciónsedeclaranlasvariablesintX,intY,eintZcomodeltipoInteger.
DimintXAsInteger,intYAsInteger,intZAsInteger
Enlasiguienteinstrucción,intXeintYsedeclarancomodeltipoVariant;ysólointZsedeclaracomodeltipoInteger.
DimintX,intY,intZAsInteger
Noesnecesarioespecificareltipodedatosenlainstruccióndedeclaración.Siseomite,lavariableserádeltipoVariant.
UtilizarlainstrucciónPublic
LainstrucciónPublicsepuedeutilizarparadeclararvariablespúblicasdeniveldemódulo.
PublicNombreTextoAsString
Lasvariablespúblicassepuedenusarencualquierprocedimientodelproyecto.Siunavariablepúblicasedeclaraenunmóduloestándaroenunmódulodeclase,tambiénsepodráusarenlosproyectosreferenciadosporelproyectoenquesedeclaralavariablepública.
UtilizarlainstrucciónPrivate
LainstrucciónPrivatesepuedeusarparadeclararvariablesprivadasdeniveldemódulo.
PrivateMiNombreAsString
LasvariablesPrivatepuedenserusadasúnicamenteporprocedimientospertenecientesalmismomódulo.
NotaCuandoseutilizaaniveldemódulo,lainstrucciónDimesequivalentealainstrucciónPrivate.SeríaaconsejableusarlainstrucciónPrivateparafacilitarlalecturaycomprensióndelcódigo.
UtilizarlainstrucciónStatic
CuandoseutilizalainstrucciónStaticenlugardelainstrucciónDim,lavariabledeclaradamantendrásuvalorentrellamadassucesivas.
UtilizarlainstrucciónOptionExplicit
EnVisualBasicsepuededeclararimplícitamenteunavariableusándolaenunainstruccióndeasignación.TodaslasvariablesquesedefinenimplícitamentesondeltipoVariant.LasvariablesdeltipoVariantconsumenmásrecursosdememoriaquelamayorpartedelasotrostiposdevariables.Suaplicaciónserámáseficientesisedeclaranexplícitamentelasvariablesyselesasignauntipodedatosespecífico.Aldeclararseexplícitamentelasvariablessereducelaposibilidaddeerroresdenombresyelusodenombreserróneos.
SinodeseaqueVisualBasicrealicedeclaracionesimplícitas,puedeincluirenunmódulolainstrucciónOptionExplicitantesdetodoslosprocedimientos.Estainstrucciónexigequetodaslasvariablesdelmódulosedeclarenexplícitamente.SiunmóduloincluyelainstrucciónOptionExplicit,seproduciráunerrorentiempodecompilacióncuandoVisualBasicencuentreunnombredevariablequenohasidopreviamentedeclarado,ocuyonombresehaescritoincorrectamente.
SepuedeseleccionarunaopcióndelentornodeprogramacióndeVisualBasicparaincluirautomáticamentelainstrucciónOptionExplicitentodoslosnuevosmódulos.ConsulteladocumentacióndesuaplicaciónparaencontrarlaformademodificarlasopcionesdeentornodeVisualBasic.Tengaencuentaqueestaopciónnotieneningúnefectosobreelcódigoquesehayaescritoconanterioridad.
NotaLasmatricesfijasydinámicassiempresetienequedeclararexplícitamente.
Declararunavariabledeobjetoparaautomatización
Cuandoseutilizaunaaplicaciónparacontrolarlosobjetosdeotraaplicación,debeestablecerseunareferenciaalabibliotecadetiposdelaotraaplicación.Unavezquesehaestablecidolareferencia,sepuedendeclararvariablesdeobjetoconformeasutipomásespecífico.Porejemplo,sidesdeMicrosoftWordseestableceunareferenciaalabibliotecadetiposdeMicrosoftExcel,sepuededeclararunavariabledeltipoWorksheetdesdeMicrosoftWordpararepresentarunobjetoWorksheetdeMicrosoftExcel.
SiseutilizaotraaplicaciónparacontrolarobjetosdeMicrosoftAccess,esposible,enlamayorpartedeloscasos,declararvariablesobjetosdeltipomásespecífico.SepuedeusartambiénlapalabraclaveNewparacrearautomáticamenteunanuevadefinicióndeunobjeto.Sinembargo,puedesernecesarioindicarquesetratadeunobjetoMicrosoftAccess.Porejemplo,cuandosedeclaraunavariabledeobjetopararepresentarunformulariodeMicrosoftAccessdesdeMicrosoftVisualBasic,debedistinguirseentreelobjetoFormdeMicrosoftAccessyunobjetoFormdeVisualBasic.Paraelloseincluyeelnombredelabibliotecadetiposenladeclaracióndelavariable,comomuestraelsiguienteejemplo:
DimfrmPedidosAsNewAccess.Form
AlgunasaplicacionesnoreconocenalgunosdelostiposdeobjetosdeMicrosoftAccess.Enesecaso,inclusodespuésdeestablecerunareferenciaalabibliotecadetiposdeMicrosoftAccess,seránecesariodeclarartodaslasvariablesobjeto
deMicrosoftAccesscomodeltipoObject.TampocopuedeusarselapalabraclaveNewparacrearunanuevadefinicióndelobjeto.ElsiguienteejemplomuestracómodeclararunavariablequerepresenteunanuevadefinicióndelobjetoApplicationdeMicrosoftAccessdesdeunaaplicaciónquenoreconocelostiposdeobjetodeMicrosoftAccess.LaaplicacióncreaentoncesunanuevadefinicióndelobjetoApplication.
DimappAccessAsObject
SetappAccess=CreateObject("Access.Application")
Paradeterminarlasintaxisautilizarconunaaplicacióndeterminadadebeconsultarseladocumentacióndelaaplicación.
Devolvercadenasdesdefunciones
Algunasfuncionestienendosversiones:unaquedevuelveuntipodedatosVariantyotraquedevuelveuntipodedatosString.LasversionesVariantsonmásaconsejablesyaquelasvariantesrealizanautomáticamentelaconversiónentretiposdedatosdistintos.TambiénpermitenqueNullsepropagueatravésdeunaexpresión.LasversionesStringsonmáseficientesyaqueconsumenmenosmemoria.
ConsiderelaposibilidaddeusarlaversiónStringcuando:
Elprogramaseamuylargoyusemuchasvariables.
Seescribandatosdirectamenteenarchivosdeaccesodirecto.
LassiguientesfuncionesdevuelvenvaloresenunavariableStringcuandoseañadeelsignodólar($)alnombredefunción.EstasfuncionestienenelmismousoysintaxisquelasfuncionesequivalentesVariant(sinelsignodólar).
Chr$ ChrB$ *Command$CurDir$ Date$ Dir$Error$ Format$ Hex$Input$ InputB$ LCase$
Left$ LeftB$ LTrim$Mid$ MidB$ Oct$Right$ RightB$ RTrim$Space$ Str$ String$Time$ Trim$ Ucase$
*Puedenoestardisponibleentodaslasaplicaciones.
Ejecutarcódigocuandoseestablecenpropiedades
SepuedencrearprocedimientosPropertyLet,PropertySetyPropertyGetquecompartanelmismonombre.Asísepuedecrearungrupodeprocedimientosrelacionadosqueoperanconjuntamente.UnavezqueseutilizaunnombreparaunprocedimientoProperty,esenombreyanosepuedeusarparadenominarunprocedimientoSuboFunction,unavariable,ountipodefinidoporelusuario.
LainstrucciónPropertyLetpermitecrearunprocedimientoqueasignaunvaloralapropiedad.UnejemplopodríaserunprocedimientoPropertyquecreaunapropiedadinvertidaparaunmapadebitsenundocumento.Lasintaxisutilizada
paraefectuarlallamadaalprocedimientoPropertyLeteslasiguiente:
Form1.Invertido=True
ElprocesorealdeinvertirunmapadebitseneldocumentoserealizaenteramentedentrodelprocedimientoPropertyLet:
PrivateEstáInvertidoAsBoolean
PropertyLetInvertido(XAsBoolean)
EstáInvertido=X
IfEstáInvertidoThen
…
'(instrucciones)
Else
'(instrucciones)
EndIf
EndProperty
LavariabledeniveldedocumentoEstáInvertidoalmacenaelvalorasignadoalapropiedad.AldeclararlacomoPrivate,elusuariosólopuedecambiarlamedianteelprocedimientoPropertyLet.Utiliceunnombrequepermitafácilmenterecordarquelavariableseutilizaparalapropiedad.
EsteprocedimientoPropertyGetseutilizaparadevolverelvaloractualdelapropiedadInvertido:
PropertyGetInvertido()AsBoolean
Invertido=EstáInvertido
EndProperty
LosprocedimientosPropertyhacenmásfácillaejecucióndecódigoaltiempoqueseasignaunvaloralapropiedad.SepuedenusarlosprocedimientosPropertyparaejecutarlossiguientesprocesos:
Antesdeasignarunvaloralapropiedad,paradeterminarelvalordela
propiedad.
Despuésdeasignarlo,procedimientosbasadosenelnuevovalor.
Escribirdatosenarchivos
Cuandosetrabajacongrandescantidadesdedatos,esamenudoconvenienteescribiroleerdatosdeunarchivo.LainstrucciónOpenpermitecrearyaccederaarchivosdirectamente.Openproporcionatrestiposdeaccesoaarchivos:
Accesosecuencial(modosInput,OutputyAppend)seutilizaparaescribirarchivosdetexto,talescomoregistrosdeerroreseinformes.
Accesodirecto(modoRandom)seutilizaparaleeryescribirdatosenunarchivosincerrarlo.Losarchivosdeaccesodirectoconservanlainformaciónenregistros,loquepermiterecuperarladeformarápida.
Accesobinario(modoBinary)seutilizaparaleeryescribirencualquierbytedeunarchivo,sirveparaalmacenaropresentarunaimagendemapadebits.NotaLainstrucciónOpennosedebeutilizarparaabrirarchivosdelmismotipoquelaaplicación.Porejemplo,nouseOpenparaabrirundocumentodeWord,unahojadecálculodeMicrosoftExcelounabasededatosdeMicrosoftAccess.Sisehiciera,seperderíalaintegridaddelarchivosecorromperíanlosdatosalmacenados.
Lasiguientetablamuestralasinstruccionesnormalmenteutilizadasparaescribiryleerdatosenodeunarchivo.
Tipodeacceso Escribirdatos LeerdatosSecuencial Print#,Write# Input#Directo Put GetBinario Put Get
Escribirinstruccionesdeasignación
Lasinstruccionesdeasignaciónasignanunvaloroexpresiónaunavariableoconstante.Lasinstruccionesdeasignaciónincluyensiempreunsignoigual(=).ElsiguienteejemploasignaelvalorquedevuelvelafunciónInputBoxalavariablesuNombre.
SubPregunta()
DimsuNombreAsString
suNombre=InputBox("¿Cómosellama?")
MsgBox"Sunombrees"&suNombre
EndSub
LainstrucciónLetesopcionalynormalmenteseomite.Porejemplo,lainstruccióndeasignaciónanteriorpodríahaberseescritoasí:
LetsuNombre=InputBox("¿Cómosellama?").
LainstrucciónSetseutilizaparaasignarunobjetoaunavariablequehasidodeclaradacomoobjeto.LapalabraclaveSetesnecesaria.Enelsiguienteejemplo,lainstrucciónSetasignaunrangodeHoja1alavariabledeobjetomiCelda:
SubDarFormato()
DimmiCeldaAsRange
SetmiCelda=Worksheets("Hoja1").Range("A1")
WithmiCelda.Font
.Bold=True
.Italic=True
EndWith
EndSub
Lasinstruccionesqueestablecenvalorespropiedadsontambiéninstruccionesdeasignación.ElsiguienteejemploasignalapropiedadBolddelobjetoFontparalaceldaactiva:
ActiveCell.Font.Bold=True
Escribirinstruccionesdedeclaración
Lasinstruccionesdedeclaraciónseusanparadarnombreydefinirprocedimientos,variables,matricesyconstantes.Cuandosedeclaraunprocedimiento,variableoconstante,tambiénsedefinesualcancequedependedellugarenquesecoloqueladeclaraciónydelaspalabrasclavequeseusanparaello.
Elsiguienteejemplocontienetresdeclaraciones.
SubDarFormato()
ConstlimiteAsInteger=33
DimmiCeldaAsRange
'Masinstrucciones
EndSub
LainstrucciónSub(conlacorrespondienteinstrucciónEndSub)declaraunprocedimientollamadoDarFormato.TodaslasinstruccionesqueaparecenentrelasinstruccionesSubyEndSubseejecutancuandoelprocedimientoDarFormatoseejecutaosellama.
EscribirunprocedimientoSub
LainstrucciónConstdeclaralaconstantelimite,especificandoeltipodedatosIntegeryunvalorde33.
Declararconstantes
LainstrucciónDimdeclaralavariablemiCelda.Eltipodedatosesobjeto,enestecaso,unobjetoRangedeMicrosoftExcel.Sepuededeclararunavariablequeseacualquieradelosobjetosqueestánaccesiblesalaaplicaciónqueseestáusando.LasinstruccionesDimsonuntipodeinstrucciónqueseutilizaparadeclararvariables.OtraspalabrasclaveutilizadasenlasdeclaracionessonReDim,Static,Public,PrivateyConst.
Declararvariables
EscribirinstruccionesdeVisualBasic
UnainstruccióndeVisualBasicesunainstruccióncompleta.Puedeincluirpalabrasclave,operadores,variables,constantesyexpresiones.Todaslasinstruccionespertenecenaunadelastrescategoríassiguientes:
Lasinstruccionesdedeclaración,quedannombreaunavariable,constanteoprocedimientoypuedentambiénespecificarsutipodedatos.Escribirinstruccionesdedeclaración
Lasinstruccionesdeasignación,queasignanunvaloroexpresiónauna
variableoconstante.Escribirinstruccionesdeasignación
Lasinstruccionesejecutables,queinicianacciones.Estasinstruccionespuedenejecutarunmétodoofunciónypuedensaltaraoevitarbloquesdecódigo.Lasinstruccionesejecutablesamenudocontienenoperadorescondicionalesomatemáticas.Escribirinstruccionesejecutables
Continuarinstruccionesenmúltipleslíneas
Unainstruccióncabenormalmenteenunalínea,peropuedecontinuarseenlasiguienteutilizandouncarácterdecontinuacióndelínea.Enelsiguienteejemplo,lainstrucciónejecutableMsgBoxseextiendeporlastreslíneasquelesiguen:
SubCuadroDemo()'Esteprocedimientodeclaraunavariabledecadena,
'leasignaelvalorJuanyacontinuación
'presentaenpantallaunmensajeconcatenado.
DimmiVarAsString
miVar="Juan"
MsgBoxPrompt:="Hola"&myVar,_
Title:="Cuadrodesaludo",_
Buttons:=vbExclamation
EndSub
Añadircomentarios
Loscomentariospuedenexplicarunprocedimientoounainstrucciónenparticularacualquierpersonaquetengaqueleerelcódigo.VisualBasicignoraloscomentarioscuandoejecutalosprocedimientos.Laslíneasdecomentariocomienzanporunapóstrofe(')oconlapalabraclaveRemseguidaporunespacioypuedecolocarseencualquierlugardelprocedimiento.Paraañadirun
comentarioalamismalíneaqueocupaunainstrucción,debeinsertarseunapóstrofedespuésdeesta,seguidoporelcomentario.Loscomentariosaparecenenpantallaencolorverde,colorpredefinido.
Comprobarerroresdesintaxis
SisepresionalateclaENTRARdespuésdeescribirunalíneadecódigoylalíneaapareceenpantallaencolorrojo(puedequeaparezcatambiénunmensajedeerror),debeaveriguarcuáleselproblemaenesainstrucciónycorregirlo.
Escribirinstruccionesejecutables
Unainstrucciónejecutableiniciaunaacción.Puedeejecutarunmétodoofunciónysaltarabloquesdecódigoonoejecutarotros.Lasinstruccionesejecutablesincluyenamenudooperadorescondicionalesomatemáticos.
ElsiguienteejemploutilizalainstrucciónForEach...NextparapasarporcadaunadelasceldasdeunrangollamadoMiIntervaloenlaHoja1deunlibroMicrosoftExcelactivo.LavariablecesunaceldaenlacoleccióndeceldasquecomponenMiIntervalo.
SubDarFormato()
ConstlimiteAsInteger=33
ForEachcInWorksheets("Hoja1").Range("MiIntervalo").Cells
Ifc.Value>limiteThen
Withc.Font
.Bold=True
.Italic=True
EndWith
EndIf
Nextc
MsgBox"¡Fin!"
EndSub
LainstrucciónIf...Then...Elsedelejemplocompruebaelvalordelacelda.Sielvaloresmayorde33,lainstrucciónWithestablecelaspropiedadesBoldeItalicdelobjetoFontparaesacelda.LasinstruccionesIf...Then...ElseacabanconunainstrucciónEndIf.
LainstrucciónWithpuedeevitarquehayaqueescribirmuchasveceslasmismaspalabrasyaquelasinstruccionesquecontieneseejecutanautomáticamenteenelobjetoquesiguealapalabraclaveWith.
LainstrucciónNextllamaalasiguienteceldadelacoleccióndeceldascontenidaenMiIntervalo.
LafunciónMsgBox(quepresentaenpantallauncuadrodediálogodeVisualBasic)presentaunmensajeindicandoqueelprocedimientoSubhaterminadodeejecutarse.
EscribirunprocedimientoFunction
UnprocedimientoFunctionesunaseriedeinstruccionesdeVisualBasicencerradasentredosinstruccionesFunctionyEndFunction.UnprocedimientoFunctionessimilaraunprocedimientoSub,aunqueunafunciónpuededevolverademásunvalor.UnprocedimientoFunctionaceptaargumentos,comopuedenserconstantes,variablesoexpresionesquelepasaelprocedimientoqueefectúalallamada.SiunprocedimientoFunctionnotieneargumentos,lainstrucciónFunctiondebeincluirunpardeparéntesisvacíos.Unafuncióndevuelveunvalorasignándoloasunombreenunaomásinstruccionesdelprocedimiento.
Enelsiguienteejemplo,lafunciónCelsiuscalculagradoscentígradosapartirdegradosFahrenheit.CuandosellamaalafuncióndesdeelprocedimientoPrincipal,selepasaunavariablequecontieneelvalordelargumento.Elresultadodeloscálculossedevuelvealprocedimientoqueefectúolallamadaysepresentaenuncuadrodemensaje.
SubPrincipal()
temp=Application.InputBox(Texto:=_
"Porfavor,introduzcalatemperaturaengradosF.",Tipo:=1)
MsgBox"Latemperaturaes"&Celsius(temp)&"gradosC."
EndSub
FunctionCelsius(GradosF)
Celsius=(GradosF-32)*5/9
EndFunction
EscribirunprocedimientoProperty
UnprocedimientoPropertyesunaseriedeinstruccionesVisualBasicquepermitenaunprogramadorcrearymanipularpropiedadespersonalizadas.
LosprocedimientosPropertysepuedenusarparacrearpropiedadesdesólolecturaparaformularios,módulosestándarymódulosdeclase.
LosprocedimientosPropertydebenutilizarseenelcódigoenlugardelasvariablesPublicquedebenserejecutadascuandoseasignaunvaloralapropiedad.
AdiferenciadelasvariablesPublic,losprocedimientosPropertypuedentenercadenasdeAyudaasignadasenelExaminadordeobjetos.
CuandosecreaunprocedimientoProperty,seconvierteenunapropiedaddelmóduloquecontienealprocedimiento.VisualBasicproporcionalossiguientestrestiposdeprocedimientosProperty:
Procedimiento DescripciónPropertyLet Unprocedimientoquedavaloraunapropiedad.PropertyGet Unprocedimientoquedevuelveelvalordeunapropiedad.PropertySet Unprocedimientoqueestableceunareferenciaaunobjeto.
LasintaxisparadeclararunprocedimientoPropertyeslasiguiente:
[Public|Private][Static]Property{Get|Let|Set}nombrepropiedad_[(argumentos)][Astipo]
instrucciones
EndProperty
LosprocedimientosPropertyseusannormalmenteenparejas:PropertyLetconPropertyGetyPropertySetconPropertyGet.SisedeclaraunprocedimientoPropertyGetsóloescomosisedeclararaunapropiedadsólodelectura.ElusocombinadodelostresprocedimientosPropertysóloesútilenelcasodevariablesVariant,dadoquesólounavariableVariantpuedecontenerinformacióndeunobjetouotrotipodedatos.PropertySetestápensadopara
serusadoconobjetos,mientrasquePropertyLetnoloestá.
LosargumentosnecesariosparaunprocedimientoPropertysonlosqueaparecenenlatablasiguiente:
Procedimiento SintaxisdeladeclaraciónPropertyGetPropertyGetnombreprop(1,…,n)AstipoPropertyLetPropertyLetnombreprop(1,…,,,,n,n+1)PropertySet PropertySetnombreprop(1,…,n,n+1)
Desdeelprimerargumentohastaelpenúltimo(1,…,n)debencompartirlosmismosnombresytipodedatosentodoslosprocedimientosPropertyconelmismonombre.
LadeclaracióndeunprocedimientoPropertyGetaceptaunargumentomenosquelasdeclaracionesPropertyLetyPropertySet.EltipodedatosdelprocedimientoPropertyGetdebeserelmismoqueeltipodedelúltimoargumento(n+1)delasdeclaracionesPropertyLetyPropertySetcorrespondientes.Porejemplo,sisedeclaraelsiguienteprocedimientoPropertyLet,ladeclaraciónPropertyGetdebeusarargumentosconelmismonombreytipodedatosquelosargumentosdelprocedimientoPropertyLet.
PropertyLetNombres(intXAsInteger,intYAsInteger,varZAsVariant)
'Aquíunainstrucción.
EndProperty
PropertyGetNombres(intXAsInteger,intYAsInteger)AsVariant
'Aquíunainstrucción.
EndProperty
EltipodedatosdelúltimoargumentoenunadeclaraciónPropertySetdeberserdeltipodeobjetooVariant.
EscribirunprocedimientoSub
UnprocedimientoSubesunaseriedeinstruccionesVisualBasic,encerradasentreunpardeinstruccionesSubyEndSub,querealizanaccionesespecíficasperonodevuelvenningúnvalor.UnprocedimientoSubpuedeaceptarargumentos,comoconstantes,variablesoexpresionesquelepasaelprocedimientoquehaefectuadolallamada.SiunprocedimientoSubnotieneargumentos,lainstrucciónSubdebeincluirunpardeparéntesisvacío.
ElsiguienteprocedimientoSubdisponedecomentariosexplicativosencadalínea.
'DeclaraunprocedimientollamadoObtenInformacion
'EsteprocedimientoSubnoaceptaargumentos
SubObtenInformacion()
'Declaraunavariabledecadenallamadarespuesta
DimrespuestaAsString
'AsignaelvalorquedevuelvelafuncionInputBoxalavariablerespuesta
respuesta=InputBox(Prompt:="¿Cómosellama?")
'InstruccióncondicionalIf...Then...Else
Ifrespuesta=EmptyThen
'LlamaalafunciónMsgBox
MsgBoxPrompt:="Nohaescritosunombre."
Else
'FunciónMsgBoxconcatenadaconlavariablerespuesta
MsgBoxPrompt:="Sunombrees"&respuesta
'FindelainstrucciónIf...Then...Else
EndIf
'FindelprocedimientoSub
EndSub
Evitarconflictosdenombres
UnconflictodenombresSeproducealtratardecrearoutilizarunidentificadorqueyaestabadefinido.Enalgunoscasos,losconflictosdenombresgeneranerroresdeltipo"Detectadonombreambiguo"o"Declaraciónduplicadaenelalcance".Losconflictosdenombresquenosedetectanpuedenproducirfallosdeprogramaciónenelcódigoygenerarresultadoserróneos,especialmente,sinosedeclaranexplícitamentetodaslasvariablesantesdeutilizarlasporprimeravez.
Lamayorpartedelosconflictosdenombressepuedenevitarcomprendiendolascaracterísticasdealcancedelosidentificadoresdedatos,objetosyprocedimientos.VisualBasictienetresnivelesdealcance:niveldeprocedimiento,niveldemóduloprivadoyniveldemódulopúblico.
Elconflictodenombressepuedeproducircuandounidentificador:
Esvisibleenmásdeunniveldealcance.
Tienedossignificadosdistintosenelmismonivel.
Porejemplo,losprocedimientospertenecientesamódulosdistintospuedencompartirelmismonombre.Esposible,portanto,definirunprocedimientollamadoMiSubenlosmódulosMod1yMod2.Noseproduciráningúnconflictosicadaunodeestosprocedimientosesllamadoúnicamenteporotrosprocedimientosdesumismomódulo.Sinembargo,puedeproducirseunerrorsihayunallamadaaMiSubdesdeuntercermóduloynosehaproporcionadoningunaidentificaciónadicionalquepermitadistinguirentrelosdosMiSubexistentes.
Lamayorpartedelosconflictosdenombressepuedenevitarasignandoacada
identificadorunprefijoqueconsistaenelnombredelmóduloy,siesnecesario,unnombreproyecto.Porejemplo:
MiProyecto.MiMódulo.MiSubMiProyecto.MiMódulo.MiVariable
ElcódigoanteriorefectúaunallamadaalprocedimientoSubMiSubypasacomoargumentolavariableMiVariable.Sepuedeutilizarcualquiercombinacióndecalificadoresparadiferenciaridentificadoresinicialmenteidénticos.
VisualBasichacecorrespondercadareferenciaaunidentificadoraladeclaracióndeidentificador"másparecida"queencuentra.Porejemplo,siMiIdsedeclaracomoPublicendosmódulosdeunproyecto(Mod1yMod2),seráposibleespecificarsinningunacalificaciónelidentificadorMiIddeclaradoenMod2desdeelmismomóduloMod2,perodeberácalificarsecomoMod2.MyIdparaespecificarloenMod1.LomismoestambiénciertoenelcasodequeMod2estéenunproyectoalquesehacereferenciadirectamente,aunqueseadistinto.Sinembargo,siMod2estáenunproyectoalquesehacereferenciaindirectamente,esdecir,enunproyectoalquesehacereferenciaenelproyectodirectamentedereferencia,lasreferenciasalavariableMiIddelmóduloMod2debenirsiempreprecedidasporelnombredelproyectocomocalificador.SisehaceunareferenciaaMiIddesdeuntercermódulo,alquesehacereferenciadirectamente,larelaciónseestableceráconlaprimeradeclaraciónqueselocalicedurantelabúsqueda:
Proyectosalosquesehacereferenciadirectamente,enelordenenqueaparecenenelcuadrodediálogoReferenciasdelmenúHerramientas.
Losmódulosdecadaproyecto.Observequenohayningúnordeninherentealosmódulosdeunproyecto.
Nosepuedenutilizarnuevamentenombresdeobjetosdelaaplicaciónhost,porejemploR1C1enMicrosoftExcel,adistintosnivelesdealcance.
SugerenciaNombresambiguos,declaracionesduplicadas,identificadoresnodeclaradosyprocedimientosnolocalizablessonalgunosdeloserroresmáscomunescausadosporconflictosdenombres.Esposibleevitaralgunosposiblesconflictosdenombresyloserroresdeprogramaciónasociados,iniciandocada
móduloconunainstrucciónOptionExplicitqueobligaadeclararexplícitamentelasvariablesantesdequepuedanserutilizadas.
HacerbuclesFor...Nextmásrápidos
LosenterosutilizanmenosmemoriaquelostiposdedatosVariantysuactualizaciónesalgomásrápida.Sinembargo,ladiferenciasóloesapreciablesiserealizanmuchosmilesdeoperaciones.Porejemplo:
DimCuentaRápidoAsInteger'Primercaso,utilizaInteger.
ForCuentaRápido=0to32766
NextCuentaRápido
DimCuentaLentoAsVariant'Segundocaso,utilizaVariant.
ForCuentaLento=0to32766
NextCuentaLento
Elprimerodelosdoscasosconsumeuntiempoligeramentemenorensuejecución.Sinembargo,siCuentaRápidotomaunvalorsuperiora32.767,seproduciráunerror.ParacorregirelerrorsepuedehacerqueCuentaRápidopasea
serdeltipodedatosLong,queadmiteunagamamásampliadevaloresenteros.Engeneral,cuantomáspequeñoseaeltipodedatos,menostiemposeconsumiráensuactualización.SiseutilizaVariantseconsumiráalgomásdetiempoquesiseempleaunodelostiposdedatosequivalentes.
Llamaraprocedimientosconelmismonombre
Esposibleefectuarunallamadaaunprocedimientoubicadoencualquiermódulodelmismoproyectoqueelmóduloactivodelamismaformaenqueseharíaunallamadaaunodelosprocedimientosdelmóduloactivo.Sinembargo,sidosomásmóduloscontienenunprocedimientodelmismonombre,esnecesarioespecificarelnombredelmóduloenlainstruccióndellamada,talycomomuestraelsiguienteejemplo:
SubPrincipal()
Módulo1.MiProcedimiento
EndSub
Siseasignaelmismonombreadosprocedimientosdistintosdedosproyectosdiferentes,esprecisoespecificarelnombredeproyectocuandosehagaunallamadaalprocedimiento.Porejemplo,elsiguienteprocedimientoefectúaunallamadaalprocedimientoPrincipaldelmóduloMiMóduloenelproyecto
MiProyecto.vbp.
SubPrincipal()
[MiProyecto.vbp].[MiMódulo].Principal
EndSub
NotaLasdistintasaplicacionesdandiversosnombresaunproyecto.Asíporejemplo,enMicrosoftAccess,aunproyectoseleconocecomounabasededatos(.mdb);enMicrosoftExcel,sedenominalibrodetrabajo(.xls)
Sugerenciasparaefectuarllamadasaprocedimientos
Sicambiaelnombredeunmódulooproyecto,asegúresedecambiartodaslasreferenciasalnombredelmódulooproyectosentodaslasinstruccionesdellamada,delocontrario,VisualBasicnoserácapazdelocalizarelprocedimientollamado.PuedeutilizarelcomandoReemplazardelmenúEditarparaencontraryreemplazareltextocorrespondienteenunmódulo.
Paraevitarconflictosdenombresentreproyectosalosquesehacereferenciaesaconsejabledaracadaprocedimientounnombreúnicodeformaqueseaposiblehacerllamadasalosprocedimientossintenerqueespecificarunnombredemódulooproyecto.
LlamaraprocedimientosProperty
EnlasiguientetablasemuestralasintaxisaemplearenlasllamadasaprocedimientosProperty:
ProcedimientoProperty SintaxisPropertyLet [objeto.]nombreprop(argumentos)]=argumentoPropertyGet nombrevar=[objeto.]nombreprop(argumentos)]PropertySet Set[objeto.]nombreprop[.(argumentos)]=
nombrevar
CuandoseefectúaunallamadaalosprocedimientosPropertyLetoPropertySet,aladerechadelsignoigual(=)debesiempreaparecerunargumento.
CuandosedeclaranunprocedimientoPropertyLetoPropertySetconmúltiplesargumentos,VisualBasicpasaelargumentosituadoaladerechadelainstruccióndellamadaalúltimodelosargumentosqueapareceenladeclaración
dePropertyLetoPropertySet.Porejemplo,elsiguientediagramamuestralacorrespondenciaexistenteentrelosargumentosdelallamadaalprocedimientoPropertyconlosargumentosdeladeclaraciónPropertyLet:
Enlapráctica,losprocedimientosdepropiedadesconmúltiplesargumentossólosirvenparacrearmatricesdepropiedades.
LlamaraprocedimientosSubyFunction
ParaefectuarunallamadaaunprocedimientoSubdesdeotroprocedimiento,escribaelnombredelprocedimientoeincluyavaloresparatodoslosargumentosrequeridos.NoesnecesariaunainstrucciónCall,perosilautiliza,losargumentosdebenaparecerencerradosentreparéntesis.
SepuedeutilizarunprocedimientoSubparaorganizarotrosprocedimientosdeformaqueseanmásfácilesdeentenderydepurar.Enelsiguienteejemplo,elprocedimientoSubPrincipalefectúaunallamadaalprocedimientoSubMultiBeep,pasandocomoargumentoelvalor56.DespuésdequeMultiBeepacabasuejecución,elcontrolvuelveaPrincipalyPrincipalllamaalprocedimientoSubMensaje.Mensajepresentaenpantallauncuadrodemensaje;cuandoelusuariohaceclicenAceptar,elcontrolvuelveaPrincipalyPrincipaltermina.
SubPrincipal()
MultiBeep56
Mensaje
EndSub
SubMultiBeep(númbips)
Forcontador=1Tonúmbips
Beep
Nextcontador
EndSub
SubMensaje()
MsgBox"¡Eshoradedescansar!"
EndSub
LlamaraprocedimientosSubconmásdeunargumento
ElsiguienteejemplomuestradosformasdellamaraunprocedimientoSubconmásdeunargumento.LasegundavezquesellamaaCalcuCasa,esnecesarioutilizarparéntesisaambosladosdelosargumentosyaqueseutilizalainstrucciónCall.
SubPrincipal()
CalcuCasa99800,43100
CallCalcuCasa(380950,49500)
EndSub
SubCalcuCasa(precioAsSingle,salarioAsSingle)
If2.5*salario<=0.8*precioThen
MsgBox"Nopuedepermitirseestacasa."
Else
MsgBox"Estacasaestáasualcance."
EndIf
EndSub
UtilizarparéntesisalefectuarllamadasaprocedimientosFunction
Parautilizarelvalorquedevuelveunafuncióndebeasignarlafunciónaunavariableyencerrarlosargumentosentreparéntesis,talycomomuestraelsiguienteejemplo.
Respuesta3=MsgBox("¿Estácontentoconsusalario?",4,"Pregunta3")
Sinoestáinteresadoenelvalorquedevuelveunafunción,puedeefectuarlallamadaalafuncióndelamismaformaquesillamaraaunprocedimientoSub.Noutilicelosparéntesis,incluyaunalistadeargumentosynoasignelafunciónaunavariable,todoellocomomuestraelsiguienteejemplo.
MsgBox"¡Tareaconcluida!",0,"Cuadrodetarea"
PrecauciónSienelejemploanteriorseincluyenparéntesis,lainstrucciónpuedeproducirunerrordesintaxis.
Transferirargumentosconnombre
UnainstruccióndeunprocedimientoSuboFunctionpuedepasarvaloresalosprocedimientosquellamamedianteargumentosconnombre.Losargumentosconnombrepuedenaparecerencualquierorden.Unargumentoconnombresecomponedelnombredelargumentoseguidopordospuntosyunsignoigual(:=)yelvalorasignadoalargumento.
ElsiguienteejemploefectúaunallamadaalafunciónMsgBoxutilizandoargumentosconnombrequenodevuelvenningúnvalor.
MsgBoxTitulo:="Cuadrodetarea",Mensaje:="¡Tareaconcluida!"
ElsiguienteejemplollamaalafunciónMsgBoxempleandoargumentosconnombre.Elvalorquedevuelvelafunciónseasignaalavariablerespuesta3.
respuesta3=MsgBox(Titulo:="Pregunta3",_
Mensaje:="¿Estásatisfechoconsusalario?",Botones:=4)
ReglasdeasignacióndenombresenVisualBasic
Paradarnombreaprocedimientos,constantes,variablesyargumentosenunmódulodeVisualBasichandeseguirselassiguientesreglas:
Elprimercarácterdebeserunaletra.
Enelnombrenosepuedenutilizarespacios,puntos(.),signosdeinterjección(!),niloscaracteres@,&,$,#.
Elnombrenopuedetenermásde255caracteresdelongitud.
Comoreglageneral,nosedebenusarnombresigualesalosdelosprocedimientosFunction,instruccionesymétodosdeVisualBasic.Alfinalpuedeterminarusandolasmismaspalabrasclavequeutilizaellenguaje.Parautilizarunafunciónintrínsecadellenguaje,ounainstrucciónométodo,cuyonombrecoincideconunodelosnombresasignados,esprecisoidentificarlosexplícitamente.Paraellosesitúadelantedelnombredelafunciónintrínseca,instrucciónométodo,elnombredelabibliotecadetiposasociada.Porejemplo,siutilizaunavariablellamadaLeft,laúnicaformadeutilizarlafunciónLeftesescribiendoVBA.Left.
Losnombresnosepuedenrepetirdentrodelmismoniveldealcance.Porejemplo,nosepuedendeclarardosvariablesconelnombreedaddentrodelmismoprocedimiento.Sinembargo,sepuededeclararunavariableprivadaedadyunavariabledeniveldeprocedimientollamadaedaddentrodelmismomódulo.NotaVisualBasicnodiferenciaentremayúsculasyminúsculas,perorespetalaformaenqueseescribenlasinstruccionesdedeclaracióndenombres.
Trabajarconotrasaplicaciones
VisualBasicpuedecrearnuevosobjetosyrecuperarotrosyaexistentesenmuchasaplicacionesMicrosoft.OtrasaplicacionespuedenproporcionartambiénobjetosquesepuedencrearusandoVisualBasic.Consulteladocumentacióndelaaplicaciónparamásdetalles.
Paracrearunnuevoobjetouobtenerunoyaexistentedeotraaplicación,seutilizanlasfuncionesCreateObjectoGetObject,respectivamente:
'ArrancaMicrosoftExcelycrearunnuevoobjetoWorksheet.
SetExcelWorksheet=CreateObject("Excel.Sheet")
'ArrancaMicrosoftExcelyabreunobjetoWorksheetyaexistente.
SetExcelWorksheet=GetObject("Hoja1.XLS")
'ArrancarMicrosoftWord.
SetWordBasic=CreateObject("Word.Basic")
LamayorpartedelasaplicacionesdisponendeunmétodoExitoQuitquepermitecerrarlaaplicacióninclusocuandonoestávisible.Sideseamásinformaciónsobreobjetos,métodosypropiedadesqueproporcionaunadeterminadaaplicación,consultesudocumentación.
AlgunasaplicacionespermitenusarlapalabraclaveNewparacrearunobjetodecualquieradelasclasesqueexistenensubibliotecadetipos.Porejemplo:
DimXAsNewField
Enestecaso,Fieldesunejemplodeunadelasclasesexistentesenlabibliotecatipodeaccesodedatos.Secreaasí,conestasintaxis,unanuevadefinicióndelobjetoField.Consulteladocumentacióndelaaplicacióncorrespondienteparadeterminarlasclasesdeobjetoquesepuedencreardeestaforma.
Transferirargumentoseficientemente
Todoslosargumentossepasanalosprocedimientosporreferencia,amenosqueseespecifiquelocontrario.Estaformadeactuareseficienteyaqueseconsumeelmismotiempoyelmismoespaciodealmacenamientodentrodelprocedimiento(4bytes)parapasartodoslosargumentos,seacualseasutipodedatos.
SepuedepasarunargumentoporvalorsiseincluyelapalabraclaveByValenladeclaracióndelprocedimiento.Losargumentosquesepasanporvalorconsumenentre2y16bytesdealmacenamientodelprocedimiento,dependiendodeltipo
dedatosdelargumento.Lostiposdedatosmáslargosconsumenmástiempoalpasarporvalorquelostiposmáspequeños.Porestarazón,lostiposdedatosStringyVariantnodeberíanpasarsenormalmenteporvalor.
Alpasarunargumentoporvalorsecopialavariableoriginal.Loscambiosquepuedasufrirelargumentodentrodelprocedimientonotienenningúnefectosobrelavariableoriginal.Porejemplo:
FunctionFactorial(ByValMiVarAsInteger)'Functiondeclaration.
MiVar=MiVar-1
IfMiVar=0Then
Factorial=1
ExitFunction
EndIf
Factorial=Factorial(MiVar)*(MiVar+1)
EndFunction
'LlamaaFactorialconunavariableS.
S=5
PrintFactorial(S)'Muestraenpantalla120(factorialde5)
PrintS'Muestraenpantalla5.
SinoseincluyeByValenladeclaracióndelafunción,lasinstruccionesPrintpresentaríanenpantallalosvalores1y0.LacausaesqueMiVarharíareferenciaentoncesalavariableS,quebajadevalorde1en1hastaquevale0.
DadoqueByValhaceunacopiadelargumento,permitepasarunavariantealafunciónFactorialdelejemploanterior.Nosepuedepasarunavarianteporreferenciasielprocedimientoquedeclaraelargumentoesdeuntipodedatosdistinto.
Utilizarconstantes
Elcódigopuedecontenervaloresconstantesdeusofrecuente,opuededependerdeciertosnúmerosdifícilesderecordaroconunsignificadooscuro.Puedehacer
quesucódigoseademásfácillecturaymantenimientoempleandoconstantes.Unaconstanteesunnombreconsignificadoquereemplazaaunnúmeroocadenadetextoquenovaasufrircambios.Noesposiblemodificarunaconstante,niasignarleunnuevovalor,comoaunavariable.
Haytrestiposdeconstantes:
Constantesintrínsecasoconstantesdefinidasporelsistema,quesonproporcionadasporlasaplicacionesycontroles.Otrasaplicacionesqueproporcionanbibliotecasdeobjetos,comoMicrosoftAccess,MicrosoftExcel,MicrosoftProject,yMicrosoftWord,tambiénproporcionanunalistadeconstantesquesepuedenutilizarconsusobjetos,métodosypropiedades.EnelExaminadordeobjetosesposibleobtenerunalistadelasconstantesproporcionadasporcadabibliotecadeobjetosindividual
LasconstantesdeVisualBasicaparecenrelacionadasenlabibliotecadeVisualBasicforApplicationsyenlabibliotecaDataAccessObject(DAO).
NotaVisualBasicsiguereconociendoconstantesdeaplicacionescreadasconversionesanterioresdeVisualBasicoVisualBasicforApplications.EsposibleactualizarlasconstantesparautilizarsólolasqueaparecenenelExaminadordeobjetos.LasconstantesqueaparecenenelExaminadordeobjetosnotienequedeclararseensuaplicación.
Constantessimbólicasodefinidasporelusuario,sedeclaranmediantelainstrucciónConst.
Constantesdecompilacióncondicionalquesedeclaranempleandolainstrucción#Const.
EnversionesanterioresdeVisualBasic,losnombresdeconstantesserepresentabannormalmenteenmayúsculasyconguionesdesubrayado.Porejemplo:
MOSAICO_HORIZONTAL
Lasconstantesintrínsecascuentanahoraconuncalificadorparaevitarlas
confusionescuandohayconstantesconelmismonombreenmásdeunabibliotecadeobjetos,oconstantesquepuedentenerasignadosvaloresdistintos.Haydosformasdecualificarlosnombresdelasconstantes:
Conunprefijo
Conunareferenciaalabiblioteca
Calificarconstantesporprefijo
Lasconstantesintrínsecasproporcionadasportodoslosobjetostienennombresenmayúsculasyminúsculas,conunprefijode2caracteresqueindicalabibliotecadeobjetosquedefinelaconstante.LasconstantesdelabibliotecadeobjetosVisualBasicforApplicationstienenelprefijo"vb"ylasconstantesdelabibliotecadeobjetosMicrosoftExcelllevanelprefijo"xl".Lossiguientesejemplosmuestranlasvariacionesentrelosprefijosdeloscontroles,enfuncióndelabibliotecadetipos.
vbTileHorizontal
xlDialogBorder
Calificarconstantesporreferenciaabiblioteca
Tambiénesposiblecualificarlareferenciaaunaconstanteempleandolasiguientesintaxis:
[nombrebiblioteca.][nombremodulo.]nombreconstante
Lasintaxisparacualificarconstantesconstadeestaspartes:
Parte Descripciónnombrebiblioteca Opcional.Elnombredelabibliotecatipoquedefineala
constante.Paralamayorpartedeloscontroles(noestádisponibleenMacintosh),setratatambiéndelnombredeclasedelcontrol.Sinorecuerdaelnombredeclasedelcontrol,sitúeelpunterodelmouse(ratón)sobreelcontrolenlacajadeherramientas.ElnombredeclaseapareceráenelToolTip.
nombremodulo Opcional.Elnombredelmódulo,dentrodelabibliotecatipoquedefinealaconstante.SepuedeconocerelnombredelmóduloempleandoelExaminadordeobjetos.
nombreconstante Elnombredefinidoparalaconstanteenlabibliotecatipo..
Porejemplo:
Threed.LeftJustify
UtilizarinstruccionesDo...Loop
SepuedenusarinstruccionesDo...Loopparaejecutarunbloquedeinstruccionesunnúmeroindefinidodeveces.LasinstruccionesserepitenmientrasunacondiciónseaTrueohastaquellegueaserTrue.
RepetirinstruccionesmientrasunacondiciónesTrue
HaydosformasdeutilizarlapalabraclaveWhileparacomprobarelestadodeunacondiciónenunainstrucciónDo...Loop.Sepuedecomprobarlacondiciónantesdeentrarenelbucle,odespuésdequeelbuclesehayaejecutadoalmenosunavez.
EnelsiguienteprocedimientoComPrimeroWhile,lacondiciónsecompruebaantesdeentrarenelbucle.SimiNumvale9envezde20,lasinstruccionescontenidasenelbuclenoseejecutaránnunca.EnelprocedimientoComFinalWhile,lasinstruccionescontenidasenelbuclesóloseejecutaránunavezantesdequelacondiciónllegueaserFalse.
SubComPrimeroWhile()
contador=0
miNum=20
DoWhilemiNum>10
miNum=miNum-1
contador=contador+1
Loop
MsgBox"Elbucleseharepetido"&contador&"veces."
EndSub
SubComFinalWhile()
contador=0
miNum=9
Do
miNum=miNum-1
contador=contador+1
LoopWhilemiNum>10
MsgBox"Elbucleseharepetido"&contador&"veces."
EndSub
RepetirinstruccioneshastaqueunacondiciónllegueaserTrue
HaydosformasdeutilizarlapalabraclaveUntilparacomprobarelestadodeunacondiciónenunainstrucciónDo...Loop.Sepuedecomprobarlacondiciónantesdeentrarenelbucle(comomuestraelprocedimientoComPrimeroUntil)osepuedencomprobardespuésdequeelbuclesehayaejecutadoalmenosunavez(comomuestraelprocedimientoComFinalUntil).ElbuclesigueejecutándosemientraslacondiciónsigasiendoFalse.
SubComPrimeroUntil()
contador=0
miNum=20
DoUntilmiNum=10
miNum=miNum-1
contador=contador+1
Loop
MsgBox"Elbucleseharepetido"&contador&"veces."
EndSub
SubComFinalUntil()
contador=0
miNum=1
Do
miNum=miNum+1
contador=contador+1
LoopUntilmiNum=10
MsgBox"Elbucleseharepetido"&counter&"veces."
EndSub
InstruccióndesalidadeDo...Loopdesdedentrodelbucle
EsposiblesalirdeDo...LoopusandolainstrucciónExitDo.Porejemplo,parasalirdeunbuclesinfin,sepuedeusarlainstrucciónExitDoenelbloquedeinstruccionesTruedeunainstrucciónIf...Then...ElseoSelectCase.SilacondiciónesFalse,elbucleseguiráejecutándosenormalmente.
Enelsiguienteejemplo,seasignaamiNumunvalorquecreaunbuclesinfin.LainstrucciónIf...Then...Elsecompruebaesacondiciónyejecutaentonceslasalida,evitandoasíelbuclesinfin.
SubEjemploSalida()
contador=0
miNum=9
DoUntilmiNum=10
miNum=miNum-1
contador=contador+1
IfmiNum<10ThenExitDo
Loop
MsgBox"Elbucleseharepetido"&contador&"veces."
EndSub
NotaParadetenerlaejecucióndeunbuclesinfin,presionelateclaESCoCTRL+PAUSE.
UtilizarinstruccionesForEach...Next
LasinstruccionesForEach...Nextrepitenunbloquedeinstruccionesparacadaunodelosobjetosdeunacolecciónoparacadaelementodeunamatriz.VisualBasicasignavalorautomáticamenteaunavariablecadavezqueseejecutaelbucle.Porejemplo,elsiguienteprocedimientocierratodoslosformulariosexceptoelquecontienealprocedimientoqueseestáejecutando.
SubCierraFormul()
ForEachfrmInApplication.Forms
Iffrm.Caption<>Screen.ActiveForm.CaptionThenfrm.Close
Next
EndSub
ElsiguientecódigorecorretodosloselementosdeunamatrizeintroduceencadaunodeelloselvalordelavariableíndiceI.
DimPruebaMatriz(10)AsInteger,IAsVariant
ForEachIInPruebaMatriz
PruebaMatriz(I)=I
NextI
Recorrerunconjuntodeceldas
SepuedeusarelbucleForEach...Nextpararecorrerlasceldaspertenecientesaunrangodeterminado.ElsiguienteprocedimientorecorrelasceldasdelrangoA1:D10delaPágina1yconviertecualquiervalorabsolutomenorde0,01en0(cero).
SubRedondeoACero()
ForEachmiObjetoinmiColeccion
IfAbs(miObjeto.Value)<0.01ThenmiObjeto.Value=0
Next
EndSub
SalirdeunbucleForEach...Nextantesdequefinalice
SepuedesalirdeunbucleForEach...NextmediantelainstrucciónExitFor.Porejemplo,cuandoseproduceunerrorsepuedeusarlainstrucciónExitForenelbloquedeinstruccionesTruedeunainstrucciónIf...Then...ElseoSelectCasequedetecteespecíficamenteelerror.Sielerrornoseproduce,lainstrucciónIf…Then…ElseesFalseyelbucleseseguiráejecutandonormalmente.
ElsiguienteejemplodetectalaprimeraceldadelrangoA1:B5quenocontieneunnúmero.Siseencuentraunaceldaenesascondiciones,sepresentaunmensajeenpantallayExitForabandonaelbucle.
SubBuscaNumeros()
ForEachmiObjetoInMiColeccion
IfIsNumeric(miObjeto.Value)=FalseThen
MsgBox"Elobjetocontieneunvalornonumérico."
ExitFor
EndIf
Nextc
EndSub
UtilizarinstruccionesFor...Next
LasinstruccionesFor...Nextsepuedenutilizarpararepetirunbloquedeinstruccionesunnúmerodeterminadodeveces.LosbuclesForusanunavariablecontadorcuyovalorseaumentaodisminuyecadavezqueseejecutaelbucle.
Elsiguienteprocedimientohacequeelequipoemitaunsonido50veces.LainstrucciónFordeterminalavariablecontadorxysusvaloresinicialyfinal.LainstrucciónNextincrementaelvalordelavariablecontadoren1.
SubBips()
Forx=1To50
Beep
Nextx
EndSub
MediantelapalabraclaveStep,sepuedeaumentarodisminuirlavariablecontadorenelvalorquesedesee.Enelsiguienteejemplo,lavariablecontadorjseincrementaen2cadavezqueserepitelaejecucióndelbucle.Cuandoelbucledejadeejecutarse,totalrepresentalasumade2,4,6,8y10.
SubDosTotal()
Forj=2To10Step2
total=total+j
Nextj
MsgBox"Eltotales"&total
EndSub
ParadisminuirlavariablecontadorutiliceunvalornegativoenStep.Paradisminuirlavariablecontadoresprecisoespecificarunvalorfinalqueseamenorqueelvalorinicial.Enelsiguienteejemplo,lavariablecontadormiNumsedisminuyeen2cadavezqueserepiteelbucle.Cuandoterminalaejecucióndelbucle,totalrepresentalasumade16,14,12,10,8,6,4y2.
SubNuevoTotal()
FormiNum=16To2Step-2
total=total+miNum
NextmiNum
MsgBox"Eltotales"&total
EndSub
NotaNoesnecesarioincluirelnombredelavariablecontadordespuésdelainstrucciónNext.Enlosejemplosanteriores,elnombredelavariablecontadorsehaincluidoparafacilitarlalecturadelcódigo.
SepuedeabandonarunainstrucciónFor...Nextantesdequeelcontadoralcancesuvalorfinal,paraelloseutilizalainstrucciónExitFor.Porejemplo,siseproduceunerrorsepuedeusarlainstrucciónExitForenelbloquedeinstruccionesTruedeunainstrucciónIf...Then...ElseoSelectCasequedetecteespecíficamenteeseerror.Sielerrornoseproduce,lainstrucciónIf…Then…ElseesFalseyelbuclecontinuaráejecutándosenormalmente.
UtilizarinstruccionesIf...Then...Else
SepuedeusarlainstrucciónIf...Then...Elseparaejecutarunainstrucciónobloquedeinstruccionesdeterminadas,dependiendodelvalordeunacondición.LasinstruccionesIf...Then...Elsesepuedenanidarentantosnivelescomoseanecesario.Sinembargo,parahacermáslegibleelcódigoesaconsejableutilizarunainstrucciónSelectCaseenvezderecurriramúltiplesnivelesdeinstruccionesIf...Then...Elseanidadas.
EjecutarunasolainstruccióncuandounacondiciónesTrue
ParaejecutarunasolainstruccióncuandounacondiciónesTrue,sepuedeusarlasintaxisdelíneaúnicadelainstrucciónIf...Then...Else.Elsiguienteejemplomuestralasintaxisdelíneaúnica,enlaqueseomiteelusodelapalabraclaveElse:
SubFijarFecha()
miFecha=#13/2/95#
IfmiFecha<NowThenmiFecha=Now
EndSub
Paraejecutarmásdeunalíneadecódigo,esprecisoutilizarlasintaxisdemúltipleslíneas.EstasintaxisincluyelainstrucciónEndIf,talycomomuestraelsiguienteejemplo:
SubAvisoUsuario(valorasLong)
Ifvalor=0Then
Aviso.ForeColor="Red"
Aviso.Font.Bold=True
Aviso.Font.Italic=True
EndIf
EndSub
EjecutarunasinstruccionesdeterminadassiunacondiciónesTrueyejecutarotrassiesFalse
UseunainstrucciónIf...Then...Elseparadefinirdosbloquesdeinstruccionesejecutables:unbloquequeseejecutarácuandolacondiciónesTrueyelotroqueseejecutarásilacondiciónesFalse.
SubAvisoUsuario(valorasLong)
Ifvalor=0Then
Aviso.ForeColor=vbRed
Aviso.Font.Bold=True
Aviso.Font.Italic=True
Else
Aviso.Forecolor=vbBlack
Aviso.Font.Bold=False
Aviso.Font.Italic=False
EndIf
EndSub
Comprobarunasegundacondiciónsilaprimera
condiciónesFalse
SepuedenañadirinstruccionesElseIfaunainstrucciónIf...Then...ElseparacomprobarunasegundacondiciónsilaprimeraesFalse.Porejemplo,elsiguienteprocedimientofuncióncalculaunabonificaciónsalarialdependiendodelaclasificacióndeltrabajador.LainstrucciónquesiguealainstrucciónElsesóloseejecutacuandolascondicionesdetodaslasrestantesinstruccionesIfyElseIfsonFalse.
FunctionBonificación(rendimiento,salario)
Ifrendimiento=1Then
Bonificación=salario*0.1
ElseIfrendimiento=2Then
Bonificación=salario*0.09
ElseIfrendimiento=3Then
Bonificación=salario*0.07
Else
Bonificación=0
EndIf
EndFunction
UtilizarinstruccionesSelectCase
LainstrucciónSelectCaseseutilizacomoalternativaalasinstruccionesElseIfeninstruccionesIf...Then...Elsecuandosecomparaunaexpresiónconvariosvaloresdiferentes.MientrasquelasinstruccionesIf...Then...ElsepuedencompararunaexpresióndistintaparacadainstrucciónElseIf,lainstrucciónSelectCasecomparaúnicamentelaexpresiónqueevalúaalcomienzodelaestructuradecontrol.
Enelsiguienteejemplo,lainstrucciónSelectCaseevalúaelargumentorendimientoquesepasaalprocedimiento.ObservequecadainstrucciónCasepuedecontenermásdeunvalor,unagamadevalores,ounacombinacióndevaloresyoperadoresdecomparación.LainstrucciónopcionalCaseElseseejecutasilainstrucciónSelectCasenoencuentraningunaigualdadconlosvaloresdelainstruccionesCase.
FunctionBonificación(rendimiento,salario)
SelectCaserendimiento
Case1
Bonificación=salario*0.1
Case2,3
Bonificación=salario*0.09
Case4To6
Bonificación=salario*0.07
CaseIs>8
Bonificación=100
CaseElse
Bonificación=0
EndSelect
EndFunction
UtilizarinstruccionesWith
LainstrucciónWithpermiteespecificarunavezunobjetootipodefinidoporelusuarioenunaserieenteradeinstrucciones.LasinstruccionesWithaceleranlaejecucióndelosprocedimientosyayudanaevitareltenerqueescribirrepetidasveceslasmismaspalabras.
Elsiguienteejemplointroduceenunrangodeceldaselnúmero30,aplicaaesasceldasunformatoennegritayhacequesucolordefondoseaelamarillo.
SubRangoFormato()
WithWorksheets("Hoja1").Range("A1:C10")
.Value=30
.Font.Bold=True
.Interior.Color=RGB(255,255,0)
EndWith
EndSub
LasinstruccionesWithsepuedenanidarparaaumentarsueficiencia.ElsiguienteejemploinsertaunaformulaenlaceldaA1yseleccionaacontinuacióneltipodeletra.
SubMiEntrada()
WithWorkbooks("Libro1").Worksheets("Hoja1").Cells(1,1)
.Formula="=SQRT(50)"
With.Font
.Name="Arial"
.Bold=True
.Size=8
EndWith
EndWith
EndSub
Utilizarlostiposdedatoseficientemente
Amanosqueseespecifiquelocontrario,alasvariablesnodeclaradasselesasignaeltipodedatosVariant.Estetipodedatosfacilitalaescrituradeprogramas,peronosiempreeseltipodedatosmáseficienteensuutilización.
Esaconsejablepensarenusarotrostiposdedatossi:
Elprogramaesmuygrandeyutilizamuchasvariables.
Elprogramadebeejecutarseconlamáximarapidez.
Seescribendatosenarchivosdeaccesodirecto.
AdemásdeVariant,sepuedenutilizarlossiguientestiposdedatosByte,Boolean,Integer,Long,Single,Double,Currency,Decimal,Date,ObjectyString.UselainstrucciónDimparadeclararunavariabledeuntipodeterminado,porejemplo:
DimXAsInteger
EstainstruccióndeclaraquelavariableXesunentero—unnúmeronodecimal
comprendidoentre32.768y32.767.SisetratadeasignaraXunnúmerofueradeesemargen,seproduciráunerror.SisetratadeasignaraXunafracción,elnúmeroseredondeará.Porejemplo:
X=32768'Causaunerror.
X=5.9'Asignaaxelvalor6.
Utilizarmatrices
Sepuededeclararunamatrizparaoperarconunconjuntodevaloresdelmismotipodedatos.Unamatrizesunaúnicavariableconmuchoselementosenquesepuedenalmacenarvalores,mientrasqueunavariablenormaltienesólounáreadealmacenamientoenelquesólosepuedearchivarunvalor.Puedereferirsealamatrizcomountodocuandosetratadehacerreferenciaatodoslosvaloresquecontiene,obienhacerreferenciaasuselementosindividuales.
Porejemplo,paraalmacenarlosgastosdiariosdetodoslosdíasdelañosepuededeclararunavariablematrizcon365elementos,mejorquedeclarar365
variables.Cadaelementodeunamatrizcontieneunvalor.LasiguienteinstruccióndeclaralavariablematrizcurGastoscon365elementos.Sinoseespecificalocontrario,elíndicedeunamatrizcomienzaporelcero,conloqueellímitesuperiordelamatrizes364envezde365.
DimcurGastos(364)AsCurrency
Paradarvaloraunelementoindividual,esprecisoespecificarelíndicedelelemento.Elsiguienteejemploasignaunvalorinicialde20atodosloselementosdelamatriz.
SubLlenarMatriz()
DimcurGastos(364)AsCurrency
DimintIAsInteger
ForintI=0to364
curGastos(intI)=20
Next
EndSub
Cambiarellímiteinferior
SepuedeusarlainstrucciónOptionBasealprincipiodeunmóduloparacambiarelíndicepredefinidodelprimerelementodel0al1.Enelsiguienteejemplo,lainstrucciónOptionBasecambiaelíndicedelprimerelementoylainstrucciónDimdeclaralavariablematrizcurGastoscon365elementos.
OptionBase1
DimcurGastos(365)AsCurrency
TambiénsepuedefijardeformaexplícitaellímiteinferiordeunamatrizmedianteelusodelacláusulaTotalycomomuestraelsiguienteejemplo.
DimcurGastos(1To365)AsCurrency
DimstrDiaSemana(7To13)AsString
AlmacenarvaloresVariantenmatrices
HaydosformasdecrearmatricesdevaloresVariant.UnaformaconsisteendeclararunamatrizcomodeltipodedatosVariant,talycomomuestraelsiguienteejemplo:
DimvarDatos(3)AsVariant
varDatos(0)="CristinaMartínez"
varDatos(1)="C/DonRamóndelaCruz,73"
varDatos(2)=38
varDatos(3)=Format("06-09-1952","Fechageneral")
LaotraformaconsisteenasignarlamatrizquedevuelvelafunciónMatrizaunavariableVariant,talycomomuestraelsiguienteejemplo.
DimvarDatosAsVariant
varDatos=Array("CristinaMartínez","C/DonRamóndelaCruz,73",38,_
Format("06-09-1952","Fechageneral"))
LoselementosdeunamatrizdevaloresVariantseidentificanmediantesuíndice,seacualsealatécnicaquesehayausadoparacrearlamatriz.Porejemplo,lasiguienteinstrucciónpodríaañadirseacualquieradelosejemplosanteriores.
MsgBox"Losdatosde"&varDatos(0)&"sehanguardado."
Utilizarmatricesconmúltiplesdimensiones
EnVisualBasicsepuedendeclararmatricesconhasta60dimensiones.Porejemplo,lasiguienteinstruccióndeclaraunamatrizdedosdimensiones,de5por10.
DimsngMulti(1To5,1To10)AsSingle
Siconsideraalamatrizcomounatabladedosentradas,elprimerargumento
representaríaalasfilasyelsegundoalascolumnas.
UtiliceinstruccionesFor...Nextparaoperarconmatricesdedimensionesmúltiples.ElsiguienteprocedimientollenaunamatrizbidimensionalconvaloresSingle.
SubLlenaMatrizMulti()
DimintIAsInteger,intJAsInteger
DimsngMulti(1To5,1To10)AsSingle
'Llenamatrizconvalores.
ForintI=1To5
ForintJ=1To10
sngMulti(intI,intJ)=intI*intJ
Debug.PrintsngMulti(intI,intJ)
NextintJ
NextintI
EndSub
Utilizarparéntesisenelcódigo
LosprocedimientosSub,lasinstruccionesintegradasyalgunosmétodosnodevuelvenvaloralguno,porloquelosargumentosnoaparecenentreparéntesis.Porejemplo:
MiSub"stringArgumento",integerArgumento
LosprocedimientosFunction,lasfuncionesintegradasyalgunosmétodosdevuelvenalgúnvalor,quepuedeserignorado.Sisevaaignorarelvalordevuelto,noesnecesarioincluirparéntesis.LallamadaalafunciónseharáigualquesiseestuvierallamandoaunprocedimientoSub.Omitiendolosparéntesis,incluyendounalistadeargumentos(siloshay)ynoasignandolafunciónaunavariable.Porejemplo:
MsgBox"¡Tareaconcluida!",0,"Cuadrodetarea"
Parautilizarelvalorquedevuelveunafunción,losargumentosdebenencerrarseentreparéntesistalycomomuestraelsiguienteejemplo.
Respuesta3=MsgBox("¿Estásatisfechoconsusalario?",4,"Pregunta3")
UnainstruccióndeunprocedimientoSuboFunctionpuedepasarvaloresalprocedimientoalquellamamedianteargumentosconnombre.Lasnormasparaelusodeparéntesisseaplicantantosiseusanargumentosconnombrecomosino.Cuandoseusanargumentosconnombresepuedencolocarencualquierordenysepuedenomitirlosargumentosopcionales.Losargumentosconnombrevansiempreseguidospordospuntosyunsignoigual(:=)yfinalmenteelvalordelargumento.
ElsiguienteejemploefectúaunallamadaalafunciónMsgBoxutilizandoargumentosconnombre,altiempoqueignoraelvalorquedevuelvelafunción:
MsgBoxTitle:="Cuadrodetarea",Prompt:="¡Tareaconcluida!"
ElsiguienteejemploefectúaunallamadaalafunciónMsgBoxutilizandoargumentosconnombreyasignaelvalordevueltoalavariablerespuesta3:
respuesta3=MsgBox(Title:="Pregunta3",_
Prompt:="¿Estácontentoconsusalario?",Buttons:=4)