domingo, febrero 05, 2006

La función SUMAPRODUCTO, una explicación básica

En una nota anterior he mostrado como calcular un promedio ponderado utilizando la función SUMAPRODUCTO (SUMPRODUCT en la versión inglesa de Excel), sin entrar en demasiado detalle sobre cómo funciona.
Esta función se comporta como las funciones matriciales, pero sin la necesidad de pulsar Ctrl+Shift+Enter para anotarla.
Con SUMAPRODUCTO se pueden hacer de una vez cálculos que de otra manera habría que realizar en varios pasos.
La forma más sencilla de explicar esta función es con un ejemplo. Esta función multiplica vectores (Excel en castellano los llama matrices), que son listas de valores que se encuentran en distintos rangos. La condición necesaria es que todos los rangos tengan el mismo "tamaño".
Así, si tenemos en una hoja una lista de productos en la columna A, los precios de estos productos en la columna B y las cantidades vendidas en al columna C, la fórmula =SUMAPRODUCTO(B2:B11,C2:C11) nos dará como resultado el total vendido.




Sin esta función tendríamos que calcular cada producto por separado y luego sumarlos en otra celda. Es decir, 10 fórmulas para multiplicar y otra para sumar las multiplicaciones, en lugar de una única fórmula.


Pero con SUMAPRODUCTO se puede hacer mucho más. Por ejemplo, contar cuántos productos de nuestra lista hay entre dos precios determinados, o cuántos productos han producido ventas por encima de cierto monto. Estas técnicas los mostraré en la próxima nota.



Si te gustó esta nota anotala en del.icio.us



Technorati Tags: ,



Categorías: Funciones&Formulas_, Formulas Matriciales_

24 comentarios:

  1. Espero que todavía leas los comentarios de un post tan viejo.

    Hace rato que leo tu blog, al cual estoy subscripto, y lo uso como consulta permanente ante nuevos desafíos con excel.

    Mi pregunta es sobre sumaproducto, hace lo que necesito, pero no puedo aplicarlo a una tabla cuyas filas cambian cada tanto (son mas o menos).

    Es decir, no puedo utilizar un rango del tipo A1:A20 porque si mañana la tabla tiene 21 filas no las incluye; si uso A:A me tira error y no quiero modificar la fórmula cada vez que la tabla crece o se reduce.

    Alguna idea?, muchas gracias.

    ResponderBorrar
  2. Hola,
    si, trato de leer todos los comentarios que llegana todos los posts.
    La solución es utilizar rangos dinámicos, como está explicado en esta nota.

    ResponderBorrar
  3. Muchas gracias, me solucionó un gran problema pero no otro, por un lado pude hacer lo que quería pero también lo necesito hacer en una formula que utilizo para sacar los elemenos unicos de una lista que varía permanentemente.

    Para hacertelo mas claro, tengo un listado del tipo:

    AgenteA
    AgenteA
    AgenteB
    AgenteA

    Lo que necesito es saber la cantidad de Agentes, en este caso solo 2, hasta ahora uso la formula:

    {=SUMA(1/CONTAR.SI(A1:A4;A1:A4))}

    la cual funciona perfecta, pero si mañana tengo 5 filas o 3 esta formula me da error.

    Haciendo lo que me comentas con DESREF no funciona adentro de esta formula.

    Se entendió?.

    Una vez mas agradezco la ayuda permanente que le das a todos tus lectores.

    ResponderBorrar
  4. Hola
    sen entiende, pero no comprendo por qué no te funciona. Ten en cuenta que los rangos de CONTAR.SI deben tener el msimo número de filas.
    Digamos que la lista de agentes empieza en la celda A1 y se extiende a lo largo de la columna A. La fórmula en el nombre que contiene el rango dinámico debe ser

    =DESREF(Hoja1!A1;0;0;CONTARA(A:A);1)

    A medida que vayas agregando, o quitando agentes, el rango se irá adaptando.

    Si no lo logras puedes mandarme el archivo para que vea donde pueda estar el problema.

    ResponderBorrar
  5. Hola
    sen entiende, pero no comprendo por qué no te funciona. Ten en cuenta que los rangos de CONTAR.SI deben tener el msimo número de filas.
    Digamos que la lista de agentes empieza en la celda A1 y se extiende a lo largo de la columna A. La fórmula en el nombre que contiene el rango dinámico debe ser

    =DESREF(Hoja1!A1;0;0;CONTARA(A:A);1)

    A medida que vayas agregando, o quitando agentes, el rango se irá adaptando.

    Si no lo logras puedes mandarme el archivo para que vea donde pueda estar el problema.

    ResponderBorrar
  6. Buenos días,
    Muchas gracias por tu blog sobre excel, ¡es un verdadero manual avanzado! y me está resultando muy útil para automatizar unos informes, concretamente utilizando la función sumarproducto para dar un resultado según una lista de proveedores. Pero sigo teniendo un problemilla que no he conseguido resolver y te agradecería que le dieras un vistazo:
    Tengo un listado de incidencias y proveedores y una série de códigos de resolución. Para los provedores "conocidos" a,b,c,d genero el informe sin problemas pero existen proveedores de otros departamentos del todo desconocidos y que pueden ir cambiando cada mes (por ejemplo x,y,z). Para ellos quisiera dar un resultado sumarizado. Se me ocurre comparar con una lista de proveedores "conocidos" ... pero no he conseguido implementarlo.
    La funcion sumaproducto que estoy utilizando es (simplificad) del tipo: =SUMAPRODUCTO(((Detall!$E$2:$E$36="Resuelta")*(Detall!$I$2:$I$36="a")))
    * Detall!$E$2:$E$36 es el rango donde buscar el codigo de incidencia
    * Detall!$I$2:$I$36 es el rango donde localizar el proveedor

    La función me tendría que resolver la siguiente pregunta: para todos los proveedores que no son ni a, ni b ... (es decir, que no está en la lista de proveedores conocidos)

    Muchas gracias de antemano.
    Mònica

    ResponderBorrar
  7. Hola Mónica
    ese tipo de consultas las tienes que hacer vía mail (figura arriba, en la columna izquierda del blog).

    ResponderBorrar
  8. Hola Jorge!

    Hace un tiempo que leo sus explicaciones y realmente me han servido de mucho, pero en este momento tengo un problema del que no puedo salir. He probado de varias formas y ninguna me da resultados.
    Lo que quiero hacer es contar la cantidad de veces que en una misma columna figuran las palabras "regular", "mal" y "bien-". He probado estas fórmulas:

    =SUMAPRODUCTO(((E16:E29)="Mal")*((E16:E29)="Reg")*1)

    =SUMA(SI(E5:E59="B";SI(C3:C57="1";0;1)))

    En SUMAPRODUCTO el resultado me da 0, es decir que no funciona. Y en la segunda me da 17 cuando hay más de 20.

    Podría ayudarme? Realmente se lo agradecería.

    Un cordial saludo,

    Leila.

    ResponderBorrar
  9. Hola Leila

    el planteo de tu problema es: cuántas veces aparece la palabra "bien" o la palabra "mal o la palabra "regular". Siendo así la fórmula tiene que ser

    =SUMAPRODUCTO(((E16:E29)="Mal")+((E16:E29)="Regular")+((E16:E29)="Bien"))

    Es decir, usamos el operador "+" en lugar de "*".

    Cuando usas "*" estas pidiendo que en cada celda aparezca también "mal", también "regular" y también "bien". Lógicamente el resultado es 0.
    Cuando usas "+" estas diciendo que el valor de la celda puede ser o "bien" o "mal" o "regular".

    ResponderBorrar
  10. Jose Torres C.12 abril, 2011 21:32

    Jorge.

    Te felicito por tu BLOG, el cual ha sido un excelente apoyo.

    Te comento que tengo una planilla en Excel 2003 con una tabla con mas de 4000 registros que contiene 2 campos con la función sumaproducto. Cada formula tiene 5 criterios. El problema es que al calcular la hoja, se demora aprox 5 minutos en calcular, entonces mi pregunta es ¿Esto se debe a las limitaciones de la formula y/o del Excel? ¿Existe alguna solución mas eficiente?


    Saludos

    ResponderBorrar
  11. Si, existen soluciones más eficientes, por ejemplo, tablas dinámicas. Pero mucho depende de la estrucutra del modelo y de lo que tienes que calcular. Puedes mandarme el archivo para ver si puedo sugerirte algo más específico.

    ResponderBorrar
  12. BUENAS TARDES, ANDO APRENDIENDO EXCEL EN MUCHOS ASPECTOS, SOBRE TODO CON EL 2007 Y ME ENCONTRE CON ESTA FORMULA =(SUMPRODUCT(ISNUMBER(SEARCH($A7,Sales!$E$2:$E$25000))*ISNUMBER(SEARCH(B$6,Sales!$G$2:$G$25000)),Sales!$H$2:$H$25000))

    ESTA FORMULA LO QUE HACE ES QUE BUSCA A7(UN PRODUCTO DE CONSUMO MASIVO) EN EL LIBRO SALES(DONDE ESTAN CARGADOS LOS DATOS) Y BUSCA B6(EL CODIGO DE UN VENDEDOR)EN SALES Y LUEGO EL FINAL DE LA FORMULA SUMA LA CANTIDADES DE CAJA VENDIDAS CON CADA VENDEDOR

    LA CUESTION ES LA SIGUIENTE EN CIERTA MANERA ENTIENDO LA FORMULA, PERO AUN NO LOGRO ENTENDER BUSCANDO EN TODOS LADOS QUE HACE EL "ISNUMBER" ESNUMERO EN EL ESPAÑOL, POR FAVOR SERA QUE ALGUIEN ME LO EXPLICA? DE VERDAD ESTARIA AGRADECIDA ME URGE RAPIDAMENTE ENTENDER ESTO

    ResponderBorrar
  13. Eroka,

    ESNUMERO evalua el contenido de una celda y da como resultado VERDADERO si ésta contiene un número o FALSO en caso contrario. Los valores lógicos VERDADERO y FALSO pueden usarse en cálculo. Excel asigna el valor 1 a VERDADERO y 0 a FALSO.
    Por favor, evita escribir todo en mayúsculas (es como si estuvieras gritando).

    ResponderBorrar
  14. Como puedo calcular el promedio ponderado en una planilla donde existen dos columnas, una para el item y otra para su puntuación, es decir, hay manera de que la formula calcule las veces que se repite cada valor y haga el calculo del promedio ponderado o tengo que agregar obligatoriamente una columna para contar las repeticiones y utilizar SUMAPRODUCTO.
    Muchas Gracias!!!

    ResponderBorrar
  15. Hola Jorge;

    Me ocurre una cosa muy rara al usar SUMAPRODUCTO.

    Tengo 2 columnas A con fechas, B con numeros, C2 pongo el numero para que me de la fecha que le corresponde.
    =SUMAPRODUCTO((B2:B5000=C2)*(A2:A5000))

    Me da la fecha perfectamente, hasta que el numero que busco esta a partir de una cierta fila y me da una fecha erronea. Deberia darme 27/07/12 y me da 15/01/25.

    Sabes a que puede ser debido?

    Muchas gracias!

    ResponderBorrar
  16. Tendría que ver el archivo, pero tal vez esté relacionado con el problema de la configuración regional de las fechas. Algo similar muestro en esta nota.

    ResponderBorrar
  17. Jorge,

    He hecho la funcion matricial "frecuencia" para ver que valor se repite mas de la lista y para que me indique cual es el que mas se repite en una celda esta formula:

    =SUMAPRODUCTO((C23:C35=MAX(C23:C35))*(D23:D35))

    El problema me viene cuando se me repite el maximo, me suma los numeros de la columna D.

    Lo que quiero es que me de el maximo de la fila mas alta y otra celda con la formula para el max de la fila mas baja.

    Como lo puedo hacer?

    Muchas gracias

    ResponderBorrar
  18. Bien, no puedo decir que he entendido el planteo (no se cual es la relación entre los valores enla columna C y la columna D) y tampoco a que te referís con fila más alta y fila más baja, pero para calcular cuál es el valor que más se repite te sugiero usar la función MODA.

    ResponderBorrar
  19. Jorge,

    La relacion entre la columna C y D es la siguiente:

    C numero de veces que se repiten los valores de la columna D

    En la columna C esta la funcion matricial "frecuencia".

    C=frecuencia D=puntos(1,2,3,4...)

    Con la formula SUMAPRODUCTO de antes me da que valor de la columna D se repite mas.

    Pero por ejempo: pongamos que de la columna D los puntos 3 y 4 se repiten 5 veces ambos. Con esa formula SUMAPRODUCTO me da el resultado 7 y lo que quiero es que me de la fila mas alta es decir, me de el valor 4 (de la columna D).

    Espero haberme explicado mejor.

    Muchas gracias!

    ResponderBorrar
  20. Jorge,

    Si tengo esto 3 columnas y quiero que me de la ultima fecha como lo hago para que no me las sume si se repite el valor a buscar?

    FECHAS GANANCIA VALOR a buscar
    07/08/12 $90,56 90,56
    07/08/12 $103,06
    07/08/12 $90,56
    09/08/12 ($34,44)

    =SUMAPRODUCTO((B2:B5=C2)*(A2:B5))

    MMuchas gracias!

    ResponderBorrar
  21. Para enterderte mejor, lo que estás buscando es el último valor de la fecha, es decir 90.56 para el 07/08? Fijate que el rango A2:B5 comprende ds columnas y los vectores en SUMAPRODUCTO deben tener una sola columna.

    ResponderBorrar
  22. De ser así, deberías usar

    =BUSCAR(C2,$A$2:$A$5,$B$2:$B$5)

    ResponderBorrar
  23. Volviendo sobre la consulta de la frecuencia (del 7 de agosto y disculpas por la demora),si la función MODA no resuelve tu problema, quiere decir que sigo sin entender tu consulta. Te sugiero que me mandes el archivo por mail privado para que pueda hacerme una idea más exacta.

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.