AW: makro - falsches Ergeb wenn Zahl mit 2 Dezimalstellen (Text)
31.08.2024 20:13:46
Fred
Hallo Daniel,
danke für deine Aufmerksamkeit!
Meine Beispielmappe sollte eigentlich all die von dir gestellten Fragen beantworten ....
aber erstmal; Vielen Dank für deine Code-Unterstützung!
Deine Version konnte leider die spezifischen Anforderungen an das Vergleichen von Nachspielzeiten nicht erfüllen.
Sie war vor allem problematisch, weil sie Strings als mathematische Ausdrücke behandelte...
Ich habe das nun alles etwas komplexer gemacht,- vieleicht nicht optimal,- aber viel genauer und "robuster".
Die Funktion ist nun sehr speziell darauf ausgelegt, Nachspielzeiten richtig zu vergleichen, und berücksichtigt verschiedene Sonderfälle wie leere Zellen oder unterschiedliche Dezimalstellen.
UND
es funzt!!
Public Function VergleicheNachspielzeit(wert1 As String, wert2 As String) As String
Dim parts1 As Variant
Dim parts2 As Variant
If wert1 = "" And wert2 = "" Then
VergleicheNachspielzeit = ""
Exit Function
ElseIf wert1 = "" Then
VergleicheNachspielzeit = wert2
Exit Function
ElseIf wert2 = "" Then
VergleicheNachspielzeit = wert1
Exit Function
End If
parts1 = Split(wert1, ",")
parts2 = Split(wert2, ",")
If CLng(parts1(0)) > CLng(parts2(0)) Then
VergleicheNachspielzeit = wert1
ElseIf CLng(parts1(0)) CLng(parts2(0)) Then
VergleicheNachspielzeit = wert2
Else
If UBound(parts1) > 0 And UBound(parts2) > 0 Then
If CLng(parts1(1)) > CLng(parts2(1)) Then
VergleicheNachspielzeit = wert1
Else
VergleicheNachspielzeit = wert2
End If
ElseIf UBound(parts1) > 0 Then
VergleicheNachspielzeit = wert1
Else
VergleicheNachspielzeit = wert2
End If
End If
End Function
Sub chronologie3333()
Dim ENDE_1 As Long
Dim i As Long
Dim wert1 As String
Dim wert2 As String
Dim ergebnis As String
ENDE_1 = Sheets("Liga").Cells(Rows.Count, 13).End(xlUp).row
With Worksheets("Liga")
' Schleife durch die Zeilen von AL11 bis AM und setzt die Formel für jede Zeile individuell
For i = 11 To ENDE_1
wert1 = .Cells(i, "AL").Value
wert2 = .Cells(i, "AM").Value
' Vergleich der beiden Werte unter Verwendung der UDF
ergebnis = VergleicheNachspielzeit(wert1, wert2)
.Cells(i, "AN").Value = ergebnis
Next i
End With
' Formatierung auf "General" setzen
Sheets("Liga").Range("AN11:AN" & ENDE_1).NumberFormat = "General"
End Sub
Diese Funktion nimmt zwei Strings (wert1 und wert2) als Eingabe, die jeweils eine Nachspielzeit enthalten, z. B. "9,10" und "9,3".
Die diese Funktion teilt jede Nachspielzeit in den Ganzzahlteil (9 in "9,10") und den Dezimalteil (10 in "9,10") auf.
Zuerst vergleicht sie die Ganzzahlen. Wenn die Ganzzahl von wert1 größer ist, gibt sie wert1 zurück; wenn wert2 größer ist, wirft sie wert2 zurück.
Wenn die Ganzzahlen gleich sind, vergleicht sie die Dezimalteile, zudem prüft die Funktion, ob einer der Werte leer ist, und behandelt diese Situation entsprechend.
Letztens gibt die Funktion die größere der beiden Nachspielzeiten im ursprünglichen Format zurück.
Diese Funktion ist also speziell darauf ausgelegt, Nachspielzeiten richtig zu vergleichen, ohne sie in mathematische Ausdrücke umzuwandeln oder sie als Dezimalzahlen zu interpretieren.
Es werden "alle möglichen" Zellszenarien berücksichtigt und sollte somit immer das korrekte Ergebnis zurück geben.
Nochmals vielen Dank für deine Denkanstoß und den Code-Ansatz
nun hoffe ich mal weiter, das die Jungs von Vodafone "meine Rückwegstörung" endlich orten und den chinesischen Staubsauger ausschalten :-)
Gruss
Fred