miércoles, 4 de octubre de 2017

Variables-matriz: proceso de datos ultrarápido con VBA



Normalmente, se habla de variables de dos tipos: las variables de datos y las variables de objetos. Mientras que las variables de datos sirven para almacenar un solo valor (venga de donde venga y se obtenga como se obtenga), las varibles de objetos sirven para almacenar objetos.

En este artículo, vamos a hablar de las variables - matriz. Una variable matriz es un lugar de la memoria RAM de nuestro ordenador al que se le da una forma de cuadrícula de dos dimensiones (filas x columnas) para que pueda almacenar datos de cualquier tipo provinientes de celdas de Excel y ordenados de esa forma matricial.
 

Por lo tanto, una variable - matriz SIEMPRE se ha de dimensionar como una variable del tipo Variant a la que se asigna una serie de valores que se encuentran en un determinado rango de celdas.

1. Dimensionar (crear o dar forma) una variable - matriz

Una variable matriz se debe dimensionar mediante la instrucción Dim antes del nombre de la propia variable (que debe seguir las mismas normas que para las variables de datos y de objetos). Seguidamente, se puede explicitar (no es necesario) que la variable será del tipo variant:

 Dim miVariable               .. o bien...          Dim miVariable As Variant        (recomendable)

2. Asignar valor a una variable - matriz

a) La primera vez

La primera vez que se asignan los valores a una variable - matriz se debe hacer de una sola vez, igualando el rango de Excel a la variable:

 miVariable = miRango
 
Por ejemplo...

miVariable = Range ("A1:C10")

Con el código anterior conseguimos una variable - matriz de 10 filas por 3 columnas

b) Cuando la variable ya contiene valores

Si la variable ya tiene valores almacenados podemos:
  • Volver a asignar valores de la misma forma que la primera vez (ver punto anterior)
  • Asignar valores posición a posición dentro de la matriz de datos. Puesto que la variable - matriz ya tiene una determinada estructura, ya podemos hacer referencia a ella con un par de índices (x, y)* separados por una coma y encerrados entre paréntesis, que corresponden al número de filas y número de columnas que tiene:
miVariable(10,3)

* Siempre se debe explicitar un par de parámetros, aunque el rango sea una sola columna o una sola fila. El parámetro x = nº fila y el parámetro y = nº columna

Por lo tanto, ya podemos asignar valores a cada una de las posiciones de la variable - matriz. Por ejemplo de este modo:

miVariable(1, 1) = miValor

De la forma anterior, asignamos un valor a la posición (1, 1) de la variable - matriz (que corresponde a la celda de su primera fila y primera columna).

Si queremos asignar valores de forma mucho más rápida a todas las posiciones de una variable - matriz lo podemos hacer mediante un bucle For...Next, por ejemplo. Un código completo de ejemplo podría ser así:

Sub llenadoDeVariable ()
      
'Dimensionado de variable - matriz

   Dim miVariable As Variant
   miVariable = Hoja1.Range("A1:C10")

'Dimensionado de variables para contadores del bucle For...Next
    Dim miFila As Integer
   Dim miColumna As Integer

'Bucle de asignación de valores posición a posición

   For miFila = 1 to 10
      For miColumna = 1 to 3
         mivariable(miFila, miColumna) = miVariable(miFila, miColumna)*4562
      Next miColumna
   Next miFila

End Sub

Lo que hace el anterior código es re-asignar los valores a todas las posiciones de la variable - matriz. Después del código, la variable - matriz tiene todos sus valores multiplicados por 4562. Es un ejemplo de código donde se leen, uno a uno, los datos de una variable - matriz y donde se reescriben también, uno a uno, los datos de esa cariable - matriz.
(debemos recordar que con este código aún no hemos volcado los nuevos datos de la variable - matriz en ningún rango, sino que permanecen en dicha variable)

3. Volcar los datos de la matriz en un rango de Excel

