Alcoholtest in excel (vb)

Moderators: ArcherBarry, Fuzzwood

Reageer
Gebruikersavatar
Berichten: 768

Alcoholtest in excel (vb)

Ik moet dus voor informatica een programmaatje maken in excel (VB). Daarvoor heb ik de formule voor de alcoholtest nodig. Weet iemand die formule?

ik heb deze:

BAG (a x 10)/(g x r) - (u - 0,5) x (g x 0,002)

Verklaring:

a = aantal glazen

g = lichaamsgewicht

r = bij mannen 0,7 en bij vrouwen 0,5 u = het aantal uren vanaf het eerste glas

u = het aantal uur je gedroken hebt

ik heb dus dit als code:

Sub Alcoholtest()

Dim Gewicht As Double

Dim Glazen As Double

Dim Geslacht As Double

Dim uren As Double

Dim Uitkomst As Double

Geslacht = InputBox("Vul voor man 0.7 of voor een vrouw 0.5 in.")

Glazen = InputBox("vul hier het aantal glazen in.")

uren = InputBox("Hoeveel uur is het geleden dat je begonnen bent met drinken?")

Gewicht = InputBox("Vul hier je gewicht in")

Uitkomst = (Glazen * 10) / (Gewicht * Geslacht) - (uren - 0.5) * (Gewicht * 0.002)

MsgBox "Beste" & Uitkomst & " dit is het"

End Sub

Maar ik kom steeds een negatief getal uit.

Waarschijnlijk is dat niet moeilijk, maar wij hebben geen cursus informatica, wat ik dus zeer jammer vind. ;)
Het Wetenschapsforum heeft ook een facebook pagina!

Berichten: 1.116

Re: Alcoholtest in excel (vb)

Maar ik kom steeds een negatief getal uit.
Dit kan op twee manieren ontstaan: Je noemer is negatief of het deel wat er afgetrokken wordt is groter dan de deling.

Heb je het al nagerekend op je rekenmachine o.i.d. of er überhaupt wel een goed antwoord uit komt? Anders moet je eens kijken of je type-juggling gewoon niet verkeerd is (Misschien moet je CDouble o.i.d. gebruiken op die InpubBox, deze levert volgens mij namelijk Strings aan). Evt. kun je ook Application.InputBox gebruiken, dan kun je met het argument Type zelf bepalen welk type het moet worden.

Overigens, je kunt een stuk sneller/korter programmeren in VBA met het gebruik van het volgende:

$ A string

% An integral value between -32768 and 32767

& An integer of small or large scale

! A decimal number with single precision

# A decimal number with double precision

@ A monetary value

Code: Selecteer alles

Sub AlcoholTest()

  dGeslacht# = InputBox("Vul voor man 0.7 of voor een vrouw 0.5 in")

  dGlazen# = InputBox("Vul hier het aantal glazen in")

  dUren# = InputBox("Hoeveel uur is het gelden dat je begonnen bent met drinken?")

  dGewicht# = InputBox("Vul hier je gewicht in")

  dUitkomst# = (dGlazen * 10)/(dGewicht *dGeslacht) - (dUren - .5) * (dGewicht * .002)

End Sub

Gebruikersavatar
Berichten: 768

Re: Alcoholtest in excel (vb)

Kan je ene iets makkelijker antwoord geven? Ik zeg he je, we krijgen geen cursus informatica.
Het Wetenschapsforum heeft ook een facebook pagina!

Gebruikersavatar
Berichten: 2.609

Re: Alcoholtest in excel (vb)

Het probleem zit hem mogelijk niet in het informatica gedeelte.

Heb je al eens geprobeerd van de waardes gewoon op een excel werkblad uit te rekenen? Het kan goed zijn dat je formule gewoon niet klopt.

Wat hierboven staat zou ik trouwens ook afraden qua programmeerstijl. Het is 'beter' om al de variabelen netjes te definieren zoals jij doet.

