AW: Makro oder sub schreiben
04.09.2014 17:37:27
Andreas
Hi Daniel,
ja - hast Recht. Hat mich zwar etwas Zeit gekostet, aber sicher habe ich dabei mehr gelernt, weil es mich zwang genau zu sein. Hat mich auch gleich wieder in VBA rein gebracht.
OK, falls noch mal jemand so etwas hat, oder nähere Erläuterungen braucht (wovon ich ein Fan bin), here you go.
Sub trennSpalteBeiErstemLeerzeichen()
'Aufgabe: In mein Worksheet habe ich den Inhalt einer Tabelle aus einer .pdf-Datei einkopiert, _
die zwei Spalten enthielt
'In Excel ist der ganze Text in eine Spalte gekommen.
'Nun will ich das in zwei Spalten trennen, um es dann in Word als Tabelle zu übernehmen.
Dim arr
Dim z As Long
Dim Pos As Long
'Die Zahl, die beim Range nach B noch fehlt wird mit & drangehängt.
'Alles nach dem & ermittelt genau diese fehlende Angabe.
'Cells(Rows.Count,1) // ermittelt die Anzahl der Zellen, egal ob beschrieben oder nicht
'Die 1 verweist auf die erste Spalte, also "A"
'.End // geht auf die letzte Zeile, die aller Wahrscheinlichkeit unbeschrieben ist, in Excel _
2007 ist das 1048576
'(xlUp) // geht wieder hoch, auf die letzte Zeile, die einen Eintrag in der Spalte enthält
'.Row // ermittelt die Zahl dieser Zeile
With Range("A1:B" & Cells(Rows.Count, 1).End(xlUp).Row)
' innerhalb von With wird mit dem Punkt-Operator auf Eigenschaften - hier von Range - _
zugegriffen, ohne
' Range (oder was auch immer) wiederholen zu müssen
arr = .Value
'Schreibt man einen Range in ein Array, so ist es
' a) immer zwei-dimensional und
' b) immer 1-basiert auch wenn Arrays normalerweise 0-basiert sind (da war ich doch arg stutzig _
geworden).
'Das bedeutet (arr(0,1) würde einen out-of-bound-Fehler werfen
' Das Array enthält die einzelnen gefundenen Zeilen als z
' UBound --> UpperBound, daher höchstes Array-Element
For z = 1 To UBound(arr)
' Die Zeilen werden über z systematisch durchlaufen
' Die Position des ersten Leerzeichens wird ermittelt
Pos = InStr(arr(z, 1), " ")
' wenn es ein Leerzeichen gibt, ist die Pos auch größer 0
If Pos > 0 Then
' Das zweite Array-Element wird zuerst beschrieben, da es eh noch leer ist, weil nur die erste _
Spalte Text enthielt
arr(z, 2) = Mid(arr(z, 1), Pos + 1)
' Das erste Array-Element wird nun ÜBERschrieben, mit dem Text bis zum ersten Leerzeichen
arr(z, 1) = Left(arr(z, 1), Pos)
' Ok, jetzt muss der Inhalt der Array-Elemente in das Worksheet noch zurückgeschrieben werden
' Zunächst war ich vorsichtig und habe den Inhalt belassen und einfach in Spalte 3 und 4 zurü _
ckgeschrieben
' und dann unten Spalte A und B wieder gelöscht.
' Ist aber unnötig, funktioniert so wunderbar.
' Cells(z, 3) = arr(z, 1)
' Cells(z, 4) = arr(z, 1)
Cells(z, 1) = arr(z, 1)
Cells(z, 2) = arr(z, 2)
End If
Next
End With
'Range("A:B").Delete
End Sub
Danke noch mal
schöne Grüße