VBA Schleife bleibt hängen

Bild

Betrifft: VBA Schleife bleibt hängen
von: Heiner
Geschrieben am: 14.08.2015 14:52:56

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

Bild

Betrifft: AW: VBA Schleife bleibt hängen
von: Heiner
Geschrieben am: 14.08.2015 15:13:08
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...

Bild

Betrifft: benutze split() und ein array
von: Michael
Geschrieben am: 14.08.2015 16:16:36
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

Bild

Betrifft: AW: benutze split() und ein array
von: Heiner
Geschrieben am: 14.08.2015 16:47:16
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

Bild

Betrifft: AW: benutze split() und ein array
von: Michael
Geschrieben am: 14.08.2015 17:28:57
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

 Bild

Beiträge aus den Excel-Beispielen zum Thema "VBA Schleife bleibt hängen"