Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: fred-neumann am Februar 19, 2016, 16:22:37

Titel: Harmittel statt Mittelwert
Beitrag von: fred-neumann am Februar 19, 2016, 16:22:37
Ich ermittel Durchschnittswerte, welche als Basis für weitere Berechnungen dienen (beispielsweise zur Berechnung von Abweichung und Varianz).
Vor allem wenn man Werte in Dezimalzahlen nutzt ist es der falsche Ansatz, einfach nur das arithmetische Mittel der zu analysierenden Werte zu bilden,- dies führt oft zu einem irreführenden Ergebnis.

Excel bietet neben der Funktion Mittelwert() die zB für Dezimalwerte wesentlich genauere Funktion Harmittel()
Beispiel:
Mittelwert (arithmetische Mittel)
(2,75 + 1,48 + 2,41 + 1,45 + 1,36) / 5 = 1,89000

Harmittel (harmonische Mittel)
5 / ((1 / 2,75) + (1 / 1,48) + (1 / 2,41) + (1 / 1,45) + (1 / 1,36)) = 1,73659

Man kann deutlich sehen, dass die beiden Berechnungen zu unterschiedlichen Ergebnissen führen!
Leider finde ich in Access die Funktion Harmittel() nicht,- kann mir ein Experte evt. diese Funktion bitte für meine Abfragen schreiben?
Titel: Re: Harmittel statt Mittelwert
Beitrag von: DF6GL am Februar 19, 2016, 17:00:43
Hallo,

eine Access-Routine kann (will) ich Dir nicht schreiben, aber beschrieben, wie die Excel-Funktion aus Access aufrufbar wird:

--Verweis auf die entspr. Excel-Library setzen

--Eine Instanz von Excel erzeugen (und ggfls. wieder schließen).

Die Funktion etwa so aufrufen:

dblHarmonMittel = Excel.Application.WorksheetFunction.HarMittel(1 / 2.75 + 1 / 1.48 + 1 / 2.41 + 1 / 1.45 + 1 / 1.36 )
Titel: Re: Harmittel statt Mittelwert
Beitrag von: database am Februar 19, 2016, 18:17:23
Hallo,

schau mal hier - den letzten Beispielseintrag:

