[Calc] Löschen einer Spalte

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

Moderator: Moderatoren

sucher3000
**
Beiträge: 25
Registriert: Sa, 07.03.2015 10:58

[Calc] Löschen einer Spalte

Beitrag von sucher3000 »

Hallo zusammen!

Ich habe eine Tabelle zum Erfassen von firmeninternen Anrufen, ähnliches eines Ticketssystems.
(weitere Posts zu der Tabelle *hier* und *hier*)

Hierbei werden kurzzeitig die Namen der Anrufer gespeichert, um an diese im Anschluss an das Telefonat eine Umfrage verschicken zu können.
Das findet der Datenschutz aber nicht so gut, sodass er fordert dass alle Namen gelöscht werden.


Ich brauche nun ein Makro, dass in dem gerade aktiven Tabellenblatt alle Inhalte in Spalte G nach Zeile 4 löscht, wenn ich das Dokument speichere.

Das Speichern als Auslöser kann ich über Extras --> Anpassen ja einstellen - kein Problem.

Ich hab mittels Makro-Rekorder folgendes funktionierende Marko erstellt:

Code: Alles auswählen

Sub RemoveNamePlain
Dim document   as Object
Dim dispatcher as Object

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$G$5:$G$1003"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

dispatcher.executeDispatch(document, ".uno:ClearContents", "", 0, Array())
End sub
Allerdings habe ich mich gefragt, ob es da nicht einen schlankeren und einfacheren Weg gibt, zu mal bei meiner jetztigen Lösung danach immer die gesamte Spalte G markiert ist und vor allem in allen Tabellenblättern (und nicht nur in dem aktiven) die Inhalte der Spalte G gelöscht werden.

Ich habe weiterhin noch Tabellenblätter zur Auswertung, die ich mittels Tabellenschutz vor dem Löschen der Spalte G schützen will.


Vielen Dank bereits im Voraus - vor allem an clag ;)

Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören; Betreff angepasst
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Marko zum Löschen einer Spalte

Beitrag von clag »

Moin sucher3000

also mit dem Speichern verknüpfen und das auf das gerade aktive Tabellenblatt anwenden,
dürfte ziemlich schnell zu einem unerwünschten Löschen-Unfall führen.
Besser wäre du würdest die Tabelle mit dem Namen ansprechen, dann kann es keine Unfälle geben.

hier ein Code der in der aktuellen Tabelle löscht

Code: Alles auswählen

sub DeleteG 
	oCalc=thisComponent
	sAktSheet = oCalc.getCurrentSelection().Spreadsheet.Name
	mySheet = oCalc.Sheets.getByName(sAktSheet)
	oCellRange=mySheet.getCellRangeByPosition(6,5,6,1003)
	oCellRange.clearContents(com.sun.star.sheet.CellFlags.STRING '_
'                         +com.sun.star.sheet.CellFlags.VALUE_
'                         +com.sun.star.sheet.CellFlags.DATETIME)
	oCalc.store()
end sub
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
sucher3000
**
Beiträge: 25
Registriert: Sa, 07.03.2015 10:58

Re: Makro zum Löschen einer Spalte

Beitrag von sucher3000 »

Danke zunächst clag!

Meinst du mit einer Wenn-Bedingung am Anfang des Markos könnte das Behoben werden?

Dachte jetzt spontan an sowas:

Code: Alles auswählen

Wenn --> aktives Tabellenblatt = "Jan.", "Feb." "Mrz." ... 
Dann --> restliches Makro
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makro zum Löschen einer Spalte

Beitrag von clag »

hallo sucher3000

hängt von deiner Datei ab, wie viele Tabellen enthalten in denen gelöscht werden soll
vielleicht ist es einfacher das Makro zu beenden wenn eine Tabelle aktiv ist in der nicht gelöscht werden darf.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: Makro zum Löschen einer Spalte

Beitrag von Karolus »

Hallo

@clag: bitte Zeile 4 entfernen, und Zeile 3 ersetzen durch:

Code: Alles auswählen

mySheet = oCalc.getCurrentSelection().Spreadsheet
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makro zum Löschen einer Spalte

Beitrag von clag »

Hallo Karolus,

Danke für die Optimierung,

hier hatte ich diese Variante gewählt damit "sucher3000" eventuell
zeile 3 löscht/auskommentiert und in 4 direkt seinen Tabellennamen einträgt

Code: Alles auswählen

 
'   sAktSheet = oCalc.getCurrentSelection().Spreadsheet.Name
   mySheet = oCalc.Sheets.getByName("seinTabellenblatt")
aber wenn nun zuvor geprüft werden soll welche Tabelle aktive ist,
dann ist dein Code auf jeden Fall der elegantere Weg.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makro zum Löschen einer Spalte

Beitrag von clag »

Hallo sucher3000

hier ein Makro mit positiv Prüfung also in welchen Tabellen gelöscht werden darf
es wird aber nur in der aktuellen Tabelle gelöscht,

Code: Alles auswählen

sub DeleteG 
	oCalc=thisComponent
	mValidSheets = Array("Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez")  
	for i=0 to ubound(mValidSheets)
		if oCalc.getCurrentSelection().Spreadsheet.Name = mValidSheets(i) then 
			mySheet = oCalc.Sheets.getByName(mValidSheets(i))
			oCellRange=mySheet.getCellRangeByPosition(6,5,6,1003)
			oCellRange.clearContents(com.sun.star.sheet.CellFlags.STRING
		end if
	next	
end sub
edit :
veränderst du die if Abfrage etwas, wird in allen gelisteten Tabellenblättern gelöscht sofern sie existieren
(meint, das nicht vorhanden sein einer der genannten Tabellen führt nicht zu einer Fehlermeldung
du kannst nur mit "Jan" anfangen und die anderen Tabellen nach und nach hinzufügen)

vielleicht gefällt das eurem Datenschutzbeauftragten ja noch viel besser ;)

Code: Alles auswählen

sub DeleteG 
	oCalc=thisComponent
	mValidSheets = Array("Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez")  
	for i=0 to ubound(mValidSheets)
		If oCalc.Sheets.hasByName(mValidSheets(i)) then
			mySheet = oCalc.Sheets.getByName(mValidSheets(i))
			oCellRange=mySheet.getCellRangeByPosition(6,5,6,1003)
			oCellRange.clearContents(com.sun.star.sheet.CellFlags.STRING
		end if 
	next	
end sub
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
sucher3000
**
Beiträge: 25
Registriert: Sa, 07.03.2015 10:58

Re: [Calc] Löschen einer Spalte

Beitrag von sucher3000 »

Guten Morgen clag!

Ich habe mich für die zweite Varainte entschieden. Die funktioniert auch sehr gut - vielen Dank dafür!

Kannst du mir dennoch den Unterschied der beiden folgenden Zeilen erklären?

Code: Alles auswählen

if oCalc.getCurrentSelection().Spreadsheet.Name = mValidSheets(i) then 
und

Code: Alles auswählen

if oCalc.Sheets.hasByName(mValidSheets(i)) then
Für mich sehen beide so aus, als würden sie einfach prüfen ob das aktive Tabellenblatt einen der zuvor aufgeführten Namen hat. Wo genau liegt denn der Unterschied?
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: [Calc] Löschen einer Spalte

Beitrag von Stephan »

Code: Alles auswählen

if oCalc.getCurrentSelection().Spreadsheet.Name = mValidSheets(i) then


entspricht der Name (.Name) des Tabellenblattes (.Spreadsheet) auf welchem sich die aktuelle Selection (.getCurrentSelection() -->Zelle, Zellbereich, mehrere Zellbereiche) befindet dem Inhalt von mValidSheets(i) dann ...

Code: Alles auswählen

if oCalc.Sheets.hasByName(mValidSheets(i)) then
gibt es unter allen Tabellenblättern (.sheets) des aktuellen Tabelldokuments (oCalc mit: oCalc=thisComponent) ein Blatt dessen Name (.hasByName) dem Inhalt von mValidSheets(i) entspricht dann ...


Gruß
Stephan
sucher3000
**
Beiträge: 25
Registriert: Sa, 07.03.2015 10:58

Re: [Calc] Löschen einer Spalte

Beitrag von sucher3000 »

Dankeschön!
Antworten