bestimmte blätter löschen

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

Moderator: Moderatoren

kannenklaus
*****
Beiträge: 319
Registriert: Mi, 14.12.2005 08:08
Wohnort: freising - oder dort, wo das bier herkommt

bestimmte blätter löschen

Beitrag von kannenklaus »

hallo

ich will alle blätter bis auf des erste mit dem index 0 löschen. hierzu habe ich folgendes makro verwendet. meine frage ist nun, ob es auch eleganter gelöst werden kann.

Code: Alles auswählen

sub BlaetterLoeschen
Dim i as integer, BlattAnz as integer
Dim s as string
BlattAnz=thisComponent.sheets.count-1
'--mit Ausnahme des ersten alle Blätter löschen
	for i = 1 to BlattAnz
		if thisComponent.sheets.count=0 then exit for
		s=thisComponent.sheets(i).name
		with thisComponent
			.Sheets.RemoveByName(s)
			BlattAnz=thisComponent.sheets.count-1
		end with
		i=i-1

	next
end sub
danke klaus
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: bestimmte blätter löschen

Beitrag von komma4 »

Eine Calc Datei muss immer ein Tabellenblatt haben - beim Versuch das letzte zu löschen bekommst Du einen Fehler.

Ansonsten kannst Du doch auch über den Index löschen:

Code: Alles auswählen

anzSheets = ThisComponent.Sheets.Count 
If anzSheets > 1 then
  for i = (anzSheets - 1) to 1 step by - 1
    ThisComponent.Sheets.removeByIndex( i )
  next i
End If
Zählweise "von hinten", damit intern der Index stimmt, wenn gelöscht wurde.
Alles klar?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: bestimmte blätter löschen

Beitrag von Stephan »

ob es auch eleganter gelöst werden kann
ja, weil ein For-Next unelegant ist wenn es um eine eigentlich unbestimmte Anzahl von Wiederholungen geht.
Beispielsweise ist ein Do-Loop für diesen Zweck passender, da die Anzahl der Blätter bei Start des Makros auch 1 sein kann, sollte das Do-Loop kopfgesteuert(*) sein:

Code: Alles auswählen

Sub BlaetterLoeschen2()
With ThisComponent
	Do While .sheets.count-1 > 0
		.Sheets.RemoveByName(.sheets(.sheets.count-1).name)
	Loop
End With
End Sub


(*)
umganssprachlich heißt sowas wie:

Code: Alles auswählen

Do While <Bedingung>
	'...
Loop
kopfgesteuert, und sowas wie:

Code: Alles auswählen

Do
	'...
Loop While <Bedingung>


fußgesteuert

Ansonsten kannst Du doch auch über den Index löschen:
.RemoveByIndex finde ich nirgens als Methode für diesen Zweck und es läuft hier auch nicht




Gruß
Stephan
kannenklaus
*****
Beiträge: 319
Registriert: Mi, 14.12.2005 08:08
Wohnort: freising - oder dort, wo das bier herkommt

Re: bestimmte blätter löschen

Beitrag von kannenklaus »

hallo stefan und winfried,

stefan hat recht. die methode removeByIndex hätte ich zwar auch erwartet. aber xray zeigt, dass es die nicht gibt. der code von stefan läuft bestens.

danke an euch beiden.

gruß klaus
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: bestimmte blätter löschen

Beitrag von komma4 »

Schäm!
Vor dem Frühstück "aus dem hohlen Bauch" heraus geantwortet - ohne in der Doku nachzusehen....

Stephan hat natürlich recht: bei den sheets gibt's keine Methode removeByIndex
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
gschuckar
****
Beiträge: 140
Registriert: Fr, 24.02.2006 14:27

Re: bestimmte blätter löschen

Beitrag von gschuckar »

Hallo,
wenn die Sheets noch keinen anderen Namen haben, als den, den ooffice vorgibt (z.Bsp. Tablle1,Tabelle2, etc),
dann mache ich das so:

Code: Alles auswählen

private function delSystemSheets() as boolean
dim oDoc as Object	
dim oSheets as Object
	dim i as integer
	oDoc = thisComponent
	oSheets = oDoc.getSheets()
	' i kann auch 2 oder jeden anderen Wert haben,
' je nachdem, wieviel Sheets bleiben sollen
	for i = 1 to oSheets.getCount()
		if oSheets.hasByName("Tabelle" & i) then
			oSheets.removeByName("Tabelle" & i)
		end if	
	next
	delSystemSheets = true
end function	' delSystemSheets
Hilft das ein wenig weiter?
Gruß
Gerd
Antworten