miércoles, 30 de diciembre de 2015

Buscar datos en una matriz

Hola mis amigos!

Como verán, me estoy involucrando más en el blog, y empiezo a subir más cosas que espero les sirvan.

En este post les voy a mostrar cómo buscar un determinado dato en una matriz de celdas.

Si nos alejamos de las premisas que deben cumplir las grandes bases de datos relacionales, podemos considerar a Excel como una "base de datos". Un libro sería la base de datos propiamente dicha, y sus hojas podrían ser las "tablas" de esa base; inclusive podríamos interactuar con datos de varios libros o bases de datos, y sus respectivas tablas.

Invocando a las reglas de normalización, los datos no deben estar duplicados en diferentes tablas, porque esto lleva a problemas de mantenimiento, ya que si un dato cambia en una tabla, hay que cambiarlo en el resto, lo cual es muy trabajoso. Y por si fuera poco, se crearía una gran propensión a la inconsistencia de los datos.

En el ejemplo que voy a desarrollar, tengo un libro en cuya primera hoja se almacenan datos de clientes de un supuesto negocio, que consisten en:
Número del Cliente (único para cada cliente).
Nombre del Cliente (puede estar duplicado).
Saldo del Cliente (el saldo de dinero que le queda a favor o en contra a cada cliente, y éste es el dato que vamos a buscar).
Acá les adjunto una captura de la primera hoja:


La segunda hoja del libro contiene los siguientes datos:
Número de Cliente (relaciona al cliente de la primera hoja).
Saldo del Cliente (dinero que tiene a favor o en contra el cliente, y éste será el dato buscado).
Acá está la captura de la segunda hoja:

Ahora vamos a ver cómo desde la primera hoja buscamos el saldo de cada cliente, el cual se encuentra en la segunda hoja.

La función que utilizaremos será BUSCARV o CONSULTAV. Ustedes se preguntarán el por qué de los dos nombres, y esto es así ya que a partir de Excel 2010 decidieron cambiar el nombre de la función BUSCARV por un nombre más descriptivo como CONSULTAV, pero si tienen instalado el Service Pack 1 de Office, la verán como BUSCARV (su viejo nombre), no se preocupen por esto.

