Zellschutz per Makro ändern

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

Zahnerer
**
Beiträge: 25
Registriert: Di, 20.02.2007 23:56

Zellschutz per Makro ändern

Beitrag von Zahnerer »

Hallo Freaks,

hat jemand eine Idee, wie man per Makro den Tabellenschutz aufhebt? Wenn ich in einer geschützten Tabelle eine geschützte Zelle in eine ungeschützte umwandeln will, fordert CALC das Passwort für die Tabelle an. Generell soll an der Tabelle nicht geändert werden können, deshalb die geschützten Bereiche. Nun soll der Nutzer aber per Button den einen Bereich freigeben und den anderen schützen können - und ebenso natürlich auch wieder zurück.

Ich habe folgendes probiert:

Code: Alles auswählen

sub FesteAbbuchungen
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args26(0) as new com.sun.star.beans.PropertyValue
args26(0).Name = "Protect"
args26(0).Value = false

dispatcher.executeDispatch(document, ".uno:Protect", "", 0, args26())


rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$B$20:$C$20"

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

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:ClearContents", "", 0, Array())

rem ----------------------------------------------------------------------
dim args2(4) as new com.sun.star.beans.PropertyValue
args2(0).Name = "BackgroundPattern.Transparent"
args2(0).Value = false
args2(1).Name = "BackgroundPattern.BackColor"
args2(1).Value = 16777215
args2(2).Name = "BackgroundPattern.URL"
args2(2).Value = ""
args2(3).Name = "BackgroundPattern.Filtername"
args2(3).Value = ""
args2(4).Name = "BackgroundPattern.Position"
args2(4).Value = com.sun.star.style.GraphicLocation.NONE

dispatcher.executeDispatch(document, ".uno:BackgroundPattern", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(3) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Protection.Locked"
args3(0).Value = true
args3(1).Name = "Protection.FormulasHidden"
args3(1).Value = false
args3(2).Name = "Protection.Hidden"
args3(2).Value = false
args3(3).Name = "Protection.HiddenInPrintout"
args3(3).Value = false

dispatcher.executeDispatch(document, ".uno:Protection", "", 0, args3())
rem ----------------------------------------------------------------------
dim args16(0) as new com.sun.star.beans.PropertyValue
args16(0).Name = "ToPoint"
args16(0).Value = "$B$9"

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

rem ----------------------------------------------------------------------
dim args17(4) as new com.sun.star.beans.PropertyValue
args17(0).Name = "BackgroundPattern.Transparent"
args17(0).Value = false
args17(1).Name = "BackgroundPattern.BackColor"
args17(1).Value = 13421823
args17(2).Name = "BackgroundPattern.URL"
args17(2).Value = ""
args17(3).Name = "BackgroundPattern.Filtername"
args17(3).Value = ""
args17(4).Name = "BackgroundPattern.Position"
args17(4).Value = com.sun.star.style.GraphicLocation.NONE

dispatcher.executeDispatch(document, ".uno:BackgroundPattern", "", 0, args17())

rem ----------------------------------------------------------------------
dim args18(3) as new com.sun.star.beans.PropertyValue
args18(0).Name = "Protection.Locked"
args18(0).Value = false
args18(1).Name = "Protection.FormulasHidden"
args18(1).Value = false
args18(2).Name = "Protection.Hidden"
args18(2).Value = false
args18(3).Name = "Protection.HiddenInPrintout"
args18(3).Value = false

dispatcher.executeDispatch(document, ".uno:Protection", "", 0, args18())

rem ----------------------------------------------------------------------
dim args25(0) as new com.sun.star.beans.PropertyValue
args25(0).Name = "Protect"
args25(0).Value = true

dispatcher.executeDispatch(document, ".uno:Protect", "", 0, args25())

end sub
Vielleicht hat jemand eine einfachere Methode parat, den Zellschutz zu ändern - bzw. vorallem eine Lösung, die funktioniert! 8)

Danke im Voraus für die Hilfe, Zahnerer
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Zellschutz per Makro ändern

Beitrag von Toxitom »

Hey Zahnender,

das, was du präsentierst, ist aufgezeichneter Code. Ohne Ahnung in OOo API (und in dem Fall Basic Code) kommst du allerdings hier nicht weiter.

Das Prinzip ist einfach:
Cellschutz ist eine Eigenschaft der Zelle (oder eines Zellbereichs) - und zwar als Objekt des Typs Struct: com.sun.star.util.CellProtection.
Typischerweise steht die "CellProtection" auf "isLocked" - also gesperrt, diese ist jedoch nur in Verbindung mit dem Blattschutz wirksam.
Um bspw eine Zelle vom Schreibschutz aufzuheben, sähe der Code vereinfacht so aus:

Code: Alles auswählen

...
osheet = thisComponent.getSheets().getByName("Tablelle1")  ' die Tabelle
oSheet.unprotect("meinPasswort")  'Tabellenschutz aufheben - PW kann auch ein leerer String sein
oZelle = oSheet.getCellrangeByName("A1")   'die Zelle A1
oCellSchutz = oZelle.CellProtection  'das Zellschutzobjekt
oCellSchutz.IsLocked = false   'Zellschutz aufheben
oZelle.CellProtection = oCellSchutz   'Zellschutzobjekt zurückschreiben
oSheet.protect("meinPasswort")   'Tabelle wieder schützen
...
Und wenn du ihn wieder setzen willst, dann übergib statt "false" eben "true".

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Zahnerer
**
Beiträge: 25
Registriert: Di, 20.02.2007 23:56

Re: Zellschutz per Makro ändern

Beitrag von Zahnerer »

Hallo Toxitom,

Danke für die Antwort!

Ich denke, ich werde mich wohl doch etwas näher mit dem Thema API oder Basic beschäftigen müssen. Wenn ich dann nicht weiter komme, melde ich mich noch einmal.

Danke, Zahnerer


PS.: Gibt es hier vielleicht ein besonderes Buch oder Tutorial, das newbies wie mir den Einstieg leichter macht?
Gesperrt