09. august 2007 - 16:22Der er
23 kommentarer og 1 løsning
Afrunding i excel
Hvordan sikrer man, at en talrække med x antal decimaler, hvoraf summen bliver eksempelvis 11 også bliver 11 efter der er afrundet til nul decimaler når man lægger de afrundede værdier sammen.
Eksempel: Ved afrunding af nedenstående talrække til nul decimaler bliver summen af de afrundede tal 10 og ikke 11.
Talrække (ikke afrundet) giver 11: 0,49 0,97 2,15 1,09 1,14 1,68 1,30 2,18 Sum 11,00
Talrække (afrundet) giver 10: 0 1 2 1 1 2 1 2 Sum 10
Hvordan kan dette løses uden manuel afrunding (der ønskes at summen fortsat giver 11)??
Ved flg. brug af ændring af visning af decimaler, kan du få Excel til at give dig et resultat hvor decimalerne også er talt med:
Afrunde et tal Ændre antallet af viste decimalpladser uden at ændre tallet
"I et regneark Marker de celler, du vil formatere. Hvis du vil have vist flere eller færre cifre efter decimaltegnet, skal du klikke på Forøg decimal eller Formindsk decimal på værktøjslinjen (værktøjslinje: En linje med knapper og indstillinger, der kan bruges til at udføre kommandoer. Klik på Tilpas i menuen Funktioner, og klik derefter på fanen Værktøjslinjer.) Formatering."
Mvh. Be_Nice "Hver for sig kan vi alle en smule - men sammen kan vi det hele :o)"
Problemet er, at jeg skal fordele værdien 11, så der samlet er fordelt 11, men de værdier de 11 fordeles på skal være uden decimaler. Hvis man ser på talrækken der er afrundet, fordeles der samlet kun 10. For at få fordelt 11 er det "mest fair", at det er den første værdi på 0,49 der rundes op til 0,50, hvorved der ved afrunding til nul decimaler bliver afrundet til 1. Samlet vil der dermed være fordelt 11.
Denne justering af afrundingen vil jeg dog gerne have foretaget "automatisk" via en funktion/metode i Excel istedet for manuel korrektion af værdierne.
Du kommer nok til at præcisere det hele lidt nærmere - har du en fast sum du skal fordele, hvilken fordelingsnøgle ønsker du at bruge - eller har du ikke noget fast system?
Giv en tilbagemelding og så skal jeg nok forsøge at guide dig til en løsning.
Mvh. Be_Nice "Hver for sig kan vi alle en smule - men sammen kan vi det hele :o)"
Hmmm. det kan godt være dette spørgsmål skulle ha' været tildelt mere end 20 point :-)
Problemet er at jeg skal fordele 11 t.kr. ud fra ovennævnte andele. Jeg skal fordele de 11 t.kr. i hele tusinder, dvs. uden decimaler. De 11 t.kr. skal alle fordeles på den mest "fair" måde. Det mest "fair" er at runde den første værdi op til 1 (efter afrunding), men det efterspørger jeg en funktion der kan gøre automatisk.
Først vil jeg sige at med hensyn til tildeling af point, så er det til enhver tid spørgerens ret at definere hvor mange point man ønsker at give for et svar - det bør dog ikke være nødvendigt at give mange point for at få løst sine problemer.
Med hensyn til din fordelingsnøgle, så er de fremkomne forslag om at afrunde nok det nærmeste du kommer et "perfekt" resultat - om det er "fair" at dele 11 t.kr. på den måde du foreslår, er der vel kun dig selv til at vurdere. Jeg ville nok foretrække en fordeling i nærmeste 500,- - men det kan der jo bruges megen tid på at diskutere.
Håber at du får løst "opgaven" på den bedste måde for dig.
Mvh. Be_Nice "Hver for sig kan vi alle en smule - men sammen kan vi det hele :o)"
Jeg har fået løst opgaven ved manuel op- og nedrunding af en række lister tilsvarende den i eksemplet ovenfor. Det er dog en tilbagevendende opgave og det ville derfor være super med en funktion der automatisk kan løse opgaven til næste gang.
I mit konkrete tilfælde skal fordelingen iøvrigt være i hele tusinder.
Sådan som jeg forstår dit forslag, skal der stadig foretages en manuel vurdering af, hvilke(n) værdi(er) der er tættest på at skulle rundes op (eller ned) for at få fordelt de 11, så det hjælper mig ikke.
YDERLIGERE UDDYBNING:
I det nævnte eksempel skal de 11 fordeles på 8 andele med forskellig værdi. Det kunne dog lige så godt have været 1000, der skulle fordeles på 125 andele med forskellig værdi, hvilket jo gør opgaven noget mere uoverskuelig.
Min løsning har indtil videre været som følgende eksempel (jf. eksemplet med fordelingen af 11):
I cellerne A1:A8 står andelene. I cellerne B1:B8 "trækker" jeg decimalerne fra andelene i kolonne A ud via =midt(A1;3;2). Dernæst kopierer jeg resultatet i B1:B8 og vælger indsæt speciel - Værdier i kolonne C, hvorefter jeg sorterer dem stigende. Derved får jeg de værdier der er tættest på at skulle rundes op (lige under 0,50) eller ned (0,50 eller over) samlet ca. midt på listen, hvorefter den (eller de) værdier der er "nødvendige" at korrigere nemt kan identificeres og efterfølgende tilrettes.
I eksemplet med de 11 vil listen med de sorterede decimaler se således ud:
09 14 15 18 3 49 68 97
Da der i dette tilfælde mangler at blive fordelt 1 (afrundingen gav 10 jf. ovenfor) er det andelen med decimalerne 49 (0,49) der er tættest på at skulle rundes op, hvorfor denne tilrettes manuelt til eksempelvis 0,50. Derefter er de 11 fordelt.
Det er naturligvis hurtigt at foretage tilretningen manuelt i en lille liste, men ved store lister og mange lister kunne det være rart med en nemmere metode...
Såfremt en af de andre værdier udover den eksisterende værdi på 0,49 erstattes med værdien 0,49 i det nævnte eksempel, således at der bliver 2 værdier på 0,49, vil de enten begge skulle justeres op såfremt der ved afrunding til nul decimaler bliver en sum på 9. Såfremt der bliver en sum på 10 vil de begge skulle justeres op, samt den værdi der er tættest på ikke at skulle rundes, men er det, vil skulle justeres ned, så summen ikke bliver 12, men 11.
Tja, det er da noget af en opgave du ønsker udført der :o)
Umiddelbart bliver det svært at lave en automatisk regel, der også kan tage hensyn evt. gengangere af "uheldige" afrundinger, hvor der så skal besluttet om én eller flere skal rundes op/ned!
Måske skulle du overveje at lave en regel der "bare" afrunder som du ønsker, og derefter lave en kontroludregning, der fortæller om din værdi også stemmer overens med totalen på afrundingen af dine andele - ved afvigelser er du så desværre tvunget til at reagere. Med lidt gransken osv. så kunne du måske også lave en regel der så kører en ekstra gang på din nye fordeling? (Blot en tanke)
Håber at dette kan hjælpe dig lidt nærmere en løsning.
Mvh. Be_Nice "Hver for sig kan vi alle en smule - men sammen kan vi det hele :o)"
Vil der altid være minimum 1 til hver? Skal alle have min 1? Ønsker du en fordeling hvor nummer 1 får 400 og nummer 2 får 399 eller kan nummer 1 få 400 og nummer 2 kun få 2, nummer 3 få 1 osv ??
Med antallet af tusinde i celle A1 og andelene i kolonne B. Altså i A1 står der 11 i B1 0,49 B2 0,97 osv.
Private Sub CommandButton1_Click() ren = ActiveSheet.Range("D30000").End(xlUp).Row ActiveSheet.Range("D1:D" & ren) = 0 ant = ActiveSheet.Range("A1") rg = ActiveSheet.Range("B30000").End(xlUp).Row sat = 0: i = 0 ActiveSheet.Range("B1:B" & ren).Select Selection.Sort Key1:=Range("B1"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal ActiveSheet.Range("D1").Select Do i = i + 1 ActiveSheet.Range("D" & i) = ActiveSheet.Range("D" & i) + 1 sat = sat + 1 If i = rg Then i = 0 Loop While sat < ant End Sub
Jeg har stort set ikke arbejdet med programmering, så dels kan jeg ikke gennemskue hvad programkoden vil gøre, og dels får jeg fejlmeddelelsen "runtime error 1004, application error or definition error", med henvisning til nedenstående del af koden
Jeg har indsat 11 i celle A1 og andele i cellerne B1:B8 og kører så programkoden via visual basic editor. Gør jeg noget forkert??
Fordelingen af andelene er tilfældig. Der kan sagtens forekomme en eller flere andele der ikke skal tildeles 1. Et eksempel kunne være at man har 11 en-kroner (mønter) og disse skal fordeles efter de 8 andele (andelene er fremkommet via pct.-andele der summer til 1, men giver de viste værdier når værdien 11 fordeles ud fra andelene). Alle 11 en-kroner skal fordeles, så hvordan skal fordelingen være!!??
Ifølge min logik skal fordelingen være følgende (som tidligere nævnt):
Prøv at flytte andelene til kolonne C og kør denne kode:
Private Sub CommandButton1_Click() ren = ActiveSheet.Range("C30000").End(xlUp).Row ActiveSheet.Range("D1:J" & ren) = 0 ant = ActiveSheet.Range("A1") rg = ActiveSheet.Range("C30000").End(xlUp).Row sat = 0: i = 0 ActiveSheet.Range("C1:C" & ren).Select Selection.Sort Key1:=Range("C1"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal ActiveSheet.Range("D1").Select Do i = i + 1 ActiveSheet.Range("E" & i) = ActiveSheet.Range("E" & i) + 1 sat = sat + 1 If i = rg Then i = 0 Loop While sat < ant End Sub
Personligt mener jeg jo at det mest fair, så vidt muligt at fordele til andele over 0.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.