Serialisierte Werte Suchen/Ersetzen

pyretta

Mitglied
Hallo,

ich habe eine CSV-Datei in der mehrere 100 Datensätze stehen. In den Spalten sind serialisierte Werte (IDs) die durch neue ersetzt werden sollten.

Beispiel eines solchen Zellinhalts: "2915|2916|2917|2951|2952|2953|2954"

2915 entspricht im neuen System z.B. 13441
2916 z.B. 13443
2917 z.B. 13445
etc.

Wie kann ich nun die alten IDs durch die neuen ersetzen?

Hinweise:
  • Die Reihenfolge der Werte ist unterschiedlich
  • Die Anzahl der Werte ist auch unterschiedlich - es kann auch nur 1 Wert in der Zelle stehen - oder aber auch 25 Werte oder mehr
  • Auch die Anzahl der Zeichen ist unterschiedlich
  • Die Kombination der Werte ist auch sehr unterschiedlich
  • Einzig verbindliches Element: Der Separator "|"
Ich habe auch schon ein zweites Tabellenblatt erstellt, in dem alle Wertepaare (Alt-Neu) gegenüberstehen.

Ich glaube die bekannten Formeln - Links/Rechts, SVERWEIS, WENN, Vergleich, Index - wären hier ineffizient.
Bei der Datenmenge ist auch ein händisches Suchen/Ersetzen ineffizient und potentiell fehlerintensiv.
Ich glaube ich bräuchte eine Art Schleife, kenne mich aber mit Visual Basic noch nicht aus.

Kann mir hier jemand auf die Sprünge helfen?

Vielen Dank schon mal im Voraus.
 
Ich würde eine VBA-Funktion machen

Visual Basic:
'/**
' * Parst alle Werte eines Listenstrings anhand einer Mappingtabelle in neue Werte
' * Das ganze ist eine Anlehnung an VLookup()
' * @param  String  Der Listenstring
' * @param  Range   Range mit dem Mapping. Analog zu VLookup
' * @param  Long    Absolute Spalte des Ranges, in der das Resultat steht. Beginnend bei 1
' * @param  String  Der Delimiter, der den Listenstring in seine Einzelkomponenten zerlegt
' * @return String  Listenstring mit den neuen Werten
' */
Public Function listVLookup( _
        ByVal iLookupValues As String, _
        ByRef iMapArray As Range, _
        Optional ByVal iColIndex As Long = 2, _
        Optional ByVal iDelimiter As String = "|" _
) As String
    Dim values() As String
    Dim idx As Long
    
    'Werte in einen Array zerlegen
    values = Split(iLookupValues, iDelimiter)
    
    'Array durchiterieren
    For idx = 0 To UBound(values)
                
        'Funktioniert bei mir leider nicht
        'ids(idx) = Application.WorksheetFunction.VLookup(ids(idx), iTableArray, iColIndexNum)

        'Pro Wert das Resultat übernehmen
        values(idx) = iMapArray.Find(values(idx)).Offset(columnOffset:=iColIndex - 1).Value

    Next idx
    
    'Werte-Array wieder in ein String zusammensetzen
    listVLookup = Join(values, iDelimiter)
End Function

Ich hba dir mal ein Excel-Beispiel hochgeladen
 

Anhänge

  • listVLookup_Demo.zip
    14,5 KB · Aufrufe: 2
Wie geil ist das denn bitte?!
Das ist ja viel cooler als ich es mir hätte träumen lassen!! Da schreibst du mir einfach ne Funktion :D

Boahr! Ehrlich, vielen viiiielen vielen Dank!!
Wär das hier möglich, würd ich dir ne Kiste Bier oder Limo oder so ausgeben.

Du hast eine einfache Tür sehr glücklich gemacht :D (Zitat Per Anhalter durch die Galaxis)
 

Neue Beiträge

Zurück