PDA

Vollständige Version anzeigen : Warnfenster nach If-Schleife einblenden


Excel_beginner
02.07.2014, 17:47
Hallo,

ich sitze leider immernoch an meiner excel Auswertungssoftware für einen Motorprüfstand und es geht glücklichweise langsam dem Ende entgegen- Dank ganz viel erstklassiger Hilfe von euch aus dem Forum!!!

Ich stehe nun leider mal wieder vor einem großes Fragezeichen. Und zwar geht es um folgendes:

Es wird eine Drehzahl aufgezeichnet über einen variablen Bereich von bspw. 1500-4500 rpm (inklu. Leistung und Drehmoment). Leider muss ich den kleinen Knopf um die Drehzahl gaaanz langsam zu eröhen von Hand drehen und der ist deutlich feinfühliger als ich. Das heißt, wenn ich die Drehzahl zu schnell erhöhe soll ein Fenster in meinem Worksheet eingeblendet werden das entweder grün ist und "accepted" oder rot und "Too fast" anzeigt. Das Kriterium dafür ist die Drehzahlerhöhung. Soviel zum Hintergrund.

Ich habe nur leider wieder einmal keine Ahnung wie ich das umsetzen könnte. Und zwar: Wenn ich weniger als 5 Messwerte über eine Drehzahlerhöhung von 100 rpm habe, dann ist es die Messung ungültig und ich muss den Knopf langsamer drehen. Wenn ich >5 Messwerte habe, dann grün und alles ist accepted.

Beispiel: C2 (keine Information) C3 (1502rpm), C4 (1556), C5 (1565), C6 (1573), C7 1574), C8 (1628)

C3-C7 = 5 Messwerte in einem Drehzahlbereich von 1500-1574rpm. Also ist alles gut.

Kann mir einer von euch einen Tipp geben eventuell ?? Ich wäre sehr dankbar, leider rennt mir gerade meine Erasmuszeit davon und ich will dieses Projekt einfach nur noch fertig machen...

aloys78
02.07.2014, 20:06
Hallo,

wenn die Messwerte direkt in die Tabelle eingefügt werden, könnte man das Change_Ereignis nutzen und dann jeweils die letzen 5 Messpunkte überprüfen.

Gruß
Aloys

Hasso
02.07.2014, 22:39
Hallo Excel_beginner,

ich habe das mit einer bedingten Formatierung gelöst:

<b>Process_Data</b><br /><br /><table border="1" cellspacing="0" cellpadding="0" style="font-family:Calibri,Arial; font-size:11pt; background-color:#ffffff; padding-left:2pt; padding-right:2pt; "> <colgroup><col style="font-weight:bold; width:30px; " /><col style="width:82px;" /><col style="width:86px;" /><col style="width:85px;" /><col style="width:80px;" /><col style="width:81px;" /></colgroup><tr style="background-color:#cacaca; text-align:center; font-weight:bold; font-size:8pt; "><td >&nbsp;</td><td >A</td><td >B</td><td >C</td><td >D</td><td >E</td></tr><tr style="height:18px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >1</td><td >&nbsp;</td><td style="text-align:center; ">Torque [Nm]</td><td style="text-align:center; ">Rpm [1/min]</td><td style="text-align:center; ">Power [kW]</td><td style="text-align:center; ">Fueltank [g]</td></tr><tr style="height:18px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >2</td><td style="color:#ffffff; background-color:#ff0000; ">13:53:42,809</td><td style="color:#ffffff; background-color:#ff0000; text-align:right; ">83,5</td><td style="background-color:#ff0000; ">&nbsp;</td><td style="background-color:#ff0000; ">&nbsp;</td><td style="color:#ffffff; background-color:#ff0000; text-align:right; ">5674</td></tr><tr style="height:18px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >3</td><td style="color:#ffffff; background-color:#ff0000; ">13:53:43,302</td><td style="color:#ffffff; background-color:#ff0000; text-align:right; ">81,5</td><td style="color:#ffffff; background-color:#ff0000; text-align:right; ">1502</td><td style="color:#ffffff; background-color:#ff0000; text-align:right; ">13,0</td><td style="color:#ffffff; background-color:#ff0000; text-align:right; ">5670</td></tr><tr style="height:18px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >4</td><td >13:53:44,393</td><td style="text-align:right; ">84,0</td><td style="text-align:right; ">1556</td><td style="text-align:right; ">13,1</td><td style="text-align:right; ">5670</td></tr></table><br /><table style="font-family:Arial; font-size:10pt; background-color:#fffcf9; border-style: groove ;border-color:#ff0000"><tr><td ><b>Bedingte Formatierungen der Tabelle</b></td></tr><tr><td ><table border="1" cellspacing="0" cellpadding="0" style="font-family:Arial; font-size:10pt; padding-left:2pt; padding-right:2pt; "><tr><td >Zelle</td><td >Nr.: / Bedingung</td><td >Format</td></tr><tr><td >A2</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >B2</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >C2</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >D2</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >E2</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >A3</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >B3</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >C3</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >D3</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >E3</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >A4</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >B4</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >C4</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >D4</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr><tr><td >E4</td><td >1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())&gt;100</td><td style="color:#ffffff; background-color:#ff0000; ">Abc</td></tr></table></td></tr></table> <br /><br /><span style="font-family:Arial; font-size:9pt; font-weight:bold;background-color:#ffffff; color:#000000; ">Excel Tabellen im Web darstellen &gt;&gt; </span><a style ="font-family:Arial; font-size:9pt; color:#fcf507; background-color:#800040; font-weight:bold;" href="http://www.excel-jeanie-html.de" target="_blank"> Excel Jeanie HTML 4 </a>

Excel_beginner
03.07.2014, 08:21
Guten Morgen Aloys,

mmmh, ich habe gerade versucht, deinen Vorschlag bei mir einzubauen, leider kann ich deiner Formel nicht ganz folgen :/

Wenn ich es richtig verstehe, werden immer 5 Werte überprüft, stimmt das? Und wenn die Bedingung nicht erfüllt ist, dann wird der Bereich rot markiert. Könntest du mir eventuell erklären, was genau das bedeutet:

"1. / Formel ist =INDIREKT("$C"&ZEILE()+4)-INDIREKT("$C"&ZEILE())>100"

und wo ich das einbauen kann um es per Makro automatisch ausführen zu lassen? Bzw. ich glaube die Formel ist nicht ganz richtig. Bei dem roten Bereich Z14-16 sind ja 6 Werte vorhanden (Z11-Z16), also wäre der Bereich okay. Das Problem ist leider, dass es immer eine unterschiedliche Anzahl sein kann.

Hasso
03.07.2014, 08:35
Hallo Excel_beginner,

die Formel war nicht von Aloys, sondern von mir :D
Ich hatte die Bedingung einfach umgedreht: Wenn innerhalb von 4 Messwerten eine Erhöhung von über 100 erfolgt ist, dann soll dies hervorgehoben werden. Ich hatte dabei aber einen kleinen Denkfehler: Ändere die Formel mal so:=INDIREKT("$C"&ZEILE()+3)-INDIREKT("$C"&ZEILE())>100und wo ich das einbauen kann um es per Makro automatisch ausführen zu lassen?Dafür brauchst du kein Makro. Wenn das über die bedingte Formatierung erfolgt, kopierst du einfach die Messwerte in die Tabelle und die Färbung erfolgt entsprechend der Formel. Vielleicht könntest du den Bereich für die bedingte Formatierung (aktuell: $A$2:$E$107) vergrößern, damit auch längere Messreihen abgedeckt werden.

Excel_beginner
03.07.2014, 21:47
Moin Hasso,

tut mir leid, ich habe das mit den Namen irgendwie durcheinander gebracht.

So, ich habe deine Formel jetzt nocheinmal ausprobiert und bei mir funktioniert da gar nichts. Ich habe das Arbeitsblatt wie vorhin im Anhang genommen, dann bedingte Formatierung --> Regeln verwalten --> Neue Regel --> Formeln zur Ermittlung..... -->
"=INDIREKT("$C"&ZEILE()+3)-INDIREKT("$C"&ZEILE())>100" eingefügt --> Roten hintergrund gewählt --> Bereich C2 bis C350 angeklickt --> Haken entfernen --> ok.

Ich habe die Messwerte so verändert, dass die Drehzahl nur 3 Werte per 100 rpm hat. Aber es passiert bei mir gar nichts. Was mache ich falsch?