Apreciemos cómo se utiliza la función en las siguientes capturas;
En la celda D2 ingresamos la función, la cual tiene cuatro parámetros; el valor que vamos a buscar (en este caso el número del cliente), la matriz en donde vamos a buscar (que se encuentra en la segunda hoja, el indicador de columnas (que es en realidad la columna que contiene el dato deseado), y por último un valor booleano (verdadero o falso) para indicar si el valor buscado deber respetar una coincidencia estricta o por el contrario, se puede buscar por un valor parecido.
En nuestro caso, vamos a buscar por el número de cliente, que se encuentra en la celda B2, luego nos desplazamos a la segunda hoja y seleccionamos toda la matriz, tal como lo muestra la siguiente imagen:
Noten que la función ya se va armando, ya que tiene el dato a buscar (el número de cliente, y la matriz). Hasta ahora va quedando de la siguiente forma: =BUSCARV(B2;Saldos!B1:C7
Ahora sólo resta indicar qué columna de la matriz debe devolver, que en nuestro caso es la número 2 (saldo), y siempre recomiendo usar "FALSO" como último argumento para que las búsquedas sean exactas.
Entonces, la función final quedaría así:
=BUSCARV(B2;Saldos!B1:C7;2;FALSO)
Una vez presionado ENTER, veremos en nuestra pantalla lo siguiente;
El saldo se corresponde perfectamente con el número de cliente entre ambas hojas, por lo que ahora deberíamos arrastrar hacia abajo, ¿no es cierto?, bueno lo hagamos y veamos qué sucede;
Algo anduvo mal, ¿estamos de acuerdo?.
Bueno, pero no fue culpa de Excel, sino exclusivamente nuestra, porque debimos decirle a Excel que trabajara con referencias absolutas a las celdas de la matriz, para que la referencia a la misma no variara cuando arrastramos la fórmula hacia abajo.

La función debería haber sido escrita así: =BUSCARV(B2;Saldos!$B$1:$C$7;2;FALSO)

El signo de moneda que le agregamos a las celdas B1 y C7 hacen que Excel "ancle" ese conjunto de celdas y no se corran cuando arrastramos hacia cualquier dirección.
Si no tienen claro este tema de referencias relativas y absolutas, los remito a otro de mis posts:
Variables Estáticas en Excel

Una vez indicado que vamos a utilizar una referencia absoluta o estática, veamos cómo queda:
Ahora quedó bien.

Los invito a practicar esto pero que el dato a buscar esté en otro libro.

La idea es comenzar a imponer las "buenas prácticas" en el manejo de la información, ya se trate de un estudiante, un contador, el propietario de un negocio, etc. para que puedan organizar mejor sus datos y accedan a ellos de una manera ágil, segura y ordenada, evitando el "copiar y pegar" libros enteros o parte de ellos en otros.

Espero les haya servido.

domingo, 27 de diciembre de 2015

Rellenar Celdas Numéricas con Caracteres en Excel - 2 de 2

Hola Amigos!

En el post anterior hemos visto cómo obtener la cantidad de caracteres de una celda, y cómo hacer que se repita un determinado caracter.

Ahora vamos a ver el resto para poder hacer que una celda se rellene con "0" (ceros) a la izquierda.



A la celda "E2" le agregué las siguientes funciones: "=CONCATENAR(REPETIR("0";10);B2)".
Como su nombre lo indica, la función CONCATENAR(), es decir, UNE en una celda varios valores. En este caso le decimos a Excel que una la repetición de 10 ceros y el valor de la celda B2, y luego copiamos el contenido de la celda hacia abajo.

¿Excel hizo lo que le decíamos?, definitivamente sí.
¿Es lo que buscábamos?, está claro que no, porque si se fijan, en la celda E2 hay 11 caracteres, en la celda E3 hay 12, en la celda E4 hay 13, en la celda E5 hay 14, y así podríamos seguir hasta ocupar los 255 caracteres por celda.

¿Y por qué sucedió esto?, porque no utilizamos la función LARGO() para determinar cuántos caracteres había en la celda B2 y en las subsiguientes, y en función de eso, agregar los ceros, 

¿Cómo lo corregimos?, así:

Al agregar la función LARGO() a la fórmula de E2 de esta manera: "=CONCATENAR(REPETIR("0";10-largo(B2));B2)", le dijimos a Excel que evaluara cuántos caracteres contenía la celda B2 (en este caso 1 caracter), y se los restara a los 10 que yo había fijado arbitrariamente. Así, en vez de 10 veces, la función REPETIR() ahora lo hace 9 veces.

Si se fijan en las celdas subsiguientes a E2, verán que cada una de ellas guarda el mismo número de caracteres (10), pero no el mismo número de "0" (ceros), y esto es lo que habíamos buscado.

Una aclaración para los puristas de Excel:
Ustedes argumentarán, y con toda razón, que tratándose de valores numéricos bastaría con acceder al menú contextual y en la opción "Formato de Celda" --> Número, determinar cuántos ceros se quieren implementar, incluidos formatos más complejos.
Pero esto es una explicación más completa que eso, ya que esta fórmula que abarca las tres funciones, podría servir sobre todo para los datos que son de texto, y en vez de repetir el caracter "0" se podría poner un espacio vacío entre comillas " ", invertir el orden (poner REPETIR() al final, y el valor de la celda al  comienzo, y estaría justificado a la derecha.
Espero que entiendan que elegí un formato numérico solamente por propósitos didácticos.



sábado, 26 de diciembre de 2015

Rellenar Celdas Numéricas con Caracteres en Excel - 1 de 2

Hola de nuevo mis amigos!

Ahora les voy a enseñar cómo rellenar una celda numérica con ceros a la izquierda (en realidad puede ser cualquier caracter).

A varios de ustedes seguramente les ha pasado de necesitar dar un largo específico a una columna numérica para exportar a un archivo delimitado por comas (*.csv), o de texto (*.txt), o simplemente por pura estética visual, y se han encontrado con la limitación de no saber cómo hacerlo.

Como yo quiero enseñar a pescar y no entregar el pescado listo, vamos a ir paso por paso con la construcción de una sencilla fórmula para lograr este cometido.

Comencemos:

En este libro de trabajo he agregado 5 valores numéricos aleatorios, incrementando los mismos en una cifra por cada columna.
Fíjense que en la celda B2 tengo el valor "5", y en la celda D2 tengo la función "=LARGO(B2)", la cual he copiado hacia abajo hasta el último valor.
¿Qué hace esta función?, como su nombre lo dice, me devuelve la cantidad de caracteres de la celda indicada.
¿Y para qué nos sirve?, a eso ya lo veremos un poco más adelante.

Ahora veamos en acción la función REPETIR:
Fíjense que en la celda D2 ingresé la función "=REPETIR("0";10)".
¿Para qué hice esto?, para que en este caso el caracter "0" (cero) se repita 10 veces. las 10 veces es una arbitrariedad de mi parte, bien podría ser que se repita 2 veces o 200.

¿Con esto ya podemos hacer que se rellene con "0" (ceros) a la izquierda?, no, todavía no, porque ya sabemos qué largo en caracteres tiene una celda, y sabemos cómo hacer que se repita un determinado caracter, pero no sabemos todavía cómo unir los ceros a la izquierda con los datos.

A esto lo vamos a hacer en el próximo post.



Variables Estáticas en Excel

Hola mis amigos!

Si bien no había publicado nada desde hace muchísimo tiempo, ahora he decidido que me voy a abocar un poco más a mi blog, y en este caso, voy a tratar sobre las variables estáticas y semi-estáticas en Excel.



En la pantalla tenemos en la celda A2 un valor de un porcentaje, el cual equivaldría al 21%; mientras que en la celda B2 guardamos un importe al que se le aplicará el porcentaje y ese valor se dejará en la celda D2 tal como lo explicita la fórmula ingresada en esa celda( =C2*A2).

Ahora bien, en la columna "B" tenemos una serie de importes a los que debemos calcular el porcentaje, por lo tanto nos sentimos tentados de arrastrar hacia abajo la fórmula introducida en D2, no sería mala idea, ¿no es cierto?.

Pero ocurre lo siguiente:

Excel nos calcula bien el porcentaje de la celda D2, pero en el resto de las celdas nos aparecen ceros ("0").
Algo no anda bien, ¿estamos de acuerdo?.

Ahora, ¿por qué pasa esto?.
Por la forma que tiene Excel de interpretar la fórmula ingresada en la celda D2, Cuando le indicamos que es igual a C2 multiplicado por A2, Excel entiende lo siguiente:
"En esta celda (D2), hay que almacenar el valor de la celda que está inmediatamente a mi lado por la izquierda (C2) multiplicado por el valor de la celda que está desplazada 2 lugares hacia la izquierda (A2)".

Entonces, ¿qué fue lo que ocurrió cuando arrastramos la fórmula hacia abajo?, simple, que Excel para la celda D3, y las subsiguientes de la misma columna, "razonó" igual que para D2:
"En esta celda (D3), hay que almacenar el valor de la celda que está inmediatamente a mi lado por la izquierda (C3) multiplicado por el valor de la celda que está desplazada 2 lugares hacia la izquierda (A3)".
¿Qué valor tiene C3?, 243; ¿y A3?, A3 no tiene valor, por lo que podríamos considerarlo igual a cero (0). Por lo tanto, en D3 se almacena 243 multiplicado por 0 (cero). Excel lo hizo de manera impecable, pero no es lo que queríamos.

¿Cómo lo resolvemos?, por suerte es en extremo fácil:
Debemos decirle a Excel que no importa cuántos valores tengamos en la columna "B", a éstos siempre los multiplique por el valor de A2, y los almacene en la columna "D", en la fila que corresponda.
Lo hacemos así:

Cuando agregamos el signo $ (pesos) delante de la letra de la columna, en este caso "A", y antes de la fila, en este caso "2", le estamos diciendo que queremos "anclar" esa celda.
De esta forma Excel interpreta la fórmula para cada fila de la columna "D", de la siguiente manera:
"En esta celda (DX), hay que almacenar el valor de la celda que está inmediatamente a mi lado por la izquierda (CX) multiplicado exclusivamente por el valor de la celda A2".

Lo que hicimos fue establecer una referencia absoluta en vez de una referencia relativa, que es como Excel interpreta las fórmulas por defecto.

Ahora nuestra hoja de trabajo quedaría de la siguiente manera:

Espero que les haya sido de utilidad, y recuerden que esta forma de explicar las referencias absolutas y relativas la vieron acá por primera vez. :D

También pueden hacer referencias semi-absolutas, por ejemplo: $A2 (en este caso le decimos que "ancle" la columna "A", pero que varíe la fila); o también A$2 (en cuyo caso de decimos que la fila debe quedar "anclada" pero puede variar la columna. 

Ya seguiré posteando más temas de Excel.