Bereken gemiddelde in tekstvak met 3 getallen

Status
Niet open voor verdere reacties.

TdsGerard

Gebruiker
Lid geworden
1 nov 2014
Berichten
39
Hallo allemaal,
Ik heb een subformulier in mijn database waarin de waarden van een meting die drie keer gedaan is worden ingevoerd. In dit tekstvak worden drie getallen van 3 of 4 cijfers elk ingevoerd (bijvoorbeeld 998-1024-1000).
-Nou is het mijn bedoeling om met een druk op de knop het gemiddelde van deze getallen te berekenen, en de inhoud van het tekstvak door dit gemiddelde te vervangen.
-Ook zou ik graag hebben dat het gemiddelde wordt bepaald wanneer er maar 1 of 2 getallen zijn ingevoerd, voor het geval een meting mislukt is.
Is hier een handige oplossing voor? Zelf loop ik als access-groentje gelijk al tegen het probleem dat ik niet weet hoe ik de drie getallen moet splitsen.

Groetjes,

Gerard
 
Daar heb je een (niet zo moelijke) functie voor nodig, zeker als het aantal componenten in de string variabel is. Iets als:
Code:
Public Function BerekenVeld(Waarde As String) As Double
Dim tmp As Variant
Dim i As Integer, iTot As Double

If InStr(Waarde, "-") > 0 Then
    tmp = Split(Waarde, "-")
    For i = LBound(tmp) To UBound(tmp)
        iTot = iTot + tmp(i)
    Next i
    BerekenVeld = iTot / i
Else
    BerekenVeld = Waarde
End If

End Function
In je tekstvak hoef je dan alleen de besturingselementbron goed te zetten op de functie. Bijvoorbeeld: =BerekenVeld([check1])
Het leuke is: het scheelt je nog een knop (en een gebruikershandeling) ook ;)
 
Waar moet ik die functie ingeven? En werkt hij ook wanneer je de data appart invoert?
Ik heb namelijk een meting waarbij ik ECD, SD, CV en 6A uit krijg. ik zou dus eerst meting 1 invullen, en daarna pas meting 2.
 
De functie kun je in elke willekeurige (of nieuwe) module zetten; hij werkt altijd. De aanroep zet je dus in een tekstvak, met als parameter het veld dat je rekenstring bevat. Ik heb getest met een tekstvak met de naam Check1. Zal bij jou vast anders heten. Wat je bedoelt met:
En werkt hij ook wanneer je de data appart invoert? Ik heb namelijk een meting waarbij ik ECD, SD, CV en 6A uit krijg.
weet ik niet. ECD, SD etc zijn geen getallen, dus hoe je daar een gemiddelde van denkt te berekenen zie ik zo gauw ook niet :).
In de functie zit geen controle of je wel een getallenreeks invoert; hij gaat er zonder meer vanuit dat je begint met een getal. Wel checkt hij of er een koppelstreepje in zit. Als dat niet het geval is, heb je ofwel niks (blijft het veld leeg) ofwel één getal ingevoerd, en het gemiddelde van 1 getal is natuurlijk altijd dat getal. Dus dat krijg je dan terug.
 
Ik heb jouw formule nu werkend, maar het is niet helemaal wat ik bedoel. Mijn bedoeling is dat in hetzelfde vakje waarin je om te beginnen drie getallen invoert uiteindelijk het gemiddelde van deze getallen terecht komt. Als dat niet mogelijk is zal dit waarschijnlijk ook wel geaccepteerd worden, maar het maakt het uiteindelijke formulier een stuk minder overzichtelijk ben ik bang.

Edit: ECD, SD, CV en 6A zijn trouwens de tekstvakken waarin de resultaten van de meting worden ingevoerd, ook voor die waarden worden 3 metingen gedaan.
 
Laatst bewerkt:
Mijn bedoeling is dat in hetzelfde vakje waarin je om te beginnen drie getallen invoert uiteindelijk het gemiddelde van deze getallen terecht komt.
Dat lijkt mij totaal onmogelijk, en is vergelijkbaar met een imploderend heelal. Je kunt immers niet op 2 plaatsen tegelijk zijn, en je kunt niet zowel het resultaat als de bron van de formule in hetzelfde tekstvak hebben. Net zo min als je in Excel een uitkomst van een formule in dezelfde cel kunt hebben als de onderliggende waarden eruit. In Excel heet dat een kringverwijzing, in Access mag je zelf een woord verzinnen :).
 
Dat is dan ook de reden dat ik dacht er een knop voor te moeten gebruiken, om het ontstaan van een loop te voorkomen. Als het mogelijk is om via code een waarde van het ene tekstvak naar een ander te verplaatsen, zou ik die code aan een button vast moeten maken, en zo de waarde van het berekeningsveld over zetten naar het originele veld. Het berekenveld past zich dan weer automatisch aan (naar de waarde die hij al had), en in het originele veld blijft nog maar 1 waarde over.
Het kan natuurlijk zijn dat ik er helemaal naast zit, ik heb nog nooit eerder iets dergelijks geprobeerd.

Als je echt zeker weet dat dit onmogelijk is, weet je dan misschien hoe ik het berekeningsveld moet opschonen? Hij geeft nu standaard "#TYPE!" weer wanneer het veld ECD leeg is.
 
Als het mogelijk is om via code een waarde van het ene tekstvak naar een ander te verplaatsen, zou ik die code aan een button vast moeten maken, en zo de waarde van het berekeningsveld over zetten naar het originele veld. Het berekenveld past zich dan weer automatisch aan (naar de waarde die hij al had), en in het originele veld blijft nog maar 1 waarde over.
Ik heb deze zinnen een paar keer overgelezen, maar ze gaan mij ver boven de pet, vrees ik... Met de beste wil van de wereld kan ik er niet meer van maken dan dat je een veld met meerdere getallen, gescheiden door een koppelteken, wil vervangen door de uitkomst van het gemiddelde over dezelfde getallen in dat tekstvak. Waarmee je dus automatisch de oorspronkelijke waarden kwijt bent! Dat is echt heel slecht gebruik voor een database, waar je koste wat koste op zijn minst de brongegevens bewaart; dat moet bovenaan staan in je lijstje met voorwaarden waaraan je db moet voldoen! En berekeningen maak je dan via queries. In het uiterste geval sla je de uitkomst van een berekening óók op naast de brongegevens, als die variabel zijn, zoals prijzen.

Natuurlijk kun je een waarde in een tabel vervangen door een andere waarde; zelfs als dat het resultaat is van een berekening op basis van de waarde uit hetzelfde veld. De echte vraag is dus niet of het kan, maar het waarom....
 
De meting waar het over gaat is tamelijk onnauwkeurig. Dus voorheen is altijd het gemiddelde van drie waarden bepaald, dat vervolgens in een excel datasheet gezet werd.

Enig idee hoe ik de #Type! melding kan verhelpen, dan?
 
Die foutmelding wordt veroorzaakt als het veld leeg is. Als je de standaardwaarde van het veld op 0 zet, ben je er vanaf (dan staat er namelijk een getal in). Zoals ik al zei: de functie heeft getallen nodig om te kunnen functioneren, en daar zit verder geen enkele controle op. Maar die kun je hopelijk zelf wel programmeren :).
 
Hey! Ik zou hier graag nog even op terug komen. Degene voor wie ik de database maak heeft liever dat ik de waarden waarover het gemiddelde berekend moet worden van elkaar scheid. Dus ik heb nu 3 kolommen waarin telkens 1 waarde staat.
Ik heb een extra tekstvak in mijn formulier toegevoegd waarin het gemiddelde wordt berekend van deze 3 velden.
Dit werkt echter alleen wanneer in alle drie de velden een getal staat, en dit is niet de bedoeling. Is het mogelijk om te zorgen dat dit net zo gaat functioneren als de module die gegeven werd om de string op te splitsen?

Groetjes,

Gerard
 
Het is mijn bedoeling dat het gemiddelde berekend wordt over de ingevulde velden.
De velden heten ECD Meting 1, ECD Meting 2 en ECD Meting 3.
Wanneer alleen 1 en 2 zijn ingevuld wil ik het gemiddelde over deze twee. Het is niet handig als het gemiddelde lager ligt alleen omdat cel 3 niet is ingevuld.

Ik heb met die module die je eerder gepost hebt gekeken of ik door hem iets aan te passen iets voor elkaar zou krijgen, maar ik ben geen held met dat soort dingen ben ik bang.

Edit: Het zou natuurlijk ook fijn zijn dat hij werkt wanneer alleen veld 1 en 3 zijn ingevuld, of alleen veld 2.
 
Laatst bewerkt:
Je hebt geen functie nodig, al kun je die er uiteraard wel voor maken als je dat makkelijker vindt. Maar met deze (enigszins ingewikkelde) constructie kun je het rechtstreeks in een query uitrekenen:
Code:
Gemiddeld: (Nz([ECD Meting 1])+Nz([ECD Meting 2])+Nz([ECD Meting 3]))/Abs(IsNumeric([ECD Meting 1])+IsNumeric([ECD Meting 2])+IsNumeric([ECD Meting 3]))
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan