Seite 1 von 1

zeile mit bestimmten zellwerten löschen

Verfasst: Di, 25.04.2006 11:29
von kannenklaus
hallo ng,

mit dem folgenden makro will ich bestimmte zeilen löschen, wenn die zellen a1 bis a10 einen bestimmten wert haben. wird das makro ausgeführt, wird der löschvorgang nur in teilen vorgenommen. ist besser mit einer do/loop-schleife zu arbeiten?

Code: Alles auswählen

Sub SuWertLoescheZeile1
Dim oDoc, oSheet as Object
Dim str1 as String
Dim i as Integer
oDoc = ThisComponent
oSheet = oDoc.CurrentController.getActiveSheet
str1 = "wurst"
	for i = 0 to 9
	
		If oSheet.getCellByPosition(0, i).String = str1 then oSheet.Rows.removeByIndex(i,1)
		'If oSheet.getCellByName("A"&i).string = str1 then oSheet.Rows.removeByIndex(i,1)
	
	
	next i
end Sub
freue mich auf eine antwort

klaus

Verfasst: Di, 25.04.2006 13:11
von Stephan
wird der löschvorgang nur in teilen vorgenommen.
ja
ist besser mit einer do/loop-schleife zu arbeiten?
aber nicht wegen dem teilweisen Löschvorgang, obwohl mein Code nun in Do-Loop ist

Der Fehler ist das Du nicht beachtest das sich die Zählung beim Löschen ändert.
Beispiel:
A1 und A2 enthalten "wurst", beim ersten Durchlauf i = 0 wird "wurst" in A1 erkannt und Zeile 1 gelöscht, nun ist aber die ehemalige Zeile 2 plötzlich Zeile 1. Das "wurst" in der nun neuen Zeile 1 wird jedoch niemals gefunden weil garnicht danach gesucht wird denn im nächsten Schleifendurchlauf ist i bereits 1.

Probiere sowas:

Code: Alles auswählen

Sub SuWertLoescheZeile1 
Dim oDoc, oSheet as Object 
Dim str1 as String 
Dim i as Integer 
oDoc = ThisComponent 
oSheet = oDoc.CurrentController.getActiveSheet 
str1 = "wurst" 
i = 0
j = 9
Do
	If oSheet.getCellByPosition(0, i).String = str1 then 
		oSheet.Rows.removeByIndex(i,1)
		j = j - 1
	Else
		i = i + 1 
	End If
Loop While j >= i
end Sub

Gruß
Stephan

Verfasst: Di, 25.04.2006 13:43
von kannenklaus
hallo stephan
Der Fehler ist das Du nicht beachtest das sich die Zählung beim Löschen ändert.
dass hier der fehler liegt war mir klar. dank deines tippes klappt es nun. besten dank dafür!

grüße

klaus

Verfasst: Di, 25.04.2006 14:17
von Stephan
dass hier der fehler liegt war mir klar.
Naja, OK. Aber mal zur Verdeutlichung das Du nicht glaubst es hinge an Do-Loop, es geht mit For-Next genauso gut:

Code: Alles auswählen

Sub SuWertLoescheZeile1 
Dim oDoc, oSheet as Object 
Dim str1 as String 
Dim i as Integer 
oDoc = ThisComponent 
oSheet = oDoc.CurrentController.getActiveSheet 
str1 = "wurst"
j = 9 
for i = 0 to j 
	If oSheet.getCellByPosition(0, i).String = str1 then 
		oSheet.Rows.removeByIndex(i,1) 
		j = j - 1
		i = i - 1
	End If
next i 
end Sub
Der Wert des Schleifenzählers ist innerhalb der Schleife grundsätzlich ganz irrelevant soweit es dessen Steuerfunktion bezüglich der Schleife betrifft, erst wenn die Next-Zeile kommt wird der Wert der Variablen um die gegebene Schrittweite (hier 1 da nicht spezifiziert) erhöht, dann zum For gegangen und dort geschaut ob die Variable noch innerhalb des Bereichs liegt, wenn ja der Inhalt der Schleife abgearbeitet, sonst nach der Schleife fortgesetzt.
Heißt also beispielsweise das im Folgenden das Makro nie beendet wird, weil i nach dem For immer 0 ist und vor dem Next -1.

Code: Alles auswählen

Sub Test()
For i = 0 To 1
	i = i - 1
Next i
End Sub


Gruß
Stephan