webForumDet fria alternativet

Excel: Summera för varje tal i en serie

Kontorsprogram

8 svar · 1 870 visningar · startad av kristoffer

Medlem sedan juni 20001 257 inlägg
Frågan#1

Jag vill i Excel utföra en beräkning på varje tal mellan x1, x2, ..., xn, där x(n+1) = xn + 1 och därefter summera varje tal.

Exempel, om jag skall dubbla varje tal, och om x1 = 1 och n = 3:

= x1*2 + x2*2 + x3*2 =
= 1*2 + 2*2 + 3*2 = 11

Hur kan jag göra detta i en formel?

Medlem sedan jan. 2007177 inlägg
#2

kristoffer skrev:

= 1*2 + 2*2 + 3*2 = 11

Hmm... Summan måste här alltid vara ett jämt tal, dvs rimlighetskontroll och kontrollräkning ger nog ett annat svar ;-)

Till frågan. Om det handlar om "enkla" beräkningar så att talföljden blir en aritmetisk eller geometrisk talföljd så kan man slå upp uttrycket för summan i närmaste formelsammling [1][2] och använda detta. Excel har annars en funktionalitet matrisformel ("En matrisformel kan utföra flera beräkningar och sedan returnera ett enstaka resultat eller flera resultat") om du har hela listan x0,x1,x2.... xn som en lista men inte vill visa delberäkningarna för varje tal xi innan du gör en vanlig summering.

http://sv.wikipedia.org/wiki/Aritmetisk_summa
http://sv.wikipedia.org/wiki/Geometrisk_summa

Medlem sedan juni 20001 257 inlägg
#3

Hej. Ja, jag skrev fel summa där :)

Ok, nej, mitt exempel med dubbleringen var bara ett exempel. Det jag egentligen vill göra är att räkna ut ett pris för ett antal artiklar, där priset bygger på ett antal trappsteg:

1-1 000: 2 kr styck
1 001 - 1 999: 1 kr styck
2 001 - 2 999: 0,50 kr styck

Ett köp av 1 500 artiklar kostar alltså 1 000*2 + 500*1 = 2 500 kr

Jag har kommit så långt att jag kan leta upp i priset för ett visst intervall:

A     B
=====
1     2
1001 1
2001 0,50

=LETARAD(1500;A1:B3;2)

formeln ger: 1

Men jag behöver ju summera från 0 till 1500, alltså:

summa = 0;
for (i=1; i<=1500; i++) {
 summa += LETARAD(i;A1:B3;2)
}

Kan man göra detta på något sätt?

Medlem sedan jan. 2007177 inlägg
#4

Det var ju ett helt annat problem än att summera en talföljd :-)

Den generella lösningen är väl att skriva en egen funktion som tar antal och en prismatris som variabler och ger summan som resultat.

Man kan också direkt i kalkylbladet använda resultatet av if-satser för att göra beräkningar t.ex. genom att först beräkna fult pris för alla och sedan dra av rabatt för det antal som ligger över respektive prisgräns. I ditt fall om A10 innehåller antalet och A1:B3 innehåller prismatrisen.

=A10*B1-OM(A10>=A2;A10-A2+1;0)*(B1-B2)-OM(A10>=A3;A10-A3+1;0)*(B2-B3)
Medlem sedan juni 20001 257 inlägg
#5

i2n2 skrev:

Det var ju ett helt annat problem än att summera en talföljd :-)

Den generella lösningen är väl att skriva en egen funktion som tar antal och en prismatris som variabler och ger summan som resultat.

Hm, den funktion som du beskriver tar väl inte hänsyn till att det är olika priser för de olika artiklarna? De första 1000 kostar 2 kr / styck, nästa 1000 kostar 1 kr /styck.

Så, jag tänkte att det handlar just om att summera en följd av tal, dvs att summera en följd av beräknade tal:

resultat =
MinFunktion(1, prismatris) + MinFunktion(2, prismatris) + ... + MinFunktion(1500, prismatris) =
LETARAD(1;A1:B3;2) + LETARAD(2;A1:B3;2) + ... + LETARAD(1500;A1:B3;2)

där MinFunktion returnerar priset för just det enskilda värdet.

Medlem sedan jan. 2007177 inlägg
#6

kristoffer skrev:

Hm, den funktion som du beskriver tar väl inte hänsyn till att det är olika priser för de olika artiklarna? De första 1000 kostar 2 kr / styck, nästa 1000 kostar 1 kr /styck.

Med "egen funktion" menade jag en funktion skriven i VisualBasic som du anropar från kalkylbladet eftersom beräkningar med formler i kalkylblad som kräver flera if-satser eller motsvarande för att ge en lösning för alla tänkbara fall ofta blir svårlästa och svårtolkade (ex. den formeln som jag gav).

kristoffer skrev:

Så, jag tänkte att det handlar just om att summera en följd av tal, dvs att summera en följd av beräknade tal:

Du bör inte göra beräkningen genom att for-loopa, och summera, från 1 till antalet för att få ett summa pris utan använda villkor som gör att resultatet beräknas på olika sätt .

Ditt exempel "1 500 artiklar kostar alltså 1 000*2 + 500*1 = 2 500 kr" beräknas ju enkelt utan for-loop och om vi beskriver de fall du kan råka ut för får vi bara tre fall. Fungerar inte den formel som jag gav som ju är ett sätt att använda if-satser i en kalkylbladesformel för att göra beräkningen så att det fungerar för alla tre fallen (byt OM till IF och kanske ; till , om du kör annat språk och numeriskt format).

Är det flera olika varor med olika prismatriser som du planerar för så rekommenderar jag en VB lösning.

Medlem sedan aug. 2004126 inlägg
#7

Om det är så få nivåer går det lätt att lösa med enkla OM-satser.

Låt oss säga att antalet är i kolumn A, priset i kolumn B och prislistan i C-D.

       A       B       C       D
1    3000     ?        0        2
2    1000     ?        1000     1
3    4000     ?        2000     0,5
4    500      ?

Låt då B1 vara

=OM(A1>$C$3;(A1-$C$3)*$D$3+($C$3-$C$2)*$D$2+$C$2*$D$1;OM(A1>$C$2;(A1-$C$2)*$D$2+$C$2*$D$1;A1*$D$1))

...kopiera nedåt.

En snyggare och mer skalbar lösning, fortfarande utan onödig VBA ;) , är att lägga till en hjälpkolumn i tabellen, låt i exemplet ovan E1 vara 0 och låt E2 vara

=(C2-C1)*D1+SUMMA($E$1:E1)

Fyll nedåt i E-kolumnen för hela prislistan.

Sedan låter du B1 vara

=LETARAD(A1;$C$1:$D$20;2;2)*(A1-FÖRSKJUTNING($C$1;PASSA(A1;$C$1:$C$20;1)-1;0))+LETARAD(A1;$C$1:$E$20;3;2)

Och fyller nedåt så långt du behöver (här har jag förutsatt max 15 poster i prislistan, men den kan vara hur lång som helst).

Medlem sedan jan. 2007177 inlägg
#8

Tosse skrev:

En snyggare och mer skalbar lösning, fortfarande utan onödig VBA ;)

Det var väl till mig som föreslog VBA som lösningsmetod. Det skall mycket till för att jag skall uppskatta denna typ av lättolkade ;-) kalkylbladsformler framför ett anrop av en VBA funktion prisMedMangdrabbat(antal, mangdRabattMatris) som borde kunna innehålla felhantering ge ett svar och läsbar kod. Nu visar det sig att den gamla Excelversion jag kör inte kan ta en matris med dynamisk storlek som argument (går det i modernare versioner?) och då blir ju funktionen inte fullt lika användbar.

Medlem sedan aug. 2004126 inlägg
#9

i2n2 skrev:

Det var väl till mig som föreslog VBA som lösningsmetod. Det skall mycket till för att jag skall uppskatta denna typ av lättolkade ;-) kalkylbladsformler framför ett anrop av en VBA funktion prisMedMangdrabbat(antal, mangdRabattMatris) som borde kunna innehålla felhantering ge ett svar och läsbar kod. Nu visar det sig att den gamla Excelversion jag kör inte kan ta en matris med dynamisk storlek som argument (går det i modernare versioner?) och då blir ju funktionen inte fullt lika användbar.

Självklart var det det... med glimten i ögat. Jag använder VBA mycket själv också och det är väldigt kraftfullt, problem uppstår mest när andra ska öppna mina filer. Beroende på säkerhetsinställningar och VBA-version kan det mesta hända. Men ska man bara köra filen själv är det förstås inga problem. Prestandamässigt är det dock min erfarenhet att det är bättre att försöka hålla sig till de inbyggda formlerna när arbetsböckerna börjar bli tungrodda.

UDFer blir inte heller speciellt lättlästa eller -tolkade för användare som inte ens vet hur man öppnar VBA-editorn och än mindre kan tolka koden.

303 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
154 ms — deklarationer (db)
0 ms — hämta statistik (cache)
146 ms — hämta tråd, inlägg och bilagor (db)
150 ms — ändringar (db)