Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

makro - falsches Ergeb wenn Zahl mit 2 Dezimalstellen (Text)

Forumthread: makro - falsches Ergeb wenn Zahl mit 2 Dezimalstellen (Text)

makro - falsches Ergeb wenn Zahl mit 2 Dezimalstellen (Text)
31.08.2024 12:33:07
Fred
Hallo Excel Experten,
ich habe ein Makro das anscheinend falsch ausgibt:
Sub chronologie3()


Dim ENDE_1 As Long
ENDE_1 = Sheets("Liga").Cells(Rows.Count, 13).End(xlUp).row

With Worksheets("Liga")



.Range("AN11").FormulaLocal = "=WENN(WERT(tab_Liga[@[last Tor Heim]]) > WERT(tab_Liga[@[last Tor Gast]]); WERT(tab_Liga[@[last Tor Heim]]); WERT(tab_Liga[@[last Tor Gast]]))"

' Zellen als Text formatieren, um Datum-Interpretation zu vermeiden
.Range("AN11:AN" & ENDE_1).NumberFormat = "@"


.Range("AN11:AN" & ENDE_1).Value = .Range("AN11:AN" & ENDE_1).Value
End With

' Format wieder zurück auf "General"
Sheets("Liga").Range("AN11:AN" & ENDE_1).NumberFormat = "General"

End Sub


Der Fehler tritt anscheinend auf, wenn in "last Tor Heim" oder "last Tor Gast" eine Zahl (Text) mit 2 Dezimalstellen steht.
Kann ein Experte bitte mal drauf schaun und mir eine Lösung anbieten
https://www.herber.de/bbs/user/171902.xlsb
Gruss
Fred





Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: makro - falsches Ergeb wenn Zahl mit 2 Dezimalstellen (Text)
31.08.2024 13:13:42
JoWE
Hallo Fred,
Du könntest alle Werte im Bereich "AI11:AN" & ENDE_1" einfach nochmal mit 1 multiplizieren.
Also z.B. so:
    For Each e In Sheets("Liga").Range("AI11:AN" & ENDE_1)

e.Value = e.Value * 1
Next

Gruß
Jochen
Anzeige
AW: makro - falsches Ergeb wenn Zahl mit 2 Dezimalstellen (Text)
31.08.2024 16:05:34
Daniel
Hi Fred
du schreibst "anscheinend falsch"
da solltest du aber etwas mehr Arbeit einstecken und erstmal selber folgende Fragen klären:
- worin macht sich der Fehler bemerkbar? Gibt es eine Fehlermeldung, wenn ja, welche?
- wenn es keine Fehlermeldung gibt, woran bemerkst du den Fehler? Ist es ein falsches Ergebnis? Wie sieht das falsche Ergebnis aus und wie sollte das richtige Ergebnis aussehen?
- Tritt der Fehler immer auf oder nur manchmal?
Wenn der Fehler nur manchmal auftritt, in welchen Fällen tritt er auf?
einiges hast du ja beantwortet, aber nicht alles
interessant wäre auch: um was geht es, was sind das für daten ?
das in alles Informationen, die du auswendig kennst und nur hinschreiben müsstest, wir müssen die aber mühselig ermitteln, was zeit kostet.
Wäre kein Problem, wenn ich dir dafür eine Stunde mehr in Rechnung stellen könnte, aber da du ja die Hilfe kostenlos haben möchtest, solltest du uns das Leben so einfach wie möglich machen und mit Informationen zur Aufgabe und zum Fehler nicht knausern.

nun, die sache ist einfach:
das ganze soll ja die Spielminute darstellen, in der das Tor gefallen ist.
Dabei wird bei einer nachspielzeit von 7 Minuten nicht die 97 hingeschrieben, sondern 90,7 und bei 10 Minuten dann 90,10.
dh sobald des über die 9. Minute hinaus geht funktioniert dein Ansatz nicht mehr, weil 90,7 größer ist als 90,1

du müsstest für den Vergleich den Wert nach dem Komma abtrennen, beides in eine Zahl umwandeln und dann addieren, so das aus 90,3 dann 93 und aus 90,10 dann 100 wird. Das wird in der Formel recht aufwendig.


probierst mal so:
1. füge dem Code diese Funktion hinzu
Public Function Nachspielzeit(txt As String) As Double

txt = Replace(txt, ",", "+")
Nachspielzeit = Evaluate(txt)
End Function


2. ersetze in deiner Vergleichsformel "=WENN(WERT(tab_Liga[@[last Tor Heim]]) > WERT(tab_Liga[@[last Tor Gast]]); WERT(tab_Liga[@[last Tor Heim]]); WERT(tab_Liga[@[last Tor Gast]]))"
dann die Funktion WERT durch die neue Funktion Nachspielzeit.

Gruß Daniel
Anzeige
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




Anzeige
AW: makro - falsches Ergeb wenn Zahl mit 2 Dezimalstellen (Text)
31.08.2024 22:58:40
daniel
Freut mich ,dass du dich selber bemüht hast,eine Lösung zu finden.

Du siehst, wenn man bei einem Fehler nicht gleich aufgibt, sondern mit den richtigen Fragen systematisch den Fehler analysiert, findet man häufig auch selbst sie Lösung, ohne das man einen "Experten" zu Rate ziehen muss.
AW: makro - falsches Ergeb wenn Zahl mit 2 Dezimalstellen (Text)
31.08.2024 13:58:13
Fred
Hallo Jochen,
danke für deine Aufmerksamkeit!
Aber leider bringt dieser Zusatz auch nicht das richtige Ergebnis.
Zudem habe ich seit 3 Tagen eine "Rückwegstörung" bei meinen Vodafoneanschluss,- ich flippe langsam aus; alle paar Minuten bin ich off und dann (irgendwann nach vieleicht 10-15 Minuten) wieder on
manmanmann

Gruss
Fred
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige