Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1784to1788
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
Inhaltsverzeichnis

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?

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
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
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 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
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
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

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige