Rechnen mit Kommazahlen (aus TextBox)

Hallo! Hoffe einer der VB Experten kann mir bei meinem warscheinlich trivialen Problem helfen…

Public Winkelabstand As Double
Public Anzahl As Double

Winkelabstand = ComboBox1.Value
Anzahl = 360 / Winkelabstand
ComboBox2.Value = Anzahl

Bin kurz vorm verzweifeln, hab schon alles probiert, CDbl() hat auch nicht geholfen! Er rechnet bei z.B. 0,1 mit 1! Wenn ich Winkelabstand ausgeben lasse steht 0,1 drinn!! Kann doch nicht sein, dass man nicht mit Kommazahlen rechnen kann…

Danke schonmal und viele Grüße
Stefan

Hallo,

Kann doch nicht sein, dass man nicht mit Kommazahlen rechnen kann…

nein, ist ja auch nicht. :smile: Auch wenn Dir ein Komma als Dezimaltrenner ausgegeben wird, zum Rechnen übergib mal einen Dezimalpunkt.

Gruß Rainer
PS. Kann es sein, daß Du Dich im Brett geirrt hast, daß Du von VB2005/2008 redest?

Sorry, hab mich in einem Punkt geirrt und im zweiten nicht klar genug ausgedrückt :wink:

Also in der ComboBox steht keine Zahl 0,1 sonder 0.1, da diese aus einer vorherigen Rechnung stammt und in die Box geschrieben wird, das müsste also stimmen!

Winkelabstand = ComboBox1.Value
MsgBox (Winkelabstand)

Schon hier gibt er mir eine 1 wenn ich Public Winkelabstand As Double definiere.

Schreibe ich einfach nur Public Winkelabstand dann gibt er noch eine 0.1 aus, bei der Rechnung wandelt er die aber auch in ne 1 um…

Bin echt ratlos…

Hallo,

Bin echt ratlos…

bevor ich mein VB öffne, mir das problem im Editor mal ansehe und Dir Code poste, der funktioniert, musst Du mir nun doch erst mal sagen welches VB ich öffnen soll. Ich habe hier Excel VBA, VB6.0, VB 2005 und VB2008 Express. Die Codes sind unterschiedlich, deshalb würde ich schon gern das richtige Werkzeug verwenden. :smile:

Gruß Rainer

Hallo Fragewurm,

Also in der ComboBox steht keine Zahl 0,1 sonder 0.1, da diese
aus einer vorherigen Rechnung stammt und in die Box
geschrieben wird, das müsste also stimmen!

Winkelabstand = ComboBox1.Value
MsgBox (Winkelabstand)

Schon hier gibt er mir eine 1 wenn ich Public Winkelabstand As
Double definiere.

Schreibe ich einfach nur Public Winkelabstand dann gibt er
noch eine 0.1 aus, bei der Rechnung wandelt er die aber auch
in ne 1 um…

Bin echt ratlos…

Du machst einen typischen Anfängerfehler :smile:

  1. Du musst zwischen Zeichenkette (String) und Zahlen (Double) unterscheiden !

  2. BASIG hat zudem noch ein paar Unsauberkeiten. Wenn du
    Public Winkelabstand
    deklarierst, erhältst du eine Variable vom Typ Variant. Diese kann alle möglichen Typen annehmen. BASIC nimmt dann meist automatisch Konvertierungen zur Laufzeit vor.

  3. in ComboBox1.Value ist ein String abgelegt, da kannst du auch „1x.23“ reinschreiben, nur kann damit keiner Rechnen.
    Ich weiss jetzt nicht welche Konvertierungen dein BASIC automatisch vornimmt, geht in deinem Fall aber gründlich in die Hose ;-(
    Zumindest bei VB 6, besteht noch dass Problem, dass die Verwendung von „.“ oder „,“,als Dezimalpunkt von den Ländereinstellungen abhängt.

Mit
Winkelabstand = CDbl(ComboBox1.Value)
müsste es funktionieren oder einen Runtimefehler erzeugen, wenn der String keine gültige Zahl ist.

MfG Peter(TOO)

Hallo,

OK, ich hab’s herausgefunden, Du verwendest VBA. :smile:

Wenn das Excel-VBA ab Excel 2000 ist, funktioniert das:

Dim Anzahl As Double

Private Sub Command1\_Click()
 Anzahl = CDbl(Replace(ComboBox1.Value, ".", ","))
 MsgBox Anzahl
End Sub

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

Wenn Du ein VBA verwendest, das Replace() nicht kennt, musst Du entweder schon vorher dafür sorgen, daß da wirklich ein Komma steht, oder erst mit Instr() suchen und mit Mid() den Punkt durch ein Komma ersetzen.

Gruß Rainer

Also ich verwende VB6.0! Mit Winkelabstand = CDbl(ComboBox1.Value) habe ich es auch schon probiert, nur wandelt er dann die 0.1 in eine 1 um!

Mit Winkelabstand = ComboBox1.Value steckt er in Winkelabstand noch die 0.1 rein wandelt sie aber dann in der Rechnung in eine 1 um.

Ist es korrekt, dass ich Public Winkelabstand schreibe, wenn ich die Zeile Winkelabstand = CDbl(ComboBox1.Value) verwende, oder muss ich die Variable trotzdem als Double deklarieren?

Ups hab nur dem Peter geantwortet, also nochmal :wink: Verwende Visual Basic 6.0 Version 8714, welches bei meinen CAD Programm Catia dabei ist!

Danke euch schonmal echt cool dass sich jemand meinem Prob annimmt :smile:

Cool das ist die Lösung meines Problems, hab zwar das mit dem Replace noch nicht probiert, aber wenn ich in die ComboBox per Hand eine 0,1 reinschreibe funktioniert es! Da muss man erstmal drauf kommen, dass VBA mir eine 0.1 errechnet und bei weiteren Rechnungen nach einer 0,1 verlangt :wink:

Damit ist der Tag gerettet, Vielen Dank!! :smile:

Achso und ich verwende nicht Excel sondern Catia (CAD Konstruktion), da kann man mit VB einiges automatisieren…

So hab anscheinend die richtige Version erwischt, denn Replace funktioniert wunderbar :smile:

Damit ist das Problem komplett gelöst! Danke nochmal!

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

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]