Para volcar los datos de una matriz (ya estén procesados como en el ejemplo de código anterior, o no) se nos pueden presentar dos casos:
  • Los datos deben ser volcados en un rango de Excel con la misma forma matricial que la propia variable - matriz (¡¡Importante!!). En este caso, tan solo tenemos que hacer el proceso inverso a la primera asignación de datos en bloque. Es decir:
 miRango = miVariable
 
Por ejemplo...

Range ("A1:C10") = miVariable
 
  •  Los datos deben ser volcados en algún objeto como un combo - box o un cuadro de lista de un UserForm. En este caso debemos utilizar un bucle para hacerlo.
Por lo tanto, nuestro código de ejemplo del punto anterior podría quedar completado con esta última línea (volcado de datos desde la variable - matriz hasta el rango de celdas de Excel):


Sub llenadoDeVariable ()
      
'Dimensionado de variable - matriz

   Dim miVariable As Variant
   miVariable = Hoja1.Range("A1:C10")

'Dimensionado de variables para contadores del bucle For...Next
    Dim miFila As Integer
   Dim miColumna As Integer

'Bucle de asignación de valores posición a posición

   For miFila = 1 to 10
      For miColumna = 1 to 3
         mivariable(miFila, miColumna) = miVariable(miFila, miColumna)*4562
      Next miColumna
   Next miFila

'Volcado de datos desde la variable - matriz hasta el rango de Excel

    Range ("A1:C10") = miVariable

End Sub

Resumen de características de las variables - matriz

Las variables - matriz son una forma rápida de "subir" a la memoria RAM de nuestro equipo una serie de datos para, posteriormente, manejarlos (trasladarlos a otra ubicación en Excel, modificarlos, realizar operaciones matemáticas, etc.) de forma muy rápida. Son, por tanto, una alternativa a las matrices o arrays, aunque con algunas ventajas y desventajas:

Ventajas:


  • Código más simplificado que en el caso de los arrays. Se dimensiona como una variable cualquiera (más rápidamente que un array, al no tener que explicitar ni las dimensiones ni los elementos por dimensión).
  • Se pueden asignar valores en bloque, lo cual resulta más rápido (respecto de los arrays, en los que se debe asignar valores posición a posición) cuando es posible hacerlo.
Desventajas:
  • Debe estar, obligatoriamente, dimensionada como variable del tipo "variant" (el tipo de datos más "pesado").
  • La primera asignación de datos debe ser, obligatoriamente, desde un rango de celdas de Excel, pues esto es lo que genera la estructura de una variable - matriz con (x, y) elementos en filas y columnas, respectivamente. De esto se deduce que siempre serán matrices de dos dimensiones.

Allá donde podamos "subir" en bloque (no uno a uno o por separado) los datos de un rango-origen a una variable, hay muchas probabilidades de que la mejor opción sea utilizar una variable - matriz para procesar esos datos y volcarlos posteriormente en un rango-destino de Excel o de cualquier otro tipo (por ejemplo y como ya se comentó anteriormente, para llenar un combo - box o un cuadro de lista en un UserForm de VBA).




José Manuel Pomares Medrano









4 comentarios:

  1. buen dia,

    si en una variable guardo el rango a1:e10, en otra parte del proceso necesito volcar de la variable a una hoja de excel las columnas 1 y 2 hasta la fila 10 (me refiero a los datos que hay almacenados en la variable, espero me puedan ayudar.

    ResponderEliminar
    Respuestas
    1. Hola Jc. Sería este código:

      Sub volcarVariable()

      Dim miVariable As Variant
      miVariable = Range("A1:E10").Value

      Dim i As Long, j As Long
      For i = 1 To 2
      For j = 1 To 10
      'Se considera volcar a partir de H1, que es... (7+i)
      Cells(j, 7 + i).Value = miVariable(j, i)
      Next j
      Next i

      End Sub

      Eliminar
  2. ¿por qué conviene usar matrices en vez de variables para almacenar muchos datos?

    ResponderEliminar
  3. Hola que tal? Quería informarme sobre esta web https://1cursos.com/f-curso-de-telefonista-recepcionista-de-oficina que tiene el curso de telefonista recepcionista de oficina y me gustaría saber si los conocen y que tan buenos son

    ResponderEliminar