Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA - Rechnen mit Uhrzeiten

VBA - Rechnen mit Uhrzeiten
08.10.2020 10:22:56
luka
Hallo zusammen,
folgendes Verstehe ich gerade leider nicht, vielleicht kann mir ja jemand auf die Sprünge helfen:
Dim Startzeit As Date: Startzeit = Range("C" & reihe).Text
Dim Endzeit As Date: Endzeit = Range("D" & reihe).Text
Dim Gesamtstunden As Date: Gesamtstunden = Endzeit - Startzeit
If Gesamtstunden > "06:00:00" And Gesamtstunden < "09:00:00" Then
Gesamtstunden = Gesamtstunden - CDate("00:30")
ElseIf Gesamtstunden > "09:00:00" Then
Gesamtstunden = Gesamtstunden - CDate("00:45")
End If
If Gesamtstunden = "06:00:00" Then
Cells(reihe, spalte) = 6
Else
Cells(reihe, spalte) = Gesamtstunden
End If
Wenn es 06:00:00 Gesamtstunden sind, geht er dennoch in den Else Bereich der If Abfrage. Wenn ich vor der If Abfrage nochmal "Gesamtstunden = "06:00:00" eintrage, funktioniert es, wieso?
Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 10:31:06
Daniel
Hi
Datumswerte sind Zahlen und keine Text
dh wenn, dann Startzeit = Range(…).Value
wenn du hier mit Texten arbeitest und das mischst tritt die implizite Typumwandlung in Aktion und da ist man nie sicher, ob die für die Umwandlung das TMJ- oder MTJ-Format anzieht
auch für die Vergleiche in den IFs solltest du die Werte nicht als Text, sondern als Datumswert angeben, dh mit CDate, DateValue oder DateSerial (wobei ich DateSerial bevorzuge, weil das das eindeutigste ist)
Gruß Daniel
Anzeige
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 10:41:31
luka
Danke für deine Antwort. Ich habe es jetzt entsprechend geändert, es funktioniert leider dennoch nicht. Habe ich hier noch irgendwo einen Fehler?
Dim Startzeit As Date: Startzeit = Range("C" & reihe).Value
Dim Endzeit As Date: Endzeit = Range("D" & reihe).Value
Dim Gesamtstunden As Date: Gesamtstunden = Endzeit - Startzeit
If Gesamtstunden > TimeSerial(6, 0, 0) And Gesamtstunden < TimeSerial(9, 0, 0) Then
Gesamtstunden = Gesamtstunden - TimeSerial(0, 30, 0)
ElseIf Gesamtstunden > TimeSerial(9, 0, 0) Then
Gesamtstunden = Gesamtstunden - TimeSerial(0, 45, 0)
End If
If Gesamtstunden = TimeSerial(6, 0, 0) Then
Cells(reihe, spalte) = 6
Else
Cells(reihe, spalte) = Gesamtstunden
End If
Anzeige
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 10:54:01
Daniel
Beschreibe "funktioniert nicht" bitte ausführlicher und präziser.
beschreibe bitte auch, was tatsächlich in den verwendeten Zellen steht (im Zahlenformat Standard)
Ist dir klar, dass 6 in Excel nicht 6 Stunden, sondern 6 Tage sind?
außerdem hast du noch eine Lücke, wenn die Gesamtstunden genau 9:00 sind, wird keine Pausenzeit abgezogen. Ist das tatsächlich so gewünscht?
Welchen Sinn macht es, nur bei genau 6:00:00 nochmal die 6 in die Zelle zu schreiben und bei allen anderen Zeitwerten (auch kleiner 6h) den genauen Zeitwert?
Gruß Daniel
Anzeige
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 11:07:43
luka
Das "funktioniert nicht", bezieht sich auf das anfängliche Problem. Bei der If-Abfrage wird nicht erkannt, wenn die Gesamtstunden genau 6 Stunden sind, das heißt es werden immer genau die Gesamtstunden genommen und nicht die „6“ eingetragen falls es 6 Stunden sind.
In den angesprochenen Zellen stehen die Uhrzeiten (zB 09:30:00) mit der Formatierung [hh]:mm.
Der Sinn dahinter ist der, dass ich mit diesem Makro ein „Fremdes“ Worksheet ausfülle, dort werden alle Uhrzeiten ohne Doppelpunkt eingetragen. Wenn ich die Zeiten so rechne funktioniert auch alles, außer bei 06:00 Stunden, dann springt das „Fremde Makro“ auf 0,25. Wenn ich allerdings nur die Zahl 6 in die Zelle schicke, rechnet das „Fremde“ Makro dies zu 6:00 Stunden wie gewollt.
Die Gegebenheiten kann ich leider nicht umschreiben, ich versuche das ganze damit nur für mich selbst zu fixen und mir Zeit einzusparen.
Anzeige
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 11:14:26
Daniel
HI
da kenne sich jetzt deine Dateien und das Zusammenspiel der Makros zuwendig, um dir da was konkretes sagen zu können.
Gruß Daniel
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 12:32:25
luka
Ich habe mal eine Demo Datei hochgeladen: https://www.herber.de/bbs/user/140728.xlsm
Danke & Gruß
luka
Anzeige
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 13:05:11
Daniel
Hi
hier trifft das altbekannte Problem aller Computer zu:
da der Speicherplatz begrenzt ist, können Computer manche Zahlen nur ungenau darstellen und somit kommt es dann bei Berechnungen zu minimalen Abweichungen, hier
gesamtstunden- timeserial(6, 0, 0) = -5,5511*10^-17
also erst 17 Stellen nach dem Komma.
normalerweise macht das nichts aus, aber bei Vergleichen ist das das entscheidende "Zünglein an der Waage".
die Abhilfe für dieses Problem ist in der Regel das RUNDEN auf eine für die Berechnung ausreichende Stellenzahl.
bei Zeitwerten kann man auch einfach in Text konvertieren, so dass nur Stunden, Minuten und Sekunden übrig bleiben:
If Format(Gesamtstunden, "hh:mm:ss") = "06:00:00" then
Gruß Daniel
Anzeige
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 13:10:37
luka
Ahh Ok, gut zu wissen Danke. Beim Debuggen wird ja nur 06:00:00 dargestellt, deswegen hab ich da keinen Fehler gesucht, ist aber gut zu wissen.
Jetzt funktioniert es jedenfalls ohne Probleme, Dank Dir!
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 13:14:41
Daniel
Ja, die Abweichung ist auch so klein, dass sie, wenn man sich Gesamtstunden direkt anzeigen lässt, nicht angezeigt wird. Erst mit Bildung dieser Differenz wird sie sichtbar.
Gruß Daniel
Anzeige
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 11:41:55
Frank
Hallo luka,
6 Stunden sind als Zahl genau 0.25, nämlich 1/4 Tag. Wenn Du in eine Zelle im Format [hh]:mm von Hand nur eine 6 einträgst, interpretiert Excel das als 6 Tage, also 144:00. Wenn Du dagegen 6:00 einträgst, interpretiert Excel das als Sunden:Minuten.
Wenn Du den Wert per VBA einträgst oder abfragst sind das unabhängig vom Format immer Tage. Du musst den Wert mit 24 multiplizieren, um die Stunden zu erhalten.
Viele Grüße
Frank
Anzeige
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 12:31:41
luka
Dann weiß ich wenigstens schon mal, warum dann da 0.25 steht, Danke.
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 11:47:20
Luschi
Hallo luka,
solange Du nur theoretisch diskutierst. statt endlich mal Butter bei die Fische zu geben, kannst Du auch erzählen, im Himmel ist Weinachstmarkt - es bringt NICHTS.
Zeige endlich eine Demodatei mit neutralisierten Daten - und es wird auch Hilfe bei Dir ankommen.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: VBA - Rechnen mit Uhrzeiten
08.10.2020 14:29:21
Frank
Hallo luka,
ich rechne lieber mit Sekunden statt Stunden.
So habe ich ganze Zahlen und gehe der Fließkomma-Ungenauigkeit aus dem Weg.

Sub demo()
Dim Startzeit As Date, Endzeit As Date, Gesamtstunden As Date, Sekunden As Long
Const SekundenProStunde = 3600, SekundenProMinute = 60
Range("C1:D1") = Empty
Startzeit = Range("A1").Value
Endzeit = Range("B1").Value
Gesamtstunden = Endzeit - Startzeit
Sekunden = Round(Gesamtstunden * 24 * SekundenProStunde, 0)
If Sekunden > 6 * SekundenProStunde And Sekunden  9 * SekundenProStunde Then
Sekunden = Sekunden - 45 * SekundenProMinute
End If
Cells(3, 1) = Sekunden / SekundenProStunde / 24
If Sekunden = 6 * SekundenProStunde Then
Cells(1, 3) = "Bla"
Else
Cells(1, 4) = "Blub"
End If
End Sub
Sub demokurz()
Dim sek As Long
Const sph = 3600, spm = 60
[C1:D1] = Empty
sek = Round(([B1] - [A1]) * 24 * sph, 0)
If sek > 6 * sph And sek  9 * sph Then sek = sek - 45 * spm
[A3] = sek / sph / 24
If sek = 6 * sph Then [C1] = "Bla" Else [D1] = "Blub"
End Sub

Nebenbei: Ab 6:00:01 bis 8:59:59 werden 30 Minuten abgezogen und ab 9:00:01 45 Minuten. Bei exakt 9:00:00 und bis 6:00:00 wird nichts abgezogen. Ist das gewollt? Sonst ggf. > durch >= erseutzen.
Viele Grüße
Frank
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Rechnen mit Uhrzeiten in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Variablen deklarieren: Beginne mit der Deklaration der benötigten Variablen. Du benötigst mindestens Startzeit, Endzeit, und Gesamtstunden.

    Dim Startzeit As Date
    Dim Endzeit As Date
    Dim Gesamtstunden As Date
  2. Werte aus Zellen einlesen: Setze die Werte aus den entsprechenden Zellen in die Variablen. Achte darauf, .Value zu verwenden, um sicherzustellen, dass du mit Datumswerten arbeitest.

    Startzeit = Range("C" & reihe).Value
    Endzeit = Range("D" & reihe).Value
  3. Berechnung der Gesamtstunden: Berechne die Gesamtstunden, indem du Endzeit und Startzeit subtrahierst.

    Gesamtstunden = Endzeit - Startzeit
  4. Bedingungen für Pausen: Verwende If-Anweisungen, um Pausenzeiten je nach den Gesamtstunden zu subtrahieren.

    If Gesamtstunden > TimeSerial(6, 0, 0) And Gesamtstunden < TimeSerial(9, 0, 0) Then
       Gesamtstunden = Gesamtstunden - TimeSerial(0, 30, 0)
    ElseIf Gesamtstunden > TimeSerial(9, 0, 0) Then
       Gesamtstunden = Gesamtstunden - TimeSerial(0, 45, 0)
    End If
  5. Ergebnis in Zelle ausgeben: Überprüfe, ob die Gesamtstunden genau 6 Stunden betragen, und schreibe entsprechend in die Zelle.

    If Format(Gesamtstunden, "hh:mm:ss") = "06:00:00" Then
       Cells(reihe, spalte) = 6
    Else
       Cells(reihe, spalte) = Gesamtstunden
    End If

Häufige Fehler und Lösungen

  1. Datentypen mischen: Achte darauf, dass du Date-Werte und Text nicht vermischst. Verwende immer .Value anstelle von .Text, um sicherzustellen, dass du die richtigen Datentypen verwendest.

  2. Vergleichsfehler: Bei Vergleichen kann es durch Fließkomma-Ungenauigkeiten zu Problemen kommen. Verwende Format oder runde die Werte, um Genauigkeitsprobleme zu vermeiden.

  3. Falsches Zeitformat: Wenn du nur "6" eingibst, interpretiert Excel dies als 6 Tage. Stelle sicher, dass du "6:00" verwendest, wenn du Stunden und Minuten angeben möchtest.


Alternative Methoden

  • Mit Sekunden rechnen: Eine Möglichkeit, die Ungenauigkeiten bei der Berechnung von Uhrzeiten zu umgehen, besteht darin, alle Zeiten in Sekunden umzuwandeln. Dies macht die Berechnungen einfacher und genauer.

    Dim Sekunden As Long
    Sekunden = Round(Gesamtstunden * 24 * 3600, 0)
  • Nutzung von benutzerdefinierten Funktionen: Du kannst auch eigene VBA-Funktionen erstellen, um spezifische Zeitberechnungen durchzuführen, was den Code modularer und wiederverwendbarer macht.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du mit Uhrzeiten in Excel VBA rechnen kannst:

Sub BerechneDauer()
    Dim Startzeit As Date
    Dim Endzeit As Date
    Dim Gesamtstunden As Date

    Startzeit = TimeValue("08:00:00")
    Endzeit = TimeValue("16:30:00")

    Gesamtstunden = Endzeit - Startzeit

    If Gesamtstunden > TimeSerial(6, 0, 0) Then
        Gesamtstunden = Gesamtstunden - TimeSerial(0, 30, 0)
    End If

    MsgBox "Gesamtstunden: " & Format(Gesamtstunden, "hh:mm:ss")
End Sub

Tipps für Profis

  • Debugging: Nutze Debugging-Tools in VBA, um den Fluss deines Codes besser zu verstehen und Fehler schneller zu identifizieren.
  • Verwende Konstanten: Definiere Konstanten für häufig verwendete Werte wie SekundenProStunde, um deinen Code besser lesbar zu machen.
  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung, um unerwartete Fehler abzufangen und den Code robuster zu gestalten.

FAQ: Häufige Fragen

1. Wie rechnet man Uhrzeiten aus?
Um Uhrzeiten in Excel zu berechnen, subtrahiere einfach die Startzeit von der Endzeit und verwende die richtigen Zeitformate und Datentypen.

2. Warum funktioniert mein Code nicht?
Überprüfe, ob du die richtigen Datentypen verwendest und ob du die Werte korrekt aus den Zellen einliest. Achte auch auf die Fließkomma-Ungenauigkeit bei Vergleichen.

3. Was ist der Unterschied zwischen .Value und .Text?
.Value gibt den tatsächlichen Wert der Zelle zurück, während .Text den angezeigten Text zurückgibt. Für Zeit- und Datumswerte solltest du immer .Value verwenden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige