abonnement Unibet Coolblue Bitvavo
  zondag 20 december 2009 @ 17:13:25 #51
67978 HenryHill
Fake it 'till you make it
pi_75843335
Haha, graag gedaan hoor

Voor de volledigheid, dit is het resultaat:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub BepaalBedrag()

Dim bedragTeBetalen, bedragGegeven, bedragRetour As Double

Rem 1. Lees de 2 invoervelden en bepaal het bedrag retour
bedragTeBetalen = Range("B1").Value
bedragGegeven = Range("B2").Value
bedragRetour = bedragGegeven - bedragTeBetalen

Rem Loop nu over alle beschikbare coupures heen...
Dim coupureIndex, coupureAantal As Integer
Dim coupure As Double

For coupureIndex = 1 To 15
    Rem Lees het bedrag voor deze coupure in
    coupure = Range("D" & coupureIndex).Value
    
    Rem Bepaal het maximaal aantal coupures dat we kunnen uitgeven zonder bedragRetour te overschrijden.
    coupureAantal = 0
    While ((coupureAantal + 1) * coupure) <= bedragRetour
        coupureAantal = coupureAantal + 1
    Wend
    
    Rem Trek het bedrag wat dit aantal coupures voorstelt af van het bedrag dat we nog uit moeten keren.
    bedragRetour = bedragRetour - (coupureAantal * coupure)
    
    Rem Schrijf het resultaat weg
    Range("E" & coupureIndex).Value = coupureAantal
Next

End Sub
So this is how liberty dies... with thunderous applause.
Truth? What's so great about the truth? Try lying for a change, it's the currency of the world
pi_75847187
't kan trouwens makkerlijk zonder VBA, gewoon met een paar formuletjes...
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
pi_75869915
Interessant maar hij klopt niet.

Te betalen = 126.38
Ontvangen = 215.48
verschil = 89.10

macro zegt dat je 89.09 terug moet geven?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
500   0
200   0
100   0
50   1
20   1
10   1
5   1
2   2
1   0
0.5   0
0.2   0
0.1   0
0.05   1
0.02   2
0.01   0
Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
pi_75870932
Deze werk wel. uitleg staat in de regels achter '

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Sub wisselgeld()

Dim check, pay, diff As Double
Dim change As String
Dim flappen As Integer

'te betalen = check
'geld gegeven = pay
'diff = wisselgeld
'bedrag is totale hoeveelheid wisselgeld
check = Range("B1").Value
pay = Range("B2").Value
diff = pay - check
bedrag = diff

'lijst met coupures
myArray = Array(500, 200, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01)
change = ""

'loop door elke coupure
For i = 0 To 14
'als te geven wisselgeld 0 is dan is loopje klaar
    If diff = 0 Then Exit For
'het aantal coupures van de betreffende waarde bepalen (int maakt er een geheel getal van)    
'myArrayi is het i-de item van de eerder aangemaakte array
    flappen = Int(diff / myArrayi)
'tekstregel maken met het aantalcoupures en het type
    change = change & flappen & "x" & myArrayi & " "
'oevrgebleven bedrag berekenen dat nog gewisseld moet worden, afronden op 2 decimalen om rekenfouten te voorkomen
    diff = Round((diff - flappen * myArrayi), 2)
Next i

'tekst box met te wisselen bedrag en hoe deze te wisselen
MsgBox bedrag & ":-->" & change

End Sub

oh ja het informatie tekentje i staat voor {i} maar dan met ronde haken ipv accolades
Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
pi_75871172
quote:
Op maandag 21 december 2009 11:01 schreef Deetch het volgende:
Deze werk wel. uitleg staat in de regels achter '
[ code verwijderd ]

oh ja het informatie tekentje i staat voor {i} maar dan met ronde haken ipv accolades
Zou het niet nog mooier zijn als je ipv de 0 to 14 loop even de lengte van de array bepaald en dan de for loop tot de lengte van de array laat lopen, dan kan de gebruiker in het geval van hyperinflatie ook nog makkelijk de briefjes van 1000, 2000, 5000 en 10.000 euro invoegen zonder dat deze de for while loop moet veranderen.
  maandag 21 december 2009 @ 12:33:31 #56
85514 ralfie
!Yvan eht nioj
pi_75874655
zonder vba veeel makkelijker

http://spreadsheets.google.com/ccc?key=0AqF4qrW2Q0b1dGx4UHBVR0tPRkRZUWxRdlcwOEY4Snc&hl=en

Enige gekke is dat de rest() / mod() of hoe je het ook wil noemen met de decimalen een kleine afwijking heeft, waardoor je het terug te betalen bedrag met 0.1 cent moet verhogen anders geeft ie een cent te weinig terug... Is zowel in google als in excel, dus...
pi_75882702
dubbel
Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
pi_75882799
quote:
Op maandag 21 december 2009 12:33 schreef ralfie het volgende:
zonder vba veeel makkelijker

http://spreadsheets.google.com/ccc?key=0AqF4qrW2Q0b1dGx4UHBVR0tPRkRZUWxRdlcwOEY4Snc&hl=en

Enige gekke is dat de rest() / mod() of hoe je het ook wil noemen met de decimalen een kleine afwijking heeft, waardoor je het terug te betalen bedrag met 0.1 cent moet verhogen anders geeft ie een cent te weinig terug... Is zowel in google als in excel, dus...
Vandaar ook het afronden elke keer naar 2 decimalen. Opdracht van TS was om een algoritme te schrijven.
quote:
Op maandag 21 december 2009 11:07 schreef Basp1 het volgende:

[..]

Zou het niet nog mooier zijn als je ipv de 0 to 14 loop even de lengte van de array bepaald en dan de for loop tot de lengte van de array laat lopen, dan kan de gebruiker in het geval van hyperinflatie ook nog makkelijk de briefjes van 1000, 2000, 5000 en 10.000 euro invoegen zonder dat deze de for while loop moet veranderen.
vervang "For i = 1 To 14" door "For i = 1 To Ubound(myArray)"
Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
  maandag 21 december 2009 @ 18:25:10 #59
67978 HenryHill
Fake it 'till you make it
pi_75889055
quote:
Op maandag 21 december 2009 12:33 schreef ralfie het volgende:
Enige gekke is dat de rest() / mod() of hoe je het ook wil noemen met de decimalen een kleine afwijking heeft, waardoor je het terug te betalen bedrag met 0.1 cent moet verhogen anders geeft ie een cent te weinig terug... Is zowel in google als in excel, dus...
Dat is geen oplossing, dat is een workaround (en ik vermoed dat, naarmate het aantal iteraties van je algoritme toeneemt, je nog wel meer dan 1 cent kwijt zult raken)

Het probleem is dat, voor getallen kleiner dan 1, floating point datatypes (waaronder Double) eigenlijk alleen combinaties van negatieve machten van 2 exact kunnen opslaan (getallen als 0.5, 0.75, 0.125, etc.). Voor alle andere gevallen wordt een benadering gebruikt, wat een kleine afrondingsfout tot gevolg heeft. Des te vaker je het resultaat van de vorige berekening gebruikt als input voor de volgende, des te groter wordt je afrondingsfout.

Aangezien VBA niet voorziet in een Decimal of Money datatype (die dit probleem niet hebben), is de beste oplossing om gewoon alle getallen 100 keer zo groot te maken (en dus in centen te gaan rekenen). Zo vermijdt je ten alle tijden dat je een getal kleiner dan 1 ergens moet opslaan.
So this is how liberty dies... with thunderous applause.
Truth? What's so great about the truth? Try lying for a change, it's the currency of the world
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')