[gelöst] CALC: bestimmte Zeilen per Macro löschen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

theindless
*****
Beiträge: 355
Registriert: So, 09.05.2010 12:37

[gelöst] CALC: bestimmte Zeilen per Macro löschen

Beitrag 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
Zuletzt geändert von theindless am Fr, 04.05.2012 10:37, insgesamt 1-mal geändert.
Lernbegieriger Nutzer mit (hoffentlich) steigendem Wissen
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: CALC: bestimmte Zeilen per Macro löschen

Beitrag 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
theindless
*****
Beiträge: 355
Registriert: So, 09.05.2010 12:37

Re: CALC: bestimmte Zeilen per Macro löschen

Beitrag 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!
Lernbegieriger Nutzer mit (hoffentlich) steigendem Wissen
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: CALC: bestimmte Zeilen per Macro löschen

Beitrag 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
theindless
*****
Beiträge: 355
Registriert: So, 09.05.2010 12:37

Re: CALC: bestimmte Zeilen per Macro löschen

Beitrag 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...
Lernbegieriger Nutzer mit (hoffentlich) steigendem Wissen
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: CALC: bestimmte Zeilen per Macro löschen

Beitrag von Karolus »

Hallo
Arbeite "rückwärts"
for i = 100 to 3 step -1
bla
next
Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
theindless
*****
Beiträge: 355
Registriert: So, 09.05.2010 12:37

Re: CALC: bestimmte Zeilen per Macro löschen

Beitrag 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
Lernbegieriger Nutzer mit (hoffentlich) steigendem Wissen
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: [gelöst] CALC: bestimmte Zeilen per Macro löschen

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: [gelöst] CALC: bestimmte Zeilen per Macro löschen

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Antworten