Excel VBA application function Average

Pyrukar

Captain
Registriert
Jan. 2013
Beiträge
3.703
hallo,

ich experementiere gerade etwas mit der Application.WorksheetFunction.Average(). Wenn ich eine Average(Range()) angebe tut die Funktion was sie soll. Jetzt habe ich aber 2 verschiedene Ranges ( Range(A) und Range(B)) Beide haben unterschiedliche Anzahl an Elementen. Ich mach jetzt einfach mal Werte damit es deutlicher wird. Range(A) hat 127 Elemente, Range(B) hat 373 Elemente. Wenn ich jetzt den Mittelwert aller 500 Elemente wissen möchte gibts Probleme: Ich habe das im VBA Editor so stehen: x=Application.WorksheetFunction.Average(Range("M10:M1000"),Range("W10:W1000")). Die Sub wirft keine Fehlermeldung jedoch ist das Ergebnis fern jeder sinnvollen Lösung. Wenn ich auf dem Excelsheet die Funktion =MITTELWERT(M10:M1000;W10:W1000) verwende kommt das Richtige ergebnis raus und ich muss gestehen ich verstehe das nicht ganz.
Wenn ich ehrlich bin verstehe ich nichtmal wenn ich etwas um die Ecke denke was die VBA version rechnet.
hier die Ergebnisse:

MW Range(A)=64.572 (127 Elemente)
MW Range(B)=318.227 (373 Elemente)
VBA Gesamtergebnis=92.496
Mittelwertfunktion (korrektes Ergebnis)=253.798

Findet jemand meinen Fehler? bzw. vielleicht würde es ja schon helfen wenn jemand herausbekommt, was die VBA Funktion rechnet denn egal was ich tue komme ich nicht auf die 92k ...

gruß

Pyrukar
 
Dumme Sache…
Code:
Sub MiWe()
Dim X As Single
Dim Y As Single
Dim Z As Single

X = Application.WorksheetFunction.Average(Range("U46:U50"))
Y = Application.WorksheetFunction.Average(Range("V46:V50"))
Z = Application.WorksheetFunction.Average(Range("U46:U50"), Range("V46:V50"))

Debug.Print X, Y, Z

End Sub
U46 abwärts: 20,40,60,80,100
V46 abwärts: 15,30,45,60,75
Ergibt fü X, Y, Z 60, 45 und unfassbare 52,5 wie es sich gehört. Die analogen Blattformeln liefern nichts anderes.

Keine Ahnung in welchem Detail da der Teufel steckt.

CN8
 
der Teufel steckte tatsächlich im detail.

nachdem ich die Bestätigung hatte, dass die eigentliche Syntax richtig war hab ich mich nochmal auf fehlersuche begeben ... tatsächlich stand dort : x=Application.WorksheetFunction.Average(Range("M10:M1000" ,Range("W10:W1000")) und der Editor hat leider keinen Fehler geschmissen ... na ja auf jeden fall hat es sich gefunden :) danke für deine Bestätigung, CN8, das die Syntax richtig ist.

jetzt habe ich aber noch eine kleinigkeit die ziemlich nervt und für die es sich nicht wirklich lohnt ein neues Thema aufzumachen :) : der Befehl Tabelle1.Range(x:y).ClearContent wirft einen Fehler sobald man nicht auf Tabellenblatt 1 ist ... kann man das irgendwie umgehen? bisher habe ich dann immer Tabelle1.activate / Tabelle1.Range(x:y).ClearContent / Tabelle2.activate gemacht aber dadurch kommt natürlich eine gewisse unruhe rein wenn man dem Skript beim ausführen zusieht :)

gruß

Pyrukar
 
Ich bin momentan nicht mehr so sehr in VBA drin, aber im Zweifel kannst du vor dem tabelle1.activate ein Application.Screenupdate=False setzen, dann flackert nichts.
Und hinterher halt wieder auf den Usprungswert (üblicherweise true, sollte auch, muss aber nicht) setzen.
 
Zurück
Oben