Calc: Zellinhalte löschen bei geschützter Tabelle

Hi,
ich habe eine komplexe Tabelle, die geschützt ist mit dem Ziel, dass niemand aus Versehen Formeln verändert.
Alles zusammen ist ein Formular zum Ausdrucken, einige Zellen müssen also noch von den Nutzern gefüllt werden. Diese Zellen sind deswegen natürlich ausdrücklich nicht gesperrt.

Ich möchte jetzt gern die nicht gesperrten Zellinhalte auf einmal löschen.

Einzeln geht das auch, also eine nicht gesperrte Zelle kann auch ein Nutzer löschen, aber markiere ich als Nutzer zusätzlich mindestens eine gesperrte Zelle, wird gar nichts gelöscht.

Jemand eine Idee? Ist das ein Bug?

MfG
     Norbert

Ich denke nicht; wenn Du etwas 'unerlaubtes' tust (z. B. versuchst, eine
gesperrte Zelle zu löschen), woher soll das Programm dann wissen, was
genau Du wirklich willst?

Ich fürchte, Da wird Dir ein bisschen Fußweg nicht erspart bleiben; Du
wirst die die betreffenden Zellen manuell markieren und löschen müssen.

Wenn die Zellen beieinander liegen, kannst Du dazu einfach den
Mausbutton gedrückt halten, und die Zellen markieren. Wenn nicht, halte
die STRG-Taste gedrückt, und klick dabei der Reihe nach alle
betreffenden Zellen mit der Maus an. Versehentlich angeklickte Zellen
kannst Du auf die gleiche Weise auch wieder deselektieren.

Wenn Du das öfter benötigst, würde ich Dir empfehlen, das als Makro auf
zu zeichnen, und dann einfach das Makro laufen lassen.

Wolfgang

Ich denke nicht; wenn Du etwas 'unerlaubtes' tust (z. B. versuchst, eine
gesperrte Zelle zu löschen), woher soll das Programm dann wissen, was
genau Du wirklich willst?

In dem Fall logisch wäre ja, das Erlaubte zu tun und das Unerlaubte zu lassen. Wofür sonst ist das selektive Sperren einzelner Zellen gut?

Ich fürchte, Da wird Dir ein bisschen Fußweg nicht erspart bleiben; Du
wirst die die betreffenden Zellen manuell markieren und löschen müssen.

Der Fußweg ist die allerletzte Lösung. Es handelt sich um 600 Formulare untereinander mit 5 bis 20 zu löschenden, einzeln anzuklickenden, nicht nebeneinander liegenden Zellen.

Das Drüberkopieren eines leeren Formulars geht auch wieder nicht, weil ich da mal wieder von anderen Bugs geplagt werde (automatische Zeilenhöhe bei Schriftgrößen unter 10).

MfG
     Norbert

Hallo Norbert,

Ich denke nicht; wenn Du etwas 'unerlaubtes' tust (z. B.
versuchst, eine gesperrte Zelle zu löschen), woher soll das
Programm dann wissen, was genau Du wirklich willst?

In dem Fall logisch wäre ja, das Erlaubte zu tun und das
Unerlaubte zu lassen.

Das sehe ich auch so, zumindest wäre es sehr sinnvoll.

Wofür sonst ist das selektive Sperren einzelner Zellen gut?

Ich fürchte, Da wird Dir ein bisschen Fußweg nicht erspart
bleiben; Du wirst die die betreffenden Zellen manuell markieren
und löschen müssen.

Der Fußweg ist die allerletzte Lösung. Es handelt sich um 600
Formulare untereinander mit 5 bis 20 zu löschenden, einzeln
anzuklickenden, nicht nebeneinander liegenden Zellen.

Hmm, dann bleibt vermutlich tatsächlich nur der Weg über ein Makro.
Leider kenne ich mit mit LibO-Makros überhaupt nicht aus, aber
vielleicht kannst Du oder ein anderer Makro-Kenner aus dem von mir
gefundenen Excel-Code (siehe unten), der so natürlich unter LibO
nicht funktioniert, eine funktionierende LibO-Variante basteln?

*x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*

Sub NichtGesperrteZellenMarkieren()
Dim zelle As Range
Dim s As String
Dim lArray() As String
Dim i As Integer
Dim e As Integer

i = 1
ReDim lArray(1 To 100)

For Each zelle In ActiveSheet.UsedRange
If zelle.Locked = False Then
    lArray(i) = zelle.Address
    i = i + 1
    Else
    End If
Next zelle

For e = 1 To i
s = s & lArray(e) & ","
Next e
s = Left(s, Len(s) - 2)
Range(s).Select
End Sub

*x- - - - - - - - - - - - - > Schnapp < - - - - - - - - - - - -x*

Hallo Werner,

*x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*
Option VBAsupport 1

...
*x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*

Ach, interessant ... und mit dieser Zeile würde der Excel-VBA-Code
dann unverändert auch unter LibO laufen? Das wäre ja toll ...

Ich nehme an, dass diese Zeile unter Excel nicht notwendig ist,
oder? Daher stand sie natürlich auf der von mir gefundenen Seite für
eine Excel-Lösung auch nicht mit bei und konnte somit von mir auch
nicht mitkopiert werden.

Aber @Norbert, vielleicht geht's ja mit dem nachfolgenden noch
einfacheren Excel-Code - entsprechend auf LibO angepasst - noch
problemloser, wenn Du die Zeile mit der Einfärbung gegen ein
entsprechendes Kommando zum Löschen des Inhalts austauschst.

*x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*

Sub NichtGesperrteZellenEinfärben()
Dim zelle As Range
For Each zelle In ActiveSheet.UsedRange
If zelle.Locked = False Then
zelle.Interior.ColorIndex = 4
Else
zelle.Interior.ColorIndex = xlColorIndexNone
End If
Next zelle
End Sub

*x- - - - - - - - - - - - - > Schnapp < - - - - - - - - - - - -x*

Hallo Norbert,

In dem Fall logisch wäre ja, das Erlaubte zu tun und das Unerlaubte zu
lassen. Wofür sonst ist das selektive Sperren einzelner Zellen gut?

Logisch ist nicht zu verlangen, was nicht erlaubt ist.

Zellen, die gelöscht werden sollen manuell markiert und einen Bereichsnamen dafür vergeben.
Anschließen ein kleines Makro aufzeichnen:
Auswählen "Bereichsname"
Löschen

Das Makro in die Symbolleiste einbinden oder in die Tabelle (Button)
That's it, so mache ich das.

Hallo Norbert,

>
>> In dem Fall logisch wäre ja, das Erlaubte zu tun und das Unerlaubte zu
>> lassen. Wofür sonst ist das selektive Sperren einzelner Zellen gut?
>
> Logisch ist nicht zu verlangen, was nicht erlaubt ist.

Es ist logisch zu verlangen nicht gesperrte Zellen in einer geschützten Tabelle löschen zu können, was ja auch so funktioniert.

Befinden sich auch gesperrte Zellen in dem ausgewählten Bereich ist es logisch diese Zellen nicht zu löschen, aber auch nur diese - einfach gar nichts zu machen ist nicht logisch.

> Zellen, die gelöscht werden sollen manuell markiert und einen
> Bereichsnamen dafür vergeben.
> ...

Zu kompliziert.

Ich habe jetzt als Workaround einfach auf der Tabelle nach ".*" gesucht und das durch "" ersetzt. Das hat er anstandslos gestartet und logischerweise nur für die nicht gesperrten Zellen ausgeführt.

MfG
Norbert

Hallo miteinander,

Hallo

@Franklin
Wenn du schon VBA Gedichte ablieferst, solltest du auch die initiale
Zeile mitliefern:

*x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*
Option VBAsupport 1

...
*x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*

Hey, super, mit dieser vorangestellten Zeile funktioniert der
Excel-Code tatsächlich auch in LibO - sofern in diesem Fall hier der
Excel-Code im aktuellen Arbeitsblatt gespeichert ist.

Weiß jemand evtl., was man wo und wie hier am Code vielleicht noch
ergänzen oder ändern müsste, damit er auch läuft, wenn er nicht in
der aktuellen Arbeitsmappe, sondern unter 'Meine Makros'
abgespeichert wird?

Ansonsten bleibt er halt bei der Zeile

   For Each zelle In ActiveSheet.UsedRange

erstmal stehen, weil er offensichtlich nicht weiß, was gerade als
'ActiveSheet' anzusehen ist.

Hallo

Der folgende Code gespeichert in einer Datei im Pfad:

<dein_benutzerverzeichnis>/Scripts/python/<irgendein_name>.py

wird alle Zellbereiche mit der Zellvorlage "input" im aktuell selektierten (einzelnen)Bereich "leeren".

*x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*

def main():
     doc = XSCRIPTCONTEXT.getDocument()
     selection = doc.CurrentSelection
     for cellrange in iterate(selection.getUniqueCellFormatRanges()):
         if cellrange.CellStyle == 'input':
             cellrange.clearContents(15)

def iterate(enumerable):
     enum = enumerable.createEnumeration()
     while enum.hasMoreElements():
         yield enum.nextElement()

*x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*

Hallo Werner,

<dein_benutzerverzeichnis>/Scripts/python/<irgendein_name>.py

wird alle Zellbereiche mit der Zellvorlage "input" im aktuell
selektierten (einzelnen)Bereich "leeren".

Auch interessant, sofern man es von Anfang an beim Aufbau des
Arbeitsblattes gleich mit berücksichtigt und diesen nichtgesperrten
Zellen immer auch gleich die passende Zellvorlage zuteilt.

Ungeachtet der Tatsache, dass Norbert ja inzwischen einen Workaround
für sich gefunden hat, würde das aber in seinem Fall bedeuten, dass
er doch erstmal seine hunderte an nichtgesperrten Zellen manuell
auswählen müsste, um ihnen die besagte Zellvorlage nachträglich
zuzuweisen.

Nachdem dies händisch eben zu aufwändig ist, wäre es also doch
erstmal notwendig, per Makro möglichst einfach auf Knopfdruck
jeweils userbedient alle nichtgesperrten Zellen maschinell
auszuwählen, um sie sodann mit einem Tastenschlag (oder auch gleich
ins Makro integriert) zu leeren.

Eigentlich müsste man doch in Deinem Code-Beispiel "nur" anstelle
der Prüfung auf eine bestimmte Zellvorlage auf den Gesperrt-Status
der Zelle prüfen ... Das scheint aber nicht so einfach möglich zu
sein, oder?

Hallo

Hallo Werner,

...

Eigentlich müsste man doch in Deinem Code-Beispiel "nur" anstelle
der Prüfung auf eine bestimmte Zellvorlage auf den Gesperrt-Status
der Zelle prüfen ... Das scheint aber nicht so einfach möglich zu
sein, oder?

>> *x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*
>> if not cellrange.CellProtection.IsLocked:
>> *x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*

Es würde dir auch nicht schaden, *selber* nachzudenken und tatsächlich einen Objektinspektor zu benutzen wie z.B.
http://extensions.services.openoffice.org/de/project/MRI

Hallo Werner,

Hallo Werner,

Eigentlich müsste man doch in Deinem Code-Beispiel "nur" anstelle
der Prüfung auf eine bestimmte Zellvorlage auf den Gesperrt-Status
der Zelle prüfen ... Das scheint aber nicht so einfach möglich zu
sein, oder?

>> *x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*
>> if not cellrange.CellProtection.IsLocked:
>> *x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*

Es würde dir auch nicht schaden, *selber* nachzudenken und tatsächlich
einen Objektinspektor zu benutzen wie z.B.
http://extensions.services.openoffice.org/de/project/MRI

