Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1024to1028
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

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

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

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

44 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige