Seite 1 von 1
[gelöst] CALC: bestimmte Zeilen per Macro löschen
Verfasst: Mi, 02.05.2012 11:59
von theindless
Hallo,
ich habe eine Datei, in welcher ich alle Zeilen löschen will, in denen in Spalte B nichts steht.
Folgenden Code habe ich derzeit erstellt:
Code: Alles auswählen
REM ***** BASIC *****
Sub RowDelete
Dim i as Integer
oDoc = ThisComponent
oSheets = oDoc.Sheets
oSheet = oSheets.getbyName("Daten")
oRows = oSheet.getRows
For i = 3 to 100
oCell = oSheet.getCellByPosition(1,i)
if oCell.Type = 0 Then oRows.removeByIndex(i,1)
Next i
End Sub
Der Code funktioniert soweit auch, jedoch habe ich das Problem, dass bei 2 aufeinander folgenden Zeilen, die gelöscht werden sollten, dies natürlich nicht funktioniert, da das nächste i geprüft wird.
Bsp.:
Er prüft Zeile 4 und stellt fest, Zelle B4 ist leer => Zeile wird gelöscht; Zeile 5 wird zu Zeile 4
Wenn die neue Zeile 4 aber auch zu löschen wäre, funktioniert das nicht, da i ja nun 5 ist.
Ich habe auch folgenden Code probiert, der das Problem mit den 2 aufeinander folgenden Zeilen löst, sich aber tot läuft, d.h. ich muss das Macro manuell abbrechen
Code: Alles auswählen
Sub RowDelete
Dim i as Integer
oDoc = ThisComponent
oSheets = oDoc.Sheets
oSheet = oSheets.getbyName("Daten")
oRows = oSheet.getRows
Goto Start
Start:
For i = 3 to 100
oCell = oSheet.getCellByPosition(1,i)
if oCell.Type = 0 Then
oRows.removeByIndex(i,1)
Goto Start
End if
Next i
End Sub
Wie kann ich das lösen?
Danke für eure Hilfe.
theindless
Re: CALC: bestimmte Zeilen per Macro löschen
Verfasst: Mi, 02.05.2012 12:19
von Stephan
Wenn die neue Zeile 4 aber auch zu löschen wäre, funktioniert das nicht, da i ja nun 5 ist.
Nein, denn i "ist" nach Löschen der Zeile nicht 5 sondern wird erst,
völlig unabhängig vom Löschen der Zeile, 5 wenn es in der Code-Zeile:
erhöht wird.
Wie kann ich das lösen?
schreibe vor die Codezeile "Next i" die Zeile "i = i - 1":
Code: Alles auswählen
if oCell.Type = 0 Then
oRows.removeByIndex(i,1)
i = i - 1
End If
Next i
(sinnvollerweise würde man wohl zusätzlich jeweils die Obergrenze der Schleife um 1 verringen)
Gruß
Stephan
Re: CALC: bestimmte Zeilen per Macro löschen
Verfasst: Mi, 02.05.2012 12:38
von theindless
Hallo Stephan,
Danke für deinen Vorschlag.
Die von dir geschriebene Lösung hatte ich schon probiert, aber da der Code
nur eine Pauschal-Angabe war und viele Zeilen beinhaltet , in denen die Spalte B leer ist, bewirkt der Teil
wohl eine Endlos-Schleife, wenn die letzte Zeile leer ist (was bei mir immer der Fall ist).
Ich muss daher zuerst die letzte gefüllte Zelle in Spalte B ermitteln.
Ich habe dazu folgenden Code entworfen:
Code: Alles auswählen
Sub RowDelete
Dim i as Integer
oDoc = ThisComponent
oSheets = oDoc.Sheets
oSheet = oSheets.getbyName("Daten")
oRows = oSheet.getRows
For j = 3 to 100
oCell = oSheet.getCellByPosition(1,j)
if oCell.Type = 0 Then
x = x
Else x = x + 1
End if
next j
For i = 3 to x+2
oCell = oSheet.getCellByPosition(1,i)
if oCell.Type = 0 Then
oRows.removeByIndex(i,1)
i = i - 1
End if
Next i
End Sub
Das x+2 habe ich mit Trial-and-Error ermittelt.
Zuerst hatte ich x + 1 aber das hat nicht funktioniert.
Das könnte daran liegen, dass die letzte Zeile IMMER einen Wert in Spalte B hat, die vorletzte Zeile NIE einen Wert in Spalte B hat.
Oder denke ich hier falsch?
Danke!
Re: CALC: bestimmte Zeilen per Macro löschen
Verfasst: Mi, 02.05.2012 12:48
von Stephan
wohl eine Endlos-Schleife, wenn die letzte Zeile leer ist
unter anderem deswegen ich ja bereits darauf hingewiesen hatte das:
(sinnvollerweise würde man wohl zusätzlich jeweils die Obergrenze der Schleife um 1 verringen)
Also ungefähr (nicht getestet):
Code: Alles auswählen
x = 100
For i = 3 to x
'...
if oCell.Type = 0 Then
oRows.removeByIndex(i,1)
i = i - 1
x = x -1
End If
Next i
Gruß
Stephan
Re: CALC: bestimmte Zeilen per Macro löschen
Verfasst: Mi, 02.05.2012 13:57
von theindless
Hi Stephan,
danke für die Erklärung. Wusste nicht so genau, was du mit "Obergrenze der Schleife um 1 verringen" meintest.
Deine Lösung ist natürlich einfacher.
Nun muss ich in diese Datei mit ca. 1000 Zeilen diesen Code anwenden, dann für jede Zeile prüfen, ob das Datum ein Monatsultimo ist, ansonsten wieder eine Zeile einfügen aus einer weiteren Tabelle einen Wert eintragen, in Abhängigkeit vom Datum.
Ich glaub ich hab noch was vor mir...
Re: CALC: bestimmte Zeilen per Macro löschen
Verfasst: Mi, 02.05.2012 20:49
von Karolus
Hallo
Arbeite "rückwärts"
for i = 100 to 3 step -1
bla
next
Karo
Re: CALC: bestimmte Zeilen per Macro löschen
Verfasst: Mi, 02.05.2012 21:55
von theindless
Hallo Karolus,
danke für den Hinweis!
Ich habe mehrmals
For i = 100 to 3
probiert... aber des Step -1 war mir neu.
theindless
Re: [gelöst] CALC: bestimmte Zeilen per Macro löschen
Verfasst: Fr, 01.06.2012 13:42
von Karolus
Hallo
Was mache ich da falsch?
oRows.removeByIndex(i,12)
Du möchtest am index i nicht 1
2 Zeilen löschen sondern nur eine Zeile.
Karo
Re: [gelöst] CALC: bestimmte Zeilen per Macro löschen
Verfasst: Fr, 01.06.2012 14:14
von Karolus
Hallo
Hatte mich schon gewundert wieso man beim Zeilenindex die Spalte angebben muss =)
Wer hat denn geschrieben daß man den Spaltenindex angeben muss ??
SDK hat geschrieben:removeByIndex
void
removeByIndex( [in] long nIndex,[in] long nCount );
Description
deletes rows.
When the index or combination of index and count is out of bounds an exception will be thrown.
Parameter nIndex is the index of the first row to delete.
Parameter nCount is the number of rows to delete.
Karo