Gebruikersavatar
Berichten: 6.905

Re: Alcoholtest in excel (vb)

Heb je het al nagerekend op je rekenmachine o.i.d. of er überhaupt wel een goed antwoord uit komt? Anders moet je eens kijken of je type-juggling gewoon niet verkeerd is (Misschien moet je CDouble o.i.d. gebruiken op die InpubBox, deze levert volgens mij namelijk Strings aan).
Dat zal het probleem niet zijn. Normaal zit vba dat als double tenzij het effectief een string is dan komt er wel een error.
JWvdVeer schreef:Overigens, je kunt een stuk sneller/korter programmeren in VBA met het gebruik van het volgende:

...
Korter maar geen stijl dus:
Wat hierboven staat zou ik trouwens ook afraden qua programmeerstijl. Het is 'beter' om al de variabelen netjes te definieren zoals jij doet.
Het vel van de beer kunnen verkopen vraagt moeite tenzij deze dood voor je neervalt. Die kans is echter klein dus moeten we zelf moeite doen.

Gebruikersavatar
Berichten: 2.609

Re: Alcoholtest in excel (vb)

Oké ik heb de moeite genomen om het eens na te kijken voor je.

Ik heb je code aangepast naar het volgende:

Code: Selecteer alles

Sub Alcoholtest()

Dim Gewicht As Double

Dim Glazen As Double

Dim Geslacht As Double

Dim uren As Double

Dim Uitkomst As Double

Geslacht = CDbl(InputBox("Vul voor man 0.7 of voor een vrouw 0.5 in."))

MsgBox (Geslacht)

Glazen = CDbl(InputBox("vul hier het aantal glazen in."))

MsgBox (Glazen)

uren = CDbl(InputBox("Hoeveel uur is het geleden dat je begonnen bent met drinken?"))

MsgBox (uren)

Gewicht = CDbl(InputBox("Vul hier je gewicht in"))

MsgBox (Gewicht)

Uitkomst = (Glazen * 10) / (Gewicht * Geslacht) - (uren - 0.5) * (Gewicht * 0.002)

MsgBox (CStr(Uitkomst))

End Sub
CDbl maakt van eender welke waarde een Double en CStr hetzelfde maar dan voor een String. Dit is niet nodig, maar het is een goede gewoonte om die stijl aan te nemen. VBA is een brave programmeertaal die gewoon alles aanneemt, maar andere talen die veel gebruikt worden zijn daar strikter in.

Wat ik dus heb gedaan is alle waarden die je invoert eens uitprinten om te zien hoe die juist in het geheugen geschreven worden. Nu blijkt dat "0.7" wordt weggeschreven als 7. Dit komt omdat mijn Excel de komma gebruikt als decimaalteken. Als ik "0,7" invul werkt het programma perfect. Ik vermoed dat dit ook jouw probleem is, maar dit hangt van computer tot computer af.

Doordat de massa in de 1ste term met iets groot vermenigvuldigd werd, werd die term kleiner dan de 2de, waardoor je dus een negatieve uitkomst kreeg.

De volgende code werkt rond dat probleem door te vragen of de persoon een man of een vrouw is. Je vult dan het geslacht in en op basis daarvan kiest het programma tussen 0.7 of 0.5.

Code: Selecteer alles

Sub Alcoholtest()

Dim Gewicht As Double

Dim Glazen As Double

Dim Geslacht As String

Dim r As Double

Dim uren As Double

Dim Uitkomst As Double

Geslacht = CDbl(InputBox("Vul je geslacht in: man of vrouw"))

If Geslacht = "man" Then

r = 0.7

Else

r = 0.5

End If

Glazen = CDbl(InputBox("vul hier het aantal glazen in."))

uren = CDbl(InputBox("Hoeveel uur is het geleden dat je begonnen bent met drinken?"))

Gewicht = CDbl(InputBox("Vul hier je gewicht in"))

Uitkomst = (Glazen * 10) / (Gewicht * r) - (uren - 0.5) * (Gewicht * 0.002)

MsgBox (CStr(Uitkomst))

End Sub

Berichten: 1.116

Re: Alcoholtest in excel (vb)

Wat hierboven staat zou ik trouwens ook afraden qua programmeerstijl. Het is 'beter' om al de variabelen netjes te definieren zoals jij doet.
Tja, ieder z'n smaak. Zelf gebruik ik het redelijk vaak. Mede omdat ik persoonlijk meer talen als Java, C# en PHP gewend ben, waarbij je declareren en waarde toekennen in één keer doet. Maar ik kan er heel goed mee leven als je een andere manier beter vindt.
Korter maar geen stijl dus:
Niet mee eens dus ;)

Je zou natuurlijk met MsgBox ook tussentijds even voor alle andere variabelen kunnen checken of er de goede waarden in zitten (ofwel: of er in staat wat je ingevoerd hebt).

Overigens zou ik hier een formulier van maken en geen inputboxen. Het voordeel van een formulier is dat fouten door VBA zelf al afgevangen worden (je kunt bij input-boxen zelf aangeven wat voor waarden je verwacht (getal, tekst, e.d.) en tevens in welke range ze mogen liggen).

Het grote probleem met VBA vind ik persoonlijk is dat je zo weinig mogelijkheden hebt om fouten af te vangen. En op deze manier los je dat redelijk elegant op.

Heb je overigens al geprobeerd of de formule klopt, zoals er nu al drie personen in dit topic aangeven?

Gebruikersavatar
Berichten: 2.609

Re: Alcoholtest in excel (vb)

Heb je overigens al geprobeerd of de formule klopt, zoals er nu al drie personen in dit topic aangeven?


De formule klopt. Oplossing staat in post #6

Berichten: 1.116

Re: Alcoholtest in excel (vb)

Dat zal het probleem niet zijn. Normaal zit vba dat als double tenzij het effectief een string is dan komt er wel een error.
Wat ik dus heb gedaan is alle waarden die je invoert eens uitprinten om te zien hoe die juist in het geheugen geschreven worden. Nu blijkt dat "0.7" wordt weggeschreven als 7. Dit komt omdat mijn Excel de komma gebruikt als decimaalteken. Als ik "0,7" invul werkt het programma perfect. Ik vermoed dat dit ook jouw probleem is, maar dit hangt van computer tot computer af.
Dat was dus waarschijnlijk wel het probleem. Een reden te meer om er gewoon een formulier van te maken. In een formulier zou je dit zien wanneer je van het ene veld naar het andere veld springt. Sowieso denk ik dat het goed is om hier radio's van te maken in dit geval.

Gebruikersavatar
Berichten: 768

Re: Alcoholtest in excel (vb)

@ Xenion

Ik heb die CDbl() weg gedaan in de code en ik heb CStr() in de plaats gezet omdat je zei dat CStr() voor een string was en Geslacht is een string. Er is 1 probleempje. Als ik 5 glazen, 1 uur, 70 kg en man invul, dan kom ik in excel aan 0.95... en op mijn rekenmachine op 1,1....
Het Wetenschapsforum heeft ook een facebook pagina!

Gebruikersavatar
Berichten: 2.609

Re: Alcoholtest in excel (vb)

Ik heb die CDbl() weg gedaan in de code en ik heb CStr() in de plaats gezet
Aja, das een foutje dat ik nog had laten staan. Er stond origineel nog iets anders, maar ik heb uiteindelijk dit gekozen. Er moet zelfs geen CStr() staan omdat het al een String is.

Als ik de formule gewoon uitreken kom ik ook 0.95 uit, dus VB berekent het wel juist hoor. Ik weet niet met wat voor rekenmachine je werkt, maar je moet wel zien dat de haakjes enzo juist staan.

Reageer