Clever-Excel-Forum

Normale Version: In einem String ein Zeichen durch Komma ersetzen (VBA)
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hi, mir wurde hier vor Jahren mal perfekt und schnell geholfen – vielleicht klappt es wieder?
 
Folgendes Problem:
In einem Arbeitsblatt werden aus einer großen Text-Datenmenge Daten per VBA (Excel 2010) so extrahiert, dass sie nach ihrer Art einzelnen Spalten zur weiteren Verarbeitung zugeordnet werden. Das klappt perfekt.

Unter anderem werden auch POI im Garmin-csv-Format generiert. Diese POI enthalten die Koordinaten zunächst  mit Komma-Trennzeichen und ein „#“ zur Trennung der 3 Datenelemente „Geogr. Länge, geogr. Breite, Text.

Beispiel: 15,1731#47,3534566#Text
Das Format „garmin.csv“ verlangt nun aber als Dezimaltrennzeichen einen Punkt und als Datentrennung ein Komma.

Das soll dieses VBA-Makro ausführen:

'Komma durch Punkt und @ durch Komma ersetzen
   Columns("T:T").Select
    Selection.Replace What:=",", Replacement:=".", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
       
    Selection.Replace What:="#", Replacement:=",", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

Chr(44) an Stelle von ";" ändert leider nichts.

Statt des Kommas zur Trennung der Daten wird aber auch ein Punkt geschrieben. Ich habe im Netz viel über das Problem gelesen (da geht es allerdings immer um das Dezimaltrennzeichen – hier handelt es sich ja aber um einen String).

Beispiel: 15.1731.47.3534566.Text

Kennt jemand eine Lösung, wie in erreichen kann, dass in einem String irgendein Zeichen durch ein Komma per VBA ersetzt wird?
Diese Datei soll auch anderen Nutzern zur Verwendung gegeben werden, von denen nicht verlangt werden soll, weitere Einstellungen in Excel vorzunehmen. 

Im Augenblick helfe ich mir mit diesem Workaound:



LG
Gitte
Verwende:

Code:
Sub M_snb()
  sn = Columns(20).SpecialCells(2)
   
  For j = 1 To UBound(sn)
    sn(j, 1) = Replace(Replace(sn(j, 1), ",", "."), "#", ",")
  Next
   
  Columns(20).SpecialCells(2) = sn
End Sub
Danke.

Habe es probiert.

Leider gleiches Ergebnis - Punkt anstatt Komma.

LG
Gitte
Hallo Gitte,

bei mir funktioniert Dein Code so wie von Dir gewünscht.

Gruß Uwe
Wenn ich die Änderung über das Menü ausführe, passt es auch.

Wenn ich die Ausführung als Makro speichere und dann ausführe, kommt der Punkt. Ebenso beim Kode-Vorschlag von @snb.

Es ist ja keine große Sache, das manuell zu machen. Aber ich wollte eigentlich das ganze Extrahieren inkl. dieser Wandlung vollautomatisiert haben.

Das Ganze mit Excel 2010.

LG Gitte
Du hast das Makro falsch gespeichert.
Das sollte im Makromodul des Arbeitsblattes stehen.

Wo ist deine Beispieldatei ?
Danke, das hat geklappt. 

Ist auch egal, wie dann der Kode geschrieben wird. 

"replace" tut das, was erwartet. 

Ich wusste nicht, dass es da einen Unterschied gibt.
Ich hab das nie gelernt - sondern mich nur  einfach autodidaktisch für den Heimgebrauch der Materie genähert.

LG Gitte

Edit 1: Zu früh gefreut. In einer Testdatei funktionierte es - in der, mit der ich mich abmühe, (noch) nicht. Da probiere ich noch ein bisschen rum.
Aufruf per "call" aus Makro: Wieder Punkt statt Komma.
Separater Aufruf nach Durchlauf des Makros: Macht, was es soll.

Edit 2: In einer neu angelegter Testdatei macht "replace" unabhängig vom verwendeten Kode IM MAKRO das, was erwartet. 
Ich probiere weiter.
Wenn du richtig referenzierst (= in welchem Arbeitsblatt kann das Makro die Daten finden) schmelzen deine Fragen wie Schnee im Sonne:
Man kan referenzieren:
- codename z.B. sheet1.cells(1), oder Tabelle1.cells(1)
- Blattname: z.B. Sheets("Sheet1").cells(1) oder Sheets("Tabelle1").cells(1)
- indexnumber z.B. Sheets(1).cells(1) oder Sheets(2).cells(1)

Auto'didakt', kann sein danke sehr, bitte schön. Jedoch jeder Anfänger sollte mit Grundlagen anfangen in einer Kurs (in Persona oder virtuell) und/oder mit einem Handbuch. Wie strukturierter die didaktische Aufboau ist, wie schneller man lernt. VBA ist eine Sprache mit Grammatik, Syntaxis und Vokabular.


Code:
Sub M_snb()
  sn = sheet1Columns(20).SpecialCells(2)

  For j = 1 To UBound(sn)
    sn(j, 1) = Replace(Replace(sn(j, 1), ",", "."), "#", ",")
  Next

  Sheet1.Columns(20).SpecialCells(2) = sn
End Sub
oder
Code:
Sub M_snb()
  sn = Sheets(1).Columns(20).SpecialCells(2)

  For j = 1 To UBound(sn)
    sn(j, 1) = Replace(Replace(sn(j, 1), ",", "."), "#", ",")
  Next

  sheets(1).Columns(20).SpecialCells(2) = sn
End Sub
oder
Code:
Sub M_snb()
  sn = Sheet("Tabelle1").Columns(20).SpecialCells(2)

  For j = 1 To UBound(sn)
    sn(j, 1) = Replace(Replace(sn(j, 1), ",", "."), "#", ",")
  Next

  Sheets("Tabelle1").Columns(20).SpecialCells(2) = sn
End Sub
So, während einer Einkaufsfahrt habe ich nur nur über meinen Einkauf, sondern auch über das Problem nachgedacht.

Üblicherweise spare ich mir die Deklaration von Variablen in meinen kleinen Makros. Hat bislang auch immer so funktioniert.

Hier halt nicht (für den ganzen Rest - Analyse der Daten und Zuordnung einzelner Elemente zu bestimmten Gruppen - perfekt. Nur nicht für die eigentliche triviale Zusammenfassung der Elemente mit Einfügen des Kommas). In Zukunft werde ich das strikt machen.

Nach Einfügen von 

"Dim strPOI As String" (das Weglassen war wohl der Grundfehler)

und für n über alle 50.000 Einträge: 

" 'POI

strPOI = Cells(n, 4) & "#" & Cells(n, 5) & "#Ref - " & Cells(n, 3) & " " & Cells(n, 7) & "-" & Cells(n, 8) & " - " & Cells(n, 9):
Cells(n, 20) = Replace(strPOI, "#", ",")"

funktioniert die Zusammenfassung der einzelnen Elemente zu einer Garmin-csv-POI-Zeile im Format "Länge (mit Punkt), Breite (mit Punkt), weitere Elemente als Text" bestens.

Die Datei oder auch nur das Gesamtmakro möchte ich wegen der enthaltenen Daten hier nicht einstellen

Danke für's Mitdenken.