https://www.vb-paradise.de/index.php/Thread/9687-Mathematik-mit-VBA-Teil-1-Primzahlen-Bruchrechnen-Kombinatronik-und-Statistik/
Titel: Re: Harmittel statt Mittelwert
Beitrag von: fred-neumann am Februar 19, 2016, 19:04:33
Hallo DF6GL & database,
danke für die Aufmerksamkeit und Tipp`s!
_____________
database, der vba-code ...

Function harmMittel(ParamArray x() As Variant) As Double
    'Liefert das harmonische Mittel der "x"-Werte.
    Dim n As Integer, i As Integer
    n = UBound(x) + 1
    harmMittel = 0
    For i = 0 To n - 1
       harmMittel = harmMittel + 1 / x(i)
    Next
    harmMittel = n / harmMittel
End Function

... ist das harmonische Mittel, welches ich aus Excel kenne und auch in Access anwenden werde,- danke für den Link.
Der vba-code bezieht sich ja auf Werte in einem Datensatz, kann man nun diesen code umwandeln, so das er das "harmonische Mittel" der Werte eines Feldes (Spalte) ermittelt?
Titel: Re: Harmittel statt Mittelwert
Beitrag von: database am Februar 19, 2016, 20:00:23
Hi,

nein bezieht sich nicht auf Werte in einem Datensatz sondern auf Werte, die in einem Array übergeben werden.

Und wo stehen deine Werte? In einer Excel-Tabelle oder einer Access-Tabelle?
Titel: Re: Harmittel statt Mittelwert
Beitrag von: fred-neumann am Februar 19, 2016, 20:55:21
jo database,- bin echt nicht fit in Access!
Die Werte, denen ich den (harmonischen) Mittelwert entnehmen möchte, stehen in der Access Tabelle "Stamm" mit dem Feldname "Quote".
Titel: Re: Harmittel statt Mittelwert
Beitrag von: database am Februar 19, 2016, 21:19:05
Na dann...  ;)

Du könntest also folgendes machen:

Du erstellst dir eine weitere Funktion, welche die Daten für das Array sammelt

Public Function QuoteEinlesen() As Variant

     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim varQuote() As Variant
     'Die aktuelle Datenbank zuweisen
     Set db = CurrentDb
     'Das Recordset mit den Quoten-Werten erstellen
     Set rst = db.OpenRecordset("SELECT Quote FROM Stamm", dbOpenDynaset)

    'Werte ins Array schreiben
     Do While Not rst.EOF
         ReDim Preserve varQuote(rst.AbsolutePosition)
         varQuote(rst.AbsolutePosition) = rst!Quote
         rst.MoveNext
     Loop
     'Alles sauber machen
     Set db = Nothing
     Set rst = Nothing
     'Array an die aufrufende Function abliefern
     QuoteEinlesen = varQuote
End Function



Und diese Function rufst du aus deiner Arbeitsfunktion auf um das Array mit den Werten zu bekommen



Function harmMittel() As Double
   
    Dim n As Integer, i As Integer
    Dim varQuote() As Variant
    'Füllen des Array veranlassen
    varQuote = QuoteEinlesen

    'Liefert das harmonische Mittel der "x"-Werte.
    n = UBound(varQuote) + 1
    harmMittel = 0
    For i = 0 To n - 1
       harmMittel = harmMittel + 1 / varQuote(i)
    Next
    harmMittel = n / harmMittel
End Function



Natürlich könnte das Ganze auch noch verkürzt in einer einzigen Function zusammengefasst werden - so ist's etwas übersichtlicher - glaub' ich
Titel: Re: Harmittel statt Mittelwert
Beitrag von: fred-neumann am Februar 19, 2016, 21:25:57
Okay Peter,
ich setz das heute Abend mal um und melde mich am Samstag (jauchzend oder jubelnd) nochmals,- bis denne
Titel: Re: Harmittel statt Mittelwert
Beitrag von: database am Februar 19, 2016, 21:28:30
Na dann trainiere mal das Jauchzen!    :) :D ;D
Titel: Re: Harmittel statt Mittelwert
Beitrag von: fred-neumann am Februar 20, 2016, 09:49:45
Prima database,
der code ist zwar sehr speziell (auf eine bestimmte Datei und Feldnamen ausgerichtet) aber er hilft mir, das harmonische Mittel zu ermitteln.
Ich hoffe, dass ich eines Tages dies auch mal selbst gebacken bekomme :-)
Peter, danke für die viele Mühe!
Titel: Re: Harmittel statt Mittelwert
Beitrag von: Beaker s.a. am Februar 20, 2016, 16:30:20
Hallo Fred,
Zitatder code ist zwar sehr speziell (auf eine bestimmte Datei und Feldnamen ausgerichtet)
SQL-Strings kann man auch mit Variablen zusammen setzen.
Übergebe der Function also Tabellen- und Feldname als Parameter, und setze den SQL-String entsprechend zusammen:
"SELECT " & Feldname & " FROM " & Tabellenname
hth
ekkehard
Titel: Re: Harmittel statt Mittelwert
Beitrag von: fred-neumann am Februar 21, 2016, 16:55:35
Na kloar Ekkehard,
aber dafür ist mein Access-Wissen noch zu Banane :-)
Die Lösung von database nutze ich;
Alternativ könnte ich die Abfrage mit Feld "Quote" um einen Ausdruck ergänzen zB,

QuotenTeiler: 1 / [Quote]


.. und in einer weiteren Abfrage (die ohnehin vorhanden ist) einen Ausdruck einsetzen,

Harmittel:Anzahl([Quote]) / Summe([QuotenTeiler])


Auch so errechnet sich das harmonische Mittel.

Ich danke euch beiden und werde bestimmt bald wieder mit ner Frage auftauchen,-
bis denne