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

US Amerikanisches Nummernformat

US Amerikanisches Nummernformat
11.12.2014 10:11:01
swiederz
Hallo Zusammen,
Erstmal ein Lob an dieses Forum und die ganzen aktiven Mitglieder, habe eine ganze Menge dazu gelernt und meine ganzen VBA Kenntnisse (NOOB in dieser Hinsicht) kommen aus diesem Forum.
Jedoch stehe ich vor einem Problem das ich bis dato nicht lösen konnte.
Es geht um ein Formatierungsproblem von Daten die ich in die Spalten (B2:E5000) eintragen lassen, die Menge der Daten ist variabel und die Daten (hier liegt das Problem denke ich) sind unterschiedlich vorformatiert, z.B.:
123,45
123.45
1,23.45
1.23,45
Diese ganzen Daten sollen aber in das US Amerikanische Zahlenformat also #,#0.00 formatiert werden, gelingt jedoch nicht. Dazu muss ich sagen, dass mein Laptop bereits als Default auf das US Amerikanische Format eingestellt ist genauso wie meine Excel Einstellungen.
So der erste Schritt der Bearbeitung meiner Daten ist das diese anhand der Zahlen (Ganzzahlen) in Spalte A sortiert werden und Texte sowie nicht nummerische Daten aus den anliegen Spalten gelöscht werden.
Hier die 1. Syntax, vll liegt der Formatierungsfehler darin, konnte ihn darin aber nicht feststellen:
Sub Lezeient()
With Range("A2:E" & Cells(Rows.Count, "A").End(xlUp).Row)
.Sort Key1:=Range("A2"), _
Order1:=xlAscending, _
Header:=xlNo, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
DataOption1:=xlSortTextAsNumbers
End With
Application.ScreenUpdating = False
Dim usedRows As Long
usedRows = ActiveSheet.UsedRange.Rows.Count
For Row = usedRows To 1 Step -1
If ActiveSheet.Cells(Row, 1) = "" Then
Rows(Row).Select
Selection.ClearContents
End If
Next
Application.ScreenUpdating = True
Dim z As Integer, s As Integer
s = 1 'Spaltenzahl, in welcher die letzten Zahlen sind
For z = 2 To 5000 'Letzten Zeile, in welcher sich Daten befinden
If Not IsNumeric(Cells(z, s).Value) Then
Rows(z).Select
Selection.ClearContents
End If
Next z
End Sub
Hier soweit so gut, alles klappt wunderbar, jetzt kommt das Problem, wenn ich Zahlendaten nutze die wie folgt formatiert sind:
1,23.45 oder 123.45
funktioniert die 2. Syntax ohne Probleme, vermutlich weil sie ja bereits in dem gewünschten Format da ist. Nutze ich jedoch Zahlen wie:
1.23,45 funktioniert diese Syntax nicht, es verändert sich absolut nichts in den gewünschten Spalten:
Sub formatter()
Range(Cells(2, 2), Cells(Rows.Count, 5).End(xlUp)).Select
For Each xCell In Selection
Selection.NumberFormat = "##,###.00 €;[RED] -##,##0.00 €;0.00 €;@"
xCell.Value = xCell.Value
Next xCell
End Sub
Habe hierzu dann eine andere Syntax benutzt um diese in das entsprechende Format umzuwandeln, hierbei sind die Zellen dann zwar bereits vorformatiert mit der 2. Syntax und ich lösche lediglich den Punkt darin mit der 3. Syntax die wie folgt aussieht und einige Zahlen nehmen das gewünschte Format an:
Sub dotchanger()
Dim Pusco_B As Integer, Pufo_B As Object, Pufim_B As String
Pusco_B = 2
With Columns(Pusco_B)
Set Pufo_B = .Find("*.*", LookAt:=xlPart)
If Not Pufo_B Is Nothing Then
Pufim_B = Pufo_B.Address
Do
If Pufo_B.Value Like "*.*" Then
If IsNumeric(Replace(Pufo_B, ".", "")) Then
Pufo_B.Value = Replace(Pufo_B, ".", "") * 1
End If
End If
Set Pufo_B = .FindNext(Pufo_B)
Loop While Not Pufo_B Is Nothing And Pufim_B  Pufo_B.Address
End If
End With
USW
, ist nur die Syntax für eine Spalte (B) Davon gibt es noch die identischen für Spalte C,D & E.  _
Was hier dann passiert ist, dass alle Zahlen  die > 1000 sind, also so formatiert sind 1.000,00 in das gewünschte Format 1,000.00 formatiert werden. Alle Zahlen darunter bleiben so wie sie sind, ich vermute als Text also 999,00 = 999,00 und 0,0 ebenso. Habe auch shcon versucht mit *1 zu multiplizieren das klappt aber per vba und manuell in Excel auch nicht. Weiß keinen Rat mehr…
Also wenn ihr meint ihr könnt irgendwie helfen, immer her mit den Vorschlägen ;-)
Entschuldigt wenn ich hier komische Begriffe benutze die so eigentlich gar nicht beim VBA etc  _
benutzt werden, jeder Verbesserungsvorschlag ist erwünscht.
Schon mal vielen Dank!

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: US Amerikanisches Nummernformat
11.12.2014 18:08:17
fcs
Hallo swiederz,
wo kommen denn die Werte, die du im US-Format in deine Exceltabelle eintragen willst, her?
Zahlen der Form 1,23.45 oder 1.23,45 gibt es eigentlich ich nicht. Zahlen haben ein Dezimal-Zeichen und bei entsprechender Formatierung ein 1000er Trennzeichen. Was du da hast ist für einen Menschen -und für Excel erst recht- nicht verständlicher Mischmasch.
Du kannst nur versuchen, beim Einlesen der Daten aus der Quelle diese so aufzubereiten, dass sie korrekt interpretiert werden können. Bei Zahlen wird dabei das 1000er-Trennzeichen durch nichts ersetzt und das Dezimalstellen-Zeichen durch das Zeichen in der Systemeinstellung.
Mit der Funktion cDbl(Zahlen-Text) kann man dann beim Eintragen in die Tabelle echte Zahlen draus machen.
Nachfolgen ein Beispiel in dem Zahlen im US-Format in ein System eingelesen werden.
Das kann man bei Bedarf auf andere länderspezifische Zeichen anpassen.
Wenn die Wuelle eine Textdatei ist, dann kann man schon beim Import der der Daten entsprechende Einstellungen machen, wenn die Daten in der Textdatei andere als die Systemeinstellungen haben.
Gruß
Franz
Sub Test()
Dim strWert As String, strZahl As String
Dim varErgebnis
Dim arrSplit As Variant, intK As Integer
Dim Zeile As Long, Spalte As Long
'US-Format in Excelzahlen umwandeln
Const str1000 As String = "," '1000er-Trennzeichen in den Texten
Const strDezi As String = "." 'Dezimal-Trennzeichen in den Texten
'Daten mit Zahlen im US-Format
arrSplit = Split("2,123,132.12;Testwert;1,005;12.1E+05;AMC2000.22;" _
& "22.12.2014;22:15:45;12:05", ";")
Zeile = 4
Spalte = 0
For intK = 0 To UBound(arrSplit)
Spalte = Spalte + 1
'Wert als Text einlesen
strWert = arrSplit(intK)
Select Case intK
Case 0, 2, 3 'Zahl-Umwandlung
'1000er-Trennzeichen im Text durch "" ersetzen
strZahl = VBA.Replace(strWert, str1000, "")
'Dezimaltrennzeichen durch Trennzeichen in Systemeinstellungen ersetzen
strZahl = VBA.Replace(strZahl, strDezi, Application.International(xlDecimalSeparator))
If IsNumeric(strZahl) Then
varErgebnis = CDbl(strZahl)
Else
varErgebnis = strWert
End If
Case 5 'Datum DD.MM.YYYY --> MM\DD\YYYY
If Len(strWert) = 10 Then
'Umformen des Datums in ISO-Schreibweise YYYY-MM-DD
strZahl = Right(strWert, 4) & "-" & Mid(strWert, 4, 2) & "-" & Mid(strWert, 1, 2)
'Datumstext in Exceldatum umwandeln
If IsDate(strZahl) Then
varErgebnis = CDate(strZahl)
Else
varErgebnis = strWert
End If
Else
varErgebnis = strWert
End If
Case 6, 7 'Uhrzeit
If strWert Like "##:##:##" Or strWert Like "##:##" Then
varErgebnis = CDate(strWert)
Else
varErgebnis = strWert
End If
Case Else
varErgebnis = strWert
End Select
ActiveSheet.Cells(Zeile, Spalte).Value = varErgebnis
Next
End Sub

Anzeige
AW: US Amerikanisches Nummernformat
12.12.2014 09:01:15
swiederz
Hi fcs,
danke für den Vorschlag, also wie du schon richtig erkannt hast habe ich es hier falsch eingetippt, es geht um 1000 Trennzeichen, diese Daten stammen von unterschiedlichen Kunden die in denen die Daten entweder 1,234.56 oder 1.234,56 formatiert sein können, das erstere ist gewünscht. Es wäre mir sogar recht wenn ich egal wum welche Zahlendaten es handelt zunächst iwie umformatiere damit ich sie letztendlich in dem US Amerikanischen Zeichnformat am Ende dort stehen hab, Ergebnis soll also so sein 1,234.56
Danke

AW: US Amerikanisches Nummernformat
12.12.2014 11:35:48
Tino
Hallo,
kannst mal diesen Code testen
Sub Makro1()
Dim ArData, tmpAr, n&
Dim NotDez$

Const cSp& = 1 'Spalte 
Const DezimalZeichen$ = "." 'Dezimalzeichen 

NotDez = IIf(DezimalZeichen = ".", ",", ".")

With Tabelle1 'Tabelle anpassen 
    With .Range(.Cells(2, cSp), .Cells(.Rows.Count, cSp).End(xlUp)).Resize(, 2)
        If .Rows(1).Row < 2 Then Exit Sub 'keine Daten 
        
        ArData = .Value2
        Redim Preserve ArData(1 To Ubound(ArData), 1 To 1)
        
        For n = 1 To Ubound(ArData)
            If IsNumeric(ArData(n, 1)) Then
                If ArData(n, 1) <> "" Then
                    ArData(n, 1) = Replace(ArData(n, 1), NotDez, DezimalZeichen)
                    tmpAr = Split(ArData(n, 1), DezimalZeichen)
                    If Ubound(tmpAr) = 1 Then
                        ArData(n, 1) = Join(tmpAr, DezimalZeichen) * 1
                    ElseIf Ubound(tmpAr) = 2 Then
                        ArData(n, 1) = (tmpAr(0) & tmpAr(1) & DezimalZeichen & tmpAr(2)) * 1
                    Else
                        ArData(n, 1) = "" 'keine Zahl 
                    End If
                End If
            End If
        Next n
        With .Columns(1)
            .NumberFormat = "0.00"
            .Value = ArData
        End With
    End With
    With .UsedRange.EntireColumn
        .Sort Key1:=.Cells(2, cSp), Order1:=xlAscending, Header:=xlYes
    End With
    .Range(.Cells(.Rows.Count, cSp).End(xlUp).Offset(1), .Cells(.Rows.Count, cSp)).EntireRow.Delete
End With
End Sub
Gruß Tino
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige