Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Wörter in einer Zelle auf mehrere Zellen per VBA trennen

878 views
Skip to first unread message

Heinz Müller

unread,
Feb 8, 2017, 12:53:26 PM2/8/17
to
Hallo zusammen,

brauche mal eure Hilfe.

Ich habe beispielsweise in A1 folgendes stehen:

Name Dummy Dummy Vorname Strasse Dummy Nummer

Trenner ist Leerzeichen. Dummy ist hier nur ein Platzhalter
für ein beliebiges anderes Wort.

Ich möchte nun folgendes Endergebnis haben:

Das Wort "Name" => A1
Das Wort "Vorname" => B1
Das Wort "Strasse" => F1
Das Wort "Nummer" => G1

Kann mir jemand bitte helfen, dass mit einem VBA-Script zu lösen.
Als weitere Schwierigkeit würde ich gerne die Zellen in Spalte A
markieren, bei denen ich diese Datenumwandlung machen will.
Es betrifft also nicht immer nur A1 wie in meinem Beispiel angegeben,
sondern auch mal mehrere Zellen, z.B. A4 und A7 und A8 ( alle markiert ).

Das VBA soll also ähnlich funktionieren wie die EXCEL-Funktion
"Text in Spalten". Nur das ich die Zielspalten flexibler handhaben will.

Nein, ist keine Hausaufgabe :-)
Per Paste und Copy sollen aus einer SAP-Tabelle diverse Daten
zeilenweise extrahiert und nach EXCEL in bestimmte Spalten importiert
werden.

Danke!

Gruß
Heinz

Claus Busch

unread,
Feb 8, 2017, 1:00:24 PM2/8/17
to
Hallo Heinz,

Am Wed, 8 Feb 2017 18:53:22 +0100 schrieb Heinz Müller:

> Ich habe beispielsweise in A1 folgendes stehen:
>
> Name Dummy Dummy Vorname Strasse Dummy Nummer
>
> Trenner ist Leerzeichen. Dummy ist hier nur ein Platzhalter
> für ein beliebiges anderes Wort.
>
> Ich möchte nun folgendes Endergebnis haben:
>
> Das Wort "Name" => A1
> Das Wort "Vorname" => B1
> Das Wort "Strasse" => F1
> Das Wort "Nummer" => G1

das geht nicht so einfach. Woher soll Excel wissen, was Name und Vorname
ist?
Poste mal mehr und bessere Beispiele aller vorkommenden Möglichkeiten.
Wie sieht dieser Platzhalter aus? Sind es immer zwei Platzhalter
zwischen Name und Vorname?


Mit freundlichen Grüßen
Claus
--
Windows10
Office 2016

Heinz Müller

unread,
Feb 8, 2017, 4:40:26 PM2/8/17
to
Am 08.02.2017 um 19:00 schrieb Claus Busch:
> Hallo Heinz,
>
...
...
>
> das geht nicht so einfach. Woher soll Excel wissen, was Name und Vorname
> ist?
> Poste mal mehr und bessere Beispiele aller vorkommenden Möglichkeiten.
> Wie sieht dieser Platzhalter aus? Sind es immer zwei Platzhalter
> zwischen Name und Vorname?
>
>
> Mit freundlichen Grüßen
> Claus
>

Hallo Claus,

danke für die Rückmeldung.

Also der Aufbau der Wortreihe ist immer der gleiche, bedeutet die
Spaltenanzahl im SAP ist festgelegt.

Ich hätte als Beispiel auch folgendes schreiben können

a b c d e f g

Das würde ich dann aus der SAP-Liste kopieren und in z.B. A1 reinsetzen.
Eventuell war mein vorheriges Beispiel zu kompliziert.

Letztendlich sollte das Ergebnis dann so aussehen:

A1 => enthält a
B1 => enthält d
F1 => enthält e
G1 => enthält g

Mit der Menufunktion "Text in Spalten" komme ich da nicht weit,
weil ich erstens nicht alle SAP-Spalten benötige und zweitens die
benötigten SAP-Spalten festen EXCEL-Spalten zuweisen möchte.

Hoffe das ein wenig besser erklärt zu haben.

Gruß
Heinz


Heinz Müller

unread,
Feb 8, 2017, 5:17:22 PM2/8/17
to
Ok,

ich glaube ich habe das Gerüst im www gefunden:

Sub Text_zerlegen()

Dim Textteile

Textteile = Split(Cells(1, 1), " ")

Cells(1, 1) = Textteile(0)
Cells(1, 2) = Textteile(3)
Cells(1, 6) = Textteile(4)
Cells(1, 7) = Textteile(6)

End Sub

Zumindest funktioniert's bei mir.

Das müsste ich jetzt nur noch dynamisch so abändern,
das ich in Spalte A die Zelle bzw. Zellen markiere
welche dann in Spalten aufgeteilt werden sollen.

Gruß
Heinz

Hans.Alborg

unread,
Feb 8, 2017, 5:24:53 PM2/8/17
to
Heinz Müller schrieb:

> Ich hätte als Beispiel auch folgendes schreiben können
>
> a b c d e f g
>
> Das würde ich dann aus der SAP-Liste kopieren und in z.B. A1 reinsetzen.
> Eventuell war mein vorheriges Beispiel zu kompliziert.
>
> Letztendlich sollte das Ergebnis dann so aussehen:
>
> A1 => enthält a
> B1 => enthält d
> F1 => enthält e
> G1 => enthält g

So?
'---------------------------------
dim gestxt as string, stcktxt as string
gestxt = "deine sap-zeile"

for i = 1 to 7

if len(gestxt) < 2 then exit for

stcktxt = left(gestxt, _
instr(gestxt, " "))

if i = 1 or i=2 or i=6 or i=7 then
cells(1,i).value = stcktxt
end if

