Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1876to1880
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

Dezimaltrennzeichen und Laufzeitfehler

Dezimaltrennzeichen und Laufzeitfehler
09.04.2022 12:06:08
sab
Hallo allerseits
Ich stehe hier gerade an einem Problem an und komme einfach nicht weiter. Vielleicht hat jemand von euch eine Idee, was ich tun könnte.
Vorweg: Ich arbeite mit Office 365, aber funktionieren sollte das Ganze nachher auch mit anderen Excel-Versionen (daher habe ich die Version oben auch nicht angegeben).
Das Problem:
Aus einer Tabelle lese ich Werte in ein UserForm (in Textfelder), wo sie einerseits bearbeitet werden können, andererseits wird auch noch ein Mittelwert berechnet.
Nun renne ich fortlaufend in einen Typenfehler, sobald die Werte Dezimalzahlen sind (möglich sind Werte 0, positive Ganzzahlen und Dezimalzahlen).
Wenn ich mit Debug.Print schaue, was da eigentlich passiert, dann stelle ich fest, dass im Textfeld die Dezimalwerte immer mit , gespeichert werden. In der Tabelle ist es - meiner Systemsprache entsprechend - ein . Allerdings hilft es auch nicht, wenn ich im System z.B. auf Englisch umstelle und die Datei dann neu öffne.
Ich mache mal ein Beispiel => Ich lese Werte ein mit

Dim tabellenwerte As Variant
Dim i As Integer
tabellenwerte = ActiveSheet.Range("auszulesenderBereich").Value
For i = 1 To 12
Controls("textfeldA" & i).Value = tabellenwerte(i, 1)
Controls("textfeldB" & i).Value = tabellenwerte(i, 2)
Controls("textfeldC" & i).Value = tabellenwerte(i, 3)
Controls("textfeldD" & i).Value = tabellenwerte(i, 4)
Controls("textfeldE" & i).Value = tabellenwerte(i, 5)
Next
Das funktioniert noch, wobei Debug.Print folgendes ausgibt:

Debug.Print "Wert im Formular: " & Controls("textfeldA" & i).Value & " | Tabellenwert: " & tabellenwerte(i, 1)
=> Wert im Formular: 25,5 | Tabellenwert: 25.5 (hier sieht man das Problem mit , und .
Im nächsten Schritt möchte ich mit den Werten rechnen und hier kommt dann der Laufzeitfehler:

Dim j As Integer
For j = 1 To 12
Controls("berechnungsfeld" & j).Value = ( _
Controls("textfeldA" & j).Value + _
Controls("textfeldB" & j).Value + _
Controls("textfeldC" & j).Value + _
Controls("textfeldD" & j).Value + _
Controls("textfeldE" & j).Value ) / 5
Next i
Das resultiert in:

Laufzeitfehler '13':
Typen unverträglich
Sind es nur Integer-Werte tritt das Problem nicht auf. Gestern Nacht war der Fehler auch irgendwann mal weg und ich dachte, ich hätte das Problem gelöst. Aber als ich mich heute morgen daran setzen wollte, dass dem Anwender nur zwei Kommastellen angezeigt werden (diese aber nicht weggerundet werden sollen) und kein Dezimaltrennzeichen, falls es eine ganze Zahl ist, trat der Fehler plötzlich wieder auf. Aber vielleicht war ich gestern auch einfach zu müde und hab falsch getestet.
Experimentiert habe ich mit allem möglichen, unter anderem CDbl() an diversen Stellen und ich habe sogar überlegt, ob man vielleicht einfach das , durch einen . ersetzen könnte - aber ich bin mir nicht sicher wo am sinnvollsten und denke, dass es da doch eigentlich eine bessere Lösung geben müsste. Das Thema müsste doch häufiger vorkommen, oder?
Hat vielleicht jemand einen Hinweis oder eine Idee? Ich bin gerade etwas verzweifelt.
Lieben Dank schon mal :)
P.S.: Die Datei kann ich leider nicht so einfach hochladen. Aber falls es gar nicht anders geht, könnte ich noch versuchen eine Art Demo-Datei zu basteln und den Fehler da zu reproduzieren. Aber vielleicht ist es ja ein einfaches Problem und es reichen ein paar Tips.

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

Betreff
Datum
Anwender
Anzeige
DecimalSeparator
09.04.2022 12:45:54
{Boris}
Hi,
schau Dir in der Hilfe mal die Application.DecimalSeparator-Eigenschaft an.
VG, Boris
AW: DecimalSeparator
09.04.2022 13:09:03
GerdL
Moin,
schon mal so probiert?

For j = 1 To 12
Controls("berechnungsfeld" & j).Value = _
(Replace(Controls("textfeldA" & j).Value, ",", ".") + _
Replace(Controls("textfeldB" & j).Value, ",", ".") + _
Replace(Controls("textfeldC" & j).Value, ",", ".") + _
Replace(Controls("textfeldD" & j).Value, ",", ".") + _
Replace(Controls("textfeldE" & j).Value, ",", ".")) / 5
Next i
Gruß Gerd
AW: DecimalSeparator
09.04.2022 13:20:21
sab
Hallo Gerd
Vielen Dank für Deine Antwort.
Wie in meiner Antwort an Boris ersichtlich - ja, das habe ich probiert als möglichen "Workaround" - allerdings direkt beim Einfüllen in die Textfelder, nicht erst bei der Berechnung. Tatsächlich funktioniert das auch, aber mich verwirrt das Verhalten von VBA dennoch und ich frage mich, ob das die beste Lösungsvariante ist.
Wenn sich gar keine besseren Ideen bzw. Hinweise auf eine etablierte "best practise" finden, dann werde ich es wohl so machen bzw. die Variante mit der Formatierung des Wertes nutzen (siehe ebenfalls meine andere Antwort). Aber vielleicht findet sich ja auch noch die Ursache für das eigenartige Verhalten von VBA und ich kann direkt dort ansetzen, statt Symptombekämpfung zu betreiben.
Jedenfalls ganz lieben Dank für Deinen Input.
LG, sab
Anzeige
AW: DecimalSeparator
09.04.2022 13:16:30
sab
Hi Boris,
Vielen Dank für deine Antwort.
Ich habe tatsächlich gestern schon einmal diesen Wert in die Konsole ausgeben lassen.

Debug.Print Application.DecimalSeparator
Gibt mir einen . aus (was ja auch korrekt ist).
Die Frage ist also, warum beim Einfüllen in das Textfeld dann plötzlich ein , daraus wird? Findet man irgendwie raus, warum das passiert? Und gibt es vielleicht irgendwo eine Einstellung/ein Flag, der das verhindert bzw. müsste man beim Einfüllen der Werte etwas spezielles beachten? Also die Frage ist im Prinzip: warum macht VBA bei einem Double aus dem . ein , wenn es damit dann ja gar nicht rechnen kann?
Ich habe mir schon auch ein paar Lösungsideen ausgedacht, aber irgendwie gefallen sie mir alle nicht so sonderlich:
1) Ich nutze Application.DecimalSeperator, um den Seperator temporär auf , zu ändern - nach der Berechnung ändere ich ihn wieder zurück. Dann muss ich nur sicherstellen, dass in der Tabelle dann auch wieder gültige Werte landen.
2) Ich sorge beim Einfüllen der Werte dafür, dass die irgendwo entstehenden , wieder durch Punkte ersetzt werden
Variante a: Ich mache erst einen String aus dem Wert und ersetze darin dann das ,

Controls("textfeldA" & i).Value = Replace(CStr(tabellenwerte(i, 1)), ",", ".")
Variante b: Ich formatiere grad auf zwei Kommastellen, sofern es ein Double-Wert ist, Int ist ja eh kein Problem

Controls("textfeldA" & i).Value = IIf(Int(tabellenwerte(i, 1)) = tabellenwerte(i, 1), tabellenwerte(i, 1), Format(tabellenwerte(i, 1), "##0.00"))
3) Das habe ich noch nicht probiert, aber ich könnte evtl. für die Berechnung auch die Werte aus dem Array verwenden, statt jene aus den Controls und müsste dann bei Benutzereingaben halt jeweils sicherstellen, dass die , aus den Textfeldern wieder zu . werden, bevor ich damit rechne oder sie zurück in die Tabelle schreibe?
Es ist halt jetzt die Frage, was die performanteste/eleganteste Variante ist? Gibt es für das Problem ein "best practise"? Mache ich vielleicht auch irgendwo ganz konkret einen Fehler und das Problem würde gar nicht mehr auftreten, wenn ich diesen beseitige?
Würde mich freuen, wenn du oder ein anderes Forenmitglied evtl. noch eine Idee dazu hätte.
LG, sab
Anzeige
Hatte eine Idee (Danke Gerd und Boris)
09.04.2022 13:45:43
sab
Ihr Lieben
Jetzt hatte ich doch noch eine weitere Idee:
Statt, dass ich die Werte mit der .Value Property zuweise, verwende ich die Property .Text => so wird nix umgewandelt und der . bleibt ein . und kann entsprechend weiter verwendet werden.

Controls("textfeldA" & i).Text = tabellenwerte(i, 1)
Bis jetzt scheint es zu funktionieren und ich würde das Problem damit als gelöst betrachten.
Falls euch noch etwas einfällt, was dagegen spricht oder falls es eine noch bessere Variante gibt, freue ich mich natürlich trotzdem über Antworten, die mir helfen dazu zu lernen.
Liebe Grüsse, sab
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige