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:

Code: Alles auswählen

Next i
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

Code: Alles auswählen

For i = 3 to 100
nur eine Pauschal-Angabe war und viele Zeilen beinhaltet , in denen die Spalte B leer ist, bewirkt der Teil

Code: Alles auswählen

I = I - 1
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 12 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