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

Tausendertrennung

Tausendertrennung
Fettertiger
Hallo zusammen,
bin hier langsam am Verzweifeln, möglicherweise steckt mit derWM Schock noch zu sehr in den Knochen.
In meiner Variable vValue (als String dimensioniert) steht bspw. der Wert "1,092.00", den ich mir zuvor aus SAP ausgelesen habe. Die User verwenden verschiedene Dezimalsettings, die ich vorher durch
Range("A1").value=Application.DecimalSeparator
und
Range("A2").value= Application.ThousandsSeparator
ermittelt habe.
Die Zahl 1,092.00 würde also nach üblicher Schreibweise 1092,00 entsprechen. Da ich im Macro mit dieser Zahl rechnen muss, muss ich also irgendwie das Komma wegbekomen. Ich habe das schon mit Substitute probiert:
Vvalue = Application.WorksheetFunction.Substitute(Vvalue, Range("A2").Value, "")
Das Komma ist erwartungsgemäss weg, blöderweise aber auch die Dezimaltrennung, so dass die neue Zahl plötzlich 109200 heisst.
Hat jemand eine Idee, wie man das gelöst bekommt?
Danke und Gruss
Fettertiger

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Tausendertrennung
08.07.2010 08:55:02
ede
Hallo,
dann versuch doch mal das Komma aus dem Strin herauszuschneiden.
vValue = Val(Left(vValue, InStr(1, vValue, ",") - 1) & Mid(vValue, InStr(1, vValue, ",") + 1))
Gruss
AW: Tausendertrennung
08.07.2010 09:49:58
Fettertiger
Hallo,
der erste teil funktioniert schon mal ganz gut (Danke Ede), die 1,092.00 wird zuverlässig in 1092 umgewandelt.
Ist der Wert aber kleiner als 1000 bekomme ich trotzdem ein Problem:
BSPW: 239.00 wird nicht verändert und bleibt als 239.00 bestehen, da es ja kein Komma enthält. Addiere ich diesen Wert aber zu anderen Werten hinzu, dann wird er aber als 23900 interpretiert.
Hat noch jemand eine Idee
Gruss
Fettertiger
Anzeige
AW: Tausendertrennung
08.07.2010 09:54:51
ede
hallo noch mal,
und so?
'wenn Komma vorhanden
If InStr(1, vValue, ",") > 0 Then
vValue = Left(vValue, InStr(1, vValue, ",") - 1) & Mid(vValue, InStr(1, vValue, ",") + 1)
End If
' string in wert umwandeln
vValue = Val(vValue)
gruss
AW: Tausendertrennung
08.07.2010 10:57:38
fcs
Hallo Fettertiger,
die Zahlenkonversion in Excel-VBA ist abhängig von der Ländereinstellung in der Winddows-Systemeinstelung, nicht von der ggf. unter Extras--Optionen gewählten Einstellung.
Es müssen also die Trennzeichen der SAP-Werte durch die entsprechenden Zeichen der Ländereinstellung ersetzt werden, um unter VBA eine entsprechende Text-Zahl-Konversion durchzuführen.
Gruß
Franz
Sub aaTest()
Dim vValue As String, vNumber As Double
'Aktuelle Trenzeichen in Excel - ggf. gemäß Einstellungen unter Optionen
Range("A1").Value = Application.International(xlDecimalSeparator)
Range("A2").Value = Application.International(xlThousandsSeparator)
vValue = Range("A3").Text 'SAP-Zahlenwert als text
vNumber = SAP_Zahl_To_Number(sZahl:=vValue)
Range("A4") = vNumber
vNumber = vNumber * 10
Range("A5") = vNumber
End Sub
Function SAP_Zahl_To_Number(sZahl As String, _
Optional SAP1000er As String = ",", _
Optional SAPdezi As String = ".") As Double
Dim sValue As String, sDezi As String
sValue = Application.WorksheetFunction.Substitute(sZahl, SAP1000er, "")
Select Case Application.International(xlCountrySetting)
Case 33, 34, 43, 49 'Deu-DE,span-E, Deu-AT, franz.-F
sDezi = ","
Case 1, 41, 44 'US, Deu-CH, UK
sDezi = "."
Case Else
sDezi = ","
End Select
sValue = Application.WorksheetFunction.Substitute(sValue, SAPdezi, sDezi)
If IsNumeric(sValue) Then
SAP_Zahl_To_Number = CDbl(sValue)
Else
SAP_Zahl_To_Number = 0
End If
End Function

Anzeige
AW: Tausendertrennung
08.07.2010 11:12:50
ede
Hallo Franz,
super und Danke, weider was gelernt.
Gruss
ede
AW: Tausendertrennung
08.07.2010 12:31:05
Fettertiger
Hallo Franz,
das funzt wunderbar, ich habe nur in der Funktion die Verbindung zu den Zellen A1 und A2 hergestellt, dann funktioniert es auch für andere Ländereinstellungen (Voraussetzung: Einstellungen in SAP und Excel sind identisch):
Sub aaTest()
Dim vValue As String, vNumber As Double
'Aktuelle Trenzeichen in Excel - ggf. gemäß Einstellungen unter Optionen
Range("A1").Value = Application.International(xlDecimalSeparator)
Range("A2").Value = Application.International(xlThousandsSeparator)
vValue = Range("A3").Text 'SAP-Zahlenwert als text
vNumber = SAP_Zahl_To_Number(sZahl:=vValue)
Range("A4") = vNumber
vNumber = vNumber * 10
Range("A5") = vNumber
End Sub


Function SAP_Zahl_To_Number(sZahl As String, _
Optional SAP1000er As String = Range("A2").Value, _
Optional SAPdezi As String =Range("A1").Value) As Double
Dim sValue As String, sDezi As String
sValue = Application.WorksheetFunction.Substitute(sZahl, SAP1000er, "")
Select Case Application.International(xlCountrySetting)
Case 33, 34, 43, 49 'Deu-DE,span-E, Deu-AT, franz.-F
sDezi = ","
Case 1, 41, 44 'US, Deu-CH, UK
sDezi = "."
Case Else
sDezi = ","
End Select
sValue = Application.WorksheetFunction.Substitute(sValue, SAPdezi, sDezi)
If IsNumeric(sValue) Then
SAP_Zahl_To_Number = CDbl(sValue)
Else
SAP_Zahl_To_Number = 0
End If
End Function

Jetzt fehlt mir nur noch eine Kleinigkeit. Da die User in verschiedenen Ländern angesiedelt sind, die nicht bei den Cases auftauchen, würde ich die gerne Nachpflegen. Ich habe schon nach einer Liste gesucht, aber nichts gefunden. Hast Du solch eine Liste?
Gruss
Fettertiger
Anzeige
AW: Tausendertrennung
08.07.2010 12:50:53
Fettertiger
uups, jetzt hab ich doch glatt mist erzählt. Die Funktion war natürlich richtig, die Tausendertrennung ist ja optional. Richtig wäre demnach folgendes:
Sub aaTest()
Dim vValue As String, vNumber As Double
'Aktuelle Trenzeichen in Excel - ggf. gemäß Einstellungen unter Optionen
Range("A1").Value = Application.International(xlDecimalSeparator)
Range("A2").Value = Application.International(xlThousandsSeparator)
vValue = Range("A3").Text 'SAP-Zahlenwert als text
vNumber = SAP_Zahl_To_Number(sZahl:=vValue,SAP1000er:=Range("A2).value, _
SAPdezi:=Range("A1").Value )
Range("A4") = vNumber
vNumber = vNumber * 10
Range("A5") = vNumber
End Sub

Function SAP_Zahl_To_Number(sZahl As String, _
Optional SAP1000er As String = Range("A2").Value, _
Optional SAPdezi As String =Range("A1").Value) As Double
Dim sValue As String, sDezi As String
sValue = Application.WorksheetFunction.Substitute(sZahl, SAP1000er, "")
Select Case Application.International(xlCountrySetting)
Case 33, 34, 43, 49 'Deu-DE,span-E, Deu-AT, franz.-F
sDezi = ","
Case 1, 41, 44 'US, Deu-CH, UK
sDezi = "."
Case Else
sDezi = ","
End Select
sValue = Application.WorksheetFunction.Substitute(sValue, SAPdezi, sDezi)
If IsNumeric(sValue) Then
SAP_Zahl_To_Number = CDbl(sValue)
Else
SAP_Zahl_To_Number = 0
End If
End Function
Der Punkt mit den Ländercodes pro Dezimalzeichen bleibt natürlich offen.
Danke und Gruss
Fettertiger
Anzeige
Ländercodes
08.07.2010 13:32:10
Rudi
Hallo,
die Codes entsprechen den internationalen Telefon-Vorwahlen ohne führende 0.
In welchem Land welches Zeichen zum Einsatz kommt, weiß ich aber auch nicht.
Gruß
Rudi
AW: und noch was
08.07.2010 14:15:32
Fettertiger
Hallo zusammen,
vielen Dank, ich hatte nur nach Countrycodes und Decimal separator gegoogelt, und hatte deshalb nix gefunden.
Die Lösung von Franz passt demnach perfekt auf die Usergruppe!
Nochmals danke Euch allen!
Gruss
Fettertiger
Anzeige
AW: Tausendertrennung
08.07.2010 19:09:15
fcs
Hallo FetterTiger,
Ein kleines Problem hast du ggf. noch, wenn der Anwender in Excel unter Optionen benutzerdefinierte Trennzeichen aktiviert hat. Ggf. muss vor der SAP-Datenkonvertierung auf die Einstellungen der Systemsteuerung umgeschaltet werden. Hier gilt Probieren geht über Studieren.
In der Function-Deklaration solltest du für die optionalen Parameter dann auch die Standardwerte fest vorgeben. Da du den internationalen Einsatz der Makros planst solltest du diese Parameter nicht als optionale sondern als Pflichtparameter vorgeben.
Gruß
Franz
Sub aaTest()
Dim vValue As String, vNumber As Double, bolStatus As Boolean
bolStatus = Application.UseSystemSeparators
If bolStatus = False Then Application.UseSystemSeparators = True
'Aktuelle Trenzeichen in Excel - ggf. gemäß Einstellungen unter Optionen
Range("A1").Value = Application.International(xlDecimalSeparator)
Range("A2").Value = Application.International(xlThousandsSeparator)
vValue = Range("A3").Text 'SAP-Zahlenwert als text
vNumber = SAP_Zahl_To_Number(sZahl:=vValue, SAP1000er:=Range("A2"), _
SAPdezi:=Range("A1"))
Range("A4") = vNumber
vNumber = vNumber * 10
Range("A5") = vNumber
If bolStatus = True Then Application.UseSystemSeparators = False
End Sub
Function SAP_Zahl_To_Number(sZahl As String, _
Optional SAP1000er As String = ",", _
Optional SAPdezi As String = ".") As Double
Dim sValue As String, sDezi As String
sValue = Application.WorksheetFunction.Substitute(sZahl, SAP1000er, "")
Select Case Application.International(xlCountrySetting)
Case 33, 34, 43, 49 'Deu-DE,span-E, Deu-AT, franz.-F
sDezi = ","
Case 1, 41, 44 'US, Deu-CH, UK
sDezi = "."
Case Else
sDezi = ","
End Select
sValue = Application.WorksheetFunction.Substitute(sValue, SAPdezi, sDezi)
If IsNumeric(sValue) Then
SAP_Zahl_To_Number = CDbl(sValue)
Else
SAP_Zahl_To_Number = 0
End If
End Function

Anzeige
AW: Tausendertrennung
08.07.2010 20:12:20
Fettertiger
Hi Franz,
vielen Dank für den Hinweis. Userdefinierte Trennzeichen lassen wir sowieso nicht zu, wir "zwingen" die User identische Einstellungen in SAP und Excel zu verwenden. Da SAP nur folgenden drei Einstellungen zulässt (zumindest bei uns), lässt sich das relativ einfach in den Griff bekommen:
1.234.567,89
1,234,567.89
1 234 567,89
Ich habe Dein Macro mit diesen drei möglichen Einstellungen getestet und das funzt einwandfrei. Den optional Part habe ich entsprechend geändert. Das Macro sieht jetzt so aus:
Option Explicit
Sub aaTest()
Dim vValue As String, vNumber As Double
'Aktuelle Trenzeichen in Excel - ggf. gemäß Einstellungen unter Optionen
Range("A1").Value = Application.International(xlDecimalSeparator)
Range("A2").Value = Application.International(xlThousandsSeparator)
vValue = Range("A3").Text 'SAP-Zahlenwert als text
vNumber = SAP_Zahl_To_Number(sZahl:=vValue, SAP1000er:=Range("A2").Value, SAPdezi:=Range("A1") _
.Value)
Range("A4") = vNumber
vNumber = vNumber * 10
Range("A5") = vNumber
End Sub

Function SAP_Zahl_To_Number(sZahl As String, SAP1000er As String, SAPdezi As String) As Double
Dim sValue As String, sDezi As String
sValue = Application.WorksheetFunction.Substitute(sZahl, SAP1000er, "")
Select Case Application.International(xlCountrySetting)
Case 33, 34, 43, 49 'Deu-DE,span-E, Deu-AT, franz.-F
sDezi = ","
Case 1, 41, 44 'US, Deu-CH, UK
sDezi = "."
Case Else
sDezi = ","
End Select
sValue = Application.WorksheetFunction.Substitute(sValue, SAPdezi, sDezi)
If IsNumeric(sValue) Then
SAP_Zahl_To_Number = CDbl(sValue)
Else
SAP_Zahl_To_Number = 0
End If
End Function
Danke und Gruss
Fettertiger
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige