Springen naar inhoud

Alcoholtest in excel (vb)


  • Log in om te kunnen reageren

#1

Kwintendr

    Kwintendr


  • >250 berichten
  • 768 berichten
  • VIP

Geplaatst op 04 juni 2010 - 20:30

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!

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

JWvdVeer

    JWvdVeer


  • >1k berichten
  • 1114 berichten
  • Ervaren gebruiker

Geplaatst op 04 juni 2010 - 21:13

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

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

Veranderd door JWvdVeer, 04 juni 2010 - 21:14


#3

Kwintendr

    Kwintendr


  • >250 berichten
  • 768 berichten
  • VIP

Geplaatst op 05 juni 2010 - 14:17

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

#4

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 05 juni 2010 - 16:56

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.

#5

jhnbk

    jhnbk


  • >5k berichten
  • 6905 berichten
  • VIP

Geplaatst op 05 juni 2010 - 17:00

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.


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.

#6

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 05 juni 2010 - 17:26

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

Ik heb je code aangepast naar het volgende:
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.

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

#7

JWvdVeer

    JWvdVeer


  • >1k berichten
  • 1114 berichten
  • Ervaren gebruiker

Geplaatst op 05 juni 2010 - 17:59

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?

#8

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 05 juni 2010 - 18:08

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

#9

JWvdVeer

    JWvdVeer


  • >1k berichten
  • 1114 berichten
  • Ervaren gebruiker

Geplaatst op 05 juni 2010 - 18:11

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.

#10

Kwintendr

    Kwintendr


  • >250 berichten
  • 768 berichten
  • VIP

Geplaatst op 05 juni 2010 - 19:54

@ 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....

Veranderd door Kwintendr, 05 juni 2010 - 19:58

Het Wetenschapsforum heeft ook een facebook pagina!

#11

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 05 juni 2010 - 22:19

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.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures