von DPunch » Do, 17.03.2011 16:06
Aloha
Bergkaffee hat geschrieben:Mir ist aber nicht klar warum in der ersten Variante eine Endlosschleife entsteht. Kann mir jemand sagen warum das passiert?
Durch das Löschen der Zellen rutschen alle darunterliegenden Zellen jeweils eins hoch - ab einem gewissen Zeitpunkt rutschen dann vermutlich nur noch leere Zellen nach oben.
Nun hast Du z.B. ermittelt, dass bis zur Zeile 10 Daten vorhanden sind, davon 3 leere Zellen.
Die Zellen werden gelöscht, die Zellen darunter rutschen hoch, am Ende sind die Daten zusammengerückt auf die Zeilen 1-7. Dein Schleifenende liegt immer noch bei 10, Deine Schleife wird ab i=8 aber nur noch leere Zellen vorfinden, dadurch bei jedem Durchlauf wieder um 1 verringert, also auf 7, und dann wieder am Ende der Schleife auf 8 erhöht - usw.
Du müsstest bei Deinem Lösungsweg also auch immer die Abbruchbedingung (EZeile) um 1 verringern.
Aber die Lösung von Karolus ist die deutlich elegantere
Nachtrag:
Folgender Weg sollte schneller sein als das iterieren über alle Zellen:
Code: Alles auswählen
Sub LeereZeilen
dim PTab as object
dim ETab as object
dim i as Integer, EZeile as Integer, SZeile as Integer
thisComponent.lockControllers
PTab = thisComponent.Sheets().getByName( "Tabelle2" ) 'Punkttabelle auslesen
ETab = thisComponent.Sheets().getByName( "Tabelle1" ) 'Exporttabelle auslesen
EZImp = PTab.getCellRangeByName("H8").value 'Punktanzahl (=Zeilen und damit lezte Zeile) abfragen
EZeile = EZImp - 1 'Punktanzahl für byPosition aufbereiten
SZeile = 1 'Startzeile definieren
If EZeile < 1 Then
thisComponent.unlockControllers
Exit Sub
End If
oRange = ETab.getCellRangeByPosition(1,SZeile,1,EZeile)
oEmptyCells = oRange.queryEmptyCells.RangeAddresses
For i = UBound(oEmptyCells) To 0 Step -1
ETab.removeRange(oEmptyCells(i),com.sun.star.sheet.CellDeleteMode.ROWS)
Next i
thisComponent.unlockControllers
End Sub
Aloha
[quote="Bergkaffee"]Mir ist aber nicht klar warum in der ersten Variante eine Endlosschleife entsteht. Kann mir jemand sagen warum das passiert?[/quote]
Durch das Löschen der Zellen rutschen alle darunterliegenden Zellen jeweils eins hoch - ab einem gewissen Zeitpunkt rutschen dann vermutlich nur noch leere Zellen nach oben.
Nun hast Du z.B. ermittelt, dass bis zur Zeile 10 Daten vorhanden sind, davon 3 leere Zellen.
Die Zellen werden gelöscht, die Zellen darunter rutschen hoch, am Ende sind die Daten zusammengerückt auf die Zeilen 1-7. Dein Schleifenende liegt immer noch bei 10, Deine Schleife wird ab i=8 aber nur noch leere Zellen vorfinden, dadurch bei jedem Durchlauf wieder um 1 verringert, also auf 7, und dann wieder am Ende der Schleife auf 8 erhöht - usw.
Du müsstest bei Deinem Lösungsweg also auch immer die Abbruchbedingung (EZeile) um 1 verringern.
Aber die Lösung von Karolus ist die deutlich elegantere ;)
Nachtrag:
Folgender Weg sollte schneller sein als das iterieren über alle Zellen:
[code]Sub LeereZeilen
dim PTab as object
dim ETab as object
dim i as Integer, EZeile as Integer, SZeile as Integer
thisComponent.lockControllers
PTab = thisComponent.Sheets().getByName( "Tabelle2" ) 'Punkttabelle auslesen
ETab = thisComponent.Sheets().getByName( "Tabelle1" ) 'Exporttabelle auslesen
EZImp = PTab.getCellRangeByName("H8").value 'Punktanzahl (=Zeilen und damit lezte Zeile) abfragen
EZeile = EZImp - 1 'Punktanzahl für byPosition aufbereiten
SZeile = 1 'Startzeile definieren
If EZeile < 1 Then
thisComponent.unlockControllers
Exit Sub
End If
oRange = ETab.getCellRangeByPosition(1,SZeile,1,EZeile)
oEmptyCells = oRange.queryEmptyCells.RangeAddresses
For i = UBound(oEmptyCells) To 0 Step -1
ETab.removeRange(oEmptyCells(i),com.sun.star.sheet.CellDeleteMode.ROWS)
Next i
thisComponent.unlockControllers
End Sub[/code]