Hmm, interessant, was es alles so gibt ... scheint aber nach der
Seite die aktuelle LibO-Version (noch) nicht zu unterstützen ...

Hallo Franklin

Hallo Werner,

Hallo Werner,

Eigentlich müsste man doch in Deinem Code-Beispiel "nur" anstelle
der Prüfung auf eine bestimmte Zellvorlage auf den Gesperrt-Status
der Zelle prüfen ... Das scheint aber nicht so einfach möglich zu
sein, oder?

  >> *x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*
  >> if not cellrange.CellProtection.IsLocked:
  >> *x- - - - - - - - - - - - - > Schnipp < - - - - - - - - - - - -x*

Es würde dir auch nicht schaden, *selber* nachzudenken und tatsächlich
einen Objektinspektor zu benutzen wie z.B.
http://extensions.services.openoffice.org/de/project/MRI

Hmm, interessant, was es alles so gibt ... scheint aber nach der
Seite die aktuelle LibO-Version (noch) nicht zu unterstützen ...

Hier funktionierts mit LO 5.x

>> In dem Fall logisch wäre ja, das Erlaubte zu tun und das Unerlaubte zu
>> lassen. Wofür sonst ist das selektive Sperren einzelner Zellen gut?
>
> Logisch ist nicht zu verlangen, was nicht erlaubt ist.

Es ist logisch zu verlangen nicht gesperrte Zellen in einer geschützten
Tabelle löschen zu können, was ja auch so funktioniert.

Befinden sich auch gesperrte Zellen in dem ausgewählten Bereich ist es
logisch diese Zellen nicht zu löschen,

Das mag *Dir* logisch erscheinen, denn das erfordert ja auch eine
gewisse Intelligenzhöhe. Das Programm besitzt selbige aber
offensichtlich nicht. Schließlich ist es auch nur ein
Tabellenkalkulationsprogramm, und kein KI-Programm. Und für ein Programm
(mit oder ohne Intelligenz; gilt übrigens auch für Menschen :wink: ) ist es
grundsätzlich sicherer, im Zweifelsfall lieber *gar* nix zu tun, als
etwas möglicherweise *falsches* zu tun.

aber auch nur diese - einfach gar
nichts zu machen ist nicht logisch.

Auch einen Befehl nur *teilweise* aus zu führen erfordert eine gewisse
Intelligenzhöhe.

Wolfgang

Hallo Wolfgang,

>> In dem Fall logisch wäre ja, das Erlaubte zu tun und das Unerlaubte zu
>> lassen. Wofür sonst ist das selektive Sperren einzelner Zellen gut?
>
> Logisch ist nicht zu verlangen, was nicht erlaubt ist.

Es ist logisch zu verlangen nicht gesperrte Zellen in einer geschützten
Tabelle löschen zu können, was ja auch so funktioniert.

Befinden sich auch gesperrte Zellen in dem ausgewählten Bereich ist es
logisch diese Zellen nicht zu löschen,

Das mag *Dir* logisch erscheinen, denn das erfordert ja auch eine
gewisse Intelligenzhöhe. Das Programm besitzt selbige aber
offensichtlich nicht. Schließlich ist es auch nur ein
Tabellenkalkulationsprogramm, und kein KI-Programm. Und für ein Programm
(mit oder ohne Intelligenz; gilt übrigens auch für Menschen :wink: ) ist es
grundsätzlich sicherer, im Zweifelsfall lieber *gar* nix zu tun, als
etwas möglicherweise *falsches* zu tun.

Ich fände es aber noch besser, wenn das Programm in diesem Fall dann
den Nutzer darüber informiert, warum es nichts tut - nicht, dass der
User womöglich noch denkt, seine <Entf>-Taste sei defekt - so wie es
ja auch beim Eingabeversuch in identischer Konstellation eine
Meldung am Bildschirm anzeigt, dass gesperrte Zellen nicht geändert
werden können. Entsprechend müsste mMn beim Löschversuch die Meldung
erscheinen, dass gesperrte Zellen nicht gelöscht werden können.

Zweifelsohne; aber das ist *auch* eine Frage der Manpower. Irgend jemand
muss das implementieren, und zwar so, dass es nicht etwa andere
Funktionalitäten behindert. Das kostet Arbeitszeit; Arbeitszeit, die u.
U. besser in wichtigeren Bugfixes oder anderen fehlenden Features o. ä.
investiert wäre (ein Außenstehender wie Du oder ich kann das aber
schlecht beurteilen).

Wolfgang

Hallo Wolfgang,

>> In dem Fall logisch wäre ja, das Erlaubte zu tun und das Unerlaubte zu
>> lassen. Wofür sonst ist das selektive Sperren einzelner Zellen gut?
>
> Logisch ist nicht zu verlangen, was nicht erlaubt ist.

Es ist logisch zu verlangen nicht gesperrte Zellen in einer geschützten
Tabelle löschen zu können, was ja auch so funktioniert.

Befinden sich auch gesperrte Zellen in dem ausgewählten Bereich ist es
logisch diese Zellen nicht zu löschen,

Das mag *Dir* logisch erscheinen, denn das erfordert ja auch eine
gewisse Intelligenzhöhe. Das Programm besitzt selbige aber
offensichtlich nicht. Schließlich ist es auch nur ein
Tabellenkalkulationsprogramm, und kein KI-Programm. Und für ein Programm
(mit oder ohne Intelligenz; gilt übrigens auch für Menschen :wink: ) ist es
grundsätzlich sicherer, im Zweifelsfall lieber *gar* nix zu tun, als
etwas möglicherweise *falsches* zu tun.

Ich fände es aber noch besser, wenn das Programm in diesem Fall dann
den Nutzer darüber informiert, warum es nichts tut

Zweifelsohne; aber das ist *auch* eine Frage der Manpower. Irgend jemand
muss das implementieren, und zwar so, dass es nicht etwa andere
Funktionalitäten behindert. Das kostet Arbeitszeit; Arbeitszeit, die u.
U. besser in wichtigeren Bugfixes oder anderen fehlenden Features o. ä.
investiert wäre (ein Außenstehender wie Du oder ich kann das aber
schlecht beurteilen).

Natürlich ist das nur eine reine Spekulation von mir, weil ich - da
hast Du völlig Recht - keine Ahnung vom Coden habe, aber nachdem es
dieses Info-Fenster ja schon gibt, stelle ich es mir nicht sooo arg
schwierig vor, es zusätzlich zu der Betätigung aller "normalen"
Eingabe-Tasten auch beim Druck auf die Entf-Taste erscheinen zu lassen.

Glücklicherweise habe ich an so etwas vor ein paar Jahren beim Entwickeln der Formulare gedacht. Ich habe jetzt nur für die Vorlage, die Eingaben vorsieht, das Häkchen bei "Gesperrt" entfernt und war fertig. Mit dem Workaround bin ich somit auf keine Makros angewiesen.

Nachdem ich nochmal kurz einen Rücksprung auf Version 3.5.7 gemacht habe und alle Zeilen mit Schriftgröße 4 nun auch wieder die entsprechende Höhe haben, ich außerdem einen erneuten Versuch aufgegeben habe bedingte Formatierung direkt zu benutzen, da die Reaktionszeit bei der Eingabe pro Tastendruck auf zirka 1 Minute gestiegen ist, bin ich mit dem Ergebnis recht zufrieden.

Dumm ist weiterhin, dass man für ein komplexeres Calc-Dokument wohl mindestens 2 LibreOffice Versionen zumindest zum Erstellen benötigt, um den Großteil der Bugs zu umschiffen.

Ich brauche kein 5.1.X mir wäre ein ausgereiftes oder besser ausgereifteres 5.0.99 lieber.

MfG
     Norbert