2017-02-13 6 views
0

Sachverhalt: Ich mache Berichte für OP-Räume und gebe ihnen die Erlaubnis zur Verwendung, wenn sie bestimmte Kriterien erfüllen oder nicht. Eines dieser Kriterien ist, dass etwa 1 Million Partikel pro Minute in den Raum fließen können. Die Partikelzähler, mit denen dies gemessen wird, geben ein Datenblatt aus, das in Excel geöffnet werden kann. Jede Minute, in der die Maschine Partikel zählt, fügt sie der Datentabelle eine neue Zeile hinzu, die anzeigt, wie viele Partikel gezählt wurden.Excel VBA Rückgabe wahr oder falsch, wenn 10 Zeilen ein bestimmtes Kriterium erfüllen

Um die Freiraum für den Chirurgieraum zu geben, muss der Zähler fast genau die gleichen 1 Million (offset von 10.000 particals + - erlaubt) particals für 10 Minuten geradeaus setzen.

Was brauche ich: Ich brauche einen Code, der die ersten 10 Zeilen von Daten vergleichen kann (ab Zeile: 3). Wenn sie die Kriterien erfüllen (mit einem Offset von 10.000), füllen Sie die Zellen dieser Zeilen vbGreen. Wenn sie nicht übereinstimmen, gehen Sie zur nächsten Zeile (Zeile: 4) und vergleichen Sie die nächsten 10 Zeilen. Wenn sie übereinstimmen, fülle diese Zeilen mit vbGreen. Wenn sie nicht übereinstimmen, gehen Sie zur nächsten Zeile (Zeile: 5), usw.

Wenn keine Übereinstimmung gefunden wurde, füllen Sie cellA1 vbRed.

Beispieltabelle: Die 0,3 Mikron (Zählimpuls) Zeile ist diejenige, die wir vergleichen möchten. Die oberste Zeile dieser Tabelle ist die Zeilennummer 3 in Excel. In Zelle C1 sollte ich diesen erforderlichen Wert eingeben können (jetzt wird angenommen, dass er 1 Million ist). Und Zelle A1 sollte, wie bereits erwähnt, vbRed schalten, wenn keine Übereinstimmungen vorhanden sind.

Time Stamp | Location 2 | Location 2 | Location 2 | Location 2 | Location 2 
-----------| 0.3 micron | 0.3 micron | 0.5 micron | 0.5 micron | Temerature 
-----------| (counts) | (p/ft^3) | (counts) | (p/ft^3) | (F)  
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1555000 | 186600000.0| 800000 | 96000000.0 | 75.2 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 800000 | 96000000.0 | 400000 | 48000000.0 | 75.2 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1555000 | 186600000.0| 800000 | 96000000.0 | 75.6 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1010000 | 121200000.0| 800000 | 96000000.0 | 75.2 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1009000 | 121080000.0| 800000 | 96000000.0 | 75.2 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1003000 | 120360000.0| 800000 | 96000000.0 | 75.2 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 991000 | 118920000.0| 800000 | 96000000.0 | 75.6 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1008000 | 120960000.0| 800000 | 96000000.0 | 75.2 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1009000 | 121080000.0| 800000 | 96000000.0 | 75.2 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1010000 | 121200000.0| 800000 | 96000000.0 | 75.2 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1004000 | 120480000.0| 800000 | 96000000.0 | 75.2 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1000000 | 120000000.0| 800000 | 96000000.0 | 75.2 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1002000 | 120240000.0| 800000 | 96000000.0 | 75.2 
___________|____________|____________|____________|____________|____________ 
7/6/2016 | 1014000 | 121680000.0| 800000 | 96000000.0 | 75.6 
___________|____________|____________|____________|____________|____________ 

Fortsetzung: Ich habe keine Ahnung, wo ich anfangen soll oder wie eine Funktion wie diese würde aufgerufen werden. Diese Website hat mir eine Menge beigebracht, aber ich kann so etwas nicht finden und erstellen.

Ich bin offen für jeden Rat.

Antwort

1

Sie könnten AutoFilter(), wie folgt (siehe Kommentare Code zu Ihrem tatsächlichen Bedarf anpassen):

für Ihre Zeit
Sub main() 
    Dim area As Range 
    Dim ppm As Double 
    Dim found As Boolean 

    With Worksheets("Rooms") '<--| change "Rooms" to your actual worksheet name 
     ppm = .Range("C1").Value 
     With .Range("F2", .Cells(.Rows.count, 1).End(xlUp)) '<--| assuming data are in columns A to F and start at row 3 -.> headres in row 2 
      .AutoFilter field:=2, Criteria1:=">=" & ppm * 0.9, Operator:=xlAnd, Criteria2:="<=" & ppm * 1.1 
      If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then 
       For Each area In .Resize(.Rows.count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Areas 
        If area.Rows.count > 9 Then 
         area.Interior.Color = vbGreen 
         found = True 
         Exit For 
        End If 
       Next 
      End If 
     End With 
     .AutoFilterMode = False 
     .Range("A1").Interior.Color = IIf(found, vbGreen, vbRed) 
    End With 
End Sub 
+0

Das funktioniert! Vielen Dank für Ihre Zeit, Ihre Hilfe wird sehr geschätzt. Es gab nur einen kleinen Fehler, den du gemacht hast. ppm * 0.9 = 900000, ich brauche einen Offset von 10.000. Es wurde auf 0,99 geändert. und 1.01. – 1000PointsOfLight

+0

Sie sind willkommen – user3598756

+0

Würde "Criteria1: ="> = "& ppm - 10000" und "Criteria2: =" <= "& ppm + 10000" auch funktionieren? weil ppm * 0.99/1.01 nur für 1000000 funktionieren würde. – 1000PointsOfLight

0

Sie könnten das mit einer Schleife tun, die über die Zeilen geht (Zeile 2 bis letzte Zeile minus 10). In der Schleife würde eine verschachtelte Schleife die nächsten 9 Zeilen durchlaufen und prüfen, ob die Kriterien erfüllt sind. Verwenden Sie eine Pseudo-Continue-Anweisung, wenn die Kriterien nicht erfüllt sind. Wenn der Malcode hinter der verschachtelten Schleife steht, wird er nur ausgeführt, wenn die Kriterien erfüllt sind.

Für die rote Zelle, falls nichts zusammenpasst, würde ein einfaches boolesches Flag genügen.

-Code Umriss:

Sub doThis() 

    dim found as boolean 
    found = false 

    dim i as long, j as long, lastline as long 
    lastline = mySheet.Range(relevantRange).End(xlUp).row 

    for i = 2 to lastline - 10 
     for j = i to 10 
      if not (cells(i, relevantColumn) + 10001 > cells(j, relevantColumn) _ 
       and cells(i, relevantColumn) - 10001 < cells(j, relevantColumn)) then 
       GoTo continue 
      end if 
     next 
     range(relevantColumn & i & ":" & relevantColumn & i + 9).Interior.ColorIndex = vbGreen 
     found = true 
     exit sub 
continue: 
    next 

    if not found then 
     'coloring code 
    end if 

End Sub 

ich das nicht prüften, da ich nicht entsprechende Daten haben. Schreiben Sie einen Kommentar, wenn Sie Hilfe benötigen.

+0

Danke, aber für mich user3598756 seine awnser funktionieren! – 1000PointsOfLight

Verwandte Themen