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

Blank in String einfügen, wenn ...

Blank in String einfügen, wenn ...
26.09.2008 13:27:00
Günter
Liebe Excelfreunde,
Freitag und habe noch ein Problem:
In einer Exceldatei mit 40.000 Einträgen habe ich
in Spalte Namen stehen:
z.B. FranzMüller BergischGladbach Neufundland
Jetzt fehlen teilweise Blanks, wie in diesem Beispiel.
Müßte eigentlich, wie folgt aussehen:
Franz Müller Bergisch Gladbach Neufundland.
Könnte man folgendes über VBA realisieren:
Suche in Spalte A im String nach folgender Situation:
Wenn am Ende eines Wortes der letzte Buchstabe klein geschrieben
ist und ohne Blank ein Großbuchstabe folgt, soll hier ein Blank eingefügt werden.
Und dass für Alle in Spalte A.
Schönen Gruß
Günter

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Blank in String einfügen, wenn ...
26.09.2008 14:29:00
David
Hallo Günter,
eine (leider recht fehleranfällige) Formellösung könnte so ausschauen:
Tabellenblattname: Tabelle1
 

A

B

1

MaxMüller

Max Müller

2

MönchenGladbach

Mönchen Gladbach


Benutzte Formeln:
B1: { =LINKS(A1;MAX(IDENTISCH(TEIL(A1;ZEILE(INDIREKT("2:"&LÄNGE(A1)));1);GROSS(TEIL(A1;ZEILE(INDIREKT("2:"&LÄNGE(A1)));1)))*ZEILE(INDIREKT("2:"&LÄNGE(A1))))-1)&" "&TEIL(A1;MAX(IDENTISCH(TEIL(A1;ZEILE(INDIREKT("2:"&LÄNGE(A1)));1);GROSS(TEIL(A1;ZEILE(INDIREKT("2:"&LÄNGE(A1)));1)))*ZEILE(INDIREKT("2:"&LÄNGE(A1))));100)}
B2: {=LINKS(A2;MAX(IDENTISCH(TEIL(A2;ZEILE(INDIREKT("2:"&LÄNGE(A2)));1);GROSS(TEIL(A2;ZEILE(INDIREKT("2:"&LÄNGE(A2)));1)))*ZEILE(INDIREKT("2:"&LÄNGE(A2))))-1)&" "&TEIL(A2;MAX(IDENTISCH(TEIL(A2;ZEILE(INDIREKT("2:"&LÄNGE(A2)));1);GROSS(TEIL(A2;ZEILE(INDIREKT("2:"&LÄNGE(A2)));1)))*ZEILE(INDIREKT("2:"&LÄNGE(A2))));100)}
enthält Matrixformeln: {} nicht eingeben, sondern Formel mit STRG-SHIFT-ENTER abschließen
Einschränkungen:
Wenn mehrere Großbuchstaben vorkommen, wird nur das Wort nach dem letzten abgeschnitten.
Wenn kein Großbuchstabe vorkommt, gibt's einen #WERT-Fehler
Wenn ein Leerzeichen vorkommt, wird auch dort getrennt (wenn mehrere, beim letzten)
Falls dir die Formelvariante auch zusagt, werde ich mal schauen, ob sich das verfeinern lässt.
Rückmeldung wäre nett.
Gruß
David
Anzeige
AW: Blank in String einfügen, wenn ...
26.09.2008 14:34:00
Chris
Servus Günter,
probier mal das Makro:

Sub Blank()
Dim i As Long, StellenArray() As Long, x As Long, z As Long, lngLetzte As Long
lngLetzte = Cells(Rows.Count, 1).End(xlUp).Row
For z = 1 To lngLetzte
For i = 2 To Len(Cells(z, 1))
If Mid(Cells(z, 1), i, 1) = UCase(Mid(Cells(z, 1), i, 1)) And Mid(Cells(z, 1), i, 1)  " "  _
Then
ReDim Preserve StellenArray(x)
StellenArray(x) = i
x = x + 1
End If
Next i
On Error Resume Next
For k = UBound(StellenArray()) To LBound(StellenArray()) Step -1
If Mid(Cells(z, 1), StellenArray(k) - 1, 1)  " " Then
Cells(z, 1) = Left(Cells(z, 1), StellenArray(k) - 1) & " " & Right(Cells(z, 1), Len( _
Cells(z, 1)) - StellenArray(k) + 1)
End If
Next k
On Error GoTo 0
x = 0
Next z
End Sub


Kann aber bei 40000 Zeilen eine Weile dauern.
Gruß
Chris

Anzeige
AW: Blank in String einfügen, wenn ...
26.09.2008 14:35:20
Dieter
Hallo Günter,
ich habe es als benutzerdefinierte Funktion geschrieben zwecks Wiederverwendbarkeit.

Function blank_einfuegen(quellzk As String) As String
Dim laenge As Integer
Dim buchstabe1 As String
Dim buchstabe2 As String
Dim x As Integer
laenge = Len(quellzk)
For x = 1 To (laenge - 1)
buchstabe1 = Mid$(quellzk, x, 1)
buchstabe2 = Mid$(quellzk, x + 1, 1)
If ((buchstabe1 = LCase(buchstabe1)) And (buchstabe2 = UCase(buchstabe2))) Then
Exit For
End If
Next
If (x = laenge - 1) Then
blank_einfuegen = quellzk
Else
blank_einfuegen = Mid$(quellzk, 1, x) & " " & Mid$(quellzk, x + 1)
End If
End Function


Ich hoffe, es hilft
Gruß
Dieter

Anzeige
AW: Blank in String einfügen, wenn ...
26.09.2008 18:43:00
Günter
Vielen Dank Ihr Dreien,
bin schon fleißig heute Abend am Testen.
Vielen vielen Dank
AW: Blank in String einfügen, wenn ...
27.09.2008 14:51:39
Horst
Hi,
wenn du getestet hast, würde ich gern mal wissen, wie lange die vorgeschlagenen
Lösungen brauchen.
mfg Horst
AW: Blank in String einfügen, wenn ...
28.09.2008 15:40:55
Günter
Guten Tag,
am besten und schnellsten funtioniert das Makro con Chris.
Hat nur den Nachteil, dass -wenn in Zelle wie folgt steht:
HeinzMÜLLER, folgendes herauskommt:
Heinz M Ü L L E R
D.H., das Makro müßte beim 2. Großbuchstaben aufhören.
Schönen Gruß
Günter
AW: Blank in String einfügen, wenn ...
28.09.2008 15:50:45
Günter
Hallo,
wenn z.B. werden auch bei allen neuen Zeilen, welchen z.B. BAHN Stuttgart, wie folgt
bearbeitet:
B A H N Stuttgart. Sollte natürlich "Bahn Stuttgart" nicht ändern.
Erst mal logisch, da z.B. in der zuletzten Zeile ein Wort (Spalte A) mit einem kleinen
Buchstaben endet.
Gruß
Günter
Anzeige
AW: Blank in String einfügen, wenn ...
28.09.2008 15:55:03
Günter
Hallo,
nicht richterweise wird der richtige Eintrag, wie:
Weiß Sibyller in
wei ß Sibyller.
2
Scheinbar wird das "ß" als Großbuchstabe behandlet.
Gruß
Günter
AW: Blank in String einfügen, wenn ...
29.09.2008 07:32:00
Günter
Hi Chris,
vielleicht hast du heute Zeit für obiges Anliegen.
Schöne Woche und Gruß
Günter
AW: Blank in String einfügen, wenn ...
29.09.2008 10:37:39
Chris
Servus Günter,
hiermal abgeändert:

Sub Blank()
Dim i As Long, StellenArray() As Long, x As Long, z As Long, lngLetzte As Long
lngLetzte = Cells(Rows.Count, 1).End(xlUp).Row
For z = 1 To lngLetzte
For i = 2 To Len(Cells(z, 1))
If Mid(Cells(z, 1), i, 1) = UCase(Mid(Cells(z, 1), i, 1)) And Mid(Cells(z, 1), i, 1)  " "  _
And Mid(Cells(z, 1), i, 1)  "ß" Then
ReDim Preserve StellenArray(x)
StellenArray(x) = i
x = x + 1
End If
Next i
On Error Resume Next
For k = UBound(StellenArray()) To LBound(StellenArray()) Step -1
If Mid(Cells(z, 1), StellenArray(k) - 1, 1)  " " And Mid(Cells(z, 1), StellenArray(k) - 1, _
1)  UCase(Mid(Cells(z, 1), StellenArray(k) - 1, 1)) Then
Cells(z, 1) = Left(Cells(z, 1), StellenArray(k) - 1) & " " & Right(Cells(z, 1), Len( _
Cells(z, 1)) - StellenArray(k) + 1)
Else
If Mid(Cells(z, 1), StellenArray(k) - 1, 1) = "ß" Then
Cells(z, 1) = Left(Cells(z, 1), StellenArray(k) - 1) & " " & Right(Cells(z, 1), Len( _
Cells(z, 1)) - StellenArray(k) + 1)
End If
End If
Next k
On Error GoTo 0
x = 0
Next z
End Sub


Allerdings die eierlegende Wollmilchsau kann ich dir nicht liefern. Jetzt wird eben BAHNMAUER nicht mehr getrennt, da man ja keine wirkliche Wortabgrenzung hat. Könnte ja sein:
Bahn mau er
oder
Bahn Mauer
oder
Bahnmauer,
aber woher soll man das wissen. Das kann man nicht auseinanderhalten. Außerdem wird z.B.:
WeißESybille dann so getrennt: Weiß ESybille, weil die Trennbedingungen so sind. WeißeSybille wird dagegen richtig getrennt in Weiße Sybille, aber dagegen kann ich nichts machen, weil irgendetwas brauch ich ja nun als Trennkriterium. Eigenständige Wörter erkennt das Makro nicht.
Gruß
Chris

Anzeige
AW: Blank in String einfügen, wenn ...
29.09.2008 18:01:00
Günter
Hallo Chris,
sorry, habe erst eben in www.herber.de geschaut.
werde probieren.
danke
tschau
AW: Blank in String einfügen, wenn ...
30.09.2008 07:47:00
Günter
Hallo und guten Morgen Chris,
Makro läuft super.
Frage mich aber, warum manche Einträge wie folgt getrennt werden:
Bahn h ofapotheke
Bruchf eldap o theke
Brücke napot h eke
Brunne napot h eke
Kantapoth eke
Les ecafé
Moz art
Main g old
Rübe z ahl
Spek t rum
Vale n tino
Stehen eigentlich vor Makrolauf richtig drinnen.
Hast Du hierfür eine Idee?
Gruß
Günter
AW: Blank in String einfügen, wenn ...
30.09.2008 08:50:24
Chris
Sorry Günter,
mein Fehler, habe den Array nicht auf Null zurückgesetzt innerhalb der ersten Schleife, somit war der mit Zahlen belegt, die dazu geführt haben, dass die Wörter getrennt weden.
Jetzt müsste es gehen:

Sub Blank()
Dim i As Long, StellenArray() As Long, x As Long, z As Long, lngLetzte As Long
lngLetzte = Cells(Rows.Count, 1).End(xlUp).Row
For z = 1 To lngLetzte
For i = 2 To Len(Cells(z, 1))
If Mid(Cells(z, 1), i, 1) = UCase(Mid(Cells(z, 1), i, 1)) And Mid(Cells(z, 1), i, 1)  " "  _
And Mid(Cells(z, 1), i, 1)  "ß" Then
ReDim Preserve StellenArray(x)
StellenArray(x) = i
x = x + 1
End If
Next i
On Error Resume Next
For k = UBound(StellenArray()) To LBound(StellenArray()) Step -1
If Mid(Cells(z, 1), StellenArray(k) - 1, 1)  " " And Mid(Cells(z, 1), StellenArray(k) - 1, _
1)  UCase(Mid(Cells(z, 1), StellenArray(k) - 1, 1)) Then
Cells(z, 1) = Left(Cells(z, 1), StellenArray(k) - 1) & " " & Right(Cells(z, 1), Len( _
Cells(z, 1)) - StellenArray(k) + 1)
Else
If Mid(Cells(z, 1), StellenArray(k) - 1, 1) = "ß" Then
Cells(z, 1) = Left(Cells(z, 1), StellenArray(k) - 1) & " " & Right(Cells(z, 1), Len( _
Cells(z, 1)) - StellenArray(k) + 1)
End If
End If
Next k
On Error GoTo 0
x = 0
ReDim StellenArray(x) ' hier auf 0 zurücksetzten, sonst bleiben die Werte  des vorherigen  _
Treffers stehen
Next z
End Sub


Gruß
Chris

Anzeige
AW: Blank in String einfügen, wenn ...
30.09.2008 12:41:35
Günter
Vielen Dank Chris,
funktioniert jetzt super.
Gruß
Günter

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige