Tagarchief: Som

SOMPRODUCT: meer dan SOM en PRODUCT

SomProductSOMPRODUCT: één van de vele functies van Excel. Waar kan die voor gebruikt worden?
In dit artikel zal ik laten zien dat het meer kan zijn dan een optelling van getallen nadat die vermenigvuldigd zijn, zoals de formule hiernaast weergeeft.
Nog sterker: ik denk dat in de praktijk het (meer oneigenlijke) gebruik van de functie vaker wordt toegepast dan zoals de functie oorspronkelijk bedoeld was.

Standaard-gebruik van SOMPRODUCT

SomProduct1Laten we als simpel voorbeeld een bedrijfje nemen met 4 producten met verschillende prijzen. SomProduct2Tijdens de verkoop in de winkel wordt het aantal verkochte producten netjes bijgehouden. Op het einde van de dag willen we natuurlijk wel snel weten wat de omzet is geweest.
In het Voorbeeldbestand in het tabblad Vb1 heb ik de fictieve verkoopaantallen opgenomen. Om de omzet te bepalen moeten we de aantallen nog vermenigvuldigen met de bijbehorende prijs en alle bedragen optellen.
De standaardmethode is dan als volgt:

  1. Voeg een kolom toe waar de prijs van het product komt te staan. Dit kan makkelijk met een zoek-formule in cel G4 (in het voorbeeld staan Product en Aantal in de kolommen E en F):
    =VERT.ZOEKEN(E4;B$4:$C$7;2;ONWAAR)
    Kopieer deze formule naar beneden.
  2. De omzet komt in kolom H: in iedere regel wordt de cel in kolom F vermenigvuldigd met de cel in G.
  3. Dan onderaan in H27 een SOM-formule en we zijn klaar.

Met de Excel-functie SOMPRODUCT kunnen we de stappen 2 en 3 vervangen door één formule (in cel H28):
=SOMPRODUCT(F4:F26;G4:G26)

Wat doet deze formule: de inhoud van cel F4 wordt vermenigvuldigd met die in cel G4, F5 met G5 enzovoort tot en met de vermenigvuldiging van F26 en G26; de resultaten van de vermenigvuldigingen (PRODUCT) worden opgeteld (SOM).

NB bij het ‘nette’ gebruik van SOMPRODUCT worden de arrays gescheiden door een ; (punt-komma). Het is echter ook toegestaan om de matrices met elkaar te vermenigvuldigen. De formule wordt dan:
=SOMPRODUCT(F4:F26*G4:G26) (zie cel H29)
We zullen hieronder zien, dat deze vorm allerlei mogelijkheden biedt voor filtering van resultaten.
Een ander voordeel is, dat de formule geëvalueerd kan worden:

  1. SomProduct3selecteer cel H29
  2. kies in de menutab Formules in het blok Formules controleren de optie Formule evalueren
  3. er verschijnt een nieuw scherm:
    SomProduct4Klik op Evalueren en Excel zal de onderstreepte bewerking gaan uitvoeren (in dit geval de vermenigvuldiging van de 2 arrays).
    Je ziet dan de tussenresultaten (zoals we zelf ook hadden berekend in de cellen H4 t/m H26) omgeven door accolades ten teken dat het resultaat ook weer een array/matrix is. Bij de volgende evaluatiestap worden de tussenresultaten opgeteld.

SomProduct5Met wat creativiteit kan de standaard-formule ook nog anders gebruikt worden.
Stel dat we in de winkel niet de aantallen, maar de omzet bijhouden en we willen weten hoeveel stuks er over de toonbank zijn gegaan, dan doen we iets vergelijkbaars als hiervoor: een kolom met de prijs toevoegen en daarachter geen vermenigvuldiging maar een deling (omzet/prijs) en dan die aantallen onderaan optellen (zie Voorbeeldbestand in het tabblad Vb1).
Ook dit kan sneller met SOMPRODUCT:
=SOMPRODUCT(K4:K26;1/(L4:L26))

Verbaasd? Weet je nog bij wiskunde: delen door een getal is hetzelfde als vermenigvuldigen met het omgekeerde.
Dus we vermenigvuldigen de omzet (kolom K) met het omgekeerde van de prijs (dus 1 gedeeld door kolom L).

SOMPRODUCT voor gevorderden 1

Maar nu begint het pas leuk te worden!
Nu we ongeveer weten hoe SOMPRODUCT werkt, gaan we nog eens wat andere arrays toevoegen.

In het Voorbeeldbestand heb ik op tabblad Vb2 hetzelfde verkoopoverzicht staan. SomProduct6Waar we hiervoor een totale omzet hebben berekend, gaan we nu de omzet per product uitrekenen zonder  gebruik van een hulpkolom.

De formule: =SOMPRODUCT(($E$4:$E$26=I4)*($F$4:$F$26)*($G$4:$G$26)) in cel J4 volstaat om het resultaat 1.590 te berekenen.
De laatste 2 matrices kennen we al van de totalen-berekening (nu absoluut gemaakt zodat de formule naar beneden naar de andere drie producten kan worden gekopieerd).
Met de eerste array is iets ‘geks’ aan de hand: we gebruiken niet de inhoud zelf van de cellen E4 t/m E26 maar het resultaat van een vergelijking met cel I4: als de inhoud van cel E4 gelijk is aan de inhoud van cel I4 dan wordt het resultaat WAAR anders ONWAAR.
Voor Excel is WAAR gelijk aan 1 en ONWAAR gelijk aan 0; dus bij vermenigvuldigen wordt alleen de omzet meegeteld als de vergelijking met I4 WAAR is.

Bekijk met Formule evalueren de tussenstappen:  SomProduct7  SomProduct8  SomProduct9  ……
SomProduct10 etc

SOMPRODUCT voor gevorderden 2

Maar we hoeven het natuurlijk niet bij één filter/selectie te houden.
SomProduct11In het Voorbeeldbestand op het tabblad Vb3 staat een iets uitgebreider omzetoverzicht. Aangezien we nu ook  informatie over de regio hebben kunnen we daar ook op selecteren/filteren bij het berekenen van de totale omzet:
in cel H4 komt dan =SOMPRODUCT(($B$3:$B$1002=$H$2)*($C$3:$C$1002=$H$3)*$E$3:$E$1002)

Op dezelfde manier turven we ook het aantal keren, dat er voor de regio Noord het product Een is verkocht: =SOMPRODUCT(($B$3:$B$1002=$H$2)*($C$3:$C$1002=$H$3))

Tik in cel H2 Zuid in en de resultaten staan in de cellen H4 en H5!

Voor Draaitabel-adepten (net als ik!) is dit allemaal spielerei en moeilijk gedoe: met 8 muisklikken (en nog een paar extra om de opmaak te regelen) heb je al een totaaloverzicht met alle gewenste uitsplitsingen (zie tabblad Vb3).
Maar ik moet toegeven dat de mogelijkheden van SOMPRODUCT soms verder gaan: je kunt de formules op iedere willekeurige plaats gebruiken en bent dus niet gebonden aan het draaitabel-stramien.
En ook de filteringsmogelijkheden gaan verder:

SomProduct12In het omzetoverzicht is een verkoopdatum opgenomen; door een juiste filtering bepalen we de totalen per maand (ik weet het: met groeperen kan dat ook simpel in een draaitabel!). De formule voor het aantal wordt dan:
=SOMPRODUCT(1*(MAAND($D$3:$D$1002)=$H$7))

LET OP omdat we maar 1 selectie/filtering hebben, hebben we dus ook maar 1 array met daarin de waardes WAAR en ONWAAR. Bij de vorige voorbeelden werden die door Excel naar 1 en 0 vertaald bij de vermenigvuldiging. In dit geval forceren we een berekening door de waarden van de array met 1 te vermenigvuldigen. Een andere berekening is 0 erbij optellen (zie cel I9) of om het tegenovergestelde ervan te pakken (min-teken ervoor zetten; is hetzelfde als vermenigvuldigen met -1; zie cel J9). Doe dat laatste 2x om het juiste teken te krijgen!
Bekijk de tussenstappen met Formule evalueren.

In het tabblad Vb3 zijn nog andere voorbeelden opgenomen, die met een draaitabel niet of moeizaam kunnen worden opgelost. Via de juiste formules is het ook mogelijk om op stukken tekst te filteren.  In cel H12 staat:
=SOMPRODUCT(ISGETAL(VIND.ALLES(H11;$B$3:$B$1002))*$E$3:$E$1002)

Als de tekst uit H11 voorkomt in de cellen in kolom B (VIND.ALLES levert dan een getal op, namelijk de positie waar de tekst gevonden is) dan levert ISGETAL de waarde WAAR op, anders ONWAAR. Bij de vermenigvuldiging met de waardes uit kolom E worden deze automatisch vertaald in 1 en 0. Ook hier: bekijk de tussenstappen met Formule evalueren.

LET OP de functie VIND.ALLES is hoofdletter-gevoelig.

SOM voor gevorderden

Voor de liefhebbers: de eigenschap van SOMPRODUCT, dat berekeningen worden uitgevoerd op reeksen/arrays/matrices kunnen we ook toepassen bij veel ‘gewone’ Excel-functies, zoals SOM.

In I16 wordt SOM gebruikt ipv SOMPRODUCT. Maar om Excel te laten weten, dat er een matrix-berekening moet worden uitgevoerd moet je na het invoeren van de formule NIET op Enter drukken, maar op Ctrl-Shift-Enter (soms afgekort als CSE-invoer).
Excel plaatst dan automatisch accolades rond de formule.

LET OP alleen CSE-invoer kan gebruikt worden voor matrix-berekeningen; zelf plaatsen van accolades werkt niet!

SOMPRODUCT voor zeer gevorderden

Ik kwam deze week toevallig een voorbeeld tegen van SOMPRODUCT waarbij ik toch even op mijn hoofd moest krabben.
Ik heb de formule aangepast voor de Nederlandse versie van Excel en nog wat opmaak toegevoegd:

=”06 “&TEKST(SOMPRODUCT(10^(8-RIJ(INDIRECT(“1:8″)))*ZOEKEN(CODE(HOOFDLETTERS(DEEL(LINKS(SPATIES.WISSEN(SUBSTITUEREN(C3;” “;””))&HERHALING(“0”;8);8);RIJ(INDIRECT(“1:8″));1)));{48;49;50;51;52;53;54;55;56;57;64;68;71;74;77;80;84;87};{0;1;2;3;4;5;6;7;8;9;2;3;4;5;6;7;8;9}));”000 000 00”)

Deze formule zet een telefoonnummer in letters (in reclames werd je er ooit mee dood gegooid; nu zie ik ze niet meer) om naar een echt telefoonnummer:
dus 06 DIZ PK ROI wordt 06 349 757 64.

Gebruik Formule evalueren om de formule te doorgronden op het tabblad Vb4 van het Voorbeeldbestand.

Kom je er niet uit: neem contact op met G-Info.


Tellen met voorwaarden

Het is weer de tijd van tennistoernooien.

Op het eerste gezicht lijkt er geen verband met Excel te bestaan, maar ook hier kan Excel ingezet worden.
Ik sprak iemand, die een toernooi had georganiseerd en ’s avonds nog snel de resultaten moest bepalen: “ik heb alle uitslagen met punten per wedstrijd in Excel staan, maar ik moet nu snel van iedereen afzonderlijk de punten bij elkaar hebben.”
In Excel kan dat makkelijk met Tellen met voorwaarden.

AANTAL.ALS

Tellen met voorwaardenDe eerste functie die we zullen bekijken is AANTAL.ALS().

Ik heb een Voorbeeldbestand gemaakt, dat iets ingewikkelder is dan het verwerken van de resultaten van een tennistoernooi.
Het is  een overzicht, waarin per maand en per regio de omzet van diverse vertegenwoordigers/agenten is opgenomen.
Wanneer we nu bijvoorbeeld willen weten hoe vaak een omzet van € 7.500 voorkomt (de omzet staat in de cellen E3:E202) dan kunnen we de volgende formule gebruiken: =AANTAL.ALS(E3:E202;7500).

Tellen met voorwaardenDe eerste parameter/argument van de functie is het bereik van de gegevens, waarvan u de aantallen wilt weten en het tweede argument is de voorwaarde waaraan ze moeten voldoen om mee te mogen tellen.
Door in te typen =AANTAL.ALS(B3:B202;”jan”) zien we dat er voor januari 22 keer een omzet is geregistreerd.

LET OP: als de voorwaarde een tekst is dan moeten er “ (aanhalingstekens) om de voorwaarde gezet worden.

Tellen met voorwaardenIn het voorbeeld hiernaast ziet u dat u op deze manier snel een jaaroverzicht kunt maken; op de plaats van de voorwaarde staat een verwijzing naar een cel, die de gewenste voorwaarde bevat.
Door in de cel I6 het bereik dmv de $-tekens absoluut te maken en de voorwaarde (G6) niet, kan deze formule direct naar beneden gekopieerd worden en hoeft dan in de andere cellen niet meer aangepast te worden.
Onze tennis-organisator zou een dergelijk overzicht dus ook voor de deelnemers aan het toernooi kunnen maken en Excel haalt de gewenste gegevens dan op.

Jokers

Zoals op veel meer plaatsen in Excel kunnen bij tekst-voorwaarden zogenaamde Jokers (wildcards) worden ingezet.
Tellen met voorwaardenHiernaast staan drie voorbeelden van het gebruik van het * (sterretje; dit joker-teken geeft aan, dat wat er vanaf die positie komt niet relevant is): in het eerste geval tellen we de aantallen van de maanden die beginnen met een ‘j’, in de tweede regel alle regio’s, die eindigen op een ‘d’ (Noord en Zuid dus) en als laatste alle regio’s, die eindigen op een ‘t’ (Oost en West).

Tellen met voorwaardenIn de praktijk komt het gebruik van een ander joker-teken (het vraagteken, ?) minder voor: waar het sterretje (*) een willekeurig aantal tekens vervangt, geeft het vraagteken aan, dat het niet relevant is wat er op die ene positie staat. In het voorbeeld zoeken we alle agenten, waar op de tweede plaats een ‘a’ staat.

Numerieke voorwaarden

Tellen met voorwaardenWanneer we een voorwaarde opgeven voor getallen dan is het niet alleen mogelijk om exacte getallen te zoeken (in het eerste voorbeeld hierboven moest de omzet exact gelijk zijn aan 7.500), maar ook vergelijkingen als kleiner dan (<), groter of gelijk aan (>=) zijn mogelijk.

SOM.ALS

In de voorgaande voorbeelden hebben we met behulp van AANTAL.ALS aantallen geteld. In Excel is het ook mogelijk om op een vergelijkbare manier getallen op te tellen (voor onze toernooi-directeur zeker zo interessant!).

Tellen met voorwaardenIn het voorbeeld hiernaast wordt door de formule =SOM.ALS(E3:E202;7500) alle omzet, die voldoet aan de voorwaarde, dat de omzet gelijk is aan 7.500, opgeteld. Aangezien we hiervoor hebben gezien dat dit in het voorbeeldbestand 4 keer voorkomt, is de som gelijk aan 30.000.

Tellen8De SOM.ALS-formule is echter nog krachtiger: het is mogelijk om een derde argument aan de functie mee te geven, het zogenaamde Optelbereik.

NB een dergelijk argument, dat niet altijd hoeft te worden ingevuld, wordt optioneel genoemd. Bij het intikken van een formule worden dergelijke parameters met []-haken aangeduid. Bij het scherm met Functieargumenten (ga naar een cel met een SOM.ALS-formule en klik op FunctieInvoeren), zijn optionele argumenten lichtgrijs.

Een uitbreiding van SOM.ALS is de functie SOMMEN.ALS. Misschien wat verwarrend: de volgorde van de argumenten is heel anders dan bij SOM.ALS.
Tellen met voorwaardenHet eerste argument van SOMMEN.ALS is het optelbereik, het tweede een criteriumbereik en het derde de voorwaarde. Op deze manier is de werking van deze functie exact gelijk aan SOM.ALS. De kracht van de uitgebreidere functie is, dat er meerdere voorwaarden als argument meegegeven kunnen worden.

Draaitabel

Veel van bovenstaande berekeningen kunnen veel makkelijker, sneller, flexibeler (bedenk nog maar een paar ander loftuitingen) met een draaitabel worden bepaald; zie het tabblad Draai in het Voorbeeldbestand.

Waar het aankomt op voorwaarden met Jokers of vergelijkingstekens (<, > etc) zijn bovenstaande formules echter een must-have (of must-know?).

Functie ToonFormule

In de voorbeelden is gebruik gemaakt van de Eigen Functie ToonFormule(). Andere voorbeelden van eigen functies zijn te vinden in het artikel G-Info en de functie G_Info().

Wilt u de functie ToonFormule gebruiken dan kunt u deze terugvinden in Module1 van de Visual Basic-omgeving (zie het artikel over VBA voor uitleg hierover). Kopieer de functie naar een Module in de VBA-omgeving van uw eigen spreadsheet.