Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA Datenreduktion: Zusammenfassen von unendliche vielen Werten über den Mittelwert
#1
Hallo zusammen,
 
ich habe in eine Spalte (B) unendlich viele Messwerte über mehrere Arbeitsblätter stehen.
In Spalte (A) läuft eine Zeitachse mit.
 
Jetzt möchte ich immer, wenn 0.5 Sekunden vorbei sind die Werte Zusammenfassen
und daraus den Mittelwert bilden.
 
Wie setzte ich so etwas am besten um?
 
VG
Antworten Top
#2
Hallo,

da ich mit VBA besser kann, als mit Formeln, würde ich das ungefähr so lösen:
Code:
Sub machMittelwerte()
Dim data As Variant, lZeile As Long, lWS As Long
Dim lHalfSec As Long
Dim dSum As Double, lAnz As Long
Dim dMW(1 To 1000000, 1 To 2) As Double, lMW As Long

' es gibt keine Überschriften!

lHalfSec = Fix(ThisWorkbook.Worksheets(1).Cells(1, 1).Value / 0.5)  ' Schleife initialisieren
For lWS = 1 To ThisWorkbook.Worksheets.Count                ' Schleife über alle Tabellenblätter
    data = ThisWorkbook.Worksheets(lWS).UsedRange.Value     ' Werte aus Tabellenblatt
    For lZeile = 1 To UBound(data)                          ' Schleife über alle Werte
        If lHalfSec = Fix(data(lZeile, 1) / 0.5) Then
            lAnz = lAnz + 1
            dSum = dSum + data(lZeile, 2)
        Else
            lMW = lMW + 1                                   ' Anzahl der Mittelwerte
            dMW(lMW, 1) = data(lZeile, 1) 'lhalfsec*0.5  'lmw*0.5       ' Zeit
            dMW(lMW, 2) = dSum / lAnz                       ' Mittelwert
            dSum = 0                                        ' für nächsten Schleifendurchlauf
            lAnz = 0
            lHalfSec = Fix(data(lZeile, 1) / 0.5)
        End If
    Next
Next

'Ergebnis in neues Tabellenblatt
With ThisWorkbook
    .Worksheets.Add(after:=.Worksheets(.Worksheets.Count)).Cells(1, 1).Resize(lMW, 2).Value = dMW
End With

End Sub

Ein solches Downsampling würde ich eigentlich eher vor dem Einlesen der Daten nach Excel vornehmen (falls das bei dir überhaupt gemacht wird). Wenn es darum geht, Mittelwerte für immer die selbe Anzahl an Zeilen zu berechnen, würde ich den Code dementsprechend ändern.

Grüße, Ulrich
[-] Folgende(r) 1 Nutzer sagt Danke an losgehts für diesen Beitrag:
  • Arious87
Antworten Top
#3
Das war genau das was ich gesucht habe.
Danke es hat funktioniert.
Antworten Top
#4
C1: =MITTELWERT(INDEX(B:B;VERGLEICH((ZEILE()-1)/86400/2;A:A)+1):INDEX(B:B;VERGLEICH((ZEILE()-0)/86400/2;A:A)+0))
D1: =MITTELWERT(INDEX(B:B;(ZEILE()-1)*10+1):INDEX(B:B;(ZEILE()-1)*10+10))

c1) für variabel lange Intervalle in 0,5-Sek.-Schritten und 
d1) für eine feste Anzahl von jeweils 10 Beobachtungen (bei Messwertabständen von 1/20 Sekunden) 

Werte ab Zeile 1 ohne Überschrift
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste