martes, 21 de diciembre de 2010

VBA: definición de una matriz -ARRAY.

Llevaba un tiempo queriendo explicar el uso de la función Array, como código VBA, dentro de una macro.
Esta función se define de manera muy sencilla, con un único argumento, que corresponde a una lista de valores delimitados por comas.

Lo siguiente a explicar antes de emplear esta función ARRAY será identificar el código de los diferentes caracteres que correspondan a ciertas letras; es decir, sabemos que cada caracter/letra que podamos usar equivale a un código numerado entre 1 y 255 que especifica el caracter deseado, este caracter forma parte del conjunto de caracteres empleado por nuestro sistema.

Podemos realizar una prueba muy sencilla de esta equivalencia en nuestra hoja de cálculo. Escribimos en la celda A1
=CARACTER(FILA())
y arrastramos 255 filas hacia abajo, obteniendo un listado de equivalencias de cada uno de los 255 códigos con el caracter correspondiente.

En concreto, nuestros códigos buscados son los números 70, 69, 76, 73, 90, 32, 78, 65, 86, 73, 68, 65 y 68, en ese orden preciso.

Estamos listos para empezar a construir nuestra macro. Macro que tras su ejecución insertará un texto en nuestra hoja de cálculo.
Previo al código, explicaré dos funciones VBA que voy a emplear, y que tienen sentido al trabajar con grupos de valores (como es nuestro caso al trabajar con una matriz). Hablo de:
  • LBOUND(nombre_matriz,[dimensión]): que nos devuelve el subíndice más pequeño disponible para la dimensión indicada de la matriz.

  • UBOUND(nombre_matriz,[dimensión]): que nos devuelve el subíndice mayor disponible para la dimensión indicada de la matriz.


El código es el siguiente y lo incluiremos desde del editor de VBA (Alt+F11) en un módulo, como cualquier otra macro que deseemos ejecutar, lo que nos permitirá ejecutarla en cualquier hoja activa de nuestro libro de Excel:

'macro para crear un texto determinado.
Sub feliz()
Dim primero, ultimo As Variant

'se definen los códigos de los caracteres a emplear con una matriz - ARRAY.
Matriz = Array(70, 69, 76, 73, 90, 32, 78, 65, 86, 73, 68, 65, 68)
primero = LBound(Matriz)
ultimo = UBound(Matriz)

'damos formato al rango de celdas
With Range("A1:M1")
.Font.Name = "Arial"
.Font.Size = 14
.Font.Bold = True
.HorizontalAlignment = xlCenter
End With

For elto = primero To ultimo
i = 1
'realizamos un ciclo DO LOOP UNTIL hasta que se consiga
'un valor definido en la matriz

Do
'ralentiza el proceso
For j = 1 To 500000
Next j
'fin del retardo
i = i + 1
Cells(1, elto + 1).Font.ColorIndex = Int(Rnd() * 56)
Cells(1, elto + 1).Value = Chr(i)
Loop Until i = Val(Matriz(elto))

Next elto
End Sub



Hemos conseguido que al ejecutar la macro feliz se introduzca en un rango definido por nosotros (A1:M1) unos caracteres determinados en un ARRAY (o matriz de valores); pero para darle un efecto diferente (como de caida) hemos empleado un bucle o ciclo tipo DO... LOOP UNTIL, de tal forma que el valor de cada celda del rango recorre todos los caracteres hasta encontrar el correspondiente al elemento de la matriz; además para ralentizar o retardar el proceso de ejecución, y poder visualizarlo mejor, he incluido una instrucción FOR...TO...NEXT.
Por ejemplo, para la primera celda del rango, y por tanto para el primer elemento de la matriz, la macro recorre todos los códigos de caracteres hasta igualarse al 70, cuya correspondencia es la letra F; y así sucesivamente para los 13 elementos de la matriz.

Hasta conseguir que en esas 13 celdas nos aparezca el texto:
'FELIZ NAVIDAD'
mensaje con el que me despido hasta el año que viene....

sábado, 11 de diciembre de 2010

Aceptar rótulos en las fórmulas.

Recibí un correo de un usuario preguntaba sobre el funcionamiento de una utilidad de Excel, el antiguamente llamado Aceptar rótulos en las fórmulas (para Excel 2003), y ahora, para Excel 2007 renombrado como Usar nombres de tabla en las fórmulas:

...He visto en Excel, que se pueden utilizar rotulos numéricos, activando previamente la casilla de verificación “Aceptar rótulos en las formulas” en la ficha Calcular, pero no se exactamente como funciona, me gustaría algunos ejemplos para comprender su funcionamiento...


Identificaré en primer dónde encontrar dicha utilidad.
Para Excel 2003, buscaremos en el menú Herramientas > Opciones > Pestaña Calcular > Sección 'Opciones de Libro'

domingo, 5 de diciembre de 2010

Valores superior e inferior de uno dado.

En un comentario un usuario preguntaba sobre la forma de encontrar en un listado de valores cuáles eran aquellos inmediatamente superior o inferior para un número dado:

...COMO HACER PARA ENCONTRAR LOS VALORES APROXIMADOS POR ENCIMA Y DEBAJO DE UN NUMERO DADO; YA SE QUE CON ESTA FUNCION
=INDICE(Hoja1!C6:C30;COINCIDIR(MIN(ABS(Hoja1!C6:C30-Hoja1!C34));ABS(Hoja1!C6:C30-Hoja1!C34);0))
HALLO EL MAS APROXIMADO PERO LO MUESTRA SEGUN LA APXROXIMACION POR ENCIMA Y DEBAJO ,YO QUIERO QUE EN UNA CELDA ME BOTE EL NUMERO ANTERIOR Y EN OTRA EL SUPERIOR...


Supondremos un listado de valores únicos, siendo nuestro objetivo encontrar, para un valor cualquiera, aquellos registros inmediatamente superior e inferior.
Importante: las funciones explicadas a continuación no están depuradas para valores buscados en los límites más altos o más bajos, es decir, para encontrar el valor superior o inferior del número más alto (2.000,00)/bajo(6,00) del listado!!!.