Vba: Inhalt einer Zeile in mehrere Zeilen splitten

Hallo Leute,
Ich habe ein Problem, das ich schon seit einiger Wochen nicht lösen konnte.
Also, in meiner Exceltabelle habe ich über 1000 Zeilen. Bei jeder Zeile habe ich mehrere Inhalte, die man durch alt+enter getrennt hat. Die Inhalte sind unterschiedlich lang, es gibt Zeile wo ich keine Inhalte hab, welche wo ich nur 10 Inhalte und welche über 30 Inhalte.
Jetzt möchte ich die jedes Inhalt in einer eigenen Zeile aufteilen.
Weiß aber nicht wie ich es genau machen soll. Hab schon einiges probiert, aber nichts klappt:frowning:

Bitte um Hilfe

Jojo1

Hallo jojo1,

ich denke, dass sich das Ganze mit VBA lösen lassen müsste. Dazu bräuchtest du zum einen eine Methode, die dir nach und nach alle 1000 Zeilen ausließt. Eine Methode würd ich schreiben, die den Zellinhalt bspw. anhand eines „\n“ in mehrere Zellen aufteilt. Und eine Methode schreibt diese Zellen alle untereinander oder nebeneinander wieder in ein neues Blatt (oder auch ins gleiche). Ich hoffe, du kannst damit was anfangen.

Gruß
Philipp

Hallo Jojo1,

kannst Du irgendwo eine Beispieldatei ins Netz stellen?

Viele Grüße
Dirk

Hallo Jojo,
ein paar Fragen habe ich noch (bzw. Annahmen, und ich müsst’ wissen, ob die richtig sind), damit das Ergebnis dann auch wirklich passt:

Ausgangssituation: in einer Tabelle einer Excel-Arbeitsmappe sind die Zellen A1-A1000 (so ungefähr) befüllt. Dazwischen sind Leerzellen. Die befüllten Zellen können auch Zeilenumbrüche (alt+enter) enthalten - keinen, einen oder mehrere.

Zielsituation: Jede dieser Zellen soll aufgeteilt werden, so dass die Inhalte beim Zeilenumbruch alt+enter getrennt werden.
Frage: wo sollen die einzelnen Inhalte hin? Daneben, also jeweils in die Spalte(n) B, C, D, … Oder in ein neues Blatt? Oder untereinander?

Machen lässt sich’s auf jeden Fall.
Schöne Grüße
Katharina

Hallo, was hast Du denn schon alles probiert?
Also, mit reinen Excel-Mitteln allein funktioniert das wohl nicht, da man beim Separieren via Text in Spalten keine Sonderzeichen als Trenner vorgeben kann. Am einfachsten einen kleinen Makro schreiben, aber das setzt VBA-Kenntnisse voraus, hast Du die?

  • Schleife über alle Zeilen
  • Schleife über den Inhalt der Zelle mit dem zu zerlegenden Text
  • mit der Instr-Funktion das erste Zeichen X’0A’ (Zeilenumbruch, Konstante VbLf) suchen
  • falls gefunden: Zeichen davor in die nächste Zelle und Zeichen incl. Umbruch ausblenden
  • falls nicht gefunden: nächste Zeile
    Viel Erfolg
    Rainer

Eine Function macht das für Dich:

Function TrenneZeilen(Trennung, SammelText)
For I = 1 To Len(SammelText)
CheckChar = Mid(SammelText, I, 1)
CheckAsc = Asc(CheckChar)
If CheckAsc = 10 Then
CountTrenn = CountTrenn + 1
If CountTrenn = Trennung Then
Exit Function
Else
TrenneZeilen = „“
End If
Else
TrenneZeilen = TrenneZeilen & CheckChar
End If
Next I
End Function

Der übergibst Du eine Zahl für den Trenner und Den Text, den trennen willst. 1 trennt hinter der 1. Zeile, 2 hinter der zweiten…

Hallo Dirk

hier kannst du die Beispieldatei anschaun
http://www.fileuploadx.de/559264

die einzelne Inhalte sollte jeweils in eine Zelle hinzugefügt werden. Die Daten könnte auch in ein neues Tabellenblatt hinzugefügt werden.
Ich hatte mal in der Schule etwas mit Programmierung gehabt, aber habe sonst sehr wenig Ahnung davon. Habe mich versucht in VBA-Programmierung einzulesen, aber habe nichts konkretes dazu gefunden, wie ich dieses Problem lösen kann.

Viele Grüße

Jojo

Hallo Katharina,
danke für die schnelle Antwort. Ja du hast recht mit deiner Annahme. Die Inhalte sollten möglich untereinander stehen, es ist egal ob die Inhalte in ein neues Blatt oder in dem selben Blatt kommen. Es ist aber für die Übersicht besser wenn die Inhalte in ein neues Blatt kommen.
HOffentlich kannst du mir dabei helfen

viele Grüße

Jojo

Hallo Rainer,

Ich habe versucht in VBA-Programmierung einzulesen, leider habe ich nichts konkretes gefunden, was mir bei meinem Problem helfen kann. Ich kenne mich mit Programmierung leider nicht wirklich aus, hatte es früher in der Schule gehabt, aber des reicht nicht aus um selber was zu schreiben:frowning:

danke für deine Tips, ich schau mal ob ich was dazu find.

Viele Grüße Jojo

Hi Amtschimmel,
danke für deine antwort mit der Funktion. Ich habe nur eine ganz blöde Frage. Bei Excel fängt doch alles mit „sub“ an, warum fängt deine Funktion mit „function“ an?

Ich habe sehr wenig Ahnung über VBA, danke schon mal für die Antwort

Viele Grüße

Jojo

Sub ist ein Programmteil. Der gibt nach dem Ablauf nichts an die aufrufende Stelle zurück.

Function ist eine Funktion wie Du sie auch sonst benutzt, wie Potenz, Wurzel, kleinstes gemeinsames Vielfaches,… Nur diese Function hast du halt selber geschrieben. Die gibt einen Wert an die aufrufende Prozedur zurück.

Sub kann ich in den Zellen der Tabelle nicht aufrufen, Function schon. Und dann passiert die Umwandlung on-the-fly und man muss nicht umständlich einen Button drücken und eine Sub auslösen.

Da strickt man dann so einiges selber: Umwandlung der Excel-Zahlen im Deutschen Format in einen String für die Zahl mit amerikanischem Format, Teilung der Namen, Vornamen-Zellen in zwei Zellen, …

Hallo,

ich habe mal ein Macro aufgezeichnet, vielleicht hiflt das:

Sub Makro2()

’ Makro2 Makro
’ Makro am 25.02.2011 von KI aufgezeichnet


Range(„A1“).Select
ActiveCell.FormulaR1C1 = „fsddfgd“ & Chr(10) & „sdfgsdfg“ & Chr(10) & „fsghsgh“ & Chr(10) & „“
With ActiveCell.Characters(Start:=1, Length:=25).Font
.Name = „Arial“
.FontStyle = „Standard“
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range(„B1“).Select
ActiveSheet.Paste
Range(„A1“).Select
ActiveCell.FormulaR1C1 = „sdfgsdfg“ & Chr(10) & „fsghsgh“ & Chr(10) & „“
With ActiveCell.Characters(Start:=1, Length:=17).Font
.Name = „Arial“
.FontStyle = „Standard“
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range(„C1“).Select
ActiveSheet.Paste
Range(„D1“).Select
ActiveSheet.Paste
Range(„A1“).Select
ActiveCell.FormulaR1C1 = „fsghsgh“ & Chr(10) & „“
With ActiveCell.Characters(Start:=1, Length:=8).Font
.Name = „Arial“
.FontStyle = „Standard“
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range(„E1“).Select
ActiveSheet.Paste
End Sub

Gruß

Hallo jojo1,

zunächst ist es mal wichtig zu wissen, welches Zeichen das Trennzeichen ist und ob es immer das gleiche ist.

Gegeben: Arbeitsblatt in Excel, Zelle A1 = „blaxbla“
Gesucht: Ascii-Code von x (4. Zeichen)

Makro
Sub test()
Dim strInhalt As String
strInhalt = ActiveSheet.Cells(1, „A“)
MsgBox Asc(Mid(strInhalt, 4, 1))
End Sub

=> sollte 120 ergeben für „x“ => bei Dir wahrscheinlich ein Wert unter 32 (Steuerzeichen).

Jetzt kannst Du entweder mit InStr die Position bestimmen und den String trennen (Left, Mid, Right)
oder
mit Replace ein anderes Zeichen, Z. B. | (pipe) einfügen.

Gruß
Harry

Hallo,
sorry, hierfür habe ich gerade auch keine fertige Lösung parat. Mein Ansatz wäre, dass Trennzeichen für „ALT+ENTER“ (ASCII-Code 10 ??) zu suchen „FINDEN(ZEICHEN(10))“ und z.B. durch „|“ zu ersetzen. Dann in einem 2. Schritt über „Daten“ -> „Text in Spalten“ den Inhalt in einzelne Spalten ternnen.
So was ähnliches habe ich auch mit VBA schonmal realisiert, siehe hier:
=====Start=======
’ die Stellen mit dem String „|“ finden
Dim anz As Long, iposanz As Long, sText As String, pos1 As Long, _
pos2 As Long, pos3 As Long, pos4 As Long, pos5 As Long, pos6 As Long, _
pos7 As Long, pos8 As Long, pos9 As Long, pos10 As Long, pos11 As Long

sText = Range(„A1“)
iposanz = 0

’ hier ev. mal Variablen einbauen, für die akt. Dateien sind es 11 Trennzeichen
For anz = 1 To 11
iposanz = InStr(1 + iposanz, sText, „|“)
'MsgBox iposanz
If anz = 1 Then pos1 = iposanz
If anz = 2 Then pos2 = iposanz
If anz = 3 Then pos3 = iposanz
If anz = 4 Then pos4 = iposanz
If anz = 5 Then pos5 = iposanz
If anz = 6 Then pos6 = iposanz
If anz = 7 Then pos7 = iposanz
If anz = 8 Then pos8 = iposanz
If anz = 9 Then pos9 = iposanz
If anz = 10 Then pos10 = iposanz
If anz = 11 Then pos11 = iposanz
Next anz

’ Anhand der Stelle mit dem Trennzeichen die Textaufbereitung durchführen
Selection.TextToColumns Destination:=Range(„A1“), DataType:=xlFixedWidth, _
FieldInfo:=Array( _
Array(pos1 - 1, 9), _
Array(pos1, 2), _
Array(pos2 - 1, 9), _
Array(pos2, 2), _
Array(pos3 - 1, 9), _
Array(pos3, 2), _
Array(pos4 - 1, 9), _
Array(pos4, 2), _
Array(pos5 - 1, 9), _
Array(pos5, 1), _
Array(pos6 - 1, 9), _
Array(pos6, 1), _
Array(pos7 - 1, 9), _
Array(pos7, 1), _
Array(pos8 - 1, 9), _
Array(pos8, 1), _
Array(pos9 - 1, 9), _
Array(pos9, 1), _
Array(pos10 - 1, 9), _
Array(pos10, 1), _
Array(pos11 - 1, 9)), _
TrailingMinusNumbers:=True
Dim array1() As String
=====ENDE=======

Musst halt ein bischen probieren, aber ich denke, dass ist der Ansatz dafür.

hey

also ich hatte auch mal so ein problem. damals musste ich die texte nach dem alt enter in eine spalte nach rechts schreiben.
dies löste ich, in dem ich diese „alt enter“ durch ein „;“ ersetzte (dieses zeichen kam nirgends mehr vor). dann hab ich die datei als text gespeichert mit trennzeichen „;“ bei den spalten. anschliessend öffnete ich diese wieder und hatte den gewünschten Efekt.
Ob das auch bei dir geht, weis ich nicht. aber evt. bringt es irgend jemanden auf eine idee.

gruss
m

Hallo Jojo1,

ich meine mich zu erinnern, daß Dir die Antwort schon im Forum gegeben wurde:

die Zeilenschaltung ist Chr(10) und damit kannst Du entweder mit Split() oder mit einer eigenen Funktion die Zellen aufteilen.

Markus

hi jojo1,

leider bin ich grade schwer beschäftigt, so dass auch ich dir nicht weiterhelfen kann, um ein vba-script zu programmieren.

schick mir doch mal deine datei zu, dann werde ich in einer freien minute mal etwas passendes schreiben.

oder hast du inzwischen schon eine antwort erhalten?

thorsten

email: [email protected]