Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
984to988
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
984to988
984to988
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Betriebsstunden zählen mithilfe eines Makros ?

Betriebsstunden zählen mithilfe eines Makros ?
13.06.2008 09:32:00
christian
Hallo,
Die Drehzahl eines Motors wird (idR dazu unten mehr) alle zehn sekunden gemessen und registriert.
Die Registrierung erfolgt tageweise in eine Excel-Tabelle. (Bisher sind ca. 140 Dateien im Verzeichnis)
Jetzt möchte ich folgendes erreichen:
Ein Programm soll chronologisch in die Spalte der Drehzahl in allen Dateien schauen. Dabei soll immer wenn der wert der drehzahl über 1000 liegt, dies als Betriebszeit gewertet werden.
Jetzt gibt es noch zwei schwierigkeiten die ich nicht so recht zu überwinden weiß:
  • Zum einen die chronologische Abarbeitung der Dateien nach dem Erstelldatum,
  • zum anderen die
  • Auswertung der Betriebszeit, hier liegt das größere Problem. In der Spalte der Uhrzeit wird angezeigt hh:mm:ss allerdings ist die registrierung nicht immer (aus bisher ungeklärten Gründen) alle 10 sekunden erfolgt sondern z.B. 11 erfolgt . Siehe dazu Bild.

  • Deshalb: Kann man den Rückschluss der Betriebszeit über eine Differenzmessung in der Spalte der Uhrzeit machen?
    ErichG. hatte mir bei einem ähnlichen Problem https://www.herber.de/forum/archiv/980to984/t983224.htm#983260 eine sehr gute Lösung gegeben. Vielleicht auch diesmal?

    15
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Betriebsstunden zählen mithilfe eines Makros ?
    13.06.2008 11:52:00
    Frager
    Hallo
    ich ein bestehedes Makro, was alle Dateien eines Verzeichnisses abarbeitet um eine Route erweitert, die die Betriebsstunden auswertet.
    Versuch mal.


    Option Explicit
    Sub Drehzahl()
        Dim dlg As FileDialog, Si, Ext$, Datei$
        Dim SPZeit%, SPDreh%, ZE&, LR&, TB1, i&
        Dim Start As Date, Ende As Date, Betrieb As Date
        Set dlg = Application.FileDialog(msoFileDialogFolderPicker) 'Verzeichnis wählen
        If dlg.Show = True Then
            For Each Si In dlg.SelectedItems 'Die Abfrage für den selektierten Eintrag
                Ext = "*.xls"       'Dateiextension ggf. anpassen
                Datei = Dir(Si & "\" & Ext)
                Do
                    Workbooks.Open Filename:=Si & "\" & Datei
                    'Der Teil, der die Betriebsstunden einer Tabelle ermittelt
                    '***
                    Set TB1 = ActiveSheet   'oder aus aktuellen Blatt
                    SPZeit = 2 'in Spalte B
                    SPDreh = 4 'in Spalte D
                    ZE = 2 'ab Zeile 2
                    LR = TB1.Cells(Rows.Count, SPZeit).End(xlUp).Row 'letzte Zeile der Spalte
                    Application.ScreenUpdating = False
                    For i = ZE To LR
                        If TB1.Cells(i, SPDreh) >= 1000 Then
                            If i = ZE Or TB1.Cells(i - 1, SPDreh) < 1000 Then
                                'erster Wert über 1000
                                Start = TB1.Cells(i, SPZeit)
                            ElseIf TB1.Cells(i + 1, SPDreh) < 1000 Then
                                'nächster Wert ist unter 1000
                                Ende = TB1.Cells(i, SPZeit)
                                Betrieb = Betrieb + Ende - Start
                            End If
                        End If
                    Next
                    'Ende Teil Betriebsstunden
                    '***
                    Workbooks(Datei).Close SaveChanges:=False
                    Datei = Dir() ' nächste Datei
                Loop While Len(Datei) > 0
            Next
        End If
        MsgBox "Betriebstunden: " & Betrieb
    Fehler:
        If Err.Number <> 0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description: Err.Clear
    End Sub


    Gruß UweD

    Anzeige
    AW: Betriebsstunden zählen mithilfe eines Makros ?
    13.06.2008 12:52:38
    christian
    Hallo,
    danke erstmal. Ich habs laufen lassen und das kam raus:
    Userbild
    Allerdings scheint das nicht korrekt zu sein.
    Ermittelt er die Summe der Betriebszeit aller Tage? (Die müsste schätzungsweise bei mir bei 500 h liegen)
    Dann müsste man den Zeitbereich in der Box vielleicht so anpassen hhhh:mm:ss , oder?
    Was ist das für eine Datumsangabe?
    Optional: kann er auch die jeweilige Betriebzeit jeder einzelnen Datei ermitteln und das ganze in eine Excel-Tabelle eintragen?
    christian

    Anzeige
    AW: Betriebsstunden zählen mithilfe eines Makros ?
    13.06.2008 16:34:00
    fcs
    Hallo Christian,
    ich hatte mich auch mit deinem Problem befasst, hier meine Lösung.
    Bei Uwe's Lösung muss du wohl nur die Ergebniszeile anpassen:
    MsgBOx "Betriebsstunden: " & Format(Betrieb*24, "#.##0.00")
    Gruß
    Franz
    
    Sub BetrStdAuswerten()
    'Betriebsstunden über Drehzahlwert auswerten, Ausgabe in MsgBox
    Dim objWbQuelle As Workbook, objWksQuelle As Worksheet, lngZeileQ As Long
    Dim strStatus As String, datZeit1 As Date, datZeit2 As Date
    Dim varVerzeichnis As Variant, strDatei As String
    Dim iDatei As Integer
    Dim dblEin As Double
    Dim dblAus As Double
    Const strEin As String = "Ein"
    Const strAus As String = "Aus"
    Const dblGrenze As Double = 1000 'Schwellenwert für Status Ein oder Aus
    On Error GoTo Fehler
    'Datei im Verzeichnis auswählen
    varVerzeichnis = Application.GetOpenFilename(Filefilter:="Excel (*.xls),*.xls", _
    Title:="Bitte eine der Dateien im Verzeichnis auswählen und öffnen")
    If varVerzeichnis = False Then GoTo Fehler
    varVerzeichnis = VBA.CurDir
    strDatei = Dir(varVerzeichnis & "\*.xls")
    Application.ScreenUpdating = False
    Do Until strDatei = ""
    iDatei = iDatei + 1
    Application.StatusBar = "Datei Nr " & Format(iDatei, "000") & " wird bearbeitet."
    Set objWbQuelle = Workbooks.Open(Filename:=varVerzeichnis & "\" & strDatei, ReadOnly:=True)
    Set objWksQuelle = objWbQuelle.Worksheets(1)
    With objWksQuelle
    '1. zeit auf 0 Uhr setzen
    datZeit1 = CDate("00:00:00")
    'Betriebsstaus in der 1. Zeile auswerten und speichern
    strStatus = IIf(.Cells(3, 4).Value > dblGrenze, strEin, strAus)
    For lngZeileQ = 4 To .Cells(.Rows.Count, 1).End(xlUp) + 1
    If IsEmpty(.Cells(lngZeileQ, 1)) Then
    'Werte aus letzter Daten-Zeile einlesen und auswerten
    'letzte Zeit auf 1 Sekunde vor Mitternacht setzen
    datZeit2 = 1 '=24:00:00
    If strStatus = strEin Then
    dblEin = dblEin + (datZeit2 - datZeit1) * 24 'Betriebsstunden
    Else
    dblAus = dblAus + (datZeit2 - datZeit1) * 24 'Betriebsstunden
    End If
    Exit For
    ElseIf strStatus = strEin And .Cells(lngZeileQ, 4).Value  dblGrenze Then
    'Wechsel auf in Betrieb
    datZeit2 = .Cells(lngZeileQ, 2).Value
    dblAus = dblAus + (datZeit2 - datZeit1) * 24 'Betriebsstunden
    datZeit1 = datZeit2
    strStatus = strEin
    End If
    Next
    End With
    objWbQuelle.Close savechanges:=False
    strDatei = Dir
    Loop
    Application.ScreenUpdating = True
    Application.StatusBar = False
    MsgBox "Alle Daten eingelesen" & vbLf & vbLf _
    & "Einschaltzeit: " & Format(dblEin, "#,##0.00") & " h" & vbLf _
    & "Stillstandszeit: " & Format(dblAus, "#,##0.00") & " h"
    Fehler:
    If Err.Number  0 Then
    MsgBox "Fehler nr. " & Err.Number & " ist aufgetretn!" & vbLf & Err.Description
    End If
    Application.ScreenUpdating = True
    Application.StatusBar = False
    End Sub
    


    Anzeige
    @ Franz
    16.06.2008 09:08:00
    christian
    Hallo,
    schon mal danke für deine Lösung.
    Ich habe deinen ode ausprobiert und das kommt raus wenn ichs laufen lasse:
    Userbild
    Leider kann ich den Code nicht interpretieren, deshalb meine Frage:
    Das Format der Zeitanzeigen in der Box ist mir etwas unverständlich.
    Einfacher wäre es für mich wenn er in jeder einzelnen Datei die Zeitdiffernzen ("Aus - Ein") mißt (oder macht er dies bereits?) und diese Differenzen dann für alle Dateien im Verzeichnis aufaddiert und mir die Differenz (Betriebszeit) anzeigt.
    Optional:
    ich habe von Erich mal einen Code für einen Startzähler bekommen. Der schreibt mir die Anzahl Startvorgänge der jeweiligen Datein in eine Excel-Tabelle, könnte man das vielleicht für meinen Betriebsstundenzähler modifizieren?
    CODE:
    
    Option Explicit
    Sub Start()
    Dim strV As String, strE As String, lngUeb As Long, strSpalte As String
    Dim lngZ As Long, intDreh As Integer
    strE = "xls"
    lngUeb = 2
    strSpalte = "D"
    strV = Cells(2, 2)
    If strV = "" Then Exit Sub
    If Right(strV, 1) = "\" Then strV = Left(strV, Len(strV) - 1)
    If Dir(strV & "\*.xls") = "" Then
    MsgBox "Keine xls-Datei gerfunden in" & vbLf & vbLf & strV
    Exit Sub
    End If
    ListFiles strV, strE
    Cells.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlYes, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    Cells(1, 5) = "Starts"
    For lngZ = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    If Cells(lngZ, 1)  ThisWorkbook.Name Then
    Cells(lngZ, 5) = _
    ZaehleStarts(strV & "\" & Cells(lngZ, 1), lngUeb + 1, strSpalte, intDreh)
    End If
    Next lngZ
    Columns("A:F").AutoFit
    End Sub
    Sub ListFiles(strVrz As String, strEndg As String)
    Dim FSO As Object, oFolder As Object, oFile As Object
    Dim arr As Variant, lngZ As Long, lngS As Long
    On Error GoTo ERRORHANDLER
    strEndg = UCase(strEndg)
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set oFolder = FSO.GetFolder(strVrz)
    arr = Array("Name", "Erstellung", "Letzte Änd.", "Bytes")
    Workbooks.Add 1
    Rows(1).HorizontalAlignment = xlCenter
    Range(Cells(1, 1), Cells(1, UBound(arr) + 1)) = arr
    lngZ = 1
    For Each oFile In oFolder.Files
    If strEndg = UCase(FSO.GetExtensionName(oFile)) Then
    lngZ = lngZ + 1
    Cells(lngZ, 1).Value = oFile.Name
    Cells(lngZ, 2).Value = oFile.DateCreated
    Cells(lngZ, 3).Value = oFile.DateLastModified
    Cells(lngZ, 4).Value = oFile.Size
    End If
    Next oFile
    ERRORHANDLER:
    If Err > 0 Then
    MsgBox "Die Dateien konnten nicht gelistet werden!"
    MsgBox "Fehler " & Err.Number & vbLf & Err.Description
    End If
    Set FSO = Nothing
    Set oFolder = Nothing
    Set oFile = Nothing
    End Sub
    Function ZaehleStarts(strFile As String, lngU As Long, strSp As String, _
    intVor As Integer)
    Dim intErg As Integer, lngZ As Long, lngS As Long
    Application.EnableEvents = False
    '   On Error GoTo ERRORHANDLER1
    Workbooks.Open strFile, 0, True
    '   On Error GoTo ERRORHANDLER2
    Worksheets(1).Select
    lngS = Range(strSp & "1").Column
    If intVor = 1000 Then intErg = 1
    lngZ = Cells(Rows.Count, lngS).End(xlUp).Row
    If lngZ > lngU Then
    ZaehleStarts = intErg + Evaluate("SUMPRODUCT((" & strSp & lngU & ":" & strSp & _
    lngZ - 1 & "1000))")
    intVor = Cells(lngZ, lngS)
    Else
    ZaehleStarts = "Weniger als 2 Datenzeilen"
    End If
    ERRORHANDLER2:
    ActiveWorkbook.Close False
    ERRORHANDLER1:
    If Err > 0 Then ZaehleStarts = "Fehler " & Err.Number
    Application.EnableEvents = True
    End Function
    


    christian

    Anzeige
    Frage offen gesetzt
    16.06.2008 10:47:00
    christian
    Frage offen gesetzt

    AW: Frage offen gesetzt
    16.06.2008 17:46:49
    fcs
    Hallo Christian,
    das Ergebnis, das in der Messagebox angezeigt wird sind die Stunden als Dezimalzahl.
    Einschaltzeit = Ein-Stunden
    Stillstandszeit = Aus-Stunden
    Ich hab meine Pozedur als Variante jetzt so modiifiziert, das die zusammengefassten Daten
    Wechseln von Ein/Aus mit Zeitdifferenz
    sowie die tageweise zusammengefassten Ein- und Aus-Zeiten in Tabellenblättern ausgegeben werden.
    https://www.herber.de/bbs/user/53147.xls
    Bei dem Vorschlag für die Formatierung für die Zeitausgabe in der anderen Lösung war mir versehentlich beim Format ein Punkt statt Komma reingerutscht. Richtig: "#,##0.00"
    Dein Wunsch das Ergebnis in der Messagebox im Format h:mm:ss auszugeben funktioniert aus VBA heraus nur mit erheblichen Aufwand, da das Format [h]:mm:ss, das Stunden über 24 hinaus darstellt nur direkt in der Tabelle funktioniert. Deshalb die Ausgabe in der Msgbox als Desimalzahl mit 1000er-Punkt.
    Gruß
    Franz

    Anzeige
    AW: Frage offen gesetzt
    17.06.2008 08:13:38
    christian
    Danke Franz für deine Mühe,
    ich habs soeben ausprobiert und die Auflistung funktioniert bis auf ein paar Zellen in denen er die Zeitdifferenz [dez] mit "minus" angibt. Hier weiß ich noch nicht ob diese negative Zeit Einfluss auf das Gesamtergebnis hat. Du vielleicht?
    Ich hab die Ergebnistabelle auch hier angehängt.
    https://www.herber.de/bbs/user/53155.xls
    christian

    Nachtrag; unlogisches Ergebnis, wenn ...
    17.06.2008 09:30:57
    christian
    ... ich den Grenzwert für die Drehzahl von 1000 auf 1500 ändere sollte logischerweise die Betriebszeit geringer sein als mit dem Grenzwert 1000. Allerdings ist das Gegenteil der Fall.
    Habe ich das ganze nicht richtig angepasst, oder wo könnte der Fehler liegen?https://www.herber.de/bbs/user/53157.xls
    christian

    Anzeige
    AW: Nachtrag; unlogisches Ergebnis, wenn ...
    17.06.2008 14:37:00
    fcs
    Hallo Christian,
    ich hab für meine Testdateien mal den Vergleichswert angepasst.
    Hier funktioniert es. Wenn der Wert hochgesetzt wird, dann sinkt die Ein-Zeit.
    Es muss nur die Zeile
    
    Const dblGrenze As Double = 1500 'Schwellenwert für Status Ein oder Aus
    

    geändert werden.
    Negative Zeitdifferenzen kann eigentlich nicht sein, wenn die Daten in den Messwertdaten korrekt aufsteigend sortiert sind und für alle Datenreihen Datum, Uhrzeit und Drehzahl eingetragen sind.
    Probleme git es, wenn Sortierung nicht korrekt ist oder wenn die Uhrzeit für mehrere Datensärtze nicht eingetragen ist. ggf. müssten vom Makro die Daten vor dem Einlesen sortiert werden, wenn dies die Ursache ist.
    Gruß
    Franz

    Anzeige
    AW: Nachtrag; unlogisches Ergebnis, wenn ...
    18.06.2008 07:56:13
    christian
    Danke erstmal, ich werde es nochmal genau prüfen.
    Vielleicht finde ich noch einen Fehler in meinen Quelldateien.
    christian

    Fehler gefunden, noch eine abschließende Frage ...
    18.06.2008 13:48:00
    christian
    ... wenn ich hoffentlich nicht nerve.
    Es gibt (lieder) auch Dateien im Verzeichnis die keinerlei Daten enthalten.
    Bei diesen kommt dann diese Fehlermeldung.
    Userbild
    Ich kann diese Dateien aber nicht aus dem Verzeichnis ausschließen.
    Kann man da noch was machen, damit das Programm trotzdem weiterläuft?
    chrisitan
    PS: Den Fehler in meinen Quelldateien konnte ich ausmerzen, so dass eine negativen Zeiten mehr gelistet werden.

    Anzeige
    AW: Fehler gefunden, noch eine abschließende Frage ...
    18.06.2008 17:56:00
    fcs
    Hallo Christian,
    mit Ergänzung der gekennzeichneten Zeilen an den entsprechenden Zeilen im Code wird das Einlesen übersprungen, wenn eine Datentabelle leer ist.
    Gruß
    Franz
    
    Sub BetrStdAuswertenTabelle()
    'Betriebsstunden über Drehzahlwert auswerten, Ausgabe in Tabelle
    Set objWksQuelle = objWbQuelle.Worksheets(1)
    With objWksQuelle
    'Prüfen ob in Quelle ab Zeile 3 Datenvorhanden sind              '### neu 20080618
    If .Cells(.Rows.Count, 1).End(xlUp).Row 


    FUNKTIONIERT ALLES BESTENS, DANKE !!!
    19.06.2008 09:37:00
    christian

    Das kommt raus ...
    16.06.2008 08:22:30
    christian
    Hallo,
    ich habe es so angepasst wie Franz es mir geraten hat, allerding kommt wieder so was bei raus:
    Userbild
    Kann man das ganze überhaupt im Format hhhh:mm:ss darstellen?
    christian

    Anzeige
    AW: Das kommt raus ...
    16.06.2008 08:26:33
    Hajo_Zi
    Hallo Christian,
    ich habe es jetzt nicht nachgebaut. Versuche es doch mal mit Format.

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige