Ich möchte gerne erlauben eine Zeile zu löschen, obwohl in der Zeile enzelnen Zellen gesperrt sind und ein Blattschutz aktiv ist. Könnt Ihr mir weiterhelfen?

2 Antworten

Da die Zellen im geschützten Blatt nicht gesperrt sind, müsste das so gehen:

  • Sub ungesperrteInZeileLöschen()
  • Dim KW As String, c As Range
  • KW = ""
  • ActiveSheet.Unprotect (KW)
  • For Each c In ActiveCell.EntireRow.Cells.SpecialCells(xlValue)
  • If c.Locked = False Then c.ClearContents
  • Next
  • ActiveSheet.Protect (KW)
  • End Sub

habs ausprobiert, funkt.

  • For each c in Selection.entirerow.specialcells(xlvalues)

sollte schneller sein als das einfachere ...Selection.entirerow.cells

Wie Du die Lesbarkeit des Kennworts vermeidest, kannst Du Dir selbst was einfallen lassen. Ich schlage vor, das in einer Zelle einer ausgeblendeten Spalte weit rechts im nachher geschützten Blatt zu hinterlegen oder in einem Textfeld, das Du verschwindend klein machen kannst, und dann von dort auszulesen.


KaiserWilhelmXL 
Beitragsersteller
 19.06.2018, 09:26

Auch dir danke für deine Hilfe.

Komisch das es bei dir funktionierte.. bei mir leider nicht :(

Ich habe dein Code direkt in das betroffene Tabellenblatt eingefügt, da ich ja möchte dass der Code permanent im Hintergrund läuft.

Aber leider funzt es nicht.

Mein Wunsch wäre es, dass wenn Links an den Zahlen um eine Zeile zu makieren geklickt wird, dann sollen bitten nur die ungesperrten Zellen gelöscht werden und die anderen einfach ignoriert werden.

Iamiam  05.08.2018, 22:50
@KaiserWilhelmXL

ist ja schon lange her, hatte Pause und auch jetzt xl nicht zur Verfügg.

Im Blattmodul muss das Mako anders heißen: zB Sub Worksheet_Change (dann KANNST Du da gar nichts in ungesperrte eintragen oder sonst ein zur Auswahl stehender Vorgang. Ggf auch _save oder _open. Sind das WorkBOOK-Makros.im Workbook-Modul drauf verweisen. Viele Optionen

Moin,

leider weiß ich nicht genau, ob ich dich richtig verstanden habe.
Ich stelle mir das so vor: Ein Nutzer markiert einen Bereich und drückt dann einen Button. Dieser Button führt dann folgendes Makro aus:

Sub ungeschuetzteZellenLoeschen()
Dim rng As Range
ActiveSheet.Unprotect Password:="pw"
For Each rng In Selection
    If rng.Locked = False Then rng.ClearContents
Next rng
ActiveSheet.Protect Password:="pw"
End Sub

Hilft dir das weiter?


KaiserWilhelmXL 
Beitragsersteller
 19.06.2018, 09:24

Hi, danke für deine Hilfe.

Irgendwie habt dein Code meine Liste zu abstürzen gebraucht :)

Ich würde es ungerne mit einem Button lösen...

Mein Wunsch wäre es, dass wenn Links an den Zahlen um eine Zeile zu makieren geklickt wird, dann sollen bitten nur die ungesperrten Zellen gelöscht werden und die anderen einfach ignoriert werden.

NIRAHIMSA  19.06.2018, 09:54
@KaiserWilhelmXL

Moin,
ok - was ich vergessen habe: du musst "pw" durch das Passwort deines Blattes ersetzen :-)
probier mal unter dem entsprechenden Sheet mit folgendem Code:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Rows.Count = 1 And Target.Columns.Count = Columns.Count Then

    If MsgBox("Sollen alle ungeschützen Werte der Zeile gelöscht werden", vbYesNo) = vbYes Then
        Dim rng As Range
        ActiveSheet.Unprotect Password:="pw"
        For Each rng In Selection
            If rng.Locked = False Then rng.ClearContents
        Next rng
        ActiveSheet.Protect Password:="pw"
    End If
End If

End Sub
KaiserWilhelmXL 
Beitragsersteller
 19.06.2018, 10:09
@NIRAHIMSA

Danke.

Leider läd, läd und läd Excel und es passt nix. Minutenlang. Leider funktioniert es nicht. Und wenn, dann wäre auch einfach die Wartezeit zu lang. Schade.

NIRAHIMSA  19.06.2018, 10:34
@KaiserWilhelmXL

Merkwürdig - bei mir funktioniert das in unter einer Sekunde, habe es aber auch nur auf einem leeren Blatt probiert. Hast du zufällig Funktionen wie Bereich.Verschieben oder Indirekt genutzt?

Vielleicht kannst du nochmal folgendes probieren. Das erlaubt einen kleineren Bereich (die 10 kannst du natürlich auch anpassen)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Rows.Count = 1 And Target.Columns.Count > 10 Then
    If MsgBox("Sollen alle ungeschützen Werte im ausgewählten Bereich gelöscht werden", vbYesNo) = vbYes Then
        Dim rng As Range
        ActiveSheet.Unprotect Password:="pw"
        For Each rng In Selection
            If rng.Locked = False Then rng.ClearContents
        Next rng
        ActiveSheet.Protect Password:="pw"
    End If
End If

End Sub

NIRAHIMSA  19.06.2018, 10:39
@NIRAHIMSA

Hier nochmal eine kleine Anpassung:

er geht nicht mehr alle Spalten durch, sondern nur noch die ersten 100 - hängt aber alles vom Aufbau deiner Tabelle ab.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Rows.Count = 1 And Target.Columns.Count > 10 Then
    If MsgBox("Sollen alle ungeschützen Werte im ausgewählten Bereich gelöscht werden", vbYesNo) = vbYes Then
        Dim rng As Range
        Dim counter as Integer
          ActiveSheet.Unprotect Password:="pw"
          For Each rng In Selection
              If rng.Locked = False Then rng.ClearContents
              counter = counter +1
              If counter > 100 then exit for
          Next rng
          ActiveSheet.Protect Password:="pw"
      End If
  End If
  
  End Sub
KaiserWilhelmXL 
Beitragsersteller
 19.06.2018, 12:32
@NIRAHIMSA

Jetzt funktioniert es, und auch super schnell. Ich danke dir sehr.

KaiserWilhelmXL 
Beitragsersteller
 19.06.2018, 12:41
@NIRAHIMSA

Könnte man noch ergänzen, dass die löschmeldung erst kommt, wenn man auch tatsächlich einen Löschbefühl drückt/ klickt. Und nicht schon wenn man nur die Zeile anklickt? Oder würde das alles wieder über den Haufen werfen?

NIRAHIMSA  19.06.2018, 14:59
@KaiserWilhelmXL

sehr schön :-)

Das ist natürlich auch möglich.
Dann müsstest du den Code aber in ein Modul schreiben (Einfügen > Modul) und dem Makro eine Tastenkombination zuweisen (in Excel > Entwicklertools > Makros > Optionen) oder (zusätzlich) einen Button einfügen.

Sub ungeschuetzteZellenLoeschen()
If Target.Rows.Count = 1 And Target.Columns.Count > 10 Then
    If MsgBox("Sollen alle ungeschützen Werte im ausgewählten Bereich gelöscht werden", vbYesNo) = vbYes Then
        Dim rng As Range
        Dim counter As Integer
          ActiveSheet.Unprotect Password:="pw"
          For Each rng In Selection
              If rng.Locked = False Then rng.ClearContents
              counter = counter + 1
              If counter > 100 Then Exit For
          Next rng
          ActiveSheet.Protect Password:="pw"
      End If
End If
End Sub
KaiserWilhelmXL 
Beitragsersteller
 19.06.2018, 15:43
@NIRAHIMSA
If Target.Rows.Count = 1 And Target.Columns.Count > 10 Then

Fehlermeldung: Objekt erforderlich ?

NIRAHIMSA  19.06.2018, 15:44
@KaiserWilhelmXL

oh - sorry
füg davor mal folgendes ein - dann müsste es funktionieren
Dim Target as Range
Set Target = Selection

KaiserWilhelmXL 
Beitragsersteller
 19.06.2018, 15:47
@NIRAHIMSA

Verstehe. Aber dann ist das wieder eine Tastenkombination kommunzieren, die hier sich keiner merkt.

Ich dachte wirklich, dass ich die Zeile markiere, einfach Entf drücke und das dann so klappt.

NIRAHIMSA  19.06.2018, 16:22
@KaiserWilhelmXL

also mit Entf würde ich da nicht rumspielen wollen, da es dann wohl immer gilt und seine Funktion verliert. (ich habe mich mit dem Keypress aber auch noch nicht so intensiv auseinandergesetzt) Wenn du es trotzdem machen willst, schau mal hier vorbei:
http://www.herber.de/forum/archiv/116to120/119885_Application_OnKey.html

https://msdn.microsoft.com/en-us/vba/excel-vba/articles/application-onkey-method-excel

- warum weist du dem Makro nicht einfach z.B. Strg+Umschalt+d (für Delete) zu?