MAGUU

Cargando

Blog

medidas dax en tabA dinamica
  • Mar, Vie, 2021
DAX

MEDIDAS DAX en tabla dinámica

¿Cómo conseguimos BI en Excel?

Las medidas DAX en una tabla dinámica son cálculos que usamos para el análisis de datos.

DAX (Data Analysis Expressions) nos proporciona inteligencia de negocio (Business Intelligence, BI) dentro del familiar entorno de Excel.

Para muchos usuarios, las numerosas funcionalidades de la tablas dinámicas son suficientes para sus necesidades. Por otra parte, los usuarios de Excel interesados en BI amplían las posibilidades del análisis de datos con DAX.

DAX es un lenguaje de fórmula. Como estamos acostumbrados a la sintaxis de fórmulas de Excel, encontraremos que la sintaxis de DAX es muy similar. La gran diferencia es que las fórmulas de Excel están basadas en celdas, mientras que las fórmulas DAX lo están en columnas.

En nuestro ejemplo, queremos saber el importe del pago de comisiones de venta por producto (un 5%) en cada ciudad.

medida dax en tabla dinámica
medida dax en tabla dinámica

En primer lugar, vamos a crear un modelo de datos para trabajar con una base de datos. A continuación creamos una tabla dinámica y añadimos la medida que necesitamos. Por último, damos formato a la tabla dinámica.

Modelo de datos

Un modelo de datos crea un origen de datos relacional dentro de un libro de Excel.

Está compuesto por tablas, columnas, tipos de datos y relaciones entre las tablas. Nos permite integrar datos procedentes de distintas fuentes de forma eficaz.

En Excel, el modelo de datos se muestra como una colección de tablas con su lista de campos.

modelo de datos en Excel
modelo de datos en Excel

Modelo de datos y tabla dinámica

Para nuestro caso, contamos con una base de datos de más de veinte y un mil registros.

base de datos con ventas en ciudades de cien productos
base de datos con ventas en ciudades de cien productos

Queremos un resumen de ventas por ciudad y que incluya el importe de la comisión de dichas ventas (un 5%), .

¿Cómo lo hacemos?

Lo primero es crear el modelo de datos en Excel, a partir de la base de datos. Seguidamente la tabla dinámica y, dentro de ella, la medida DAX.

Paso 1: creamos el modelo de datos

Para crear un modelo de datos, lo primero que tenemos que conseguir son los datos. Lanzamos la interfaz de Power Pivot desde el menú Power Pivot >> Administrar

menú power pivot de Excel
menú power pivot de excel

La interfaz de Power Pivot se presenta como una ventana independiente.

interfaz de power pivot
interfaz de power pivot

Para cargar los datos, elegimos el menú De base de datos >>> De Access

fuente de datos
fuente de datos

Aparece la ventana que nos importará las tablas al modelo de datos:

asistente conexión base de datos access
asistente conexión base de datos access

Ahora conectamos con la base de datos:

elección base de datos
elección base de datos

Excel nos pide que seleccionemos las tablas o vistas con los datos a importar:

elección tablas del modelo de datos
elección tablas del modelo de datos

Cuando queremos conseguir varias tablas de un mismo origen de datos, elegimos en la lista de tablas y vistas. Al seleccionar varias tablas, Excel nos crea automáticamente un modelo de datos auqneu podremos modificarlo. En nuestro ejemplo solo tenemos una tabla:

tabla del modelo de datos
tabla del modelo de datos

La conexión es exitosa y hemos creado el modelo de datos correcatmente.

conexión completada
conexión completada

Power Pivot nos presenta os datos como columnas de una tabla:

modelo de datos Excel
modelo de datos Excel

Guardamos el modelo de datos. Las tablas que acabamos de importar nos aparecerán en la lista de campos de la tabla dinámica.

Paso 2: creamos la tabla dinámica

Una vez creado el modelo de datos, nos situamos en cualquier celda de la hoja de trabajo para insertar la tabla dinámica.

Elegimos menú Insertar >>> Tabla dinámica

menú insertar tabla dinámica
menú insertar tabla dinámica

Excel muestra la ventana >>> Crear tabla dinámica

ventana crear tabla dinámica
ventana crear tabla dinámica

Como los datos que queremos analizar proceden de un modelo de datos, Excel ha elegido la opción Usar el modelo de datos de este libro:

modelo de datos del libro
modelo de datos del libro

Agregamos los campos de la tabla en la tabla dinámica. Los campos PRODUCTO y CIUDADA como filas, mientras que las VENTAS serán valores:

configuración de la tabla dinámica
configuración de la tabla dinámica

Aceptamos la configuración y obtenemos la tabla dinámica:

tabla dinámica
tabla dinámica

Paso 3: creamos la medida

Para crear campos calculados en una tabla dinámica, usamos el menú Analizar >>> Campos, elementos y conjuntos.

men.u campos, elementos y conjuntos
menú campos, elementos y conjuntos

Sin embargo, cuando usamos un modelo de datos esta opción nos aparece deshabilitada:

campo calculado deshabilitado
campo calculado deshabilitado

Por lo tanto necesitamos otro método para agregar una medida a la tabla dinámica. En la ventana >>> Campos de la tabla dinámica hacemos click con el botón derecho sobre la tabla de los datos (en nuestro caso, VENTAS):

ventana camposd e tabla dinámica
ventana camposd e tabla dinámica

Aparece la ventana >>> Medida, que nos permite crear y comprobar medidas en DAX:

ventana medida
ventana medida

Damos un nombre a la medida en la opción >>> Nombre de la medida, y escribimos la fórmula en el área para escritura de las fórmulas:

creamos la medida DAX
creamos la medida DAX

A continuación comprobamos que la fórmula no contiene errores mediante el botón de opción >>> Comprobar fórmula DAX

La medida aparece en la ventana >>> Campos de tabla dinámica:

medida DAX en campso de tabla dinámica
medida DAX en campso de tabla dinámica

Configuramos la tabla dinámica:

Por último, aceptamos y la tabla dinámica ya incluye la medida DAX que hemos creado:

tabla dinámica con medida DAX
tabla dinámica con medida DAX

Paso 4: damos formato a la tabla dinámica

Ahora damos formato a los valores de la tabla para ofrecer un informe de las comisones fácil de descifrar.

En primer lugar, cambiamos el nombre de los encabezados de los campos por otro con mayor significado. También los rotulamos para que destaquen:

nuevos encabezdos de la tabla dinámica

Dentro de la tabla conseguimos el menú auxiliar de Excel (por ejemplo con el botón derecho del ratón) y elegimos el menú >> Formato de número. Damos formato moneda a los campos VENTAS y COMISIÓN:

Y tenemos listo el informe de comisiones de ventas de productos por ciudad:

Descarga el libro de trabajo

Libro de trabajo con datos y fórmulas Este es un archivo con extensión .xlsx. Comprueba que el navegador no cambia la extensión al archivo.

Base de datos Este es un archivo con extensión .accdb. Comprueba que el navegador no cambia la extensión al archivo.

campos calculados en tablas dinámicas
  • Mar, Vie, 2021

CAMPOS CALCULADOS en tabla dinámica

¿Cómo creamos campos calculados a partir de datos externos?

Las tablas dinámicas nos permiten calcular, resumir y analizar datos, de manera que podemos hacer comparaciones o ver patrones y tendencias en ellos.

Sin embargo, puede ocurrir que las funciones de resumen no nos proporcionen los resultados que necesitamos. Entonces podemos crear nuestras propias fórmulas en los campos calculados. Los campos calculados son una columna más de la tabla dinámica. En ellos podemos trabajar con fórmulas simples o bien recibir resultados de cálculos de funciones de la hoja de cálculo.

En nuestro ejemplo, vamos a acceder a una base de datos externa con cerca de 21.000 registros de ventas de 100 productos distintos. Cada venta supone una comisión a la empresa del 5%. Queremos saber el importe del pago de comisiones de venta por producto. Vamos a usar los valores de uno de los campos de la base de datos. Por tanto, una tabla dinámica con un campo calculado es una buena solución pues usamos los datos de un campo en la fórmula a calcular.

tabla dinámica con campo calculado
tabla dinámica con campo calculado

En primer lugar, conectamos el libro de trabajo con la base de datos. A continuación, creamos la tabla dinámica y añadimos el campo calculado. Por último, damos formato a la tabla dinámica.

Tabla dinámica y datos externos

Queremos un resumen de las ventas de cien productos que incluya el importe de la comisión de las ventas (un 5%). Contamos con una base de datos de veinte y un mil registros.

base de datos ventas cien productos
base de datos ventas cien productos

Conectamos el libro de trabajo con la base datos para construir la tabla dinámica.

Puede parecer que la base de datos no contiene demasiados registros y que podrían estar en una hoja del libro de trabajo. Hay dos buenas razones para que no sea así: primera, la velocidad de procesado es más rápida, y segunda, la integridad de los datos.

Si en lugar de veinte y un mil registros la base datos contuviera un millón, las ventajas serían evidentes.

¿Cómo lo hacemos?

Una vez conectados el libro de trabajo y la base de datos construimos la tabla dinámica y, dentro de ella, creamos el campo calculado.

Paso 1: conectamos con la base de datos

Abrimos el menú >> Tabla dinámica desde la barra de menús (menú >> Insertar)

menú insertar tabla dinámica
menú insertar tabla dinámica

Nos aparece la ventana >>> Crear tabla dinámica

menú crear tabla dinámica
menú crear tabla dinámica

Elegimos la opción >>> Utilizar una fuente de datos externa:

opción fuente de datos externa
opción fuente de datos externa

Seleccionamos la fuente de datos externa:

fuente de datos externa
fuente de datos externa

Abrimos la conexión y elegimos la celda inicial para crear la tabla dinámica:

conexión creada y celda inicial tabla dinámica
conexión creada y celda inicial tabla dinámica

Ya hemos conseguido la conexión con la base de datos. Aparece la ventana para crear la tabla dinámica con los campos que podemos usar.

campos de la tabla dinámica
campos de la tabla dinámica

Paso 2: creamos la tabla dinámica

Para construir la tabla dinámica, arrastramos el campo PRODUCTOS a la sección Filas:

campo producto de la tabla dinámica
campo producto de la tabla dinámica

A continuación arrastramos el campo VENTAS a la sección Valores:

campo ventas de la tabla dinámica
campo ventas de la tabla dinámica

Podemos configurar el campo de valor con otras operaciones (Promedio, Recuento, Máximo, Mínimo…), pero para este caso nos interesa la suma.

configuración del campo de valor
configuración del campo de valor

Una vez configurados los valores, la tabla dinámica está lista:

la tabla dinámica
la tabla dinámica

Paso 3: creamos el campo calculado

Abrimos el menú >>> Campos, elementos y conjuntos desde la barra de menús (menú >>> Analizar)

menú campos, elementos y conjuntos
menú campos, elementos y conjuntos

Elegimos la opción >>> Campo calculado:

menú campo calculado
menú campo calculado

Aparece la ventana >>> Insertar campo calculado:

menú insertar campo calculado
menú insertar campo calculado

Damos un nombre al campo calculado. En este caso, COMISION VENTAS.

nombre campo calculado
nombre campo calculado

Creamos la fórmula para el campo calculado. Como queremos el importe de las comiones por producto, la fórmula es el campo VENTAS por el 5%.

fórmula campo calculado
fórmula campo calculado

Y conseguimos el campo calculado con las comisiones por ventas.

campo calculado comision ventas
campo calculado comision ventas

Paso 4: damos formato a la tabla

Para presentar un informe de las comisones pagadas fácil de interpretar, vamos a dar formato a los valores.

Con el botón derecho del ratón conseguimos el menú auxiliar de Excel:

menú auxiliar
menú auxiliar

Elegimos el menú >> Configuración de campo de valor:

menú configuración de campo de valor
menú configuración de campo de valor

Al hacer clic en la opción, nos aparece la ventana >>> Configuración de campo de valor:

Damos un nombre personalizado a la columna de VENTAS:

También damos nombre a la columna COMISION:

columna comision de ventas
columna comision de ventas

Finalmente hacemos lo mismo con la columna PRODUCTOS:

columna PRODUCTOS
columna productos

Aplicamos formato moneda a los valores:

eligiendo formato moneda
eligiendo formato moneda

Y por último, rotulamos los encabezados para que destaquen:

tabla formateada
tabla formateada

Descarga el libro de trabajo

Libro de trabajo con datos y fórmulas Este es un archivo con extensión .xlsx. Comprueba que el navegador no cambia la extensión al archivo.

Base de datos Este es un archivo con extensión .accdb. Comprueba que el navegador no cambia la extensión al archivo.

suma entre fechas
  • Feb, Vie, 2021

SUMA entre fechas

¿Cómo sumamos valores entre fechas?

Sumar fechas es muy sencillo cuando comprendemos cómo Excel maneja la información relacionada con el tiempo. Para Excel, una fecha es simplemente un número entero.

Siendo más preciso, una fecha es un número de serie que representa el número de días transcurridos desde enero de 1900. De esta manera, el número de serie 1 corresponde al 1 de enero de 1900. A ese número de serie le damos un formato especial. Por lo tanto, puede aparecer como 01/01/2020, o como miércoles, 01 de enero de 2020, o como 1-ene… pero el número de serie sigue siendo el mismo: el 43831.

Puesto que se trata de un entero, las fechas en Excel son muy manejables para nuestros cálculos. Así podemos sumar los valores de un mes concreto, o también podemos sumar valores según ciertos criterios, o quitar días con respecto a una fecha.

Tenemos los datos de los ingresos de una empresa durante el año 2020. La tabla que usamos lista algo más de 4.000 registros para que así podamos ver toda la potencia de cálculo de Excel con las fechas.

datos de las ventas
datos de las ventas

En primer lugar vamos a explorar cómo Excel suma entre fechas. A continuación cómo suma los valores por mes completo, y por último cómo suma fechas según períodos de tiempo.

Suma entre dos fechas

Queremos saber las ventas entre dos fechas. Para eso contamos con la tabla auxiliar donde escribimos la fechas que acotan la duración del período de tiempo.

En la celda TOTAL vamos a escribir la fórmula que calcula el total de ventas del período elegido.

celda TOTAL
celda TOTAL

Las dos fechas del intervalo de tiempo son dos condiciones para la suma entre fechas. Por lo tanto, en primer lugar la función atiende a esos dos criterios y criba los valores que los cumplen, y en segundo lugar los suma.

VIDEO

La función SUMAR.SI.CONJUNTO suma todos los argumentos que cumplen varios criterios. Podemos emplear hasta 127 criterios.

SUMAR.SI.CONJUNTO(rango_suma; rango_criterios1; criterios1; [rango_criterios2; criterios2];…)

¿Cómo lo hacemos?

Este caso hacemos un uso sencillo de la función SUMAR.SI.CONJUNTO. Solo tenemos que fijar los dos criterios que delimitan el rango de fechas.

Como tenemos muchos datos para manejar, previamente creamos referencias de nombre para los rangos que usamos en la función.

creamos nombres para los rangos que usamos
creamos nombres para los rangos que usamos

Los nombres fechas, productos y ventas incluyen, cada uno, los valores de las columnas correspondientes. De esta manera hacemos más manejable la función.

Paso 1: escribimos la función

Podemos hacerlo indistintamente en la celda o en la barra de fórmulas.

función SUMAR.SI.CONJUNTO
función SUMAR.SI.CONJUNTO

Paso 2: usamos nombres en la función

Como rango_suma empleamos el nombre ventas y como rango_criterios1 el nombre fechas.

rango_suma y rango_criterios1
rango_suma y rango_criterios1

Paso 3: creamos los criterios

Vamos a construir el primer criterio. Primero, tenemos que tener en cuenta que dentro de una fórmula los operadores de comparación son cadenas de texto y por tanto se escriben entre comillas.

=SUMAR.SI.CONJUNTO(ventas;fechas;">="

En caso de no hacerlo, Excel lanzará el aviso de error en la fórmula:

mensaje de error en la fórmula
mensaje de error en la fórmula

Incluimos la celda con la fecha de inicio en el criterio (la celda F4), y usamos la y comercial (&) para unir y generar un solo elemento:

primer criterio de la fórmula
primer criterio de la fórmula

Hacemos lo mismo para el segundo criterio. Como rango usamos fechas, y como criterio el operador menor o igual y la celda G4, que es la fecha final.

segundo criterio de la fórmula
segundo criterio de la fórmula

Ya tenemos acotadas las fechas del intervalo que necesitamos, y ahora conseguimos el resultado:

resultado suma entre dos fechas elegidas
resultado suma entre dos fechas elegidas

Suma por mes completo

Queremos el resumen anual de las ventas mes a mes. En una tabla auxiliar tenemos los meses en formato <<nombre de mes-año>>, y en la celda TOTAL MES obtenemos las ventas de cada mes.

suma entre fechas mes a mes

Para poder usar la función SUMAR.SI.CONJUNTO, necesitamos acotar el rango de fechas. Sin embargo, ese formato de fecha de la tabla auxiliar, en una única celda, no nos proporciona la última fecha de cada mes.

La función FIN.MES soluciona nuestro problema, y con ella podremos tener los dos criterios que fijan el rango de fechas.

La función FIN.MES nos devuelve el número de serie del último día del mes. A partir de una fecha inicial, buscamos el último día según el número de meses que le indiquemos.

FIN.MES(fecha_inicial, meses)

VIDEO FUNCION FIN.MES

¿Cómo lo hacemos?

Para solucionar este caso, vamos a combinar la función SUMAR.SI.CONJUNTO como ya hemos aplicado en el caso anterior, y la función FIN.MES.

También empleamos nombres para los rangos de ventas y fechas, además de los operadores lógicos mayor o igual que («>=») y menor o igual que («<=»).

Paso 1: escribimos la función

Podemos hacerlo indistintamente en la celda o en la barra de fórmulas.

fórmula en la celda

Paso 2: ventas como rango para la suma

Como rango_suma usamos el nombre ventas:

rango_suma: las ventas
rango_suma: las ventas

A continuación escribimos el rango_criterios1: el nombre fechas:

rango_criterios1: los meses
rango_criterios2: las fechas

El criterio1 lo construimos con el operador lógico mayor o igual que… Como vemos, se escribe entre comillas.

criterio1: operador mayor o igual que
criterio1: operador mayor o igual que

La fecha inicial es el propio mes, es decir, la celda correspondiente al mes. En este caso F4:

criterio1: fecha del mes

Paso 3: la fecha final de cada mes

Para el segundo criterio, volvemos a emplear el nombre fechas:

rango_criterios2: las fechas
rango_criterios2: las fechas

El criterio2 lo construimos con el operador lógico menor o igual que… y también lo escribimos entre comillas.

operador de comparación menor que…

Por último como fecha final, usamos la función FIN.MES. El primer argumento para esta función es la celda F4, es decir, el mes en cuestión, y como segundo argumento escribimos 0, puesto que queremos el último día de dicho mes.

Con esto, tenemos completa la función, y este es el resultado para el primer mes:

resultado fórmula suma entre meses
resultado fórmula suma entre meses

Extendemos la fórmula hacia abajo y conseguimos el resultado del infome mes a mes:

resultado informe mes a mes
resultado informe mes a mes

Suma de fechas según períodos de tiempo discontinuos

Ahora vemos cómo sumar períodos de tiempo discontinuos, es decir, de lunes a jueves, o los fines de semana, o todos los miércoles de un semestre…

Por ejemplo, queremos el resumen, mes a mes, primero de los ingresos de lunes a jueves y segundo de los fines de semana.

tabla de ventas según períodos de tiempo
tabla de ventas según períodos de tiempo

Este resumen necesita la función DIASEM, que nos devuelve el día de la semana como un número entero entre 1 y 7.

Podemos aplicar la función DIASEM cuando tenemos una celda con un valor en cualquier formato de fecha, o bien cuando recibe el valor de una función FECHA o cuando es el resultado de otras fórmulas o funciones.

DIASEM(núm_de_serie,[tipo])

Añadimos una columna a la tabla principal para conseguir el día de la semana de las fechas.

columna días semana
columna días semana

  • Feb, Vie, 2021

FILTRAR para encontrar palabras clave

¿Cómo encontramos palabras clave a partir de nombres largos?

Tenemos una tabla principal con una lista de productos. Como vemos, los nombres son cadenas de texto largas que pueden incluir alguna palabra clave de la tabla auxiliar.

lista de productos con algunos nombres largos

En la tabla auxiliar, las palabras clave presentan información relativa a los productos: el grupo al que pertenecen.

tabla auxiliar con información relacionada
tabla auxiliar con información relacionada

Pretendemos clasificar los productos de la tabla principal según las palbaras clave de la tabla auxiliar.

lista de productos y sus palabras clave

Por lo tanto, primero buscamos la palabra clave dentro del nombre del producto, y después usamos esa palabra clave como criterio de búsqueda para obtener todos los registros que lo cumplan.

La función HALLAR busca una cadena de texto dentro de una segunda cadena de texto y no discrimina en la búsqueda de textos entre mayúsculas y minúsculas. Por tanto es una función mucho más versátil que ENCONTRAR.

Con la función HALLAR conseguimos la posición inicial de la primera cadena de texto, a partir del primer carácter de la segunda cadena de texto.

HALLAR(texto_buscado;dentro_del_texto;[núm_inicial])

¿Cómo lo hacemos?

Lo que queremos conseguir tiene una sencilla lógica excel. En primer lugar, comprobamos si las palabras clave están en el nombre de los productos de la lista. De esto se encarga la función HALLAR. En segundo lugar, ese resultado lo usamos como criterio de filtrado para obtener la categoría a la que pertenece el producto. De esto se encarga la función FILTRAR.

Ambas partes trabajan juntas porque el resultado de HALLAR lo convertimos en un valor booleano (VERDADERO o FALSO) con la función ESNUMERO y ya nos sirve como criterio para el filtrado.

Paso 1: escribimos la función HALLAR

Empezamos a construir la fórmula escribiendo la función HALLAR en la barra de fórmulas.

Normalmente el argumento texto_buscado es un texto simple para la búsqueda dentro de un texto más largo. Por ejemplo, hallar «m» en «Madrid».

En nuestro caso empleamos como argumento un array de celdas: F5:F7, esto es, el rango donde están las palabras clave. De esa manera, si encuentra uno de ellos, nos da la posición inicial en el nombre del producto.

La referencia es absoluta porque evaluamos el nombre de cada producto de la lista con las palabras clave de este rango.

función HALLAR argumento texto_buscado array
función HALLAR, argumento texto_buscado array

Con esto, ya incluimos la celda del producto como el segundo argumento de la función (dentro_del_texto).

función HALLAR argumento dentro_del_texto
función HALLAR, argumento dentro_del_texto

Por último, la función HALLAR nos devuelve el número de la posición inicial del texto buscado (desde el primer carácter de la segunda cadena de texto), o bien nos devuelve un error porque no lo ha encontrado.

evaluación de la función hallar
evaluación de la función hallar

La evaluación que hace la función HALLAR encuentra «cocina» en la primera posición de «Cocina portátil» y por eso nos devuelve 1. Sin embargo, no encuentra «Casa» ni «Cabina» y devuelve el error !#VALOR.

Por tanto, nos interesan los valores numéricos que consigue la función HALLAR porque significan que la palabra clave existe dentro del nombre del producto.

Paso 2: necesitamos un valor lógico

Como acabamos de ver, la evaluación del array nos devuelve un valor numérico o un mensaje de error. Para utilizarlo como criterio de la función FILTRAR lo convertimos en un valor booelano con la función ESNUMERO.

La función ESNUMERO es una función de información y la usamos para comprobar si un valor es numérico. Si la celda contiene un valor numérico, devuelve VERDADERO; en otro caso, devuelve FALSO.

ESNUMERO(valor)

valor representa el valor que queremos verificar, entonces aplicado a nuestro caso:

función ESNUMERO

y conseguimos este resultado:

valores booleanos

Es decir, para el primer producto existe coincidencia en la lista de las palabras clave.

Paso 3: filtramos la lista de productos

Ahora ya tenemos listo el criterio para filtrar, así que empelamos la función FILTRAR.

La función FILTRAR extrae de un rango de datos los valores coincidentes con los criterios que definamos. Es una función disponible para versiones Microsoft 365.

FILTRAR(array;include;[if_empty])

En el primer argumento de la función, definimos el array de datos que filtramos. En nuestro caso, los valores de la categoría en la tabla auxiliar .

Como criterio, el resultado de la función ESNUMERO que nos devuelve un valor booelano.

y finalmente, si el criterio anterior nos devuelve FALSO, una alternativa. En este caso, optamos por el espacio en blanco con las comillas, aunque podríamos usar un texto de advertencia.

Validamos la fórmula y obtenemos, para el primer producto, el grupo que le corresponde.

Por último, extendemos al selección hacia abajo y conseguimos las categorías del resto de productos que contengan palabras clave:

filtrar para encontrar palabras clave
resultado final
buscarv para busquedas parciales
  • Feb, Vie, 2021

BUSCARV para búsquedas parciales

¿Cómo buscar cuando solo tenemos parte del criterio de búsqueda?

Producimos piezas y tenemos un histórico del porcentaje de las piezas producidas con defectos. Queremos saber cuántas piezas con defecto fabricaremos de algunas piezas en la próxima serie.

En una tabla auxiliar tenemos el histórico de defectos con el código de la pieza.

histórico de piezas defectuosas

Sin embargo, en la tabla principal solo tenemos parte del código de la pieza.

códigos parciales de productos

Para hacer el cálculo de piezas defectuosas en la tabla principal, primero tenemos que hacer la búsqueda y después conseguir el porcentaje en la tabla auxiliar.

BUSCARV es una función de búsqueda y referencia. La usamos para buscar elementos en una tabla o en un rango por fila.

BUSCARV(valor_buscado;matriz_tabla;indicador_columnas;[rango])

¿Cómo lo hacemos?

Aunque nuestros criterios son parciales, podemos hacer las búsquedas sin mayor problema con solo añadir el carácter * al criterio parcial de búsqueda.

Paso 1: escribimos la función de búsqueda

Empezamos a construir la fórmula escribiendo la función en la barra de fórmulas. Como valor buscado, el código del primer producto:

argumento valor_buscado

A continuación, selecionamos la matriz en donde queremos buscar (la tabla HISTÓRICO) y fijamos con F4, puesto que es una referencia absoluta: cualquier código de la tabla principal se consulta en la tabla auxiliar.

matriz tabla histórico

La columna que nos interesa de la tabla auxiliar es la segunda (% defectuosas) así que escribimos 2 como índice.

argumento indicador de columna

Por último, como queremos una coincidencia exacta, escribimos 0 ó FALSO en la función.

argumento tipo de coincidencia

Validamos la fórmula y extendemos la selección hacia abajo, pero conseguimos el error #N/D (No Disponible) en las celdas, porque no encuentra ninguno de los valores parciales en la tabla auxiliar,

error #N/D en las celdas

Paso 2: adaptamos el criterio parcial

Acabamos de comprobar que un argumento de búsqueda directo (el valor de la celda sin más) no nos sirve. Tenemos que mejorarlo para conseguir resultados.

El carácter *, usado con una cadena de texto en una búsqueda, reemplaza un grupo cualquiera de caracteres. Es un comodín que podemos usar según nos convenga. El otro carácter comodín (?) reemplaza un único carácter.

Por tanto, vamos a emplear el carácter * para mejorar el argumento de búsqueda. De esta manera, al añadir * a una cadena de texto, obtenemos nuevas cadenas de texto. Por ejemplo, tenemos la cadena ABC. Le añadimos delante * y entonces conseguimos cadenas como: 1ABC, XABC, D4fABC…

Si además añadimos el carácter * al final de la cadena, *ABC* dará lugar a cadenas como 14fABC2Nm, O23ABCtUU…

Para nuestro caso, escribimos la función en la celda como:

Observa que son necesarias las comillas junto al carácter * y que necesitamos el operador & para unir las tres subcadenas. El resto de la función no cambia:

Validamos la fórmula y extendemos la selección hacia abajo.

Ahora solo aparece el error #N/D (No Disponible) en las celdas cuyos valores no están en la tabla auxiliar.

Paso 3: controla el error #N/D

Controlamos el error #N/D con la función SI.ERROR. Con esto conseguimos sustituir la indicación del error por un mensaje propio o por un valor adecuado.

La función SI.ERROR tiene como primer argumento el resultado esperado, y como segundo argumento una alternativa en caso de error: un mensaje personalizado, un valor, una fórmula, otra función…

SI.ERROR(valor; valor_si_error)

Escribimos la función SI.ERROR al principio de la barra de fórmulas. Con esto usamos como primer argumento la evaluación realizada por la función BUSCARV.

función SI.ERROR

Al final de la fórmula escribimos la alternativa en caso de error. Por ejemplo, la alternativa es «No hay datos».

alternativa en caso de error

Con esto validamos la fórmula y extendemos la selección hacia abajo.

resultado de la fórmula completa

A partir de la versión 2013, Excel incorpora la función SI.ND para controlar el error #N/D. Si dispones de esta versión o de una superior, puedes emplearla del mismo modo que SI.ERROR.

Paso 4: calculamos las piezas defectuosas

Las piezas defectuosas que obtendremos según los datos históricos son el resultado de la siguiente fórmula:

= unidades * (% piezas defectuosas/100)

En nuestro caso:

fórmula piezas defectuosas

Ahora validamos la fórmula y extendemos la selección hacia abajo.

Ahora nos da un error de valor (#¡VALOR!) en las celdas con el valor No hay datos, es decir, las celdas donde no es posible hacer el cálculo.

Al igual que con el primer error, controlamos este segundo con la función SI.ERROR. Ahora, cuando se produce el error, dejamos la celda en blanco como valor (comillas vacías).

función SI.ERROR

Validamos la fórmula y extendemos la selección hacia abajo.

Descarga el libro de trabajo

Libro de trabajo con datos y fórmulas Este es un archivo con extensión .xlsx. Comprueba que el navegador no cambia la extensión al archivo.

arrays vba columna tabla
  • Ene, Vie, 2021
VBA

Arrays VBA para convertir columna de datos en tabla

Los arrays VBA nos permiten organizar los datos que aparecen en una columna en forma de tabla.

En el post De datos en una columna a tabla hemos visto cómo organizar los datos de una columna en una tabla usando funciones y fórmulas.

Ahora resolveremos el problema con otro enfoque. Por tanto, obtenemos el mismo resultado que con las fórmulas, pero con una técnica distinta: arrays VBA.

Los arrays VBA son una parte muy importante del lenguaje de programación de Excel. Un ejemplo sencillo de array es la lista de meses del año o una lista que resuma las ventas totales de cada mes.

Sub ejemploArray()
Dim miSemana As Variant
     miSemana = Array("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
     Debug.Print miSemana(0)
     Debug.Print miSemana(2)
     Debug.Print miSemana(4)
End Sub
arrays VBA resultado código ejemplo
resultado en la ventgana Inmediato

¿Qué es un array?

Los arrays VBA son un tipo de variable. Lo usamos para almacenar una lista de datos del mismo tipo. En cierto modo podemos definirlo como un almacén temporal de datos.

más info en: Arrays · Lo básico

Y puesto que trabajan como listas, resultan muy útiles para manejar los valores de las celdas de una hoja de cálculo por dos buenas razones:
primero, porque un array VBA es una estructura de datos muy flexible,
y segundo, porque podemos procesar esos datos (para hacer cálculos, ordenar valores, eliminar elementos…) antes de volcarlos sin alterar las celdas de origen.

Cómo convertimos los datos de una columna en tabla

Así que tenemos apilados los datos de una lista de productos en una columna, y queremos convertir la columna en una tabla.

arrays VBA convertimos una columna de datos en una tabla con campos
de columna de datos a tabla con array VBA

En la columna, hay cuatro tipos de datos que se repiten hacia abajo y que se corresponden con cuatro campos.

arrays VBA campos de los datos en la columna
campos de los datos

Lo que pretendemos es muy sencillo: en primer lugar que cada celda de la tabla albergue el valor que le corresponda de la columna de datos, y después que los valores se ordenen según los campos a los que pertenecen.

arrays VBA tabla con datos organizados en campos
tabla con datos

Paso 1: insertamos un nuevo módulo

Abrimos el editor de VBA (ALT+F11)

Insertamos un módulo (menú Insertar >> Módulo, y damos un nombre al procedimiento. Para el nombre del método evitamos tildes.

Sub DatosColumnaATabla()

End Sub

Paso 2: declaramos las variables

Empezamos declarando las variables:

Sub DatosColumnaATabla()
' Declaramos las variables
     Dim i, j As Integer
     Dim primeraFila, ultimaFila As Integer
     Dim contadorArray As Integer
     Dim arrayColumna() As Variant
 End Sub

Las variables i y j serán contadores para los bucles FORNEXT.

La variable primeraFila recorrerá la columna de datos para incluir los valores de sus celdas en nuestro array.
En este caso, como es un rango pequeño, podríamos saber cuál es el tamaño del rango con echar un vistazo hacia abajo en la hoja de cálculo.

arrays VBA última celda de la columna de datos
última fila de la columna de datos

Sin embargo, cuando el rango de la columna tiene un número impreciso o muy enorme de celdas, mover la barra es una mala práctica para conocer el tamaño del rango.

Con la variable ultimaFila sabemos cuál es la última fila de la columna de datos para, a partir de ahí, dar tamaño al array.

La variable contadorArray llenará las celdas destino con los valores del array.

La variable arrayColumna será nuestro array.
Como no sabemos el número de elementos que contendrá, no le damos tamaño y lo declaramos vacío.
El tamaño del array depende del número de celdas de la columna y no siempre sabremos cuántas son.
Por lo tanto, primero nos vamos a asegurar el número exacto de elementos que contendrá con la variable ultimaFila. En otro caso, obtendríamos un error.

Paso 3: valor de la última fila

Damos valor a la variable ultimaFila:

Sub DatosColumnaATabla()
' Declaramos las variables
     Dim i, j As Integer
     Dim primeraFila, ultimaFila As Integer
     Dim contadorArray As Integer
     Dim arrayColumna() As Variant
' Valor de la variable ultimaFila
     ultimaFila = Cells(3, 2).End(xlDown).Row
End Sub

Cells(3, 2) es la celda donde arranca el rango, B3: fila 3, columna 2.

End(xlDown).Row nos lleva hasta la última celda de la columna 2 (B). Así sabremos cuántas filas tiene.

Paso 4: dimensionamos el array

Ahora tenemos que dar tamaño al array.
La cantidad de celdas de la columna de datos nos da el número de elementos del array, es decir, su tamaño.

valor de la variable ultimaFila
valor de la variable ultimaFila

Con esta técnica, el rango de la columna de datos es “B3:BultimaFila”, donde ultimaFila es el valor de la variable.
ultimaFila nos devuelve el valor de la última fila del rango, pero no es el número de celdas del rango. Por lo tanto, el número de celdas del rango es el valor de ultimaFila 3, porque 3 es la celda donde arranca el rango.
Ahora ya podemos dar tamaño al rango con la sentencia REDIM.

REDIM es la sentencia que nos permite dimensionar un array cuando no hemos declarado inicialmente su tamaño.

Sub DatosColumnaATabla()
' Declaramos las variables
      Dim i, j As Integer
      Dim primeraFila, ultimaFila As Integer
      Dim contadorArray As Integer
      Dim arrayColumna() As Variant
' Valor de la variable ultimaFila
      ultimaFila = Cells(3, 2).End(xlDown).Row
' Damos tamaño al array con ReDim
      ReDim arrayColumna(ultimaFila - 3)
 End Sub

Si supiéramos el tamaño del array escribiríamos REDIM array(n), donde n es el número de elementos que tendrá el array.

Paso 5: poblamos el array

Ahora que el array ya tiene tamaño, vamos a poblarlo con los elementos de la columna de datos. Para hacerlo, usamos un bucle FORNEXT que recorre la columna, celda a celda, desde la primera a la última.

Preparamos el bucle. Como la primera celda está en la fila 3, damos valor a la variable.

' Damos valor a la variable primeraFila
     primeraFila = 3

En cada iteración, el bucle tomará el valor de la celda y lo añadirá como elemento al array. Después, pasará a la siguiente fila y repetirá la acción. Cuando llegue a la última celda se detendrá.

' Bucle que puebla el array
     For i = LBound(arrayColumna) To UBound(arrayColumna)
         arrayColumna(i) = Cells(primeraFila, 2).Value
         primeraFila = primeraFila + 1
     Next i

LBound y UBound son los límites inferior y superior del array.

más info en: Funciones LBound y UBound para arrays

Con esta línea

arrayColumna(i) = Cells(primeraFila, 2).Value

el bucle arranca en la primera fila y asigna a cada elemento del array el valor que le toca.

Tras añadir ese valor de la celda al array, el bucle avanza una celda hacia abajo con la sentencia:

primeraFila = primeraFila + 1 

Cuando alcanza la ultima celda, el procedimeinto abandona el bucle FORNEXT

El código hasta este punto:

Sub DatosColumnaATabla()
' Declaramos las variables
     Dim i, j As Integer
     Dim primeraFila, ultimaFila As Integer
     Dim contadorArray As Integer
     Dim arrayColumna() As Variant
' Valor de la variable ultimafila
     ultimaFila = Cells(3, 2).End(xlDown).Row
' Damos tamaño al array con ReDim
     ReDim arrayColumna(ultimaFila - 3)
' Damos valor a la variable primeraFila
     primeraFila = 3
' Bucle que puebla el array
     For i = LBound(arrayColumna) To UBound(arrayColumna)
         arrayColumna(i) = Cells(primeraFila, 2).Value
         primeraFila = primeraFila + 1
     Next i
 End Sub

Paso 6: escribimos en la tabla con arrays VBA

Una vez poblado el array con los valores de la columna de datos, los escribimos en las celdas de la tabla.

La tabla es una matriz de dos dimensiones: filas y columnas. Para recorrerla tenemos que usar dos bucles FOR … NEXT. Uno primero para recorrer las filas de la tabla y el segundo bucle FOR … NEXT, anidado dentro del primero, para recorrer las columnas.

El esquema del bloque de código es el siguiente:

For recorremos filas
     For recorremos columnas
     Salimos de las columnas
Salimos de las filas

Recorremos, uno a uno, los elementos del array con la otra variable que usamos como contador: contadorArray.
Esta variable la iniciamos en 0.

contadorArray = 0 

El límite superior del array es múltiplo de 4, ya que cuatro son los campos de la tabla. Así que tenemos que dividir el valor de cada elemento del array entre cuatro para que el bucle pueda avanzar a la siguiente fila:

contadorArray = 0 
For i = LBound(arrayColumna) To (UBound(arrayColumna) / 4)     
 
Next i

En las celdas, se escribe el valor que les corresponde.

     For j = 4 To 7
         Cells(i + 4, j).Value = arrayColumna(contadorArray)
         contadorArray = contadorArray + 1         
     Next j

El valor de j (las columnas de la tabla) se ajusta según nuestras necesidades. En este caso, las columnas van desde la 4 hasta la 7.

Después el valor de fila (variable i). Ajustamos el valor de la celda de inicio de la tabla según nos convenga. En nuestro caso, está en la fila 4.

celda de inicio de la tabla
celda de inicio de la tabla

Este es el bloque de código que necesitamos para escribir en las celdas de la tabla:

contadorArray = 0
For i = LBound(arrayColumna) To (UBound(arrayColumna) / 4)     
     For j = 4 To 7
         Cells(i + 4, j).Value = arrayColumna(contadorArray)
         contadorArray = contadorArray + 1         
     Next j 
Next i

Ejecutamos con F5 para la tabla con los valores de la columna.

imagen

Este es el código hasta este punto

For i = LBound(arrayColumna) To (UBound(arrayColumna) / 4)     
     For j = 4 To 7
         Cells(i + 4, j).Value = arrayColumna(contadorArray)
         contadorArray = contadorArray + 1         
     Next j 
Next i

Ya solo tenemos que darle formato. Nuestro siguiente paso.

Paso 7: damos formato a la tabla

Para terminar damos formato a los bordes de las celdas y así tener una apariencia uniforme.

Usamos un bloque WITHEND para asignar las propiedades a los bordes de la tabla, dentro del segundo bucle FORNEXT.

For recorremos filas
     For recorremos columnas
         With elemento
         Salimos de with
     Salimos de las columnas
Salimos de las filas

Para cada celda aplicamos un estilo de línea contínua con

.LineStyle = XlLineStyle.xlContinuous

Damos un tamaño de 2 al grosor de la línea:

.Weight = 2

y un color:

.Color = RGB(0, 112, 192)

Y ya hemos dado a la tabla un formato muy legible.

       ' Damos formato a las celdas de la tabla
       With Cells(i + 4, j).Borders
             .LineStyle = XlLineStyle.xlContinuous
             .Weight = 2
             .Color = RGB(0, 112, 192)
       End With

Código del procedimiento

Sub DatosColumnaATabla()
' Declaramos las variables
     Dim i, j As Integer
     Dim primeraFila, ultimaFila As Integer
     Dim contadorArray As Integer
     Dim arrayColumna() As Variant
' Valor de la variable ultimafila
     ultimaFila = Cells(3, 2).End(xlDown).Row
' Damos tamaño al array con ReDim
     ReDim arrayColumna(ultimaFila - 3)
' Damos valor a la variable primeraFila
     primeraFila = 3
' Bucle que puebla el array
     For i = LBound(arrayColumna) To UBound(arrayColumna)
         arrayColumna(i) = Cells(primeraFila, 2).Value
         primeraFila = primeraFila + 1
     Next i
' Escribimos los valores del array en las celdas de la tabla
     contadorArray = 0
     For i = LBound(arrayColumna) To (UBound(arrayColumna) / 4)
          For j = 4 To 7
              Cells(i + 4, j).Value = arrayColumna(contadorArray)
              contadorArray = contadorArray + 1
         ' Damos formato a las celdas de la tabla
              With Cells(i + 4, j).Borders
                  .LineStyle = XlLineStyle.xlContinuous
                  .Weight = 2
                  .Color = RGB(0, 112, 192)
              End With
          Next j
     Next i
 End Sub

Descarga el libro de trabajo

Libro de trabajo con datos y código Este es un archivo con extensión .xlsm. Comprueba que el navegador no cambia la extensión al archivo.

www.maguu.es

De datos en una columna a tabla
  • Ene, Vie, 2021

De datos en una columna a tabla

¿Cómo organizar los datos de una columna en una tabla?

Tenemos los datos de una serie de productos apilados en una columna y queremos organizar esos datos en una tabla.

datos apilados en columna
datos apilados en columna

Observamos que hay cuatro tipos de datos que se corresponden con varios campos distintos y que se van repitiendo hacia abajo.

cuatro tipos de datos en columna
los cuatro tipos de datos

Queremos una tabla que presente los datos en campos.

tabla de datos organizados en campos
tabla de datos organizados en campos

La tabla tendrá una fila de encabezados para los campos.

encabezados de los campos
encabezados de los campos

Cada celda de la tabla tiene que albergar el valor que le corresponda de la columna de datos. Para conseguirlo vamos a utilizar una técnica que usa la función INDICE.

La función INDICE nos devuelve el valor de una celda dentro de una matriz o tabla, según el número de fila que la celda ocupa dentro de la matriz. En la versión matricial de esta función, son argumentos obligatorios la matriz (o tabla) y el número de fila.

INDICE(matriz; núm_fila; [núm_columna])

Esta técnica completará las celdas de la tabla con los valores de las celdas de la columna de datos. La técnica consiste en emparejar las celdas de la columna de datos con las celdas que les correspondan en la tabla mediante indicadores. Estos indicadores los conseguimos combinando las funciones FILAS y COLUMNAS, que usaremos como argumento para el número de fila de la función INDICE.

La técnica

La función INDICE devuelve el valor de una celda dentro de una matriz, siempre que sepamos en qué fila está dicha celda.

De los dos argumentos obligatorios para usar la función INDICE, ahora mismo tenemos la matriz, que es el rango de celdas que contiene los valores en la columna de datos. Nos hace falta saber en qué fila está cada celda de la columna de datos. Pero la columna de datos puede estar colocada en cualquier lugar de la hoja de cálculo así que tenemos que asegurarnos una manera exacta para saber en qué fila está cada celda de la columna de datos.

Paso 1: indicadores numéricos para la matriz

Supongamos que cada celda de la columna de datos tuviese un identificador numérico; la primera celda sería el 1, la siguiente celda sería el número 2 y así sucesivamente hasta el final de la columna de datos.

indicadores numéricos para la columna de datos
indicadores numéricos para la columna de datos

Paso 2: indicadores numéricos para la tabla

Consideraremos la tabla como una cuadrícula.

tabla como cuadrícula
tabla como cuadrícula

Cada celda de la cuadrícula tendrá su indicador numérico. Este nos permitirá emparejar las celdas de la columna de datos con su correspondiente lugar en la cuadrícula. Así, el valor de la celda número 1 de la columna de datos irá a la celda número 1 de la tabla y después el siguiente valor hasta llegar al final de la columna.

indicadores numéricos para la cuadrícula
indicadores numéricos para la cuadrícula

El indicador numérico para cada celda de la cuadrícula lo obtendremos mediante una fórmula que combina las funciones COLUMNAS y FILAS.

fórmula indicadores para la tabla
fórmula indicadores para la tabla

Paso 3: conseguimos el número de columna en la tabla

La función COLUMNAS nos devuelve el número de columnas de una matriz o de una referencia.

COLUMNAS(matriz)

El número de columna nos servirá para recorrer la tabla en sentido vertical. Nos situamos en la celda D3 (primera celda de la tabla a donde queremos llevar el primer valor de la columna de datos) y escribimos esta función:

función COLUMNAS
función COLUMNAS

Como queremos saber el número de columna de la primera celda de la cuadrícula (D3), la matriz que necesitamos para usar la función COLUMNAS será exclusivamente la propia celda D3. Cuando extendamos la selección al resto de columnas y filas, Excel tomará como referencia la columna D. Será la columna número 1 de la cuadrícula. Lo conseguimos usando una referencia mixta a la columna D (el símbolo dólar delante de la primera D).

Aplicamos y extendemos la selección al resto de columnas y conseguimos este resultado:

indicador para cada columna
indicador para cada columna

Ya tenemos un número para cada columna la tabla. Al extender la selección hacia abajo, aparece el valor de la columna a la que pertenece cada celda:

celdas con su indicador de columna
celdas con su indicador de columna

Paso 4: conseguimos el número de fila en la tabla

La función FILAS nos devuelve el número de filas de una matriz o de una referencia.

FILAS(matriz)

El número de fila nos servirá para recorrer la tabla en sentido horizontal. Igual que para las columnas, nos situamos en la celda D3 y escribimos esat función:

función FILAS
función FILAS

Queremos saber el número de fila de la primera celda de la cuadrícula (D3), por lo tanto la matriz que necesitamos para usar la función FILAS será exclusivamente la propia celda D3. Cuando extendamos la selección al resto de columnas y filas, Excel tomará como referencia la fila 3. Será lafila número 1 de la cuadrícula. Lo conseguimos usando una referencia mixta a la fila 3 (el símbolo dólar delante del primer 3).

Aplicamos y extendemos la selección al resto de columnas y conseguimos:

indicador para cada fila
indicador para cada fila

Ya tenemos un número para cada fila de la tabla. Cuando extendemos la selección hacia abajo, aparece el valor de cada fila en las celdas:

celdas con su indicador de fila
celdas con su indicador de fila

Paso 5: conseguimos un único número para cada celda de la tabla

Los resultados de las funciones COLUMNAS y FILAS utilizados por separado son inútiles. Son un par de valores que no identifican de manera única cada celda. Sin embargo, si los sumamos conseguimos un valor más cercano a lo que pretendemos.

fórmula que suma los indicadores de columna y fila
fórmula que suma los indicadores de columna y fila

La fórmula proporciona estos resultados en las celdas:

resultados de la fórmula para la primera fila
resultados de la fórmula para la primera fila

Es decir, cada celda es el resultado de esta operación:

origen de los valores de las celdas
origen de los valores de las celdas

Extendemos la selección a toda la cuadrícula y conseguimos:

valores para la cuadrícula
valores para la cuadrícula

Fijándonos en los resultados, comprobamos que si restamos uno al valor de la fila, conseguimos la sucesión numérica que queremos para la primera fila: 1, 2, 3, 4. Ajustamos la fórmula restando 1 a la función FILAS.

primer ajuste a la fórmula
primer ajuste a la fórmula

y conseguimos la sucesión numérica que queremos para la primera fila:

valores de la fila ajustados
valores de la fila ajustados

Para el resto de celdas de la tabla conseguimos este resultado:

cuadrícula ajustada
cuadrícula ajustada

Tras este ajuste, para el valor de la función FILAS hemos conseguido esta serie numérica: 0, 1, 2 … 13 y 14. Como son cuatro los campos, la serie numérica tiene que ser múltiplo de 4, es decir, tenemos que ajustar de nuevo la fórmula mulitplicando el valor de (FILAS1) por 4.

segundo ajuste a la fórmula
segundo ajuste a la fórmula

Como el valor de la función COLUMNAS no ha cambiado (1, 2, 3, 4), la fórmula va a operar con estos valores en cada celda:

origen de los valores ajustados de las celdas
origen de los valores ajustados de las celdas

El resultado es este:

valores ajustados de la cuadícula
valores ajustados de la cuadícula

Acabamos de conseguir el valor de fila que necesitamos en cada celda para la función INDICE.

Paso 6: usamos la función INDICE

El primer argumento de la función INDICE (matriz) es la columna de datos como referencia absoluta:

matriz de la función INDICE
matriz de la función INDICE

El segundo argumento, número de fila, es el resultado de la fórmula que hemos construido en el paso anterior:

fórmula INDICE completada
fórmula INDICE completada

El resultado para la primera fila:

resultado primera fila
resultado primera fila tabla

Extendemos la selección a toda la tabla:

tabla con los valores de la columna de datos
tabla con los valores de la columna de datos

Hemos transferido correctamente los datos apilados de una columna a una tabla, ordenándolos por campos.

formato moneda con VBA
  • Ene, Vie, 2021
VBA

Formato moneda con VBA

¿Cómo podemos aplicar el formato de moneda a los datos procedentes de nuestro equipo de ventas?

Recibimos los datos de nuestro equipo de ventas y necesitamos darles formato de moneda para nuestros informes.

Automatizar esta tarea con VBA es muy sencillo. Tenemos dos formas posibles de hacerlo: conociendo completamente la referencia del rango, o conociendo parcialmente la referencia del rango.

Conocemos la referencia completa del rango

Conocemos la celda de comienzo y de final del rango. En nuestro ejemplo, el rango de datos que nos interesa es C3:C16, cuyos valores no tienen el formato de moneda.

datos sin formato

Con este método usaremos un bucle FOR EACH para dar formato de moneda al rango que contiene los valores.

Declaramos la variable rango de tipo range, para referirnos al rango de celdas, y la variable celda (también de tipo range para poder recorrer las celdas del rango.

declaramos variables tipo range

Establecemos el rango con la instrucción SET:

SET rango

Escribimos el bucle FOR EACH

bucle FOR … EACH

La instrucción FOR EACH … NEXT repite un grupo de instrucciones para cada elemento de una matriz o una colección, es decir, ejecuta un bloque de código en bucle. En nuestro caso, ejecuta una acción en cada celda del rango de las ventas (la matriz); cuando se haya ejecutado el bloque de código en la primera celda, el bucle seguirá con la siguiente celda hasta recorrerlas todas.

Ahora escribimos dentro del bloque FOR EACH, la acción a ejecutar, en este caso dar formato moneda. Se trata de la propiedad NumberFormat del objeto range.

Para conseguir el punto de millar y dos decimales empleamos la máscara: «#,##0.00 €, y por si existieran valores negativos que tuviéramos que resaltar en rojo, añadimos la máscara: [Red]-#,##0.00 €»

máscara formato moneda

Ejecutamos con F5, y este es el resultado:

formato moneda aplicado

Este es el código:

Sub Metodo1()
    Dim rango As Range
    Dim celda As Range
    
    Set rango = Range("C3:C16")
    
    For Each celda In rango
        celda.NumberFormat = "#,##0.00 € ;[Red]-#,##0.00 €"
    Next celda    
End Sub

BONUS

¿Y cuando el rango es muy grande y no sabemos cuál es la última celda?

Solo tenemos que definir el rango usando la propiedad End(direction). En este caso, la dirección de la propiedad es xlDown (hacia abajo). Esta propiedad detecta la última celda con valores en esa columna y estira el rango hasta ella.

propiedad End(xlDown)

El resto del código no cambia:

propiedad NumberFormat

Tenemos una referencia aproximada del rango

Cuando los datos entran en una columna procedentes de una fuente externa, por ejemplo, y no sabemos el número exacto de filas que tendrá el rango, podemos usar otro método para dar formato moneda a los valores de las ventas.

Con la instrucción FOR … NEXT no tenemos que preocuparnos por el número total de celdas del rango. Solo necesitamos saber el número de columna adonde llegan los datos.

En lugar del objeto range, usaremos el objeto cells.

datos sin formato

Abrimos el editor de VBA (ALT+F11)

Insertamos un módulo (menú Insertar >> Módulo, y damos un nombre al procedimiento: Metodo2(). Evitamos las tildes para el nombre del método.

Con este método usaremos un bucle FOR … NEXT para dar formato de moneda al rango que contiene los valores.

insertamos módulo

Tomamos la celda C3 como referencia para el comienzo del rango:

celda comienzo del rango

Declaramos una variable integer que actuará como contador del bucle FOR … NEXT: i

la variable i

Declaramos una variable de tipo long para el número de la última fila del rango: ultimaFila

la variable ultimaFila

La variable ultimaFila es el valor de la propiedad row, que nos devuelve un número de fila. En nuestro caso, usamos la propiedad End(xlDown) para indicarle cuál será la última fila del rango.

valor de ultimaFila

Con las dos variables tenemos la celda de comienzo y la celda final del rango. Por lo tanto, ya podemos iterar sobre las celdas del rango.

El bucle comenzará en la celda que le indiquemos (i = 3) y recorrerá todas las celdas hasta el final (ultimaFila).

bucle FOR … NEXT

Usamos el objeto cells, para indicarle la fila (que será el valor de i) y la columna que será 3 para todas las celdas (es decir, la columna C).

objeto Cells

Ahora escribimos dentro del bloque FOR NEXT, la acción a ejecutar, en este caso dar formato moneda. Ya hemos visto anteriormente que es la propiedad NumberFormat.

Después del signo igual, hemos incluido el guion bajo porque nos permite dividir líneas de código muy largas y así hacerlo más legible.

propiedad NumberFormat

Presionamos la tecla F5 y vemos el resultado:

formato moneda aplicado

Este es el código:

Sub Metodo2()
    Dim i As Integer
    Dim ultimaFila As Long
    
    ultimaFila = Range("C3").End(xlDown).Row

    For i = 3 To ultimaFila
        Cells(i, 3).NumberFormat = _
        "#,##0.00 € ;[Red]-#,##0.00 €"
    Next i
End Sub