MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Excel
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 13.07.2018, 10:31   #1
SteffenSchedy
Neuer Benutzer
Neuer Benutzer
Standard VBA - Problem mit DecimalSeperator

Grüßt euch,

ich habe (hier in Deutschland mit deutschen Regionaleinstellungen) ein Tool in Excel / VBA geschrieben, das mittlerweile auch von Kollegen in Japan und Indien eingesetzt wird. Hierbei kommt es zu Problemen.

Die Multiplikation 96*37,7952xxxx (genauer Wert ist egal) ergibt einen WErt >>33000 und ist somit zu groß für eine Integer --> overflow Fehler. Schlimmer natürlich ist noch, dass das Ergebnis selbst natürlich falsch ist.
Ich habe versucht das Problem zu lösen, indem ich die Application.DecimalSeperator und Application.ThousandsSeperator beim Start des Tools auf die deutschen Standards (Dec.: "," Thousands: ".") setze. Der Fehler tritt dennoch auf.





Hat einer von euch das Problem schon einmal gehabt und einen Lösungsvorschlag?
Da das Tool wie gesagt quasi rund um die Welt zum Einsatz kommen soll, wäre eine Lösung, die aus VBA gesteuert werden kann, notwendig.

Dankeschön im Voraus und Grüße
Steffen


Edit: Da ist eigentlich ein Screenshot eingebettet, der (zumindest bei mir) aber nicht angezeigt wird
URL zum Bild: https://picload.org/view/dlrigrai/overflow.png.html
SteffenSchedy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.07.2018, 10:33   #2
Hajo_Zi
MOF Guru
MOF Guru
Standard

Hallo Steffen,

stelle nichts um
msgbox 96*37.7952

GrußformelHomepage

__________________

Signatur in jedem Beitrag
m Forum kann der Beitrag als erledigt markiert werden. Also mache es unten links mit Klick auf den Schalter "als erledigt setzen", falls Problem gelöst.
Der Zustand des Beitrages wird dann in der Übersicht angezeigt und man braucht sich diese Beiträge nicht mehr ansehen.
Bitte Version angeben. Bei keiner Angabe gehe ich von meinen Angaben aus.
Betriebssystem: Windows 10 - 64 Bit, Office 2016 - 32 Bit.
Hajo_Zi ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.07.2018, 10:54   #3
SteffenSchedy
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hi Hajo,

vielen Dank für die schnelle Antwort!
Ich weiß allerdings nicht wie mir diese weiterhilft. Es geht natürlich nicht nur um diese Multiplikation, das ist einfach nur die erste im Code beim Öffnen des Tools, bei der der Fehler auftritt. Ich denke der Fehler ist genereller Natur und wird bei jeder weiteren Multiplikation mit Komma-Werten vorkommen.

Die Werte stehen in einem (versteckten) Sheet und entsprechen den Werten, die ein User über eine GUI festgelegt hat. Das Sheet dient als Speicher, damit beim nächsten Tool-Start die eingegebenen Werte wieder geladen und die GUI entsprechend befüllt werden kann.

Eingegeben hat offensichtlich jemand die Werte mit Komma als Seperator, was hier bei mir / den Kollegen in Deutschland wunderbar funktioniert. In Gegenden, in denen der Punkt als Seperator der Standard ist, offenbar nicht.

Grüße
SteffenSchedy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.07.2018, 10:57   #4
Hajo_Zi
MOF Guru
MOF Guru
Standard

Gut dann Frage jemand der neben Dir sitzt, der sieht das Toll und den kannst Du den Fehler erklären.
Viel Erfolg noch.
Ich bin raus, da ich nicht auf fremde Rechner schaue.

Gruß Hajo

__________________

Signatur in jedem Beitrag
m Forum kann der Beitrag als erledigt markiert werden. Also mache es unten links mit Klick auf den Schalter "als erledigt setzen", falls Problem gelöst.
Der Zustand des Beitrages wird dann in der Übersicht angezeigt und man braucht sich diese Beiträge nicht mehr ansehen.
Bitte Version angeben. Bei keiner Angabe gehe ich von meinen Angaben aus.
Betriebssystem: Windows 10 - 64 Bit, Office 2016 - 32 Bit.
Hajo_Zi ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.07.2018, 14:51   #5
Scorefun
MOF Meister
MOF Meister
Standard

Vielleicht solltest Du mal etwas konkreter werden...

Zitat:

96*37,7952xxxx

Welche Zahl wäre die richtige, und wie sieht die Zahl in Indien aus?

37,7952 in DE ?

37.7952 in IN ?

__________________

Gruss Ralf
======================================
Bitte keine PN Anfragen - Hilfe erfolgt nur im Forum!
======================================
Vorsicht Beim Ausprobieren...
Auch Chaotischer Code Entwickelt Sich Ständig
1) Intel I5-2500K, 4x3,3 Ghz, 8GB RAM, Asus P8P67, 250GB SSD Toshiba Q-Pro, 1,5TB HD, MSI GTX550TI, Win7-Prof 64-bit SP1, Office 2010 Plus SP1
2) Asus Zenbook Flip UX360UAK-C4203T, 13,3 Zoll, i5-7200U, 2,5 Ghz, 8GB RAM, 256GB SSD, Win10 Home 64-bit, Office 2016 Plus
Scorefun ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.07.2018, 17:25   #6
SteffenSchedy
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Guten Abend,

zunächst mal sorry, ich hab mich als ich den ersten Post gemacht habe mit den Zahlen vertan. Die Zahlen, die Multipliziert werden, sind 37,79527... und 8,75. Diese sind bei mir und bei den Kollegen identisch. Die erste (sehr "krumme") Zahl ist im Screenshot im Lokalfenster ersichtlich. Ich erwarte entsprechend ein Ergebnis von 330,7 (gerundet).

Nun wird das Komma in der 37,79... bei den Kollegen - obwohl wie im Screenshot auch zu sehen ist der Seperator auf Komma steht - offenbar nach wie vor als Tausendertrennzeichen interpretiert und das Ergebnis ergibt eben einige viele Zehnerpotenzen mehr, abhängig von der Anzahl der Nachkommastellen.

Wie gesagt, das Problem scheint mir prinzipieller Natur zu sein und nicht mit den Zahlen zusammenzuhängen, in Verbindung mit diesen Zahlen / an dieser Stelle des Codes tritt es einfach nur das erste mal auf.
Meine Hoffnung ist, dass einer von euch deutlich besser versteht, wie Excel / VBA im Hintergrund arbeitet und wieso in diesem Fall die Anpassung des Seperators nicht den gewünschten Effekt hat.

Grüße und n schönes Wochenende
STeffen
SteffenSchedy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.07.2018, 17:31   #7
RPP63neu
MOF Meister
MOF Meister
Standard

Moin!
Ist mir alles zu unscharf!
Geht es um .Values von Zellen?
Dann ist egal, wie der lokale DecimalSeparator lautet.
Anders sieht es natürlich aus, wenn Du "Textzahlen" wie "1,234" verarbeitest.
Gibt mal ein konkretes Beispiel mit einer Datei, wenig Inhalt und wenig aber relevantem Code.

Gruß Ralf

__________________

Meine Logik war nicht fehlerhaft, nur meine Interpretation!
Tuvok
RPP63neu ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.07.2018, 08:16   #8
SteffenSchedy
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Guten Morgen,

Code:

Option Explicit
 Private Const LOGPIXELSX As Long = 88
 #If Win64 Then
    Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As Long, ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
    Declare PtrSafe Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hdc As Long) As Long
 #Else
    Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As Long, ByVal nIndex As Long) As Long
    Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
    Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hdc As Long) As Long
 #End If

Public Function GetDpi() As Long
    Dim hdcScreen As Long
    Dim iDPI As Long
    iDPI = -1
    hdcScreen = GetDC(0)
    If (hdcScreen) Then
        iDPI = GetDeviceCaps(hdcScreen, LOGPIXELSX)
        ReleaseDC 0, hdcScreen
    End If
    GetDpi = iDPI
End Function

Sub setFrmMainValue()
    Dim txtBoxVal As Variant
    'txtBoxVal = textbox_xyz.value
    txtBoxVal = "8,75"
    If IsNumeric(txtBoxVal) Then
        ThisWorkbook.Sheets(1).Cells(2, 2).value = CDbl(txtBoxVal)
        ThisWorkbook.Sheets(1).Cells(2, 2).NumberFormat = "0.00"
    Else
        ThisWorkbook.Sheets(1).Cells(2, 2).value = txtBoxVal
    End If
End Sub

Function getFrmMainValue() As Variant
    'über übergaben normalerweise ermittlung der Spalte / Zeile
    getFrmMainValue = ThisWorkbook.Sheets(1).Cells(2, 2).value
End Function

Sub schmeissDenFehler()
    Dim pointsPerInch As Integer
    Dim pointsPerCm As Double
    Dim squareChartHeight As Double
    Dim squareChartHeight_scaled As Integer
    Dim oldDecSep As String
    Dim oldThouSep As String
    Dim oldUseSysSep As Boolean
    
    
    'Speichern und Anpassen der Länderspezifischen SepArators
    With Application
        oldDecSep = .DecimalSeparator
        oldThouSep = .ThousandsSeparator
        oldUseSysSep = .UseSystemSeparators
        .DecimalSeparator = ","
        .ThousandsSeparator = "."
        .UseSystemSeparators = False
    End With
    
    'Diese Funktion würde ausgeführt werden, wenn ein User einen Wert in der GUI einträgt
    Call setFrmMainValue

    pointsPerInch = GetDpi()
    squareChartHeight = getFrmMainValue()
    pointsPerCm = pointsPerInch / 2.54
     
    '*****************
    '  erwarteter Wert: 413,3858 --> da Integer gerundet auf 413
    ' hier geschieht der Fehler
    '****************
    squareChartHeight_scaled = squareChartHeight * pointsPerCm
    Debug.Print squareChartHeight_scaled
    'Zurücksetzen der Länderspezifischen SepArators
    With Application
        .DecimalSeparator = oldDecSep
        .ThousandsSeparator = oldThouSep
        .UseSystemSeparators = oldUseSysSep
    End With
End Sub
Das ist aus meiner Sicht der relevante Code. Prinzipielle Schritte in Verbindung mit dem Tool


1. User gibt Wert in GUI ein --> setFrmMainValue wird aufgerufen
2. Tool wird ausgeführt --> Funktion "schmeissDenFehler" wird ausgeführt
2.a Speichern und Anpassen der Separators
2.b Ermitteln von Eigenschaften des Bildschirms
2.c lesen des eingegebenen Werts über "getFrmMainValue"
2.d Berechnung einer Bildgröße in Points --> Hier passiert der Fehler

wie ihr seht wird, wenn in der Textbox ein numerischer Wert eingegeben wird, die entsprechende Zelle über NumberFormat als Zahl formatiert und der Wert nicht als Text gespeichert.

Sind aus eurer Sicht jetzt noch weitere Informationen notwendig?

Grüße
STeffen
SteffenSchedy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.07.2018, 08:28   #9
Mc Santa
MOF Meister
MOF Meister
Standard

Ohne Datei kann ich den Code nicht testen.

Ich denke, dass der Fehler beim Auslesen hier entsteht:
Code:

Function getFrmMainValue() As Variant
denn es ist die einzige Stelle, bei welcher der Typ der Variable nicht kontroliiert wird, es kann hier Double oder Integer übergeben werden.

__________________

Nützliches
Wie erstelle ich eine Pivot-Tabelle? (Link)
Alternative (Link ohne YouTube)

Du kannst hilfreiche Beiträge bewerten (Symbol unten links)
Mc Santa ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.07.2018, 08:38   #10
RPP63neu
MOF Meister
MOF Meister
Standard

Moin auch von mir!
Es wäre ganz sinnvoll gewesen, wenn Du gleich geschrieben hättest, dass es sich um Textboxes handelt!
Entsprechend war auch meine diesbezügliche Nachfrage gemeint.
Wenn in einer Textbox der lokal gültige Separator eingegeben wird, dürfte es zu keinen Problemen kommen.

Obwohl VBA englische Trennzeichen erwartet, funktioniert in Deutschland folgendes im Direktfenster:
Code:

?IsNumeric("1.234,56")
Wahr
?CDbl("1.234,56")
 1234,56
Wenn ich hingegen den String mit den "falschen" Separatoren übergebe, verschluckt sich VBA:
Code:

?CDbl("1,234.56")
 1,23456
Gruß Ralf

__________________

Meine Logik war nicht fehlerhaft, nur meine Interpretation!
Tuvok

Geändert von RPP63neu (16.07.2018 um 08:41 Uhr).
RPP63neu ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.07.2018, 08:52   #11
EarlFred
MOF Guru
MOF Guru
Standard

Hallo STeffen,

tatsächlich kann ich den Fehler nicht nachstellen.
Ich würde aber davon abstehen, die Dezimaltrenner beim Anwender zu ändern und stattdessen die Eingabe programmintern auszuwerten, nachdem ein definierter Zustand hergestellt wurde.

Das sollte hiermit gehen:
Code:

        ThisWorkbook.Sheets(1).Cells(2, 2).Value = Val(Replace(txtBoxVal, Application.DecimalSeparator, "."))
Es ist damit egal, ob der Anwender die Zahl landestypisch als "8,75" oder "8.75" einträgt. Erst wenn Du Werte > 999 erwartest und der Nutzer Tausendertrennzeichen eingeben könnte, wird es nochmals spannend.

Dein Code ergibt bei mir das erwartete Ergebnis 331.

Grüße
EarlFred

__________________

Datum und Uhrzeit, Makrorekorder-Code entschlacken, {Matrixformeln}
Tutorials zu Pivottabellen: Kurzeinstieg; Dynamischer Datenbereich; Daten und Zeiten gruppieren
Für 6 meiner Beiträge haben sich die Hilfesuchenden mit einer Spende an Wikipedia, die Tafeln oder Hilfe für krebskranke Kinder eV bedankt (das entspricht 0,044% per 26.07.2018) - eine tolle Geste!

Geändert von EarlFred (16.07.2018 um 08:54 Uhr).
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.07.2018, 12:30   #12
SteffenSchedy
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo zusammen,

vielen Dank zunächst an jeden mit einem Lösungsvorschlag!

@EarlFred:
Deine Version sieht äußerst vielversprechend aus! ich habe sie wie folgt bei mir integriert (achtung, böser nicht lauffähiger Codeschnippsel)

Code:

If IsNumeric(value) Then
            value = Replace(value, Application.ThousandsSeparator, "")
            value = Replace(value, Application.DecimalSeparator, ".")
            .Cells(rowIdxThisProp, colIdxVal).value = value
            .Cells(rowIdxThisProp, colIdxVal).NumberFormat = "0.00"
        Else
            .Cells(rowIdxThisProp, colIdxVal).value = value
        End If
Die Tausender-Separators sollten also kein Problem darstellen.
Interessant finde ich, dass Excel beim Umstellen des DecimalSeparators die entsprechenden Felder automatisch anpasst. Steht z.B. 8,75 in einer Zelle und man stellt den Separator auf Punkt um, wird der Zelleninhalt automatisch zu 8.75.

Vielen Dank wie gesagt! Ich bin gespannt auf die Rückmeldung der Kollegen

Grüße
Steffen
SteffenSchedy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.07.2018, 12:43   #13
EarlFred
MOF Guru
MOF Guru
Standard

Hallo Steffen,

Zitat:

Interessant finde ich, dass Excel beim Umstellen des DecimalSeparators die entsprechenden Felder automatisch anpasst.

das ist eigentlich nicht allzu kompliziert:
Wenn Excel eine Zahl einmal als Zahl erkannt hat, ist das Dezimaltrennzeichen nur noch eine Darstellungsangelegenheit.
Genauso, wie Du hiermit die DARSTELLUNG der Zahl änderst, aber nicht die Zahl selbst:
Code:

...NumberFormat = "0.00"
Spannend wird es bei der Frage, wann und wie Excel versucht, eine Eingabe / Textboxinhalt als Zahl zu interpretieren. Von selbst wird Excel einen Textboxinhalt nicht als Zahl verstehen, anders als bei der Eingabe in eine Excelzelle, wo entsprechende Interpretationsversuche direkt nach der Eingabe ablaufen.

Grüße
EarlFred

__________________

Datum und Uhrzeit, Makrorekorder-Code entschlacken, {Matrixformeln}
Tutorials zu Pivottabellen: Kurzeinstieg; Dynamischer Datenbereich; Daten und Zeiten gruppieren
Für 6 meiner Beiträge haben sich die Hilfesuchenden mit einer Spende an Wikipedia, die Tafeln oder Hilfe für krebskranke Kinder eV bedankt (das entspricht 0,044% per 26.07.2018) - eine tolle Geste!
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.07.2018, 17:26   #14
RPP63neu
MOF Meister
MOF Meister
Standard

So, jetzt habt ihr es geschafft!
Ich habe versucht, den Unterschied zwischen Excel und VBA zu erklären …
Das A in VBA steht für Applications, welches im Zweifel als Plural erkennbar ist, also auch z.B. den Publisher beinhaltet.
CDbl() ist eine Funktion von VBA, könnte also auch als VBA.CDbl("1.2345,67") geschrieben werden.

@Steffen:
Warum nimmst Du Userforms?
Excel als eine von vielen Applications nimmt Dir qua Design Arbeit ab …

Im Zweifel wäre Access sicherlich besser geeignet, kann man dort doch problemlos "richtige" Formulare designen.

Gruß Ralf

__________________

Meine Logik war nicht fehlerhaft, nur meine Interpretation!
Tuvok
RPP63neu ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 20.07.2018, 08:11   #15
SteffenSchedy
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Guten Morgen,

so, von mir nochmal ne Rückmeldung.
Zunächst mal - und das ist für mich mal das wichtigste - die Lösung tut genau das was sie soll! Also nochmal vielen Dank an alle die geholfen haben.

@Rpp: Naja, nennen wir es historisch gewachsen. Es war nie das Ziel in dem Projekt, Excel für die Analysen zu verwenden, es sollte eigentlich nur ne vorab-Spielwiese werden. Da sich ein paar andere Optionen verzögert haben, wurde aus der Spielwiese ein PRovisorium und aus dem Provisorium irgendwann das Tool, das es jetzt ist.

@EarlFred: Das gilt es offenbar zu vermeiden Ich habe gelernt, dass je nach Inhalt einer Zelle penibel genau auf die Formatierung zu achten ist. Die gleiche Schwierigkeit wie mit Komma und Punkt ergibt sich mit boolschen Operatoren. true / false und wahr / falsch werden nur automatisch dann richtig umgestellt und unabhängig der Region verstanden, wenn die Felder als General / Standard und nicht als Text oder oder oder formatiert sind.
SteffenSchedy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.