Vamos a tratar un tema muy interesante que permitirá mejorar nuestras macros, por ejemplo la de la entrega anterior que vimos que tenía una cierta problemática.
Los temas a tratar son:
La expresión no admite UDF's ni una función de VBA
Ejemplos de Constantes:
Sub asignandoMatriz()
Dim miMatriz()
ReDim miMatriz(2)
miMatriz(0) = "lunes"
miMatriz(1) = "martes"
miMatriz(2) = "miércoles"
ReDim Preserve miMatriz(3)
miMatriz(3) = "jueves"
MsgBox miMatriz(0) & " " & miMatriz(1) & " " & miMatriz(2) & " " & miMatriz(3)
End Sub
Sub tablaMultiplicar()
Dim i, j As Byte
Dim miMatriz As Variant
miMatriz = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Range("a1:a10").Value = Application.WorksheetFunction.Transpose(miMatriz)
Range("a1:j1").Value = miMatriz
Range("a1:a10").Font.ColorIndex = 5
Range("a1:j1").Font.ColorIndex = 5
For i = 1 To 10
For j = 1 To 10
Cells(i, j) = Cells(1, j) * Cells(i, 1)
Next j
Next i
End Sub
Los temas a tratar son:
- Variables
- Constantes
- Operadores
- Matrices
Nos van a permitir guardar los datos de forma temporal para utilizarlos mas adelante en otros cálculos u operaciones.
Por ejemplo, puedes almacenar los valores del nombre de un cliente y de sus apellidos para luego mostrarlo de otra forma. Es decir si almacenamos el nombre en una variable y cada apellido en otras podemos construir cadenas de caracteres mostrando primero los apellidos y luego el nombre. Dichos datos se los solicitaremos al usuario y los almacenaremos en sendas variables.
Técnicamente, una variable es una pequeña región de la memoria que se utiliza para guardar valores o información que luego se usará en la ejecución del programa.
Toda la información que se maneja necesita utilizar la memoria RAM del ordenador, por eso es una buena práctica reservar un lugar para guardar una variable antes de utilizarla. Esto se conoce como declaración de la variable y, aunque no es totalmente necesario, te ayudará a entender mejor el código una vez escrito.
Debido a que las variables se almacenan en Ram, un apagón o fallo de nuestro libro implicará la perdida de las mismas.
Hemos comentado que las variables hay que declararlas y tenemos dos formas de hacerlo:
- Forma implícita. Es una declaración a las bravas y se declara o se le da un valor en el momento de su uso.
Veamos unos ejemplos:
edad=56
Nombre="Pepe"
FechaNac=#3/10/1962#
Como se ve los números van directamente, los textos entre comillas y las fechas entre almohadillas ademas de ponerlas en mes/día/año.
- Forma explícita. Es necesario definir previamente el nombre de la variable antes de su uso y para ello usaremos la palabra Dim antes de la variable y normalmente detás indicamos el tipo de la misma ya que sino el tipo se considera Variant o Variante es decir, cualquier tipo de datos.
Ejemplos:
Dim miNombre as string
miNombre="Juan"
En el ejemplo anterior hemos declarado la variable de tipo String (cadena de caracteres) y luego le hemos dado un valor.
¿Que ventajas aporta la forma explícita?
Si no sabemos nada pensamos que es peor ya que escribimos mas, pero la gran ventaja es que evitamos errores a la hora de hacer operaciones y VBA nos informará si encuentra variables sin declarar.
Imagine que en el ejemplo anterior usamos la variable en otra orden posterior y escribimos lo siguiente:
Msgbox "Su nombre es " & miNiombre
Si observa atentamente verá que se ha equivocado con el nombre de la variable del mensaje y al ejecutar vemos que aparece el cuadro sin nombre.
En cambio si hubiéramos declarado la variable antes y al comienzo del módulo ponemos la orden Option Explicit que nos obliga a declarar las variables nos hubiéramos dado cuenta del error. como vemos en la imagen
En la parte superior del módulo vemos la orden Option Explicit y al ejecutar el segundo procedimiento nos muestra un cuadro con el error y en el código nos remarca en azul el nombre de la variable que causa el error.
En resumen, aunque sea mas tedioso siempre debe poner al principio de los módulos la orden
Option Explicit que nos obliga a declarar las variables de forma explicita y así evitar errores. Ya que dentro de un gran código de muchas líneas el encontrar esos errores sería complicado.
Además otra ventaja de usar la declaración explícita es que indicamos el tipo de datos que vamos a usar y eso suele redundar en ahorro de memoria.
Como es un tema tan importante el propio editor de visual basic lo podemos configurar para que en cada módulo que fabriquemos aparezca por omisión la orden Option Explicit y para ello cuando estamos en el Editor en el Menú Herramientas elegimos opciones y aparece la siguiente pantalla:
Marcaríamos la casilla Requerir declaración de variables y cada vez que cree un nuevo módulo General o un formulario o inserte hojas y entre en sus modulos nos aparecerá escrito Option Explicit al comienzo del mismo. Salvo en la hoja actual y en Thisworkbook que como son objetos previamente creados esto no le afecta y deberá hacerlo a mano.
Consejos:
- El nombre de la variable debe comenzar con una letra o con un guion bajo (_). A partir del segundo carácter ya puedes utilizar números y guiones normales (-).
- La longitud del nombre de una variable no puede exceder los 250 caracteres.
- Por supuesto, no puedes nombrar a una variable como alguna palabra reservada por Excel o VBA. Por ejemplo, no será posible utilizar nombres como Workbook o Range.
- No puedes utilizar espacios en los nombres de variables. Si quieres separar dos palabras dentro del nombre, utiliza la primera letra de cada una en mayúsculas (BorrarRango), o sepáralas con guiones bajos (borrar_rango). A mi me gusta mas la técnica de las mayúsculas pero sobre gustos no hay nada escrito.
- Es muy aconsejable usar prefijos antes del nombre para saber el tipo de datos que tiene la variable de un vistazo, por ejemplo si la variable va a almacenar un texto y es de tipo string poner por ejemplo: strNombreUsuario
Para mas tipos vemos la siguiente imagen:
Tipos de Variables.
Tenemos los siguientes:
- Byte. Guarda números enteros desde 0 a 255 y gasta un byte de memoria Ram
- Boolean. Solo almacena 2 valores Verdadero o 1 y Falso o 0 y gasta 2 bytes de memoria Ram
- Integer. Admite números desde -32768 a 32767 y también gasta 2 bytes
- Long. Almacena números enteros desde -2147483648 a 2147483647 y gasta 4 Bytes
- Currency. Se usa para cálculos que intervienen monedas disponiendo de hasta 4 decimales y de alta precisión, el rango va desde -922334203685477,5808 hasta 922337203685477,5807 y gasta 8 Bytes
- Single. Yo no lo recomiendo ya que si tenemos que convertir al siguiente tipo se inventa decimales debido a la coma flotante del procesador. Su intervalo va desde 3,4028235E+38 a -1,401298E-45 para números negativos y 1,401298E-45 a 3,4028235E+38 para números positivos. Gasta 4 bytes.
- Double. Similar al anterior pero con mucha más capacidad. Gasta 8 bytes en memoria y comprende desde -1,79769313486231570E+308 a -4,94065645841246544E-324 para los valores negativos y desde 4,94065645841246544E-324 a 1,79769313486231570E+308 para los valores positivos. Es altamente recomendable su uso en lugar de Single.
- Date. Almacena tanto las fechas como las horas basándose en los números de serie los cuales son igual que le pasa al Excel en el que la parte positiva es la fecha y la decimal la hora. Comenzando con el 1 que seria el 1/1/1900 a las 0:00:00 y 43775,49383 sería el 6/11/2019 a las 11:51:07, tenga en cuenta que la ultima fecha valida será el 31/12/9999 a las 23:59:59 que corresponde a 2958466,99999 y si se pregunta por esta limitación es que las fechas se introducen solo con años de 4 dígitos
- String. Almacena texto o mejor dicho cadenas desde la cadena vacía o "" hasta unos 2000 millones de caracteres aprox. La ocupación será según el tamaño de la cadena.
- Object. Sirve para almacenar objetos en memoria como por ejemplo un libro, una hoja, un rango y gasta 4 Bytes. Las variables de este tipo se inicializan usando la palabra Set.
- Variant. O variante, es un tipo especial de variable que admite cualquier tipo de datos (texto, numérico o fecha) la ocupación en memoria es variable ya que gastan 22 bytes + la longitud de los datos. El no declarar el tipo de variable se asume que es de tipo Variant es decir, si usted pon Dim miVar entonces la variable miVar es de tipo Variant
En el siguiente vídeo vemos como usar la declaración de variables para resolver un problema:
Constantes
A diferencia de las variables las constantes como su nombre indica no cambian durante la ejecución del código y se suelen utilizar para almacenar en ellas valores que suelen ser difíciles de recordar, como el número e,
Podemos dividir las constantes en:
El tipo de datos no puede ser objeto (Object) no un tipo personalizado (Type)Podemos dividir las constantes en:
- Integradas. Precedidas por xl usadas por los objetos de Excel, precdidas por vb las usadas por instruciones y funciones de Visual Basic, precidadas por mso las constantes de Microsoft Office (En el examinador de objetos podremos ver las que tenemos)
- Personalizadas. Son las creadas por nosotros y se realizan con la instrucción Const en la sección de declaraciones del módulo (parte superior del mismo) o en el interior de un procedimiento.
La sintaxis es:
Const NombreConstante [As <tipo de datos>] = <expresión>
La expresión no admite UDF's ni una función de VBA
Ejemplos de Constantes:
El objetivo entre otras cosas de las constantes es simplificar el código y no tener que recordar ciertos valores numéricos o textos.
En el siguiente ejemplo mostramos como crearnos una constante personalizada que usa incluso constantes intrínsecas para dar saltos de linea dentro de un mensaje:
Como vemos definimos la constante en la sección de declaraciones de un módulo la cual se llama miSaltoLinea como la suma de 2 constantes intrínsecas vbCr (Retorno de carro) y vbLf (salto de línea) .
Operadores
En cualquier expresión están los operandos y los operadores, por ejemplo:
7+3=10 tanto el 7 como el 3 son operandos y el + es un operador y obtenemos un resultado. Esto es un ejemplo de operador matemático.
Lo que ocurre es que no solo existen operadores matemáticos. Disponemos de los siguientes:
- Aritméticos. Son usados para hacer operaciones matemáticas y tenemos los siguientes:
+ Suma
- Resta
* Multiplicación
/ División
\ División entera
^ Potencia
Mod Devuelve el resto de una división
Usando la ventana de inmediato enseñamos algunas operaciones:
En lugar de números en nuestro código usaríamos variables.
- Comparación. Nos permiten comparar expresiones devolviendo verdadero o falso y este tipo de expresiones suelen ser usados dentro de una instrucción IF.
Los operadores de comparación son:
> Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que
= Igual que
<> Distinto de
Ejemplo:
if misVentas>misCompras Then msgbox "Buen resultado"
- Lógicos. Son And, Or, Xor y Not. El operador And implica que ambas expresiones deben cumplirse a la vez, el operador Or con que una de las expresiones se cumpla es suficiente, el Operador Xor es verdadero solo cuando una sola de las expresiones se cumple y por ultimo el operador Not lo que hace es invertir la expresión.
Ejemplos:
AND
Function Aprobado(nota1, nota2)
Aprobado = (nota1 >= 10.5) And (nota2 >= 10.5)
End Function
OR
Function EnergiaCelular(fuente1, fuente2)
EnergiaCelular = fuente1 Or fuente2
End Function
XOR
Function ElectricidadBanco(fuente1, fuente2)
ElectricidadBanco = fuente1 Xor fuente2
End Function
NOT
Function LlamarTecnico(funciona)
LlamarTecnico = Not funciona
End Function
- Concatenación. Se usa para unir expresiones y se representa por el operador & el cual seguramente habrá utilizado en Excel a la hora de hacer ciertas fórmulas.
Function NombreCompleto(Nombre, Apellido1, Apellido2)
if Apellido2 <> "" then
NombreCompleto= Nombre & " " & Apellido1 & " " & Apellido2
Else
NombreCompleto= Nombre & " " & Apellido1
End If
End Function
Matrices
Es posible que este termino lo escuche también en su versión inglesa Arrays o con la palabra Arreglos.
Se trata de una variable que es capaz de almacenar varios valores en ellas.
Entre sus características destaca que se trata de una variable con el mismo nombre y los elementos de la misma se diferencian por un número de índice.
Pueden ser:
- De una dimensión o Vectores
- De dos dimensiones, semejantes a una tabla de Excel
- Multidimensional de 3 o mas dimensiones.
A su vez según sus elementos las dividimos en:
Matrices estáticas cuando conocemos todo lo que van a contener, por ejemplo los meses del año o los días de la semana y dinámicas cuando su tamaño puede cambiar en cualquier momento
Para declarar una matriz dinamica se hace así:
Dim miMatriz()
O bien Dim miMatriz() as Double
En el primer caso los elementos de la matriz pueden ser de cualquier tipo y en el segundo solo admite datos de tipo Double
Para declarar una matriz estática de una dimensión:
Dim diasSemana(6) as string
Recordad que comienzan por el elemento 0 salvo que en la sección declaraciones del modulo hayamos puesto Option Base 1
Una matriz de dos dimensiones se define así:
Dim tresEnRaya(2,2) as Byte
Dispondrá de 3 filas y 3 columnas
Vamos a ver un procedimiento que rellena los elementos de una matriz:
Option Explicit
Sub RellenarMatriz()
Dim miMatriz(3) as string
miMatriz(0)="lunes"
miMatriz(1)="martes"
miMatriz(2)="miércoles"
'Mostramos los elementos en un mensaje
Msgbox miMatriz(0) & " " & miMatriz(1) & " " & MiMatriz(2)
End Sub
Ahora vamos a cambiar el tamaño de la matriz:
Dim miMatriz()
ReDim miMatriz(2)
miMatriz(0) = "lunes"
miMatriz(1) = "martes"
miMatriz(2) = "miércoles"
ReDim Preserve miMatriz(3)
miMatriz(3) = "jueves"
MsgBox miMatriz(0) & " " & miMatriz(1) & " " & miMatriz(2) & " " & miMatriz(3)
End Sub
Hemos usado el método Preserve para que no se borren los datos al redimensionarla
Ahora creamos una tabla de multiplicar:
Dim i, j As Byte
Dim miMatriz As Variant
miMatriz = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Range("a1:a10").Value = Application.WorksheetFunction.Transpose(miMatriz)
Range("a1:j1").Value = miMatriz
Range("a1:a10").Font.ColorIndex = 5
Range("a1:j1").Font.ColorIndex = 5
For i = 1 To 10
For j = 1 To 10
Cells(i, j) = Cells(1, j) * Cells(i, 1)
Next j
Next i
End Sub
Y este es el resultado:
En el ejemplo anterior hemos incluido el uso del método WorksheetFunction que nos permite usar una función Excel dentro del código VBA.
Otro ejemplo de iniciar una matriz:
Sub Peliculas()
Dim Pelis(1 To 5) As String
Dim Pelis(1 To 5) As String
Pelis(1) = "Señor de los anillos"
Pelis(2) = "La naranja mecanica"
Pelis(3) = "Star Trek"
Pelis(4) = "El Padrino"
Pelis(5) = "Abierto hasta el amanecer"
MsgBox Pelis(4)
End Sub
Pelis(2) = "La naranja mecanica"
Pelis(3) = "Star Trek"
Pelis(4) = "El Padrino"
Pelis(5) = "Abierto hasta el amanecer"
MsgBox Pelis(4)
End Sub
Ahora creamos un código que lee elementos de una hoja:
Sub LeerPeliculas()
Dim Pelis(2 To 200, 1 To 2) As String
Dim i As Integer, j As Integer
For i = 2 To 200
For j = 1 To 2
Pelis(i, j) = Cells(i, j).Value
Next j
Next i
MsgBox Pelis(200, 1) & ", Genero " & Pelis(200, 2)
End Sub
Dim Pelis(2 To 200, 1 To 2) As String
Dim i As Integer, j As Integer
For i = 2 To 200
For j = 1 To 2
Pelis(i, j) = Cells(i, j).Value
Next j
Next i
MsgBox Pelis(200, 1) & ", Genero " & Pelis(200, 2)
End Sub
Esto sería parte de la hoja:
Nos mostrara en el mensaje Memorias de una geisha, Genero Drama Romántico
Comentarios
Publicar un comentario