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

Forumthread: Addieren von Zeiten mit VBA (Rechenfehler?)

Addieren von Zeiten mit VBA (Rechenfehler?)
16.11.2008 10:43:00
Zeiten
Hallo, Excel Profis,
irgendwie scheint Excel in VBA hier falsch zu rechnen:
Ich habe in einer Tabelle untereinander 5 absolute Zeiten, die ich addieren will im Format [hh]:mm.
Mit VBA lese ich per Schleife die einzelnen Zeiten aus und wandle sie zum addieren in Dezimalzahlen um. Dazu habe ich eine sinnvolle Funktion hier im Archiv gefunden. Nach Durchlauf der Schleife habe ich die Summe der Zeiten im Dezimalformat und wandle sie wieder in Stunden und Minuten um.
Seltsam ist, dass das Makro einwandfrei funktioniert, solange die Gesamtstundenzahl maximal 48:00 beträgt. Ab 49:00 Stunden wird trotzdem 48:00 ausgegeben. Ist die Summe tatsächlich 50:00, wird stattdessen 49:00 ausgegeben. Noch seltsamer: Ist die Summe 49:05, wird sie korrekt zurückgegeben, bei 50:05, etc. ebenfalls. Fehler also nur ab Stunde 49:00 und nur bei vollen Stunden!
Die unten gelisteten Funktionen stimmen. Seltsam ist, dass z.B. bei der Funktion "dec2Time", die die Dezimalzahl in eine Zeit (string) zurückrechnet, die summe (double) korrekt übergeben wird, aber bei Stunde 49 (also Dezimalzahl 49,0) die Funktion Stunde = Fix(summe) die Zahl 48 für Stunde zurückgibt...
als Beispiel die Tabelle: (Summe = 49:00 mit Tabellenfunktion, 48:00 mit VBA)
10:25
09:15
09:00
09:10
12:10
hier der Code:

Sub summeWo()
Dim i As Integer
Dim summe As Double, stdDez As Double
Dim dtime As Date, rueckgabe As String
summe = 0
For i = 1 To 5
If Cells(i, 1).Value  "" Then
dtime = Cells(i, 1).Value
readZeit = dtime
time2Dec readZeit, stdDez
summe = summe + stdDez
End If
Next
sumZeit = summe
dec2Time sumZeit, rueckgabe
Cells(7, 1).Value = Format(rueckgabe, "hh:mm")
End Sub


'gelesene Zeit in Dezimalzahl umrechnen


Function time2Dec(ByVal readZeit As Date, ByRef stdDez As Double)
stdDez = readZeit * 24
End Function


'Dezimalzahl in Zeit umrechnen und zurückgeben


Function dec2Time(ByVal sumZeit As Double, ByRef rueckgabe As String)
Stunden = Fix(sumZeit)
Minuten = (sumZeit - Stunden) / 24
If Stunden 


Vielleicht mag oder kann sich jemand dem Problem annehmen? Ich komm nicht weiter... scheint knifflig zu sein!
Vielen Dank im Voraus,
Heiko

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Ergänzung...
16.11.2008 10:46:00
Heiko
die Summe ergibt natürlich 50:00, VBA gibt jedoch 49:00 zurück.
Lass doch einfach Excel rechnen
16.11.2008 11:13:46
Kuwe
Hallo Heiko,
ich würde es so machen:

Sub SummeWoche()
With Range("A7")
.NumberFormat = "[hh]:mm"
.Value = Application.WorksheetFunction.Sum(Range("A1:A5"))
End With
End Sub

Gruß Uwe

Anzeige
so gehts natürlich auch, aber...
16.11.2008 12:07:06
Heiko
... damit ist das Problem ja nicht gelöst, nämlich dass in bestimmten Fällen die Tabellenfunktion und VBA trotz richtigem Code zu unterschiedlichen Ergebnissen kommen.
Meine Frage war eigentlich: Rechnet VBA falsch und wenn ja, warum?
Vielleicht gibt's ja auch keine Lösung...
Trotzdem vielen Dank,
Heiko
Anzeige
AW: so gehts natürlich auch, aber...
16.11.2008 12:41:41
Gerd
Hi,
das ist nicht nachvollziehbar, VBA und Excel liefern korrekt 50.
Versuch das Ganze mal in einer neuen Mappe.
mfg Gerd
AW: so gehts natürlich auch, aber...
16.11.2008 12:45:03
robert
hallo, nimm einmal bei der 2.function das Fix raus
gruß
rofu
aber was?
16.11.2008 12:46:00
Kuwe
Hallo Heiko,
VBA rechnet genauso richtig:

Function Time2Dec(ByVal ReadZeit As Date) As Double
Time2Dec = ReadZeit * 24
End Function
Function Dec2Time(ByVal SumZeit As Double) As Double
Dec2Time = SumZeit / 24
End Function
Sub SummeWo()
Dim dblTemp As Double
Dim i As Integer
For i = 1 To 5
If Cells(i, 1).Value  "" Then
dblTemp = dblTemp + Time2Dec(Cells(i, 1).Value)
End If
Next
With Cells(7, 1)
.NumberFormat = "[hh]:mm"
.Value = Dec2Time(dblTemp)
End With
End Sub

Gruß Uwe

Anzeige
warum einfach, wenns auch...
16.11.2008 16:14:52
Heiko
Hi, Uwe,
vielen Dank für die Hilfe.
Der komplizierte Code war nur so ausgelegt, dass auch negative Zeiten dargestellt werden können.
Muß mal probieren, ob das jetzt auch klappt...
Grüße, Heiko
AW: so gehts natürlich auch, aber...
16.11.2008 12:53:00
Gerd
Hallo Heiko,
per Excel-Summen-Formel, per Code von Uwe u. per Augenschein ist die Summe deines Beispiels 50 Stunden.
Lediglich deine Prozeduren liefern als Ergebnis 49 Stunden. Schaue nochmal genau wie
die Variable Rückgabe berechnet wird. Apropo Variablen, vier Stück sind nicht deklariert.
Du alles etwas kompliziert aufgezogen.
Gruß Gerd
Anzeige
AW: so gehts natürlich auch, aber...
16.11.2008 16:19:47
Heiko
Hi, Gerd,
mit dem Code von Uwe klappts gut. Muß erst noch probieren, obs mit negativen Zeiten auch geht.
Bei meinem Code wird sumzeit noch korrekt übergeben, die Funktion Fix(sumzeit) macht daraus allerdings ne Stunde weniger in den benannten Fällen, also nur ab 49:00 und nur bei vollen Stunden.
Gibt man in der Funktion dec2Time für sumzeit bereits 49 an, so wird dies auch korrekt berechnet. Der Code danach ist ok... Vielleicht liegts an der Fix Funktion...
Das war ja das Seltsame.
Grüße, Heiko
Anzeige
AW: so gehts natürlich auch, aber...
16.11.2008 17:21:00
Gerd
Hi Heiko,
dies steht in der VBA-Hilfe:
Int-, Fix-Funktionen
Gibt den ganzzahligen Anteil einer Zahl zurück.
Syntax
Int(Zahl)
Fix(Zahl)
Das erforderliche Argument Zahl ist ein Wert vom Typ Double oder ein beliebiger zulässiger numerischer Ausdruck. Wenn Zahl den Wert Null enthält, wird Null zurückgegeben.
Bemerkungen
Int und Fix entfernen beide die Nachkommastellen einer Zahl und geben den daraus resultierenden ganzzahligen Wert zurück.
Der Unterschied zwischen Int und Fix besteht darin, daß bei einem negativen Wert von Zahl Int die erste negative ganze Zahl zurückgibt, die kleiner oder gleich Zahl ist, während Fix die erste negative ganze Zahl zurückgibt, die größer oder gleich Zahl ist. Int wandelt zum Beispiel -8,4 in -9 um, während Fix -8,4 in -8 umwandelt.
Fix(Zahl) entspricht dem folgenden Ausdruck:
Sgn(Zahl) * Int(Abs(Zahl))
Gruß Gerd
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Zeiten addieren mit VBA in Excel: Lösungen und Tipps