Hasso
03.07.2014, 21:56
Hallo Excel_beginner

Lade doch mal deine Mappe hoch, damit ich das testen kann.

Excel_beginner
03.07.2014, 22:01
Ich habe die Formel wie oben beschrieben eingefügt und einfach mal den Bereich C6-C9 verändert. Der sollte auf jedenfall erkannt werden, aber wird er irgendwie nicht.

Ich lade die Mappe mal in den Anhang. Eigentlich müssten doch alle 4 werte rot hinterlegt werden, für welche die Formel wahr wird... ?

Hasso
04.07.2014, 06:01
Hallo Excel_beginner,

leider finde ich in der hochgeladenen Datei überhaupt keine bedingte Formatierung und auch keine Messwerte, bei denen weniger als 5 Messwerte über eine Drehzahlerhöhung von 100 rpm auftauchen. Also kann die Bedingung auch nie zutreffen. Um das zu verdeutlichen, habe ich in Spalte G einmal die Differenz zwischen jeweils 4 Messwerten angezeigt und diese ist in keinem Fall größer als 100.

Ich habe als Beispiel den Wert in C117 verändert, so dass die Differenz zu C114 größer als 100 ist und sofort wird die Zeile rot.

Lade doch bitte mal eine Tabelle hoch, in der das von dir angegebene Phänomen auftaucht.

Excel_beginner
04.07.2014, 10:09
Guten Morgen Hasso,

du hast Recht, in der Datei war leider gar nichts vorhanden, was sinnvoll wäre. Hier im Anhang ein neuer Versuch. Ich habe in Spalte C die betroffenen Bereiche gelb markiert. C8-11, C44-47, C56-59, C82-85.

Die Formel prüft doch über die gesamte Spalte fortlaufend immer einen weiteren Wert. C1 & C4, ... C7&C10... Dadurch muss die Bedingung nicht zwingend erfüllt sein. Bspw: C7 - C10 < 100rpm; C8 - C11 < 100rpm; C9 - 12 < 100rpm. Trotzdem sind im bereich von 1600-1699 < 5 Messwerte enthalten.

Kann ich es irgendwie einbauen, dass immer ein Bereich von 100rpm (bspw. 1600-1699rpm) erkannt wird und die bedingte formatierung erkennt, ob es mehr oder weniger als 5 Zeilen sind?

Hasso
04.07.2014, 10:20
Hallo Excel_beginner,

wäre auch eine VBA-Lösung akzeptabel?

Excel_beginner
04.07.2014, 10:28
akzeptabel ? Es wäre sogar die schönere Lösung :)

Hasso
04.07.2014, 11:42
Hallo Excel_beginner,

hier meine VBA-Lösung. Teste das mal:
Private Sub CommandButton1_Click()
Dim rngZelle As Range
Dim intZeile As Integer
Dim intSpalte As Integer
Dim intLetzteZeile As Integer
Dim intZaehler As Integer
Dim intErhoehung As Integer

'letzte Zeile in Spalte C ermitteln:
intLetzteZeile = Worksheets("Process_Data").Cells(Rows.Count, "C").End(xlUp).Row
'alte Färbungen löschen:
Worksheets("Process_Data").UsedRange.Interior.ColorIndex = xlNone
'alle Zellen in Spalte C durchgehen:
For Each rngZelle In Worksheets("Process_Data").Range("C3:C" & intLetzteZeile - 4)
intErhoehung = 0
intZeile = 1
intZaehler = 0
Do
intErhoehung = Cells(rngZelle.Row + intZeile, "C") - Cells(rngZelle.Row, "C")
intZeile = intZeile + 1
intZaehler = intZaehler + 1
Loop Until intErhoehung > 100
'wenn weniger als 5 Messwerte, die Zellen rot färben:
If intZaehler < 4 Then Range("C" & rngZelle.Row & ":C" & rngZelle.Row + intZaehler).Interior.Color = RGB(255, 0, 0)
Next rngZelle

End Sub

Excel_beginner
04.07.2014, 12:41
Hi Hasso,

uff, dass dafür so ein Mamut Code nötig wird hätte ich nicht gedacht. Vielen Dank dafür erstmal!

Ich habe den Code gerade mal angeschaut, er funktioniert leider noch nicht ganz optimal. C44-47, C56-59, C115-117 werden beispielsweise noch nicht erkannt.

Leider kann ich deinen Code so gut wie gar nicht anpassen :D

Hasso
04.07.2014, 12:53
Hallo Excel_beginner,C44-47, C56-59, C115-117 werden beispielsweise noch nicht erkannt.
C47-C44 = 2086-2004 = 82, also weniger als 100
C59-C56 = 2270-2002 = 68, also weniger als 100
C117-C115 = 2991-2924 = 67, also weniger als 100

warum sollten die erkannt werden?

Deine Bedingung im ersten Beitrag hießWenn ich weniger als 5 Messwerte über eine Drehzahlerhöhung von 100 rpm habe, dann ist es die Messung ungültig

Excel_beginner
04.07.2014, 13:03
Aaaah, haha, ja jetzt verstehe ich was du meinst! Okay, ich habe mich nicht ganz genau ausgedrückt. Aber deine Lösung ist sogar noch besser :)

Was ich ursprünglich meinte war: Einen Bereich zu wählen, der immer bei glatten 100ern anfängt.
Bereich 1: 1600-1699
Bereich 2: 1700- 1799... usw.

Und dann schauen ob in dem Bereich 5 Messwerte liegen. Ich habe nichtmal daran gedacht, die Bereiche immer über 4 Messwerte zu ziehen. Deine Lösung ist definitiv deutlich besser, an sowas hätte ich nie gedacht. Super, ganz vielen Dank, das hat mir sehr geholfen, allein hätte ich das nie hinbekommen!

*THUMBS UP*

Excel_beginner
04.07.2014, 13:05
Klaro, jetzt wenn ich drüber nachdenke, wäre meine Lösung nicht gut gewesen.

Hätte jemand das Knöpfchen ganz schnell gedreht wären ganze Sprünge von bspw...

1500
1510
1520
1530
1540
2310
2320
2340
2360
2370

unter Umständen nichtmal aufgefallen.

Excel_beginner
04.07.2014, 14:13
Hallo Hasso,

ich baue gerade deinen Code in mein gesamtes Arbeitsblatt ein, wobei ich auf ein Problem gestoßen bin.

Im prinzip nehme ich nur deinen Code und kopiere ihn bis auf den Knopf in mein Modul, allerdings bekomme ich jetzt einen "Überlauf" fehler in Zeile:

intZeile = intZeile + 1.

Option Explicit

Sub Check_RPM_increase(wsName As String)
Dim ws As Worksheet
Dim lngLetzte As Long
'Check if worksheet is already created, otherwise delete
If Not IsError(Evaluate(wsName & "!A1")) Then
Application.DisplayAlerts = False
Worksheets(wsName).delete
Application.DisplayAlerts = True
End If
'Create new worksheet
ThisWorkbook.Worksheets.Add After:=Worksheets(Worksheets.Count)
'Choose Name
ActiveSheet.Name = wsName
'Your code for manipulating the data
Application.ScreenUpdating = False
Worksheets("Process_Data").Columns("A:D").Copy Destination:=ThisWorkbook.Worksheets("Check_RPM_increase").Range("A:D")
Application.CutCopyMode = False
Application.ScreenUpdating = True
lngLetzte = IIf(IsEmpty(Cells(Rows.Count, 1)), Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count)

'Code for finding delta rpm > 100rpm
Dim rngZelle As Range
Dim intZeile As Integer
Dim intSpalte As Integer
Dim intLetzteZeile As Integer
Dim intZaehler As Integer
Dim intErhoehung As Integer

'letzte Zeile in Spalte C ermitteln:
intLetzteZeile = Worksheets("Process_Data").Cells(Rows.Count, "C").End(xlUp).Row
'alte Färbungen löschen:
Worksheets("Process_Data").UsedRange.Interior.ColorIndex = xlNone
'alle Zellen in Spalte C durchgehen:
For Each rngZelle In Worksheets("Process_Data").Range("C3:C" & intLetzteZeile - 4)
intErhoehung = 0
intZeile = 1
intZaehler = 0
Do
intErhoehung = Cells(rngZelle.Row + intZeile, "C") - Cells(rngZelle.Row, "C")
intZeile = intZeile + 1
intZaehler = intZaehler + 1
Loop Until intErhoehung > 100
'wenn wenige als 5 Messwerte, die Zellen rot färben:
If intZaehler < 4 Then Range("C" & rngZelle.Row & ":C" & rngZelle.Row + intZaehler).Interior.Color = RGB(255, 0, 0)
Next rngZelle

