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

VBA Schleife bleibt hängen

VBA Schleife bleibt hängen
14.08.2015 14:52:56
Heiner
Hallo zusammen!
Ich fange gerade mit VBA an und bin dabei heute auf folgendes Problem gestoßen:

WaldNr	Baum	Attribute (getrennt durch Kommata)
Wald1	Baum x	Der,Baum,steht,da
Wald2	Baum y	Der,Baum,steht,da,schon,ganz,lange
bla	bla	bla,bla,bla,bla	

Soll werden zu:

Wald1	Baum x	Der	Baum	steht	da
Der
Baum
steht
da
Wald2	Baum y	Der	Baum	steht	da	schon	ganz	lange
Der
Baum
steht
da
schon
ganz
lange
bla	bla	bla	bla
bla
bla
Dazu habe ich folgenden Code benutzt:
(ist eine Erweiterung aus dem letzten Beitrag von hier: https://www.herber.de/forum/archiv/180to184/183226_Zellinhalte_aufteilen_per_VBA.html)
Sub TextTrennen_Kopieren_Transponieren()
Dim sText As String ' der eingegebene Text
Dim iPos As Integer ' die Position des Space (Trennzeichen)
Dim iCol As Integer ' die Beginn-Spalte der Aufsplittung
Dim iIndx As Integer ' For/Next Index
For iIndx = 2 To Range("C1000").End(xlUp).Row ' von Zeile 2 bis Ende
sText = Range("C" & iIndx).Value ' den Text holen
iPos = InStr(sText, ",") ' Komma-Position feststellen
iCol = 3 ' Beginn der Aufteilungs-Spalte
While iPos > 0 ' solange Komma gefunden wurde
Cells(iIndx, iCol).Value = Left(sText, iPos - 1) ' Zellen ab C befüllen
sText = Right(sText, Len(sText) - iPos) ' Eingabetext "verkürzen"
iPos = InStr(sText, ",") ' Komma suchen
iCol = iCol + 1 ' nächste Spalte errechnen
Wend
Cells(iIndx, iCol).Value = sText ' letztes Wort übertragen
Dim Offset_div As Integer
Offset_div = WorksheetFunction.CountIf(Range(Selection, Selection.Offset(0, 100)), "*") 'Zählt
aufgeteilte Wörter
Range("C" & iIndx).Select 'Wählt Zelle in Spalte "Attribute" aus
Range(Selection.Offset(1, 0), Selection.Offset(Offset_div, 0)).Select
'Wählt entsprechend der aufgeteilten Wörter, eine Anzahl an Zeilen aus
Selection.EntireRow.Insert 'Fügt entsprechende Anzahl Zeilen ein
Range("C" & iIndx).Select
Range(ActiveCell, ActiveCell.Offset(0, Offset_div - 1)).Copy
'Kopiert Zellen mit aufgeteilten Wörtern
ActiveCell.Offset(1, -1).Select
Selection.PasteSpecial Transpose:=True
'Transponiert Auswahl in die nächste Zelle unter "Baum xyz"
Next iIndx ' nächste Zeile

Wenn ich den Code ausführe, kommt folgendes raus:

WaldNr	Baum	Attribute (getrennt durch Kommata)
Wald1	Baum x	Der	Baum	steht	da
Der
Baum
steht
da
Wald2	Baum y	Der,Baum,steht,da,schon,ganz,lange
bla	bla	bla,bla,bla

Das ist vermutlich keine sehr elegante Lösung (wie gesagt, habe gerade erst mit VBA angefangen...), aber ich sehe noch nicht ganz dahinter, warum nach "Der" in der "Baum"-Spalte noch einmal Zeilen eingfügt werden. Eigentlich sollte doch die Variable 'Offset_div'=0 werden, wenn die nächste Zeile aufgerufen wird, da ab der 'Attribut'-Spalte keine Zellen mehr Inhalt haben...
Ich wäre äußerst froh, wenn mir hier jemand weiterhelfen könnte.
Danke und viele Grüße
Heiner

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Schleife bleibt hängen
14.08.2015 15:13:08
Heiner
NACHTRAG:
.
Der Code sieht folgendermaßen aus:

Range("C" & iIndx).Select 'Wählt Zelle in Spalte "Attribute" aus
Dim Offset_div As Integer
Offset_div = WorksheetFunction.CountIf(Range(Selection, Selection.Offset(0, 100)), "*")
'Zählt aufgeteilte Wörter
Die entsprechende Zeile nach dieser Sequenz entfällt dann...

benutze split() und ein array
14.08.2015 16:16:36
Michael
Hi Heiner,
schau Dir bitte mal das da an:
Sub machen()
Dim von&, bis&, i&, j&
Dim t As Variant, tLen&
von = 2
bis = Range("C" & Rows.Count).End(xlUp).Row
i = bis
While i >= von
t = Split(Range("C" & i).Value, ",")
tLen = UBound(t)
Rows(i + 1 & ":" & tLen + i + 1).Insert
For j = 0 To tLen
Range("B" & i + j + 1).Value = t(j)
Next
i = i - 1
Wend
End Sub
Schöne Grüße,
Michael

Anzeige
AW: benutze split() und ein array
14.08.2015 16:47:16
Heiner
Oha...so gehts also auch...das funktioniert hervorragend! Danke! Ich versuche gerade noch nachzuvollziehen, was da passiert. Könntest du eventuell noch ein paar Kommentare zum Code schreiben?
Danke nochmal
Heiner

AW: benutze split() und ein array
14.08.2015 17:28:57
Michael
Hi Heiner,
das "bis" hast Du ja "genauso" ermittelt, aber Rows.Count ist die unterste Zeile des Blatts, das tut immer.
t als Variant wird durch die Zuweisung mit Split zu einem Array, das die einzelnen Häppchen enthält; Split steht in der Hilfe natürlich auch...
tLen (bzw. UBound) ermitteln die "Länge" des Arrays, also die *Anzahl* der Häppchen.
Rows.xxx.Insert fügt die Anzahl der Zeilen ein, errechnet aus i+1, also der Zeile direkt unterhalb der, die gerade bearbeitet wird, und tLen + i +1, also der Anzahl der Werte im Array + die Zeile, bei der wir beginnen (nämlich i + 1).
Die For-Schleife fügt an der jeweiligen Position in der Spalte B den jeweiligen Wert des Arrays ein, beginnend bei 0. Aus Bla,bla,bla wird also: t(0) ist "Bla", t(1) ist "bla" usw.
Excel macht hier eine automatische Typkonvertierung, d.h. aus Spalte "B" und der Zahl 2 wird durch die Addition innerhalb der Range() dann automatisch aus "B" & 2 dann "B2" (genau, das & ist der Operator, mit dem man Zeichenfolgen aneinanderhängt).
Bei dem Rows.xxx.Insert ist das ganz genauso.
Happy Exceling,
Michael
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige