Supportnet / Forum / Datenbanken
Feldinhalte trennen
Frage
Hallo Hallo
Ich habe folgendes Problem.
In eine Tabellenspalte habe ich in der Zellen bis zu 5 verschiedene Angaben, zahlen und Wörter, durch Komma getrennt. Die Zellen könnten auch leer sein.
Wie könnte ich das schaffen diese Angaben zu trennen und in getrennte Spalten darstellen zu lassen.
Also Spalte1- erste Angabe, Spalte2-zweite Angabe usw.
Könnte mir von euch jemand helfen?
Vielen dank in voraus.
Gruss Matty
Antwort 1 von oliverV
Hallo Matty,
dein Problem musst du in mehreren Einzelschritten lösen:
Die erste Angabe bekommt du relativ einfach ausgelesen.
Erstelle eine Abfrage auf deiner Tabelle basierend und trage im Feld folgendes ein:
Links([Feldname];InStr([Feldname];“,“)-1)
Erklärung:
Links([Feldname];4)
Gibt von Links beginnend die ersten 4 Zeichen zurück
InStr([Feldname];“,“)
Gibt die Position von links beginnend an, an dem sich das gewünschte Zeichen befindet
Links([Feldname];InStr([Feldname];“,“)-1)
Durch „InStr“ wird abgefragt, an welcher Position sich das Komma befindet, dieser Wert abzüglich 1 wird von „Links“ verwendet um die entsprechenden Zeichen bis zum Komma zurückzugeben.
Schau dir das Ergebnis der Abfrage an, wenn du damit einverstanden bis, ändere die normale Auswahlabfrage in eine Anfügeabfrage um und gib dort das neue Feld für die Werte ein, anschließend ausführen.
Für die Angabe auf Position 2 wird es etwas schwieriger, da du nicht weißt, wo Position 2 anfängt (Durch unterschiedliche Längen von Position 1).
Erstelle wieder eine Abfrage und trage folgendes ein:
Teil([Feldname];InStr([Feldname],“,“)+2)
Du bekommt nun den „Rest“ geliefert (ab Pos. 2)
Erklärung:
Teil([Feldname];4)
Gibt den Feldinhalt ab Position 4 zurück
Teil([Feldname];InStr([Feldname],“,“)+2)
„InStr“ fragt wieder die Position des Kommas ab, „Teil“ verwendet diesen Wert +2 um den davon rechts stehenden Text zurückzugeben
(+2 wenn du „Komma“ und ein Leerzeichen verwendest, sonst nur +1)
Diese Abfrage speichere als normale Auswahlabfrage ab.
Nun wiederhole Schritt 1, mit dem Unterschied das du dich auf die soeben abgespeicherte Abfrage beziehst und nicht auf die Tabelle.
Für die Angaben auf Position 3, 4 und 5 musst du den ganzen Spaß wiederholen, indem du dich jeweils auf die vorhergehende Abfrage beziehst.
Bevor du mit der Fleißaufgabe beginnst, mache eine Sicherung von deiner alten Tabelle !!!
Poste mal ob es geklappt hat !
Gruß
oliver
dein Problem musst du in mehreren Einzelschritten lösen:
Die erste Angabe bekommt du relativ einfach ausgelesen.
Erstelle eine Abfrage auf deiner Tabelle basierend und trage im Feld folgendes ein:
Links([Feldname];InStr([Feldname];“,“)-1)
Erklärung:
Links([Feldname];4)
Gibt von Links beginnend die ersten 4 Zeichen zurück
InStr([Feldname];“,“)
Gibt die Position von links beginnend an, an dem sich das gewünschte Zeichen befindet
Links([Feldname];InStr([Feldname];“,“)-1)
Durch „InStr“ wird abgefragt, an welcher Position sich das Komma befindet, dieser Wert abzüglich 1 wird von „Links“ verwendet um die entsprechenden Zeichen bis zum Komma zurückzugeben.
Schau dir das Ergebnis der Abfrage an, wenn du damit einverstanden bis, ändere die normale Auswahlabfrage in eine Anfügeabfrage um und gib dort das neue Feld für die Werte ein, anschließend ausführen.
Für die Angabe auf Position 2 wird es etwas schwieriger, da du nicht weißt, wo Position 2 anfängt (Durch unterschiedliche Längen von Position 1).
Erstelle wieder eine Abfrage und trage folgendes ein:
Teil([Feldname];InStr([Feldname],“,“)+2)
Du bekommt nun den „Rest“ geliefert (ab Pos. 2)
Erklärung:
Teil([Feldname];4)
Gibt den Feldinhalt ab Position 4 zurück
Teil([Feldname];InStr([Feldname],“,“)+2)
„InStr“ fragt wieder die Position des Kommas ab, „Teil“ verwendet diesen Wert +2 um den davon rechts stehenden Text zurückzugeben
(+2 wenn du „Komma“ und ein Leerzeichen verwendest, sonst nur +1)
Diese Abfrage speichere als normale Auswahlabfrage ab.
Nun wiederhole Schritt 1, mit dem Unterschied das du dich auf die soeben abgespeicherte Abfrage beziehst und nicht auf die Tabelle.
Für die Angaben auf Position 3, 4 und 5 musst du den ganzen Spaß wiederholen, indem du dich jeweils auf die vorhergehende Abfrage beziehst.
Bevor du mit der Fleißaufgabe beginnst, mache eine Sicherung von deiner alten Tabelle !!!
Poste mal ob es geklappt hat !
Gruß
oliver
Antwort 2 von Sir_Hilly
Probier mal das:
Musst natürlich vorher in der Zieltabelle 5 Tabellen-Felder (typ:text) anlegen
Gruß
Sub trennen()
Dim dbs, rst, rst1
Dim werte() As String
Set dbs = CurrentDb
Set rst = dbs.openrecordset("Tabellen_name_der Ausgangstabelle")
Set rst1 = dbs.openrecordset("Zieltabelle")
If Not rst.EOF Then
rst.MoveFirst
Do Until rst.EOF
werte = split(rst("Name_des_feldes_mit_kommawerten").Value, ",", -1, 1)
rst1.AddNew
For x = LBound(werte()) To UBound(werte())
rst1.Fields(x).Value = CStr(werte(x))
Next
rst1.Update
rst.MoveNext
Loop
End If
rst.Close
rst1.Close
Set dbs = Nothing
End Sub
Musst natürlich vorher in der Zieltabelle 5 Tabellen-Felder (typ:text) anlegen
Gruß
Antwort 3 von Matty
Hallo Oliver,
die erste Abfrage habe ich geschafft, die erste Angabe ausgelesen. Aber als ich die zweite erstellt habe kam eine Fehlermeldung "Undefinierte Funktion "Teil" in Ausdruck". Habe ich irgendwo einen Fehler gemacht? Ich komme einfach nicht nachvollziehen.
Muss noch dazu eine Funktion hinterlegt werden?
Könntest du mir weiterhelfen?
Gruss Matty
die erste Abfrage habe ich geschafft, die erste Angabe ausgelesen. Aber als ich die zweite erstellt habe kam eine Fehlermeldung "Undefinierte Funktion "Teil" in Ausdruck". Habe ich irgendwo einen Fehler gemacht? Ich komme einfach nicht nachvollziehen.
Muss noch dazu eine Funktion hinterlegt werden?
Könntest du mir weiterhelfen?
Gruss Matty
Antwort 4 von oliverV
Hallo Matty,
ich habe etwas gebastelt und dir eine Beispiel-DB gemailt.
Dabei bin ich auf zwei Probleme gestoßen, die ich bei Antwort 1 nicht berücksichtigt habe:
1.) Mit Instr habe ich die Position des Kommas ausgelesen, habe aber nicht bedacht, das der letzte Feldeintrag kein abschließendes Komma enthält.
Das Problem habe ich gelöst, indem ich die Funktionen in eine Wenn-Funktion integriert habe.
2.) Ich habe geschrieben, das du eine Anfügeabfrage erstellen mußt, das ist falsch, da mit einer Anfügeabfrage neue Datensätze an die vorhandene Tabellen angefügt werden, die alten also noch bestehen bleiben.
Du muß eine Tabellen-Erstellungsabfrage erstellen, mit der du die gewünschten Feldinhalte in eine neue Tabelle speichert.
Diese neue Tabelle kannst du nach Erstellung wieder in den alten Tabellennamen umbennen, um evtl. vorhanden Berichte oder Formulare weiterhin nutzen zu können.
Gruß
oliver
ich habe etwas gebastelt und dir eine Beispiel-DB gemailt.
Dabei bin ich auf zwei Probleme gestoßen, die ich bei Antwort 1 nicht berücksichtigt habe:
1.) Mit Instr habe ich die Position des Kommas ausgelesen, habe aber nicht bedacht, das der letzte Feldeintrag kein abschließendes Komma enthält.
Das Problem habe ich gelöst, indem ich die Funktionen in eine Wenn-Funktion integriert habe.
2.) Ich habe geschrieben, das du eine Anfügeabfrage erstellen mußt, das ist falsch, da mit einer Anfügeabfrage neue Datensätze an die vorhandene Tabellen angefügt werden, die alten also noch bestehen bleiben.
Du muß eine Tabellen-Erstellungsabfrage erstellen, mit der du die gewünschten Feldinhalte in eine neue Tabelle speichert.
Diese neue Tabelle kannst du nach Erstellung wieder in den alten Tabellennamen umbennen, um evtl. vorhanden Berichte oder Formulare weiterhin nutzen zu können.
Gruß
oliver
Antwort 5 von Armin
... Ehm, vielleicht liege ich ja falsch.
ich würde die Tabelle mit der Spalte (oder nur die Spalte über den Umweg Excel) Word Textformat exportieren (*.txt) , und dann wieder als Tabelle importieren (.. und im Importfilter Trennzeichen Space setzen etc,)
Vielleicht hilfreich "?
Armin
ich würde die Tabelle mit der Spalte (oder nur die Spalte über den Umweg Excel) Word Textformat exportieren (*.txt) , und dann wieder als Tabelle importieren (.. und im Importfilter Trennzeichen Space setzen etc,)
Vielleicht hilfreich "?
Armin
Antwort 6 von Armin
... unter der Annahme,das es hier um eine einmalige Übernahme von Daten geht, die offensichtlich nicht normalisiert vorliegen.
Armin
Armin