End Sub



Ich habe an dem Code nichts verändert außer, dass ich erst die Werte in ein anderes Worksheet copiere und dann deinen Code ausführe. Es tut mir leid, dass ich damit schon wieder anfange :/

Hasso
04.07.2014, 14:26
Hallo Excel_beginner,

wie viele Zeilen hat denn dein Blatt? Vielleicht solltest du stattDim intZeile As IntegerlieberDim lngZeile As Longnehmen.

Excel_beginner
04.07.2014, 14:46
Mein Blatt hat 212 Zeilen mit Daten und geht insgesamt bis 350, die Zeilen dazwischen sind in dem Bereich leer.

Ich habe meine WS Namen abgepasst und die Variable auch, der Fehler besteht immernoch.

Wenn ich im Debugger Modus den cursor auf intZaehler halte in der Fehlerhaften Zeile, steht der Wert auf 32767... Dann verstehe ich, dass er nicht noch einen aufaddieren kann.

Hast du eine Idee warum der Zaehler so hoch ist ?

Hasso
04.07.2014, 14:54
Aus dem Code ersehe ich das nicht. Kannst du mal die Mappe hochladen?

Excel_beginner
04.07.2014, 15:09
So, musste eben alles löschen was nicht dazugehört.

Wenn du auf der STARTseite den großen Knopf drückst, dann tritt das Problem auf. Es wird die neue Seite geöffnet und es hängt.

Hasso
04.07.2014, 16:22
warum ist der Messwert in Zeile 212 so viel kleiner (-244) als der vorhergehende?

Excel_beginner
04.07.2014, 16:29
Die Messung wird per Hand von zwei Personen gestartet und gestoppt. Dabei kann es schnell passieren, dass der Prüfstandsfahrer die Drehzahl runterfährt, bevor das Programm letzten Werte geschrieben hat.

Hasso
04.07.2014, 16:45
Hallo Excel_beginner,

das Problem lag daran, dass am Ende der Tabelle nie der Wert 100 überschritten wurde und das Programm in der Do ... Loop Schleife hängen blieb.


Ich habe das im Code jetzt abgefangen und das Makro läuft ohne Fehler durch:'Code for finding delta rpm > 100rpm
Dim rngZelle As Range
Dim lngZeile As Long
Dim intSpalte As Integer
Dim intLetzteZeile As Integer
Dim intZaehler As Integer
Dim intErhoehung As Integer

With Worksheets("Check_RPM_increase")
'letzte Zeile in Spalte C ermitteln:
intLetzteZeile = .Cells(Rows.Count, "C").End(xlUp).Row
'alte Färbungen löschen:
.UsedRange.Interior.ColorIndex = xlNone
'alle Zellen in Spalte C durchgehen:
For Each rngZelle In .Range("C3:C" & intLetzteZeile - 4)
intErhoehung = 0
lngZeile = 1
intZaehler = 0
Do
'wenn die erste leere Zelle in Spalte C erreicht wurde, ohne dass intErhoehung>100 ist (Endlosschleife):
If .Cells(rngZelle.Row + lngZeile, "C") = 0 Then Exit Sub
intErhoehung = .Cells(rngZelle.Row + lngZeile, "C") - .Cells(rngZelle.Row, "C")
lngZeile = lngZeile + 1
intZaehler = intZaehler + 1
Loop Until intErhoehung > 100
'wenn weniger als 5 Messwerte, die Zellen rot färben:
If intZaehler < 4 Then .Range("C" & rngZelle.Row & ":C" & rngZelle.Row + intZaehler).Interior.Color = RGB(255, 0, 0)
Next rngZelle
End With

So, und jetzt ist erst mal Fußball angesagt :D

Excel_beginner
04.07.2014, 17:17
jaaaaah, jetzt funktioniert alles genau so wie ich es brauche!

Weltklasse, danke!!