Makro Zellen löschen in ausgewählten Tabellen

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

Moderator: Moderatoren

ver_calced
Beiträge: 7
Registriert: Di, 17.07.2018 08:14

Makro Zellen löschen in ausgewählten Tabellen

Beitrag von ver_calced » Di, 17.07.2018 11:35

Hallo, ich möchte folgendes Makro

Code: Alles auswählen

Sub loeschen

Tabelle = ThisComponent.getCurrentController.getActiveSheet
Bereich = Tabelle.getcellrangebyname("b8:af35")
Bereich.clearContents(12)

End Sub
so erweitern, das der Bereich nicht nur auf dem aktuellen Datenblatt gelöscht wird, sondern auf den Tabellen Januar-Dezember.
Natürlich funktioniert das über eine Schleife, ich weiß allerdings nicht wie ich den/die Tabellennamen auslesen kann.

Mit besten Grüßen,

ver_calced

LIbreOffice Version: 4.3.7.2 (CALC)

Gast

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von Gast » Di, 17.07.2018 15:06

Ich hab's über die Funktion Makro aufzeichnen gelöst, dennoch würde mich interessieren, ob man dies nicht doch über eine Schleife lösen, kann,
der Makro Recorder liefert grauenhaften Code.

Stephan
********
Beiträge: 10594
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von Stephan » Mi, 18.07.2018 07:40

ich weiß allerdings nicht wie ich den/die Tabellennamen auslesen kann.
Ich verstehe nicht wozu Du die Tabellennamen auslesen willst, denn diese sind doch bekannt. Das Auslesen ginge aber prinzipiell so:

Code: Alles auswählen

For i = 0 To ThisComponent.Sheets.Count-1
   Msgbox ThisComponent.Sheets(i).Name
Next i
dennoch würde mich interessieren, ob man dies nicht doch über eine Schleife lösen, kann,
Ein entsprechendes Makro sähe z.B. so aus:

Code: Alles auswählen

tn = Array("Januar","Februar","März") 'ergänze selbst bis DEzember
For i = 0 To UBOUND(tn())
	Tabelle = ThisComponent.Sheets.getByName(tn(i))
	Bereich = Tabelle.getcellrangebyname("b8:af35")
	Bereich.clearContents(12)
Next i
Falls das Dokument ohnehin nur die Tabellen Januar-Dezember enthält geht das auch einfacher:

Code: Alles auswählen

For i = 0 To ThisComponent.Sheets.Count-1
	Tabelle = ThisComponent.Sheets(i)
	Bereich = Tabelle.getcellrangebyname("b8:af35")
	Bereich.clearContents(12)
Next i


Gruß
Stephan

ver_calced
Beiträge: 7
Registriert: Di, 17.07.2018 08:14

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von ver_calced » Mi, 18.07.2018 09:07

Perfekt, Stephan, mit "Tabellennamen auslesen" habe ich mich vermutlich falsch ausgedrückt,
konkret soll das Makro nur Inhalte in bestimmten Tabellen löschen. Damit kommt die Lösung per Array der Sache sehr nah und funktioniert auch.
Besten Dank dafür.

Stephan
********
Beiträge: 10594
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von Stephan » Mi, 18.07.2018 09:14

Damit kommt die Lösung per Array der Sache sehr nah und funktioniert auch.
es wäre dann möglich ohne das Array auszukommen wenn Du die Monatswerte aus Extras-Optionen-Calc-Sortierlisten ausliest (deutschsprachiges Calc vorausgesetzt), ich weiß nur im Moment nicht wie ich da per Makro rankomme. Vielleicht weiß es sonst jemand und kann es hier posten.


Gruß
Stephan

ver_calced
Beiträge: 7
Registriert: Di, 17.07.2018 08:14

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von ver_calced » Mi, 25.07.2018 13:31

Hallo, ich möchte auch erreichen dass mittels Makro Zellen (Zeilen) ab einem bestimmten Datum
aus einer anderen Tabelle gelöscht werden können, praktische Anwendung:

In einem Schichtplan wird eingetragen, dass ein Mitarbeiter zum 9.1.2018 austritt, bestehende Inhalte vor dem Datum sollen erhalten bleiben
nachfolgende Zelleninhalte (Januar-Dezember) sollen gelöscht werden. Per bedingter Formatierung habe ich das hinbekommen,

Nachteil einer bedingten Formatierung:

-andere Formatierungen aus bedingten Formatierungen werden nicht überschrieben.

Hat jemand hierzu eine Idee? Beispieldatei:
test.ods
(11.51 KiB) 23-mal heruntergeladen
Oder ist es möglich, einen ClearContents(aktuelle Zelle) Befehl in eine bedingte Formatierung einzubauen?

Danke im Voraus.

Benutzeravatar
balu
********
Beiträge: 3649
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von balu » Do, 26.07.2018 02:24

Hallo ver_calced,

es wäre ungemein nützlich zu wissen wie die Tabellenblätter organisiert sind. Denn richtig organisiert erleichtert das die Programmierung ungemein.

Beispiel:
Wenn die Blätter wie folgt aufgebaut sind

Code: Alles auswählen

Verwaltung	Januar	Februar März ... Dezember	und noch eins
oder

Code: Alles auswählen

Januar	Februar März ... Dezember	und noch eins
dann lässt sich das mit dem löschen eigentlich recht einfach handhaben. Jedoch dürfte dann alerdings zwischen den einzelnen Monatsblättern kein weiteres mehr dazwischen stehen.
Also das hier wäre murks.

Code: Alles auswählen

Januar	BlattX	Februar März BlattY	... Dezember	und noch eins
Es erleichtert die Arbeit sehr, wenn alle Monatsblätter der Reihe nach ohne Unterbrechung angereiht sind.

Also wie sieht das bei dir nun aus?



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D

ver_calced
Beiträge: 7
Registriert: Di, 17.07.2018 08:14

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von ver_calced » Do, 26.07.2018 10:28

Hallo Balu,

ich hab noch eine Testdatei gebastelt, mein Versuch mit der bedingten Formatierung ist enthalten,
Wenn die bedingte Formatierung wahr ist, wird die Formatvorlage richtig angezeigt, nur der vorhandende Wert wird nicht überschrieben.
Daher dachte ich, dass die Lösung hier eher in einem Makro liegt. Mit einer bedingten Formatierung kann ich ebenso leben, das wäre dann aber ein
anderes Thema im Forum.

Wie auch immer, freue mich über jede Anregung.

Passwort für Zellschutz ist "test"

Libreoffice Calc 5.1.6.2
Dateianhänge
test2.ods
(20.69 KiB) 23-mal heruntergeladen

Benutzeravatar
balu
********
Beiträge: 3649
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von balu » Fr, 27.07.2018 00:04

Hallo,

also bei der Hitze mag man ja gar nix machen. Aber dennoch habe ich da einen Vorschlag für dich erstellt.

WICHTIG!!!
Es kann nur ein Mitarbeiter auf einmal gelöscht werden!
Sollen mehrere gelöscht werden, so muss erst für den ersten die Löschung vollzogen werden, dann das Austrittsdatum entfernt werden, ein neues Datum für einen anderen Mitarbeiter eingetragen werden und anschließend ein erneuter Durchgang gestartet werden.

Es werden nur die Einträge im Kalenderbereich gelöscht, der Mitarbeitername bleibt momentan unberührt.


Kurze Erklärung zum Makro. Nur im groben.

Im Blatt *Administation* wird das Löschdatum aus dem Zellbereich B3:B9 gesucht. Und wenn ein Eintrag vorhanden ist, wird das Datum aufgeteilt.
Der Tag ist die Spalte ab wann gelöscht wird.
Der Monat ist das dementsprechende Monatsblatt. Aber nicht als Name, sondern als Nummer!
Da ein Monat maximal 31 Tage haben kann, ist damit auch die Endspalte schon vorgegeben bis wohin im Monatsblatt gelöscht wird.

Da das Austritsdatum ja parallel zu dem Austrittsmitarbeiter steht, ist somit auch die Löschzeile vorhanden.

Die Löschroutine ist in 2 Schritten aufgeteilt.
1.
Als erstes wird der angegebene Austrittsmonat ab dem Austrittsdatum bis zur Endspalte abgearbeitet.

2.
Jetzt werden alle Monatsblätter die eine größere Monatsnummer als der Austrittsmonat haben, und eine kleinere oder gleich große Monatsnummer wie das letzte Monatsblatt haben vom ersten bis zum letzten Tag gelöscht.

Um zu demonstrieren das dies 2 Schritte-System funktioniert, habe ich den Austrittsmonat nicht auf Januar, sondern auf März gelegt. Denn dadurch ist ersichtlich, das alle Monate BIS zum Austrittsmonat unberührt bleiben.
Natürlich kannst Du auch wieder ein Datum im Januar eingeben. Das macht dem Makro überhaupt nix aus.


Testinfo!
Ich kann nur in der LO 5.1.5.2 die Datei gegentesten, obwohl ich in einer bedeutend älteren und anderen OpenOffice Version das Makro erstellt habe. Aber ich kann sagen, das es in der genannten LO Version funktioniert.

Wenn Du die Datei geöffnet hast, brauchst Du nur den roten Button drücken. Und da es sich ja um eine sehr kleine Datei, mit sehr wenig Daten handelt, bekommst Du nach 1 oder 2 Sekunden eine Rückmeldung: "Der Löschvorgang ist erledigt."



Gruß
balu
Dateianhänge
test2_balu_1.ods
(18.39 KiB) 23-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D

ver_calced
Beiträge: 7
Registriert: Di, 17.07.2018 08:14

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von ver_calced » Fr, 27.07.2018 08:31

Balu, was soll ich sagen, absolut genial. Perfekt, Danke.
Kleiner Hinweis am Rande, das Makro wird in LO 5.1.6.2 nur ausgeführt,
wenn in den Sicherheitsoptionen der Sicherheitslevel auf "Mittel" heruntergesetzt wird.
gleiches gilt für OO 4.1.3, das Makro wurde auch hier erfolgreich getestet.

Damit kann das Thema geschlossen werden.

Beste Grüße, Tim

ver_calced
Beiträge: 7
Registriert: Di, 17.07.2018 08:14

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von ver_calced » Fr, 27.07.2018 11:23

Bisschen offtopic, aber was ändert sich im Makro, wenn ich in den Monatsbättern (Januar-Dezember)
noch ein paar Zeilen einfüge oberhalb einfüge, also der Bereich a1:af6 um 6 Zeilen nach unten verschoben wird?
Damit der gleiche Bezug erhalten bleibt, habe ich in der Tabelle "Administration" ebenfalls 6 Zeilen eingefügt und den Bereich im Makro in der Variable oZelllbereich angepasst. Für mein Verständnis ist das Array damit das gleiche wie vorher, d.h. die erste Schleife wird so oder so entsprechend durchlaufen?

Das Makro arbeitet (fast) richtig, jedoch wird bei einem Testlauf nicht der richtige Bereich gelöscht.

Grüße, Tim

Benutzeravatar
balu
********
Beiträge: 3649
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von balu » Fr, 27.07.2018 15:47

Hallo Tim,
Bisschen offtopic
Das ist ganz und gar nicht offtopic!

aber was ändert sich im Makro
Falsche Frage.
Richtig muss das lauten: "Was muss ich* im Makro ändern?"

Mit ich* bist Du gemeint.

wenn ich in den Monatsbättern (Januar-Dezember)
noch ein paar Zeilen einfüge oberhalb einfüge
Tja, jetzt wirds kompliziert, wenn das Zeilen sind die nichts mit der Namensliste zu tun haben.

Damit der gleiche Bezug erhalten bleibt, habe ich in der Tabelle "Administration" ebenfalls 6 Zeilen eingefügt und den Bereich im Makro in der Variable oZelllbereich angepasst.
Beides ist so weit Okay.

Für mein Verständnis ist das Array damit das gleiche wie vorher, d.h. die erste Schleife wird so oder so entsprechend durchlaufen?
Wenn der Zellbereich beispielsweise von B3:B9 auf B9:B15 geändert wird, ist das Array wohl gleich groß. Doch das ist längst noch nicht alles.

Das Makro arbeitet (fast) richtig, jedoch wird bei einem Testlauf nicht der richtige Bereich gelöscht.
Das ist ja auch richtig so, das mit den paar winzig kleinen Änderungen ein falscher Bereich gelöscht wird. Denn ein wenig mehr Verständnis über die Programmierung gehört schon dazu.

Da ja schon in deiner letzten Beispieldatei eine Zeilendifferenz mit der Namensliste im Tabellenblatt *Administration* und den einzelnen Monatsblättern existierte, musste ich diese Differenz irgendwie ausgleichen.

Schauen wir uns noch mal den Zellbereich der Namenslisten etwas genauer an.
Im Blatt *Administration* war er von A3 bis A8.
Im Monatsblatt ging er aber von A2 bis A7.
Wie unschwer zu erkennen, ist da 1 (in Worten: Eine) Zeile unterscheid vorhanden. Und diese eine Zeile differenz muss ausgeglichen werden, damit auch die richtige Zeile glöscht wird. Findet kein ausgleich statt, dann wird in den Monatsblättern z.B. nicht der Inhalt der Zeile 4 gelöscht, sondern der der Zeile 3.

Und diesen ausgleich habe ich mit iTempZeile +1 in der folgenden Codezeile geregelt.

Code: Alles auswählen

ThisComponent.Sheets(i).getCellRangeByPosition(iTagesSpalte, iTempZeile +1, 31, iTempZeile +1).clearContents(12)
Und auch in dieser Codezeile.

Code: Alles auswählen

ThisComponent.Sheets(i).getCellRangeByPosition(1, iTempZeile +1, 31, iTempZeile +1).clearContents(12)
Um jetzt die geänderte Startadresse, alt war ja A3 und aktuell ist sie bei dir A9, anzupassen, muss der Zähler für iTempZeile um genau die verschobenen Zeilen erhöht werden. Also musst Du in den beiden gezeigten Codezeilen den Zähler erhöhen, und zwar auf iTempZeile +7.

Damit müsste dein Problem gelöst sein, und es wird die richtige Zeile gelöscht.

Wenn Du anschließend den Bereich aber vergrößern willst, dann brauchst Du nur noch den Zellbereich in der Variablen oZelllbereich dementsprechend anzupassen, mehr nicht.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D

ver_calced
Beiträge: 7
Registriert: Di, 17.07.2018 08:14

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von ver_calced » Mo, 30.07.2018 07:34

Super Balu, jetzt habe ich es verstanden. Besten Dank für die Hilfe.

Grüße, Tim

Benutzeravatar
balu
********
Beiträge: 3649
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro Zellen löschen in ausgewählten Tabellen

Beitrag von balu » Di, 31.07.2018 16:32

Freut mich das ich helfen konnte. 8)



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D

Antworten