gestxt=right(gestxt,len(stcktxt)

next i
'----------------------------

Die Schleife läuft 7x durch, soviel wie Wörter in Deiner Zeile vorkommen.
Bei jedem Space wird mit INSTR die Position festgestellt und der Text
bis dahin abgetrennt und in eine Zelle getan. Dann wird die lange Zeile
um diese Textlänge gekürzt damit INSTR das nächste Space findet.
(Leute mit Doppelnamen entlassen oder mit Bindestrich schreiben)

Es werden nur die 1.,2.,6. und 7. Funde in die Zellen geschrieben.

So würde ich das angehen. Wegen der Spaces mußt Du die gefunden
Textlängen noch korrigieren (...-1) damit die Spaces nicht mitgenommen
werden.

Hans

Heinz Müller

unread,
Feb 8, 2017, 5:49:17 PM2/8/17
to
Am 08.02.2017 um 23:24 schrieb Hans.Alborg:
> Heinz Müller schrieb:
>
...
...
>
> So?
> '---------------------------------
> dim gestxt as string, stcktxt as string
> gestxt = "deine sap-zeile"
>
> for i = 1 to 7
>
> if len(gestxt) < 2 then exit for
>
> stcktxt = left(gestxt, _
> instr(gestxt, " "))
>
> if i = 1 or i=2 or i=6 or i=7 then
> cells(1,i).value = stcktxt
> end if
>
> gestxt=right(gestxt,len(stcktxt)
>
> next i
> '----------------------------
>
> Die Schleife läuft 7x durch, soviel wie Wörter in Deiner Zeile vorkommen.
> Bei jedem Space wird mit INSTR die Position festgestellt und der Text
> bis dahin abgetrennt und in eine Zelle getan. Dann wird die lange Zeile
> um diese Textlänge gekürzt damit INSTR das nächste Space findet.
> (Leute mit Doppelnamen entlassen oder mit Bindestrich schreiben)
>
> Es werden nur die 1.,2.,6. und 7. Funde in die Zellen geschrieben.
>
> So würde ich das angehen. Wegen der Spaces mußt Du die gefunden
> Textlängen noch korrigieren (...-1) damit die Spaces nicht mitgenommen
> werden.
>
> Hans

Hallo Hans,

danke dir.

Habe mir mal diese Lösung zusammengestrickt und die funktioniert soweit:

Public Sub ZellenAuslesen()
Dim rngCell As Range
Dim Z As Integer
Dim S As Integer

For Each rngCell In Selection

Z = rngCell.Row
S = rngCell.Column

Textteile = Split(Cells(Z, S), " ")

Cells(Z, 1) = Textteile(0)
Cells(Z, 2) = Textteile(3)
Cells(Z, 6) = Textteile(4)
Cells(Z, 7) = Textteile(6)

Next rngCell

End Sub

Eventuell nicht sehr elegant und noch optimierbar, aber es funktioniert.

Gruß
Heinz

Claus Busch

unread,
Feb 9, 2017, 1:31:33 AM2/9/17
to
Hallo Heinz,

Am Wed, 8 Feb 2017 23:17:19 +0100 schrieb Heinz Müller:

> Sub Text_zerlegen()

> Das müsste ich jetzt nur noch dynamisch so abändern,
> das ich in Spalte A die Zelle bzw. Zellen markiere
> welche dann in Spalten aufgeteilt werden sollen.

du kannst auch gleich die ganze Spalte A aufteilen:

Sub Text_zerlegen()
Dim LRow As Long, i As Long
Dim varStr As Variant

With ActiveSheet
LRow = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To LRow
varStr = Split(.Cells(i, 1), " ")
.Cells(i, 1) = varStr(0)
.Cells(i, 2) = varStr(3)
.Cells(i, 6) = varStr(4)
.Cells(i, 7) = varStr(6)
Next
End With
End Sub

Marion Scheffels

unread,
Feb 10, 2017, 4:56:22 AM2/10/17
to
On Wed, 8 Feb 2017 18:53:22 +0100, Heinz Müller
<onkel...@mscologne.de> wrote:

>Name Dummy Dummy Vorname Strasse Dummy Nummer

Ich zerlege einen Adress-String aus einer Zelle mit einer Kombi aus
varSplit und InStr/InStrRev, aber bei mir variieren dabei die Anzahl
der Teile von 5-7 je nach Angaben der Kunden.

Dazu unterteile ich den Adress-String vor der Weiterverarbeitung mit
Kommas und Semikolons, was teils automatisch durch das Daten liefernde
Makro passiert, teils in Handarbeit.

Ich weiß nicht, inwiefern bei dir eine Lösung ohne die Dummys
praktikabler wäre?

MarionS
--
einwega...@marions.de

"Darf ich Ihnen unseren Zehnerpack anbieten?"
"Wieviel sind denn da drin?"

Heinz Müller

unread,
Feb 10, 2017, 12:54:16 PM2/10/17
to
Am 09.02.2017 um 07:31 schrieb Claus Busch:

> du kannst auch gleich die ganze Spalte A aufteilen:
>
> Sub Text_zerlegen()
> Dim LRow As Long, i As Long
> Dim varStr As Variant
>
> With ActiveSheet
> LRow = .Cells(Rows.Count, 1).End(xlUp).Row
> For i = 1 To LRow
> varStr = Split(.Cells(i, 1), " ")
> .Cells(i, 1) = varStr(0)
> .Cells(i, 2) = varStr(3)
> .Cells(i, 6) = varStr(4)
> .Cells(i, 7) = varStr(6)
> Next
> End With
> End Sub
>
>
> Mit freundlichen Grüßen
> Claus
>

Hallo Claus,

danke für den Tip.

Da die EXCEL-Liste fortlaufend erweitert wird,
war es mit wichtig immer wieder neue Einträge
aufnehmen zu können.

Das kann ich mit meiner "Selection"-Lösung
am am ehesten durchführen.

Gruß
Heinz

Heinz Müller

unread,
Feb 10, 2017, 12:55:32 PM2/10/17
to
Am 10.02.2017 um 10:56 schrieb Marion Scheffels:
> On Wed, 8 Feb 2017 18:53:22 +0100, Heinz Müller
> <onkel...@mscologne.de> wrote:
>
>> Name Dummy Dummy Vorname Strasse Dummy Nummer
>
> Ich zerlege einen Adress-String aus einer Zelle mit einer Kombi aus
> varSplit und InStr/InStrRev, aber bei mir variieren dabei die Anzahl
> der Teile von 5-7 je nach Angaben der Kunden.
>
> Dazu unterteile ich den Adress-String vor der Weiterverarbeitung mit
> Kommas und Semikolons, was teils automatisch durch das Daten liefernde
> Makro passiert, teils in Handarbeit.
>
> Ich weiß nicht, inwiefern bei dir eine Lösung ohne die Dummys
> praktikabler wäre?
>
> MarionS
>
Hallo Marion,

das war ein von mir schlecht gewähltes Beispiel.

Siehe einer meiner letzten Posts.

Gruß
Heinz
0 new messages