Está en la página 1de 10

SubMacro()

'DefinimosunavariablenumricaTipoCambio,queeselfactordeconversinentreeleuro
DimTipoCambioAsDouble'Variabledefinidacomovalorcon2decimales
TipoCambio=1.45
'Estamacromultiplicaelvalordelaceldaactivaporelvalordelavariableanterior
ActiveCell.Value=TipoCambio*ActiveCell.Value
EndSub
--------------------------------------------------------------------------------
---
Si el cdigo de nuestra macro crece mucho, al haber dado un nombre apropiado a la
variable nos permitir reconocerla fcilmente, mucho mejor que haber hecho:

SubMacro()
DimvalorAsDouble
valor=1.45
ActiveCell.Value=valor*ActiveCell.Value
EndSub

--------------------------------------------------------------------------------
---------
SubMacroMensaje()

'Declaramoslavariablesaludocomovariabletipotexto
DimsaludoAsString

'Aqudeclaramoslavariablequehabamosolvidadoantes
DimdespedidaAsString

'Damosunvaloralavariabledeclarada
saludo="Holaquetal"

'Damosunvaloralavariabledeclarada
despedida="Adios"

MsgBoxsaludo
MsgBoxdespedida

EndSub

Tipo de variables en VBA

Lgicamente si sabemos que una variable va a utilizar valores numricos sin decimale
s y entre 1 y 25, conviene que lo declaremos como Byte, como se ve en este ejemp
lo:

OptionExplicit
SubMacro()
DimXAsByte
ForX=1To25
Cells(X,1)=X
NextX
EndSub

La macro anterior utiliza bastantes menos recursos que esta prxima que no fuerza
la declaracin de la variable X (y por lo tanto es considerada como Variant):

SubMacro()
ForX=1To25
Cells(X,1)=X
NextX
EndSub

Que incluyamos la declaracion Option Explicit no implica que vayamos a hacer un


buen uso de las variables pues en el siguiente ejemplo, hemos considerado que X
es Long, cuando podra utilizar menos recursos siendo Byte:

OptionExplicit
SubMacro()
DimXAsLong'AunqueserarecomendableDimXAsByte
ForX=1To25
Cells(X,1)=X
NextX
EndSub

Una solucin momentnea para saber que tipo de variable deberamos utilizar podra ser d
e la siguiente forma. Observa que hemos eliminado la instruccin Option Explicit,
pues nuestro objetivo es descubrir que tipo de variable necesitaremos:

SubMacro()
'DimXAsLong
ForX=1To65536
Cells(X,1)=X
NextX
MsgBoxTypeName(X)
EndSub

O bien:

OptionExplicit
SubMacro()
'Decimosqueesvariant,queeslomismoquenodecirnadaperodefiniendoesanadaylueg
DimX
ForX=1To65536
Cells(X,1)=X
NextX
MsgBoxTypeName(X)
EndSub

Y en ambos ejemplos obtendramos el resultado Long, mientras que si hubiramos puest


o:

OptionExplicit
SubMacro()
DimX
ForX=1To1500'Aquescribimosunintervalomenor
Cells(X,1)=X
NextX
MsgBoxTypeName(X)
EndSub

obtendramos como resultado Integer.

Este mtodo no simpre sirve ya que:

OptionExplicit
SubMacro()
DimX
ForX=1To25
Cells(X,1)=X
NextX
MsgBoxTypeName(X)
EndSub

Daria como resultado Integer, en lugar de Byte, no obstante el ahorro de recurso


s resulta en cualquier caso evidente.

---------------------------------------------------------------------------------
----------------------------
VARIABLES LOCALES
Locales

Las variables locales se declaran dentro de cada macro, y solo pueden ser utiliz
adas dentro de la macro en la que han sido creadas, cuando la macro termina de e
jecutarse, la variable desaparece y Excel libera la memoria que estaba utilizand
o recordando a qu hacan referencia.

Una variable se declara como local cuando est declarada dentro de la macro que ha
r uso de la misma, por ej:

SubMacro()
DimXAsSingle
DimYAsSingle
DimZAsSingle
X=5
Y=10
Z=50
ActiveCell=X*Y*Z
EndSub

Tambin se pueden declarar varias variables en la misma lnea de cdigo tal que:

OptionExplicit
SubMacro()
DimxAsByte,yAsSingle,zAsLong,ResultadoAsVariant
x=5:y=2000:z=50000
Resultado=x*y*z
MsgBoxTypeName(Resultado)
'enestecasoelresultadoseriaDouble
ActiveCell=Resultado
EndSub

Si una variable es local todas el resto de las macros podrn utilizar el mismo nom
bre de la variable tal que:

OptionExplicit

SubMacro1()
DimAutorAsString
Autor="TodoEXCEL"
ActiveCell=Autor
EndSub

SubMacro2()
DimAutorAsString
Autor="Pedro"
ActiveCell=Autor
EndSub

SubMacro3()
DimAutorAsString
Autor="Jose"
ActiveCell=Autor
EndSub

SubMacro4()
DimAutorAsString
Autor="Salvador"
ActiveCell=Autor
EndSub

Se recomienda la utilizacin de variables locales antes que la de variables pblicas


(las veremos en la seccin siguiente), ya que una vez que la macro termina de eje
cutarse, VBA ya no las reconoce de nuevo y libera memoria, mientras que si son pb
licas an cuando la macro termina, el valor al que hacen referencia las variables
sigue vigente y ocupando espacio en memoria.
---------------------------------------------------------------------------------
--------------------------------------------------------

Ejemplos de tipos de variables

Recordar siempre que antes de utilizar una variable, debemos saber como funciona
:
Las variables String siempre deben definirse entre comillas:

SubejString()
DimQAZAsString
QAZ="TodoEXCEL"
Debug.PrintQAZ
'Debug.Printes1comodnquesolemosutilizarparaverloquesucedeatravesdelav
MsgBoxQAZ
EndSub

Salvo cuando hacen referencia a algn valor que venga de la misma hoja de Excel ta
l que:

SubejString()
DimQAZAsString
QAZ=ActiveCell.Value
Debug.PrintQAZ
MsgBoxQAZ
EndSub

Pero en este caso si ActiveCell.Value=255, QAZ hara referencia a 255 como si de u


n nombre se tratara y no como si de una cifra.

Para utilizar este valor 255 guardado como QAZ deberamos previamente convertirlo
a alguna variable que permita la manipulacin de cifras (Byte, Single, Long, Integ
r, Variant, etc), por ej:

SubejString()
DimQAZAsString
QAZ=ActiveCell.Value
Debug.PrintQAZ
MsgBoxQAZ
'CIntseutilizaparaconvertirunavariableejdetextoaintegercomoenesteejemplo
[A1]=CInt(QAZ)+50
'Range('A1')=[A1]'Eslomismo
'Lamar=Elmar
EndSub

En este otro ejemplo definimos tres variables como String y concatenamos sus val
ores para mostrarlos en la celda A1, en la ventana inmediata y en un mensaje tal
que:

SubejString()
DimQAZAsString
QAZ=ActiveCell.Value
DimWSXAsString
WSX="TodoEXCEL"
DimEDCAsString
Debug.PrintQAZ&WSX
MsgBoxQAZ&WSX
EDC=QAZ&WSX
[A1]=EDC
EndSub

La fechas se pueden guardar como string pero no pueden ser utilizads en operacio
nes como fechas salvo que las convertamos a Date:

SubEjByte()
DimXAsByte
ForX=1To25
Cells(X,1)=X
NextX
EndSub

SubEjInteger()
DimXAsInteger,YAsInteger
ForX=1To1000
Y=Y+20
Cells(X,1)=X+Y
NextX
EndSub

SubEjLong()
DimXAsInteger,YAsLong
'dehaberdefinidoYasInteger
'obtendramosundesbordamiento
ForX=1To2000
Y=Y+20
Cells(X,1)=X+Y
NextX
EndSub