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?
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 )
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/
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?
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?
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".
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
Okay Peter,
ich setz das heute Abend mal um und melde mich am Samstag (jauchzend oder jubelnd) nochmals,- bis denne
Na dann trainiere mal das Jauchzen! :) :D ;D
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!
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 " & Tabellennamehth
ekkehard
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