3.7k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo

hab da mal ne frage wie kriege ich vor und zuname getrennt wenn es zb. so da steht
christianmüller?
christian müller kann ich problemlos über daten-text in spalten trennen.
aber blöderweise sind beide vorhanden einmal mit leerzeichen und einmal ohne
danke für die infos :)))))

13 Antworten

0 Punkte
Beantwortet von
tja, woher soll excel dann wissen wo vorname aufhört und nachmane beginnt?
Entweder gibt es ein trennzeichen oder eine feste Anzahl Zeichen wonach getrennt werden kann
0 Punkte
Beantwortet von
gibt es eine andere alternative? vll über die strg h suche?? auf optionen und da?
0 Punkte
Beantwortet von
von welchen Datenmengen sprechen wir?
es ist sicher auch nicht immer der gleiche Name, oder doch?
und egal welchen Weg, es muss halt irgendeine Regel geben, nach der
gesucht werden kann
0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

mit Leerzeichen gibt es mehrere Lösungen.
Ohne Leerzeichen oder genaue Anzahl von Zeichen sehe ich nur Handarbeit.

Gruß

Helmut
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

trennt den vor und Nachnamen anhand einer Datenbank die im txt Format vorliegt
workupload.com/file/cO2QaARx

der pfad waere dann im code anzupassen

der code ist noch sehr langsam,erste versuch und so :-)

Eingabe
Zelle A1="Beatemustermann"

makro starten

Ausgabe
Zelle B1= W
Zelle C1= Beate
Zelle D1= mustermann

Sub NameTrennen()
Dim strAlles As String, strDaten() As Stringm, Dname As String, VName As String, WM As String
Dim DnameL As Long, Tzeilen As Long
Open "d:\temp\Daten.txt" For Binary As #1
strAlles = Space(LOF(1))
Get #1, , strAlles
Close #1
If Not Right(strAlles, 2) = vbCrLf Then strAlles = strAlles & vbCrLf
strDaten = Split(strAlles, vbCrLf)
Dname = Cells(1, 1)
For DnameL = 1 To Len(Dname)
For Tzeilen = 1 To UBound(strDaten())
If InStr(1, UCase(strDaten(Tzeilen)), Mid(UCase(Dname), 1, DnameL)) > 0 Then
VName = Mid(strDaten(Tzeilen), InStr(1, UCase(strDaten(Tzeilen)), Mid(UCase(Dname), 1, DnameL)), DnameL)
WM = Mid(strDaten(Tzeilen), 1, 1)
Exit For
End If
Next Tzeilen
Next DnameL
Cells(1, 2) = WM
Cells(1, 3) = VName
Cells(1, 4) = Mid(Dname, Len(VName) + 1, Len(Dname) - Len(VName))
End Sub
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

die txt hat 32 766 namen und ist sehr leicht ergänzbar

gruss nighty
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

erste Optimierung

gruss nighty

Sub NameTrennen()
Dim strAlles As String, strDaten() As String, Dname As String, VName As String, WM As String
Dim DnameL As Long, Lname As Long, LIndex As Long
Open "d:\temp\Daten.txt" For Binary As #1
strAlles = Space(LOF(1))
Get #1, , strAlles
Close #1
If Not Right(strAlles, 2) = vbCrLf Then strAlles = strAlles & vbCrLf
strDaten = Split(strAlles, vbCrLf)
Dname = Cells(1, 1)
LIndex = 1
Lname = Len(Dname)
Larray = UBound(strDaten())
For DnameL = 1 To Lname
For Tzeilen = LIndex To Larray
If InStr(1, UCase(strDaten(Tzeilen)), Mid(UCase(Dname), 1, DnameL)) > 0 Then
VName = Mid(strDaten(Tzeilen), InStr(1, UCase(strDaten(Tzeilen)), Mid(UCase(Dname), 1, DnameL)), DnameL)
WM = Mid(strDaten(Tzeilen), 1, 1)
LIndex = Tzeilen
Exit For
End If
Next Tzeilen
Next DnameL
Cells(1, 2) = WM
Cells(1, 3) = VName
Cells(1, 4) = Mid(Dname, Len(VName) + 1, Len(Dname) - Len(VName))
End Sub
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

fuer einen bereich(in diesem Beispiel spalte a)
erste zeile Überschrift
automatische Erfassung der spalte a mit anschliessender Splitterung zu spalte a und b

gruss nighty

Sub NameTrennen()
Dim strAlles As String, strDaten() As String, Dname As String, VName As String, WM As String
Dim DnameL As Long, Lname As Long, LIndex As Long, Lzeile As Long, CellPos As Long, Larray As Long, Tzeilen As Long
Dim Rdat As Variant
Open "d:\temp\Daten.txt" For Binary As #1
strAlles = Space(LOF(1))
Get #1, , strAlles
Close #1
If Not Right(strAlles, 2) = vbCrLf Then strAlles = strAlles & vbCrLf
strDaten = Split(strAlles, vbCrLf)
Lzeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Rdat = Range("A2:B" & Lzeile)
For CellPos = 1 To Lzeile - 1
Dname = Rdat(CellPos, 1)
LIndex = 1
Lname = Len(Dname)
Larray = UBound(strDaten())
For DnameL = 1 To Lname
For Tzeilen = LIndex To Larray
If InStr(1, UCase(strDaten(Tzeilen)), Mid(UCase(Dname), 1, DnameL)) > 0 Then
Rdat(CellPos, 1) = Mid(strDaten(Tzeilen), InStr(1, UCase(strDaten(Tzeilen)), Mid(UCase(Dname), 1, DnameL)), DnameL)
VName = Mid(strDaten(Tzeilen), InStr(1, UCase(strDaten(Tzeilen)), Mid(UCase(Dname), 1, DnameL)), DnameL)
Rdat(CellPos, 2) = Mid(Dname, Len(VName) + 1, Len(Dname) - Len(VName))
LIndex = Tzeilen
Exit For
End If
Next Tzeilen
Next DnameL
Next CellPos
Range("A2:B" & Lzeile) = Rdat
End Sub
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

nach diversen Zeitmessungen und kleinen Optimierungen folgendes Fazit

60 000 datensaetze
Excel ist total ueberfordert und verabschiedet sich regelmaessig
sieht irgendwie nach einen ueberlauf an

nach diesem Tiefschlag

1000 datensaetze
ueber 2 min,trotz erster index Erstellung

nicht akzeptabel

bevor nun eine neue datenstructur ersellt wird
wuerde ich sagen,das die Datenbank mit acces erstellt werden sollte
dort waere bestimmt ein besseer alphabetischer zugriff moeglich

*irgenddwo hab noch Access *g**

gruss nighty
0 Punkte
Beantwortet von
Guten Morgen nighty,

Auch ACCESS kocht nur mit Wasser, ich sehe auch mit Access keine seriöse Möglichkeit zusammengeschriebene Vor- und Nachnamen zu trennen.

schönen Sonntag

Gruß

Paul1
...