Rechnen mit Kommazahlen (aus TextBox)

Hallo Rainer,

Nicht der Punkt, ein Komma muss übergeben werden. Hatte ich
verwechselt, aber das ist ja schnell geändert.

Das tolle an deine Lösung ist, dass sie bei mir wiederum NICHT funktioniert ;-(

Windows mit Länderwahl Schweiz. Da ist „.“ vorgegeben.

MfG Peter(TOO)

Hi Peter,

Nicht der Punkt, ein Komma muss übergeben werden. Hatte ich
verwechselt, aber das ist ja schnell geändert.

Das tolle an deine Lösung ist, dass sie bei mir wiederum NICHT
funktioniert ;-(

Windows mit Länderwahl Schweiz. Da ist „.“ vorgegeben.

das Problem scheint es öfter zu geben, ich bau mal eine Lösung, die immer funktioniert.

Gruß Rainer

OT Excel Vba Ländereinstellungen

Nicht der Punkt, ein Komma muss übergeben werden. Hatte ich
verwechselt, aber das ist ja schnell geändert.

Das tolle an deine Lösung ist, dass sie bei mir wiederum NICHT
funktioniert ;-(

Windows mit Länderwahl Schweiz. Da ist „.“ vorgegeben.

Hallo Peter,

wenn ich das in ExcelVba laufen lasse wird für alle drei 1031 angezeigt, was wird bei dir angezeigt?

Sub tt()
MsgBox "The following locale IDs are registered " & _
"for this application: Install Language - " & _
Application.LanguageSettings.LanguageID(msoLanguageIDInstall) & _
" User Interface Language - " & _
Application.LanguageSettings.LanguageID(msoLanguageIDUI) & _
" Help Language - " & _
Application.LanguageSettings.LanguageID(msoLanguageIDHelp)
End Sub

Gruß
Reinhard

Hallo Reinhard,

wenn ich das in ExcelVba laufen lasse wird für alle drei 1031
angezeigt, was wird bei dir angezeigt?

2055, 1031, 1031

Der Weg wird über die Abfrage der entsprechenden Einstellung gehen. Man kann auch bei einer Länderwahl „Deutschland“ bei den einzelnen Einstellungen auf Dezimaltrennzeichen „.“ umstellen.

MfG Peter(TOO)

Hallo Peter,

wenn ich das in ExcelVba laufen lasse wird für alle drei 1031
angezeigt, was wird bei dir angezeigt?

2055, 1031, 1031

Der Weg wird über die Abfrage der entsprechenden Einstellung
gehen.

? Wenn wir das Gleiche meinen ja, deshalb fragte ich ja nach, also die Abfrage ob da 1031, 1031, 1031 oder halt 2055, 1031, 1031 vorliegt.
Interessieren würde mich da was bei einem englischen oder französischen Excel rauskommt.

Man kann auch bei einer Länderwahl „Deutschland“ bei
den einzelnen Einstellungen auf Dezimaltrennzeichen „.“
umstellen.

Du meinst in der Systemsteuerung von Windows?, da bin ich grad unsicher, so wie ich das grad sehe, kann ich da als Sprache Deutsch(Schweiz) auswählen, erhalte wohl dann diese 2055 durch den Vba-Code, aber mir ist unklar was geschieht, wenn ich in den anderen Auswahlpunkten dann Punkt oder Komma nehme als Dezimaltrenner.

Irgendsowas wie
Msgbox Application.decimalseperator
wär mir irgendwie lieber als diese 2055/1031 zur Unterscheidung.

Irgendwie hänge ich gerade an dem Punkt, jmd. stellt sein Windows auf „Hongkong“ ein, dann liefert mein Code ja auch Zahlen, aber kriegt der Code mit wenn derjenige sich „.“ oder „,“ auswählt?

Ich hoffe ich konnte mich verständlich machen wo ich grad dran hänge.

Gruß
Reinhard

Hallo Peter!

Windows mit Länderwahl Schweiz. Da ist „.“ vorgegeben.

Verstehe ich das richtig, dass für Rechner mit Schweizer Ländereinstellung die VBA-Funktion CDbl nur folgende Strings verarbeitet?

Double = CDbl("123.04")

Und mit der Ländereinstellung Deutschland schaut es so aus?

Double = CDbl("123,04")

mfg
christoph

Hallo christoph,

Windows mit Länderwahl Schweiz. Da ist „.“ vorgegeben.

Verstehe ich das richtig, dass für Rechner mit Schweizer
Ländereinstellung die VBA-Funktion CDbl nur folgende Strings
verarbeitet?

Double = CDbl(„123.04“)

Und mit der Ländereinstellung Deutschland schaut es so
aus?

Double = CDbl(„123,04“)

Genau so ist es :frowning:
Gilt aber auch für andere Ländereinstellungen sinngemäss.

MfG Peter(TOO)

Hallo Reinhard,

Schau die mal
Application.DecimalSeparator
an.

MfG Peter(TOO)

Hallo Peter,

Schau die mal
Application.DecimalSeparator
an.

mein Excel97 mault, kennt das nicht.

Aber wenn das geht, dann ist

Zahl = Cdbl(Replace(Text, Chr(Asc(Application.DecimalSeparator) Xor 2), Application.DecimalSeparator))

die universelle Lösung, der es egal ist, ob ein Punkt oder Komma gefordert wird.

Den Weg über die API habe ich gefunden, aber noch nicht fertig getippt, der ist ein paar Zeilen länger. :smile:

Gruß Rainer

Wenn ich die Zeile versuche, schreibt er mir nur ein Object Required, scheint also nicht mit meinem VB6 zu funktionieren… Aber ne universelle Lösung wär natürlich Top :wink:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi, also ich hab nochmal ein wenig herumprobiert… Komischerweise, wenn ich bei den Regionalen Einstellungen meines Windows (XP Pro Deutsch) das Dezimaltrennzeichen auf „.“ stelle funktioniert es egal ob ich Punkt oder Komma verwende! Steht es auf „,“ will CDbl einen „,“-Wert… Komisch, oder?

Hallo,

Wenn ich die Zeile versuche, schreibt er mir nur ein Object
Required, scheint also nicht mit meinem VB6 zu funktionieren…
Aber ne universelle Lösung wär natürlich Top :wink:

ja, die kommt noch, ich war gestern Abend nur zu müde, um noch eine Zeile zu tippen und im Moment brennt hier die Luft. Ich habe noch für 10 Stunden Arbeit und noch fünf Stunden Zeit. :smile:

Das muss leider bis zum WE warten. Über die API (funktioniert außer in VBS immer) werden das ein paar Zeilen Code mehr.

Gruß Rainer

Hallo Peter!

Genau so ist es :frowning:
Gilt aber auch für andere Ländereinstellungen sinngemäss.

Na das ist ja ein ganz schöner Murks.
Schaut ganz nach Microsoft aus: „Gut gemeint, aber eigentlich unbrauchbar“

mfg
christoph

Hallo!

Dieses Thema hat mir seit gestern keine Ruhe gelassen. Folgende zwei Lösungsmöglichkeiten möchte ich auch noch präsentieren:

Überprüfen der CDbl-Funktion
Ist eine sehr unsaubere Methode. Würde ich nur, wenn wirklich nichts anders möglich, verwenden.

If CDbl(1.4) = 14 Then stWert = Replace(stWert, ".", ",")
dblWert = CDbl(stWert)

Verwenden der Val-Funktion
Eine Spur eleganter, da die Funktion Val() immer das amerikanische Dezimaltrennzeichen frisst, egal was im Betriebssystem eingestellt ist.

If InStr(stWert, ",") \> 0 Then stWert = Replace(stWert, ",", ".")
dblWert = Val(stWert)

mfg
christoph

1 Like

Hallo Christoph,

Dieses Thema hat mir seit gestern keine Ruhe gelassen.
Folgende zwei Lösungsmöglichkeiten möchte ich auch noch
präsentieren:

Überprüfen der CDbl-Funktion
Ist eine sehr unsaubere Methode. Würde ich nur, wenn wirklich
nichts anders möglich, verwenden.

If CDbl(1.4) = 14 Then stWert = Replace(stWert,
„.“, „,“)
dblWert = CDbl(stWert)

hmmm, geht … Aber ich gebe Dir Recht, behagt mir auch nicht so Recht.

Verwenden der Val-Funktion
Eine Spur eleganter, da die Funktion Val() immer das
amerikanische Dezimaltrennzeichen frisst,
egal was im Betriebssystem eingestellt ist.

If InStr(stWert, „,“) > 0 Then stWert =
Replace(stWert, „,“, „.“)
dblWert = Val(stWert)

Stimmt, das ist viel schöner. Da überlege ich doch, ob ich meine Lösung mit GetLocaleInfo() wirklich noch schreibe. Ein besseres Ergebnis bekomme ich damit auch nicht, nur ein paar Zeilen Code mehr.

Gruß Rainer

Hi Christoph,

If InStr(stWert, „,“) > 0 Then stWert = Replace(stWert, „,“, „.“)

wozu extra abfragen ob ein Komma drin ist?
dblWert = val(Replace(stWert, „,“, „.“))

LG Alex

Universallösung …
Hallo,

Wenn ich die Zeile versuche, schreibt er mir nur ein Object
Required, scheint also nicht mit meinem VB6 zu funktionieren…
Aber ne universelle Lösung wär natürlich Top :wink:

was ich vor hatte ist viel zu kompliziert und unnötig, ich lass es. :smile:

Sieh mal …

/t/rechnen-mit-kommazahlen-aus-textbox/4806258/26

Besser geht nicht.

Gruß Rainer

was ich vor hatte ist viel zu kompliziert und unnötig, ich
lass es. :smile:

Mist Mist Mist… hab ich das zu früh gepostet :wink:

LG Alex

Hi Alex,

was ich vor hatte ist viel zu kompliziert und unnötig, ich
lass es. :smile:

Mist Mist Mist… hab ich das zu früh gepostet :wink:

ja, wenn es denn noch interessiert …
Ich hab’s als Modul für VB6 gebaut, da ist das schön kompakt.

In der Form:

Option Explicit

Private Sub Command1\_Click()
 Label1.Caption = StrToDbl("12.34")
End Sub

Und das Modul:

Option Explicit

Private Declare Function GetSystemDefaultLCID Lib \_
 "kernel32" () As Long

Private Declare Function GetLocaleInfo Lib "kernel32" \_
 Alias "GetLocaleInfoA" (ByVal Locale As Long, \_
 ByVal LCType As Long, ByVal lpLCData As String, \_
 ByVal cchData As Long) As Long

Const LOCALE\_SDECIMAL = &HE

Public Function StrToDbl(ByVal Text As String) As Double
 Dim TZ As String
 Dim SZ As String
 TZ = GetEntry(LOCALE\_SDECIMAL)
 SZ = Chr(Asc(TZ) Xor 2)
 StrToDbl = CDbl(Replace(Text, SZ, TZ))
End Function

Private Function GetEntry(ID&amp:wink: As String
 Dim LCID&, Result&, Buffer$, Length&
 LCID = GetSystemDefaultLCID()
 Length = GetLocaleInfo(LCID, ID, Buffer, 0) - 1
 Buffer = Space(Length + 1)
 Result = GetLocaleInfo(LCID, ID, Buffer, Length)
 GetEntry = Left$(Buffer, Length)
End Function

Gruß Rainer

Hallo zusammen,

hier noch eine Version, bei der es völlig
egal ist, welches Trennzeichen als Komma
verwendet wird. Viel mir gerade ein, ist
zwar umständlich, dafür „schluckt“ sie
z.B. Eingaben wie
0,453435 1234#2323 .23 1273. 0ü123

LG Alex

Public Function fnStrToDbl(z As String) As Double
 Dim a, v, n As String
 Dim i As Integer

 v = z
 n = "0"
 For i = 1 To Len(z)
 a = Mid(z, i, 1)
 If a "9" Then
 v = "0" & Left(z, i - 1)
 n = Mid(z, i + 1) & "0"
 Exit For
 End If
 Next i

 fnStrToDbl = CDbl(CLng(v) + CLng(n) / 10 ^ Len(n))
End Function