VisualBasic VBA Prgrammierung Werte vergleich

Sahit

Admiral
Registriert
März 2010
Beiträge
8.358
Servus,

muss für meine Bachelorarbeit ein Diagramm erstellen in dem ich von 2 Messwerten den Temperaturunterschied über die Temperatur auftrage. Also soll der Y-Wert delta_T und der X-Wert T sein. Nun habe ich die Temperaturen mit 2 verschiedenen verfahren gemessen (Temperatursensor und Pyrometer) aufgrund der verwendeten Messtechnik passen aber die Abstände zwischen den verschiedene Messungen nicht. Das Pyrometer hat jede 0,5 Sekunde einen Messwert abgespeichert der Sensor jede 0,4 Sekunden einen Messwert abgelegt. So kann ich das Diagramm nicht einfach erstellen.

Meine Idee war es nun per VBA Programmierung ein Makro zu schreiben was das für mich erledigt. Allerdings habe ich bis jetzt nur in C Programmiert und das ist auch schon wieder ne ganze Zeit her. Ich wollte hier mit For und If arbeiten und 3 Werte miteinander Vergleich. Das Makro an sich scheint ermal zu laufen aber es nimmt kein Ende. Ich denke der Fehler liegt Irgendwo in den If Anweisungen. Ich bekomme aber nicht raus wo.

Hier mein Makro
Code:
Sub delta_t_9()
Dim intZeile1, intZeile2, intZeile3 As Integer

    For intZeile1 = 7 To 1387
        wert1 = Cells(intZeile1, 5)
        For intZeile2 = 7 To 1387
            wert2 = Cells(intZeile2, 14)
                For intZeile3 = 8 To 1387
                    wert3 = Cells(intZeile3, 14)
                    If Abs(wert1 - wert2) < Abs(wert1 - wert3) Then
                        Cells(intZeile1, 17) = Cells(intZeile1, 6) - Cells(intZeile2, 15)
                    End If
                Next intZeile3
            If Abs(wert1 - wert2) > Abs(wert1 - wert3) Then
            Cells(intZeile1, 17) = Cells(intZeile1, 6) - Cells(intZeile1, 15)
            End If
            Next intZeile2
    Next intZeile1
End Sub

Wäre toll wenn mir jemand helfen könnte.
 
Zuletzt bearbeitet:
Also den Algorithmus zu optimieren wird wohl nichts wie ich sehe.
Dass es lange dauert liegt einfach daran, dass du 2.626.167.600 Schleifen durchführst.

Du könntest mal versuchen die Aktualisierungsoperationen von Excel währendessen auszuschalten.
Wenn Excel zu lange hängt oder sich aufhängt, entferne das Kommentarzeichen vor: DoEvents

Code:
Option Explicit

Sub delta_t_9()
    Dim intZeile1, intZeile2, intZeile3 As Integer
    Dim wert1 As Double, wert2 As Double, wert3 As Double
    
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With

    For intZeile1 = 7 To 1387
        wert1 = Cells(intZeile1, 5).Value
        For intZeile2 = 7 To 1387
            wert2 = Cells(intZeile2, 14).Value
                For intZeile3 = 8 To 1387
                
                    ' Hinweis:
                    ' Wenn Excel zu lange hängt und das Probleme macht, entferne das Kommentarzeichen  '  in der nächsten Zeile vor:   DoEvents
                    ' DoEvents
                    wert3 = Cells(intZeile3, 14).Value
                    If Abs(wert1 - wert2) < Abs(wert1 - wert3) Then
                        Cells(intZeile1, 17) = Cells(intZeile1, 6) - Cells(intZeile2, 15)
                    End If
                Next intZeile3
            If Abs(wert1 - wert2) > Abs(wert1 - wert3) Then
            Cells(intZeile1, 17).Value = Cells(intZeile1, 6) - Cells(intZeile1, 15)
            End If
        Next intZeile2
    Next intZeile1
    
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With
End Sub
 
Zuletzt bearbeitet:
Danke für die schnelle Antwort.

Mittlerweile glaube ich eher an meiner Grundidee ist was nicht richtig. Ich bekomme es aber einfach nicht hin. Ich habe wesentlich mehr werte vom Sensor also vom Pyrometer da der Sensor alle 0,4 Sekunden und das Pyrometer alle 0,5 Sekunden einen Messwert gespeichert hat. Es geht darum das ich den Temperaturwert vom Pyrometer der Zeitlich am nächsten zum jeweiligen Temperaturwert vom Sensor liegt abziehe um die Temperaturdifferenz zwischen den beiden Werten zu ermitteln.

Hierbei ist die Annahme das der Sensor genauer misst als das Pyrometer. Der Sensor stellt also den Sollwert da.
 
Ich hab zwar nicht studiert und schreibe auch keine Bachelorarbeit, aber solltest Du nicht die Messwerte des Pyrometers erst interpolieren und dann mit denen des Sensors vergleichen?

Aber vielleicht habe ich Dein Vorhaben auch falsch verstanden.
 
Das habe ich schon gemacht. So habe ich praktisch die Temperaturkurven von Pyrometer und Sensor gegenübergestellt. Nun geht es aber um die Ablage der Temperatur und das ist nicht so einfach da ich hier ja die Differenz der 2 Temperaturwerte brauche. Natürlich könnte man versuchen Funktionen für die 2 Kurven zu finden und die Werte errechen aber das ist auch nicht ohne und ich denke das es mit einem Makro was die Zeiten einfach möglichst genau aufeinander Abstimmt besser geht. Hier kommt nur das Problem das ich nicht weis wie ich diese Aufgabenstellung programmtechnisch umsetzen kann.
 
Du hast also 2 Listen mit Temperaturen und Zeitstempel wobei eine aller 0.4 sec einen Wert aufweist und die andere alle 0.5

Und jetzt möchtest Du die "kürzere" von beiden (0.5sec) an die "längere" anpassen um die Werte gegenüber stellen zu können. Soweit richtig?

Sorry...aber was bedeutet Ablage von Temperaturen eigentlich?
 
Die beiden gemessenen Temperaturen sind nicht gleich. So misst z.B. das Pyrometer bei 5 Sekunden 241,56K, der Sensor misst nun leider nicht genau bei 5 Sekunden sondern bei 4,8 oder 5,2 . Ok dann sage ich jetzt ich nehme den Wert 4,8 hier sind es 238,7K. Die Ablage (Differenz) der beiden Werte beträgt also -2,86K die das Pyrometer hier zu wenig anzeigt. So weit so gut.
Das eigentliche Problem ist aber das für hier halt immer der Zeitwert genommen werden soll der dem Sensor am nächsten ist.
Ich habe durch die 0,1 sekunden schnellere Messung beim Sensor aber 1380 Messewerte und vom Pyrometer nur 1174. Also brauche ich ein Makro was die Differenz der Temperatur des Sensor immer mit der Zeitlich am besten passenden des Pyrometers vergleicht.
 
Zuletzt bearbeitet:
Naja, glaube zwar immer noch nicht, dass das genau ist, aber was solls. Sortiere beide Listen nach der Zeit.

Dann lasse einen loop über die Datensätze des Sensors laufen. Für jeden Schritt lässt Du einen zweiten Loop über die Zeiten des Pyrometers laufen. Also eine FOR Schleife in einer FOR Schleife.

Vergleiche jede Zelle x und jede zelle x + 1 (hier die Zeitstempel des Pyrometers) mit dem jeweiligen Zeitstempel des Sensors. Welcher näher dran ist gewinnt.

Warum hast Du drei FOR Schleifen in deinem ersten Beispiel?
 
Hab ja gesagt an meiner Grundidee ist was falsch. Ich werde jetzt versuchen deine Idee jetzt umzusetzen. Danke
Ergänzung ()

Ich bin so langsam echt am Ende :( Es wird einfach nichts

Hier mein versuch
Code:
Sub delta_t_9()
Dim intZeile1, intZeile2 As Integer
Dim wert1 As Double, wert2 As Double, wert3 As Double


With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
End With

    For intZeile1 = 7 To 1387
        For intZeile2 = 7 To 1111
        wert1 = Cells(intZeile1, 5)
        wert2 = Cells(intZeile2, 14)
        wert3 = Cells(intZeile2 + 1, 14)
            If Abs(wert1 - wert2) < Abs(wert1 - wert3) Then
            Cells(intZeile1, 17) = Cells(intZeile1, 6) - Cells(intZeile2, 15)
            Else: Cells(intZeile1, 17) = Cells(intZeile1, 6) - Cells(intZeile2 + 1, 15)
            End If
        Next intZeile2
    Next intZeile1
End Sub
 
Zuletzt bearbeitet:
Eigentlich ist das doch periodisch? 0,4 0,8 1,2 1,6 2,0 und 0,5 1 1,5 2,0 somit fällt entweder 0,8 oder 1,2 weg also hast du ja nur eine Entscheidung alle 5 0,4er Werte zu treffen oder sehe ich das falsch? Am sinnvollsten wäre es doch immer eins der beiden wegzulassen und fertig oder die zu vergleichen und den mit geringster Differenz zu 1,0 zu nehmen, was aber die Messung Statistisch beeinflusst und zwar genauer mach t! Programmierung jetzt Mal vergessen aber Punkt Punkt Diagramm und da die Werte ablesen nicht gewünscht?
Zudem wenn die Werte eh nicht die gleiche Skalierung haben was bringt dir die Differenz?
 
Zuletzt bearbeitet:
Ich denke das Problem liegt darin das er Wert2 immer wieder neu setzt da das mit hoch gezählt wird. Er müsste praktisch aufhören intZeile2 hoch zu zählen für Wert 2. Ok da könnte ich intZeile1 einsetzen mal schauen ob es dann geht. Edit ich versuch mal die ExcelTabelle hier zugänglich zu machen eventuell wird dann das Problem eher klar.
Ergänzung ()

Hier die Datei https://drive.google.com/file/d/0B4wPi7lbH9JQSkJtSDlJMXQ3bmc/view

Folgende Probleme treten auf:
1. Die berechneten Werte stimmen nicht. (Bei den ersten Werten gehe ich von einem Rundungsfehler aus diesen bekomme ich aber auch nicht behoben, es wird nur auf 1 stelle nach dem Komma gerundet.)
2. Der im Diagramm ersichtliche Vorzeichenwechsel (Diagramm Vergleich Versuch 9 Sensor/Pyrometer) findet nicht statt.
3. Die Berechnung der Ergebnisse für alle Sensorwerte für die ich keine Pyrometerwerte habe geht garnicht.
 
Zuletzt bearbeitet:
Verdammt Du hast Recht. Wert1 gehört natürlich in die erste FOR Schleife. Ich denke ja mal der steht für den Sensor, korrekt?

Ich mach mir grade das Windows Update drauf, danach kann ich mal schauen....wenn der Rechner dann noch läuft :-)
 
Zurück
Oben