abonnement Unibet Coolblue Bitvavo
pi_75837043
Om maar meteen te beginnen, het volgende probleem:

Ik moet een algoritme (in Excel VBA) schrijven dat berekent hoeveel wisselgeld een kassier moet teruggeven aan een klant. Niet enkel het totaal terug te geven bedrag moet worden afgedrukt, maar het wisselgeld moet worden opgesplitst in de verschillende coupures (bijv. ¤634,33 = 1x500 + 0x200+ 1x100 +0x50 + 1x20 + 2x5+ 2x2+ 0x1+ 0x0,50 + 1x0,20 + 1x0,10 + 0x0,05 + 1x0.02+1x0,01)
Ervan uitgaande: terug te geven bedrag kleiner is dan 1000 euro.

Al wat uurtjes 'gespeeld' met VBA, maar helaas zonder resultaat. Wie helpt?

Ad
  zondag 20 december 2009 @ 14:33:59 #2
75592 GlowMouse
l'état, c'est moi
pi_75837077
wat voor code heb je nu?
eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
pi_75837136
quote:
Op zondag 20 december 2009 14:33 schreef GlowMouse het volgende:
wat voor code heb je nu?
Iets en niets, heb wat getikt, maar kreeg een foutmelding, vandaag de post.
  zondag 20 december 2009 @ 14:39:23 #4
67978 HenryHill
Fake it 'till you make it
pi_75837297
quote:
Op zondag 20 december 2009 14:33 schreef adbeentjes het volgende:
(bijv. ¤634,33 = 1x500 + 0x200+ 1x100 +0x50 + 1x20 + 2x5+ 2x2+ 0x1+ 0x0,50 + 1x0,20 + 1x0,10 + 0x0,05 + 1x0.02+1x0,01)
Hoe ben je tot bovenstaande uitwerking gekomen? Was dit een gegeven voorbeeld of heb je dit zelf uitgewerkt?

Immers, als je niet weet hoe je het probleem handmatig moet oplossen, dan hoef je al helemaal niet te proberen dit uit te leggen aan een computer
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_75837423
quote:
Op zondag 20 december 2009 14:39 schreef HenryHill het volgende:

[..]

Hoe ben je tot bovenstaande uitwerking gekomen? Was dit een gegeven voorbeeld of heb je dit zelf uitgewerkt?

Immers, als je niet weet hoe je het probleem handmatig moet oplossen, dan hoef je al helemaal niet te proberen dit uit te leggen aan een computer
Zelf 'uitgewerkt' dat is de zogenaamde bottum-up techniek, in delen oplossen van een 'groot' probleem.

De vraag zelf snap ik wel, maar hoe dat te vertalen in Excel...
pi_75837495
Idee

Klant moet betalen, bijv. ¤80.

Hij 'betaalt' met briefje van ¤100

Verschilfunctie 100-80=20 retour door kassier.

20 is 1x20 ivm rond getal...
  zondag 20 december 2009 @ 14:48:01 #7
67978 HenryHill
Fake it 'till you make it
pi_75837603
quote:
Op zondag 20 december 2009 14:44 schreef adbeentjes het volgende:
Idee

Klant moet betalen, bijv. ¤80.

Hij 'betaalt' met briefje van ¤100

Verschilfunctie 100-80=20 retour door kassier.

20 is 1x20 ivm rond getal...
Ok, en nu als iemand met een briefje van 100 voor 64 euro wil afrekenen. Welke coupures krijgt de klant dan terug?
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_75837610
Ken VB niet, dus hier wat pseudocode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
valuta = array(500, 200, 100, 50, 20, 10, 5, 2, 1, .5, .2, .1, .05, .02, .01); // geldeenheden
aantal = array[15] of int; // hoeveel van elke geldeenheid terug te geven (init. op 0!)

i = 0;
while (wisselbedrag != 0 && i < 15) {
 if (wisselbedrag >= valuta[i]) {
  wisselbedrag = wisselbedrag - valuta[i];
  aantal[i] = aantal[i]+1;
 } else {
  i = i+1;
 }
}

for (i=0; i<15; i=i+1) {
 print(aantal[i] + " maal " + valuta[i] + "teruggeven.");
}
  zondag 20 december 2009 @ 14:49:40 #9
67978 HenryHill
Fake it 'till you make it
pi_75837658
quote:
Op zondag 20 december 2009 14:48 schreef Thorír het volgende:
Ken VB niet, dus hier wat pseudocode:
Lekker, vriend. In plaats dat je TS zelf na laat denken over zijn huiswerk
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_75837672
quote:
Op zondag 20 december 2009 14:48 schreef Thorír het volgende:
Ken VB niet, dus hier wat pseudocode:
[ code verwijderd ]


Ik kan wel wat aflezen, maar ik ken dat programma niet, en voor een beginner is het zowat onmogelijk om dit te begrijpen,,, heeft u dit ook 'gemaakt' met tabellen? Sequentie, iteratie etc.?
pi_75837727
quote:
Op zondag 20 december 2009 14:48 schreef HenryHill het volgende:

[..]

Ok, en nu als iemand met een briefje van 100 voor 64 euro wil afrekenen. Welke coupures krijgt de klant dan terug?
Op dezelfde wijze; 100-64=36 euro retour door kassier

36 euro =

1x20
1x10
1x5
1x1

euro..
pi_75837759
quote:
Op zondag 20 december 2009 14:50 schreef adbeentjes het volgende:

[..]

Ik kan wel wat aflezen, maar ik ken dat programma niet, en voor een beginner is het zowat onmogelijk om dit te begrijpen,,, heeft u dit ook 'gemaakt' met tabellen? Sequentie, iteratie etc.?
Dan moet je bij de print [i] iets van row en en nog wat invoegen in die code
pi_75837788
quote:
Op zondag 20 december 2009 14:49 schreef HenryHill het volgende:

[..]

Lekker, vriend. In plaats dat je TS zelf na laat denken over zijn huiswerk
Ik snap het probleem wel, en hoe je het moet oplossen, maar ik snap niet hoe dit in kaart te brengen in Excel VBA, ik moet een algoritme schrijven, waarschijnlijk moet Excel dan 'het spelletje spelen' van de kassier,
  zondag 20 december 2009 @ 14:56:35 #14
67978 HenryHill
Fake it 'till you make it
pi_75837975
quote:
Op zondag 20 december 2009 14:51 schreef adbeentjes het volgende:

[..]

Op dezelfde wijze; 100-64=36 euro retour door kassier

36 euro =

1x20
1x10
1x5
1x1

euro..
Ok, ben je met me eens dat de truc is om van het retourbedrag (in dit geval 36 euro) net zolang biljetten van 20 euro uit te betalen totdat je retourbedrag onder de 20 euro komt. Vervolgens ga je biljetten van 10 euro uitbetalen totdat het retourbedrag minder dan 10 euro is, etc.

Toch?
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_75838087
quote:
Op zondag 20 december 2009 14:56 schreef HenryHill het volgende:

[..]

Ok, ben je met me eens dat de truc is om van het retourbedrag (in dit geval 36 euro) net zolang biljetten van 20 euro uit te betalen totdat je retourbedrag onder de 20 euro komt. Vervolgens ga je biljetten van 10 euro uitbetalen totdat het retourbedrag minder dan 10 euro is, etc.

Toch?
Zeer zeker mee eens... steeds weer volgens hetzelfde stramien.
  zondag 20 december 2009 @ 15:00:56 #16
67978 HenryHill
Fake it 'till you make it
pi_75838145
quote:
Op zondag 20 december 2009 14:52 schreef adbeentjes het volgende:

[..]

Ik snap het probleem wel, en hoe je het moet oplossen, maar ik snap niet hoe dit in kaart te brengen in Excel VBA, ik moet een algoritme schrijven, waarschijnlijk moet Excel dan 'het spelletje spelen' van de kassier,
Ok, hoe had je dit voorgesteld in Excel?

Ik kan me voorstellen dat je twee cellen gebruikt, 1 voor het invullen van het te betalen bedrag en 1 voor hoeveel de klant geeft. Als uitvoer heb je dan een kolom met met onder elkaar de waardes van de coupures (500, 200, 100, etc.). De uitvoer van je programma komt dan in de kolom naast de coupures te staan.

Om de coupures uit te laten rekenen moet je op een knop drukken, deze start jouw VBA-code.

Zoiets?
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_75838252
quote:
Op zondag 20 december 2009 15:00 schreef HenryHill het volgende:

[..]

Ok, hoe had je dit voorgesteld in Excel?

Ik kan me voorstellen dat je twee cellen gebruikt, 1 voor het invullen van het te betalen bedrag en 1 voor hoeveel de klant geeft. Als uitvoer heb je dan een kolom met met onder elkaar de waardes van de coupures (500, 200, 100, etc.). De uitvoer van je programma komt dan in de kolom naast de coupures te staan.

Om de coupures uit te laten rekenen moet je op een knop drukken, deze start jouw VBA-code.

Zoiets?
Hier loop ik vast, ik weet niet hoé. Voorheen was het een code schrijven net als hierboven, in excel vba, ..
  zondag 20 december 2009 @ 15:05:45 #18
67978 HenryHill
Fake it 'till you make it
pi_75838351
quote:
Op zondag 20 december 2009 15:03 schreef adbeentjes het volgende:

[..]

Hier loop ik vast, ik weet niet hoé. Voorheen was het een code schrijven net als hierboven, in excel vba, ..
Heb je in de vorige opdrachten wel eens cellen uit een Excel werkblad moeten lezen? Of pas je gewoon je programmacode aan als je met andere bedragen wilt werken?
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_75838416
quote:
Op zondag 20 december 2009 15:05 schreef HenryHill het volgende:

[..]

Heb je in de vorige opdrachten wel eens cellen uit een Excel werkblad moeten lezen? Of pas je gewoon je programmacode aan als je met andere bedragen wilt werken?
Altijd gewoon via "Marco opnemen" uiteindelijk kan je dan als het ware zelf de 'code' achterhalen via VBA.

Ik heb nu een kolom
A1: te betalen

A2: klant geeft

Kan ik ook dit probleem oplossen via "Macro opnemen"?
  zondag 20 december 2009 @ 15:10:42 #20
67978 HenryHill
Fake it 'till you make it
pi_75838563
quote:
Op zondag 20 december 2009 15:07 schreef adbeentjes het volgende:

[..]

Altijd gewoon via "Marco opnemen" uiteindelijk kan je dan als het ware zelf de 'code' achterhalen via VBA.
Ok, maar werd de invoer (in dit geval de bedragen) voor de vorige opdrachten ingelezen vanuit een werkblad, of werd de invoer ook in code gespecificeerd?
quote:
Ik heb nu een kolom
A1: te betalen

A2: klant geeft

Kan ik ook dit probleem oplossen via "Macro opnemen"?
Ja hoor, doe maar zoals je 't gewend bent
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_75838681
quote:
Op zondag 20 december 2009 15:10 schreef HenryHill het volgende:

[..]

Ok, maar werd de invoer (in dit geval de bedragen) voor de vorige opdrachten ingelezen vanuit een werkblad, of werd de invoer ook in code gespecificeerd?
[..]

Ja hoor, doe maar zoals je 't gewend bent

Geen idee hoe dus... dit is een 'apart' geval, opdrachten komen ook van een apart stencil. Ik heb gewoon de code voor VBA nodig, dus dat er ook schermpje verschijnt van"U betaalt, en u geeft" etc. Alleen weet ik niet hoe ik dat voor mekaar krijg, of iemand me daarbij wilt helpen. Het probleem zelf snap ik wel.
  zondag 20 december 2009 @ 15:16:09 #22
67978 HenryHill
Fake it 'till you make it
pi_75838823
quote:
Op zondag 20 december 2009 15:12 schreef adbeentjes het volgende:

[..]

Geen idee hoe dus... dit is een 'apart' geval, opdrachten komen ook van een apart stencil. Ik heb gewoon de code voor VBA nodig, dus dat er ook schermpje verschijnt van"U betaalt, en u geeft" etc. Alleen weet ik niet hoe ik dat voor mekaar krijg, of iemand me daarbij wilt helpen. Het probleem zelf snap ik wel.
In welke versie van Excel werk je? (2003 of 2007, Nederlands of Engels?)
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_75838884
quote:
Op zondag 20 december 2009 15:16 schreef HenryHill het volgende:

[..]

In welke versie van Excel werk je? (2003 of 2007, Nederlands of Engels?)
Ik gebruik voor VBA 2003 (ivm uitleg boek), heb ook 2007.

Beide NL.
  zondag 20 december 2009 @ 15:23:19 #24
67978 HenryHill
Fake it 'till you make it
pi_75839097
Ik heb zelf alleen 2007 tot m'n beschikking, dus het is misschien het handigst als je deze gebruikt.

Probeer eens het volgende:
1. Ga naar het lint "Ontwikkelaars". Als je deze niet ziet, zoek dan in de Help (F1) het onderwerp "Macro's maken met Microsoft Visual Basic" en volg de daar omschreven stappen om VBA beschikbaar te maken.

2. Op het lint Ontwikkelaars, klik op "Invoegen" (binnen het onderdeel Besturingselementen) en selecteer de knop (linksboven).

3. Door met de muis te slepen, bepaal de plaats en afmeting van de knop. Op het moment dat je de muisknop loslaat, krijg je het scherm "Macro toewijzen aan object" te zien. Vul als macronaam "BepaalBedrag" in, en druk op de knop Nieuw. Je komt nu in de VBA editor terecht, in de subroutine BepaalBedrag:

1
2
3
Sub BepaalBedrag()

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_75839240
quote:
Op zondag 20 december 2009 15:23 schreef HenryHill het volgende:
Ik heb zelf alleen 2007 tot m'n beschikking, dus het is misschien het handigst als je deze gebruikt.

Probeer eens het volgende:
1. Ga naar het lint "Ontwikkelaars". Als je deze niet ziet, zoek dan in de Help (F1) het onderwerp "Macro's maken met Microsoft Visual Basic" en volg de daar omschreven stappen om VBA beschikbaar te maken.

2. Op het lint Ontwikkelaars, klik op "Invoegen" (binnen het onderdeel Besturingselementen) en selecteer de knop (linksboven). <wordt vervolgd>
Tot hier GELUKT!, Doe nu ook in 2007. Ik kan nu een blokje, knopje 'tekenen', nietwaar>?
  zondag 20 december 2009 @ 15:27:24 #26
67978 HenryHill
Fake it 'till you make it
pi_75839263
quote:
Op zondag 20 december 2009 15:26 schreef adbeentjes het volgende:

[..]

Tot hier GELUKT!, Doe nu ook in 2007. Ik kan nu een blokje, knopje 'tekenen', nietwaar>?
Correct, zie boven
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_75839357
quote:
Op zondag 20 december 2009 15:27 schreef HenryHill het volgende:

[..]

Correct, zie boven
Gelukt, tot laatste stap,

Sub BepaalBedrag()

End Sub

  zondag 20 december 2009 @ 15:31:28 #28
67978 HenryHill
Fake it 'till you make it
pi_75839394
Ok, vul nu als code het volgende in, gewoon om het geheel even te testen:

1
2
3
4
5
6
7
8
9
Sub BepaalBedrag()
Rem Lees de waarden uit A1 en A2.
Dim i1, i2 As Integer
i1 = Range("A1")
i2 = Range("A2")

Rem Tel deze waardes bij elkaar op, en ken het resultaat toe aan cel A3
Range("A3").Value = i1 + i2
End Sub


Probeer deze subroutine uit door twee getallen in de cellen A1 en A2 te zetten, en op de knop te drukken. De som moet dan in cel A3 weggeschreven worden. Werkt dit?
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_75839476
Het volgende:

30 bij A1 ingevuld
20 Bij A2 ingevuld
> Knop drukken
50 verschijnt in A3
pi_75839537
Volgende keer dit soort vragen in: [EXCEL] Het grote Excel vragen topic, #17

Dit is em dacht ik, zelf nog even naar wens finetunen.

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
Sub wisselgeld()

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

check = Range("B1").Value
pay = Range("B2").Value
diff = pay - check
MsgBox diff

no500 = (diff - (diff Mod 500)) / 500
diff = diff - no500 * 500
If diff Mod 500 = 0 Then GoTo melding

no200 = (diff - (diff Mod 200)) / 200
diff = diff - no200 * 200
If diff Mod 200 = 0 Then GoTo melding

no100 = (diff - (diff Mod 100)) / 100
diff = diff - no100 * 100
If diff Mod 100 = 0 Then GoTo melding

no50 = (diff - (diff Mod 50)) / 50
diff = diff - no50 * 50
If diff Mod 50 = 0 Then GoTo melding

no20 = (diff - (diff Mod 20)) / 20
diff = diff - no20 * 20
If diff Mod 20 = 0 Then GoTo melding

no10 = (diff - (diff Mod 10)) / 10
diff = diff - no10 * 10
If diff Mod 10 = 0 Then GoTo melding

no5 = (diff - (diff Mod 5)) / 5
diff = diff - no5 * 5
If diff Mod 5 = 0 Then GoTo melding

no2 = (diff - (diff Mod 2)) / 2
diff = diff - no2 * 2
If diff Mod 2 = 0 Then GoTo melding

no1 = (diff - (diff Mod 1)) / 1
diff = diff - no1 * 1
If diff Mod 1 = 0 Then GoTo melding

no050 = (diff - (diff Mod 0.5)) / 0.5
diff = diff - no050 * 0.5
If diff Mod 0.5 = 0 Then GoTo melding

no020 = (diff - (diff Mod 0.2)) / 0.2
diff = diff - no020 * 0.2
If diff Mod 0.2 = 0 Then GoTo melding

no010 = (diff - (diff Mod 0.1)) / 0.1
diff = diff - no010 * 0.1
If diff Mod 0.1 = 0 Then GoTo melding

no005 = (diff - (diff Mod 0.05)) / 0.05
diff = diff - no005 * 0.05
If diff Mod 0.05 = 0 Then GoTo melding

no002 = (diff - (diff Mod 0.02)) / 0.02
diff = diff - no002 * 0.02
If diff Mod 0.02 = 0 Then GoTo melding

no001 = (diff - (diff Mod 0.01)) / 0.01
diff = diff - no001 * 0.01


melding:
MsgBox no500 & " " & no200 & " " & no100 & " " & no50 & " " & no20 & " " & no10 & " " & no5 & " " & no2 & " " & no1 & " " & no050 & " " & no020 & " " & no010 & " " & no005 & " " & no002 & " " & no001

End Sub
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_75839644
@Ditch:

Daar snap ik al helemaal niets van, bovendien veeeeeeeels te lang. Ik wil het begrijpen...
  zondag 20 december 2009 @ 15:38:29 #32
67978 HenryHill
Fake it 'till you make it
pi_75839671
quote:
Op zondag 20 december 2009 15:33 schreef adbeentjes het volgende:
Het volgende:

30 bij A1 ingevuld
20 Bij A2 ingevuld
> Knop drukken
50 verschijnt in A3
Very nice. Dan gaan we nu het werkblad opzetten voor de opdracht. Ik stel voor:

A1 bevat de tekst "Te betalen"
B1 wordt gebruikt om het te betalen bedrag in te zetten
A2 bevat de tekst "Klant geeft"
B2 wordt gebruikt om het gegeven bedrag in te zetten
B3 bevat de knop die onze subroutine BepaalBedrag aanroept

De cellen D1 t/m D14 bevatten de waarden van de coupures (500, 200, ... 0,01). De cellen E1 t/m E14 gaan het resultaat bevatten van onze code, nl. de aantallen coupures die moeten worden teruggegeven.
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_75840020
quote:
Op zondag 20 december 2009 15:38 schreef HenryHill het volgende:

[..]

Very nice. Dan gaan we nu het werkblad opzetten voor de opdracht. Ik stel voor:

A1 bevat de tekst "Te betalen"
B1 wordt gebruikt om het te betalen bedrag in te zetten
A2 bevat de tekst "Klant geeft"
B2 wordt gebruikt om het gegeven bedrag in te zetten
B3 bevat de knop die onze subroutine BepaalBedrag aanroept

De cellen D1 t/m D14 bevatten de waarden van de coupures (500, 200, ... 0,01). De cellen E1 t/m E14 gaan het resultaat bevatten van onze code, nl. de aantallen coupures die moeten worden teruggegeven.
Done;

Alleen heb ik 15 coupures:

500
200
100
50
20
10
5
2
1
0,5
0,2
0,1
0,05
0,02
0,01
  zondag 20 december 2009 @ 15:48:50 #34
67978 HenryHill
Fake it 'till you make it
pi_75840120
quote:
Op zondag 20 december 2009 15:46 schreef adbeentjes het volgende:

[..]

Done;

Alleen heb ik 15 coupures:

500
200
100
50
20
10
5
2
1
0,5
0,2
0,1
0,05
0,02
0,01
Ok, prima, dan houd ik dezelfde coupures aan als jij.
Gooi de inhoud van BepaalBedrag maar weg, en gebruik de volgende code (zelf aanvullen!)
1
2
3
4
5
Dim bedragTeBetalen, bedragGegeven, bedragRetour As Double

Rem 1. Lees de 2 invoervelden en bepaal het bedrag retour
bedragTeBetalen = Range("B1").Value
Rem ...?
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_75840372
1
2
3
4
5 Dim bedragTeBetalen, bedragGegeven, bedragRetour As Double

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


wat zijn de REM voor instructies, soort formules?

misschien klopt dit:

Rem...?

Rem 2. bedragGegeven ---> zie cel B2

Rem 3. bedragRetour = bedragGegeven - bedragTeBetalen

... zoiets?
  zondag 20 december 2009 @ 15:59:55 #36
67978 HenryHill
Fake it 'till you make it
pi_75840593
quote:
Op zondag 20 december 2009 15:54 schreef adbeentjes het volgende:
wat zijn de REM voor instructies, soort formules?
"Rem" is een afkorting van "Remark", een opmerking dus. Het vertelt de VBA interpreter dat hij de rest van de regel kan negeren. Het wordt gebruikt om in je code uit te leggen wat je aan het doen bent
quote:
misschien klopt dit:

Rem 2. bedragGegeven ---> zie cel B2
Rem 3. bedragRetour = bedragGegeven - bedragTeBetalen
... zoiets?
Je moet de REM's alleen gebruiken bij commentaarregels, niet bij je code.
Enne, " ---> zie cel B2": als je kijkt naar die ene regel die ik je cadeau heb gedaan, dan zie je hoe het moet

Je derde regel is trouwens correct.
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_75840852
Zo dus:

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

Rem 2. Lees getal wat ingevoerd is bij invoerveld KlantGeeft.
bedragGegeven = Range("B2").Value

Rem 3. bedragRetour = bedragGegeven - bedragTeBetalen


???? Weet niet of alles precies getikt is zoals Excel het wilt. ????
  zondag 20 december 2009 @ 16:12:10 #38
67978 HenryHill
Fake it 'till you make it
pi_75841036
quote:
Op zondag 20 december 2009 16:07 schreef adbeentjes het volgende:
Zo dus:

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

Rem 2. Lees getal wat ingevoerd is bij invoerveld KlantGeeft.
bedragGegeven = Range("B2").Value

Rem 3. bedragRetour = bedragGegeven - bedragTeBetalen
Ja, je moet alleen nog die "Rem 3." weghalen, dan klopt het.
quote:
???? Weet niet of alles precies getikt is zoals Excel het wilt. ????
Als je het fout doet, dan krijg je het meteen te horen van excel hoor.

Ok, plak nu onderstaande code er maar bij (onder de regels die je nu hebt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 (Logica moet hierzo komen).
    coupureAantal = 0
    
    Rem Schrijf het resultaat weg
    Range("E" & coupureIndex).Value = coupureAantal
Next


Als het goed is, krijg je nu 15 nullen onder elkaar als je de knop indrukt.
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_75841184
Nee,

Krijg een foutmelding.

heb tot nu toe:


Dim bedragTeBetalen, bedragGegeven, bedragRetour As Double

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

Rem 2. Lees getal wat ingevoerd is bij invoerveld KlantGeeft.
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 (Logica moet hierzo komen).
coupureAantal = 0

Rem Schrijf het resultaat weg
Range("E" & coupureIndex).Value = coupureAantal
Next


COMPILEERFOUT, B1
  zondag 20 december 2009 @ 16:32:58 #40
67978 HenryHill
Fake it 'till you make it
pi_75841760
quote:
Op zondag 20 december 2009 16:16 schreef adbeentjes het volgende:
Nee,

Krijg een foutmelding.

heb tot nu toe:
(...)
COMPILEERFOUT, B1
Hmm, vreemd, ik heb net jouw tekst in mijn ding geplakt en dan werkt het.

Voor de zekerheid: je hebt dit tussen
1
2
3
Sub BepaalBedrag()

End Sub

staan?
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_75841813
quote:
Op zondag 20 december 2009 16:32 schreef HenryHill het volgende:

[..]

Hmm, vreemd, ik heb net jouw tekst in mijn ding geplakt en dan werkt het.

Voor de zekerheid: je hebt dit tussen
[ code verwijderd ]

staan?

Dat had ik dus niet, dacht dat alles weg moest, nu heb ik het er wel bij staan, en hij doet het: er verschijnen allemaal 0-en
  zondag 20 december 2009 @ 16:36:49 #42
67978 HenryHill
Fake it 'till you make it
pi_75841899
quote:
Op zondag 20 december 2009 16:34 schreef adbeentjes het volgende:

[..]

Dat had ik dus niet, dacht dat alles weg moest, nu heb ik het er wel bij staan, en hij doet het: er verschijnen allemaal 0-en
Ah, gelukkig maar

Snap je ook wat de code doet, of zijn er dingen tot nu toe niet helemaal duidelijk?
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_75842005
quote:
Op zondag 20 december 2009 16:36 schreef HenryHill het volgende:

[..]

Ah, gelukkig maar

Snap je ook wat de code doet, of zijn er dingen tot nu toe niet helemaal duidelijk?
Ik snap wel zo'n beetje wat de code doet. Uiteindleijk moet er een waarde staan ipv de 0 (of weer 0) als uitgerekend is hoeveel de klant terug moet krijgen, zoals het voorbeeld.
  zondag 20 december 2009 @ 16:42:39 #44
67978 HenryHill
Fake it 'till you make it
pi_75842098
quote:
Op zondag 20 december 2009 16:39 schreef adbeentjes het volgende:

[..]

Ik snap wel zo'n beetje wat de code doet. Uiteindleijk moet er een waarde staan ipv de 0 (of weer 0) als uitgerekend is hoeveel de klant terug moet krijgen, zoals het voorbeeld.
Precies.

Maar heb je bijvoorbeeld de constructie "For index = 1 to 15" / "Next" wel eens gezien?

En snap je wat er gebeurt bij "D" & coupureIndex ?
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_75842412
Snap niet alle functies,

Ik weet wel dat we nog het een en ander moeten toevoegen, als ik bijv.
Te betalen: 120
Klant geeft: 200

invul, en daarna op de knop druk, gebeurt er nog niets, blijven nullen staan, het verschil moet nu dus berekend worden, en dan nog verdelen onder de cor.
  zondag 20 december 2009 @ 16:56:07 #46
67978 HenryHill
Fake it 'till you make it
pi_75842670
quote:
Op zondag 20 december 2009 16:50 schreef adbeentjes het volgende:
Snap niet alle functies,

Ik weet wel dat we nog het een en ander moeten toevoegen, als ik bijv.
Te betalen: 120
Klant geeft: 200

invul, en daarna op de knop druk, gebeurt er nog niets, blijven nullen staan, het verschil moet nu dus berekend worden, en dan nog verdelen onder de cor.
Vooruit dan maar, 't is ook al een heel middagvullend programma geworden ;)

Op de plek waar "Rem (Logica komt hier)." staat, plaats de volgende code:
1
2
3
4
5
6
7
8
    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)

N.B. Die "while" / "wend" constructie is een mogelijke oplossing. Een andere manier om op het maximum aantal coupures te komen is om het overgebleven bedrag te delen door de grootte van de coupure, en het resultaat naar beneden af te ronden.

Probeer het eens uit, zou ik zeggen.
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_75842823
Heb tot nu toe, zie hieronder, alleen doet 'ie het nog niet'.

Sub BepaalBedrag()


Dim bedragTeBetalen, bedragGegeven, bedragRetour As Double

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

Rem 2. Lees getal wat ingevoerd is bij invoerveld KlantGeeft.
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)

coupureAantal = 0

Rem Schrijf het resultaat weg
Range("E" & coupureIndex).Value = coupureAantal
Next


End Sub
  zondag 20 december 2009 @ 17:02:35 #48
67978 HenryHill
Fake it 'till you make it
pi_75842925
quote:
Op zondag 20 december 2009 17:00 schreef adbeentjes het volgende:

Rem Trek het bedrag wat dit aantal coupures voorstelt af van het bedrag dat we nog uit moeten keren.
bedragRetour = bedragRetour - (coupureAantal * coupure)

coupureAantal = 0

Rem Schrijf het resultaat weg
Range("E" & coupureIndex).Value = coupureAantal
Next

End Sub
Lol, je moet de vetgedrukte regel weghalen. Anders is het logisch dat 'ie elke keer '0' wegschrijft...
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_75843079
ff testen
pi_75843200
HOEZEE! HIJ WERKT!

HenryHill --------> Super!Bedankt!

  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')