Ir al contenido principal

Seminario Macros Excel Gratuito 11ª Entrega (Variables, Constantes, Operadores y Matrices)

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:

  • Variables
  • Constantes
  • Operadores
  • Matrices

Variables


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:

  • 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>

El tipo de datos no puede ser objeto (Object) no un tipo personalizado (Type)
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: 
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
Hemos usado el método Preserve para que no se borren los datos al redimensionarla

Ahora creamos una tabla de multiplicar:
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
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
    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
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

Esto sería parte de la hoja:



Nos mostrara en el mensaje Memorias de una geisha, Genero Drama Romántico






Comentarios

Entradas populares de este blog

Chrome: desactivar la opción “Abrir siempre archivos de este tipo”

En Chrome, al descargar un archivo aparecen tres opciones en el desplegable de la barra de descargas:

Combinar Correspondencia con varias cuentas en Outlook

A veces necesitamos realizar un mailing (Combinar correspondencia) y disponemos de varias cuentas de correo en nuestro Outlook. Comprobamos que no funciona el elegir una de ellas como predeterminada ya que para el envío por correspondencia usa un servicio llamado MAPI que no usa la cuenta predeterminada.  Antiguamente en versiones como la 2010 de office simplemente con cambiar el fichero de datos predeterminado de la cuenta bastaba para ello. Actualmente (nosotros usamos 365, equivalente a la 2016) la solución pasa por crear un perfil de correo en el que configuremos la cuenta que usaremos para combinar correspondencia. Adjuntamos un video en el que se explica en Windows 10 como crear un perfil de correo de una cuenta. Una vez creado ese perfil de Correo pasaríamos a realizar la combinación de Correspondencia y en el último paso cuando  realizamos la combinación de correspondencia nos solicitará el perfil a usar para poder enviar los correos y en ese caso elegiríamos el perfil asociado

Gif animado en Camtasia studio 8

 Si deseamos colocar un gif animado en Camtasia Studio 8 observamos que no es posible de forma directa ya que al importarlo lo incluye dentro de imágenes. El truco es convertirlo en un fichero AVI y para ello no hay nada como disponer de la página de conversión: Online Convert Al incorporarlo a nuestra película lo considera lógicamente un clip de video Et voilá