Schritt-für-Schritt-Anleitung

  1. Daten vorbereiten: Trage deine Zeiten in einer Spalte ein, z.B. in Spalte A (A1 bis A5) im Format [hh]:mm.

  2. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  3. Modul erstellen: Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  4. Code einfügen: Füge den folgenden Code in das Modul ein:

    Sub SummeWo()
       Dim i As Integer
       Dim summe As Double
       Dim dtime As Date
    
       summe = 0
       For i = 1 To 5
           If Cells(i, 1).Value <> "" Then
               dtime = Cells(i, 1).Value
               summe = summe + time2Dec(dtime)
           End If
       Next
    
       With Cells(7, 1)
           .NumberFormat = "[hh]:mm"
           .Value = dec2Time(summe)
       End With
    End Sub
    
    Function time2Dec(ByVal readZeit As Date) As Double
       time2Dec = readZeit * 24
    End Function
    
    Function dec2Time(ByVal sumZeit As Double) As Double
       dec2Time = sumZeit / 24
    End Function
  5. Makro ausführen: Schließe den VBA-Editor und führe das Makro aus, um die Zeiten zusammenzurechnen.


Häufige Fehler und Lösungen

  • Problem: Excel rechnet Stunden falsch zusammen oder zeigt 48:00 an, obwohl die Summe 50:00 ist.

    • Lösung: Überprüfe die Formatierung deiner Zellen. Stelle sicher, dass die Zellen im Format [hh]:mm formatiert sind.
  • Problem: VBA gibt falsche Ergebnisse zurück.

    • Lösung: Achte darauf, die Fix-Funktion zu vermeiden, wenn du die Stunden berechnest. Nutze stattdessen die Funktion Int() für die Umwandlung.
  • Problem: Die Summe ist korrekt, aber die Darstellung in der Zelle zeigt falsche Werte.

    • Lösung: Nutze .NumberFormat = "[hh]:mm" in deinem VBA-Code, um sicherzustellen, dass die Ausgabe im richtigen Format erfolgt.

Alternative Methoden

  • Excel-Funktionen: Statt VBA kannst du auch die Excel-Funktion SUMME() verwenden, um die Zeiten zu addieren. Beispiel:

    =SUMME(A1:A5)
  • Matrixformeln: Du kannst auch komplexere Berechnungen mit Matrixformeln durchführen, wenn du Zeitwerte in verschiedenen Formaten hast.


Praktische Beispiele

  1. Beispiel für das Addieren von Stunden und Minuten:

    • Wenn du die Zeiten 10:25, 09:15, 09:00, 09:10, 12:10 in den Zellen A1 bis A5 hast, wird die Summe in A7 korrekt dargestellt, wenn du das oben beschriebene Makro ausführst.
  2. Negative Zeiten: Wenn du auch negative Zeiten addieren möchtest, passe die Funktionen entsprechend an, um negative Werte zu berücksichtigen.


Tipps für Profis

  • Verwende benutzerdefinierte Formate: Wenn du die Darstellung der Zeit anpassen möchtest, kannst du benutzerdefinierte Formate nutzen, um Stunden und Minuten besser darzustellen.

  • Fehlerprüfung: Füge Fehlerprüfungen in deinen VBA-Code ein, um sicherzustellen, dass nur gültige Zeitwerte addiert werden.

  • Dokumentation: Kommentiere deinen Code gründlich, damit du und andere die Logik hinter den Berechnungen verstehen.


FAQ: Häufige Fragen

1. Warum zeigt Excel manchmal 48:00 an, wenn die Summe 50:00 ist? Excel hat eine Limitierung bei der Darstellung von Zeiten über 24 Stunden. Stelle sicher, dass du die Formatierung auf [hh]:mm eingestellt hast.

2. Wie kann ich Stunden und Minuten in Dezimalzahlen umwandeln? Du kannst die Funktion time2Dec verwenden, die die Zeit in Dezimalzahlen umwandelt, indem sie die Zeit mit 24 multipliziert.

3. Gibt es eine einfache Formel, um Zeiten zusammenzurechnen? Ja, du kannst die Excel-Funktion SUMME() verwenden, um die Zeiten in einer Spalte einfach zusammenzurechnen, ohne VBA zu 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