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?
Hey,
also in einer Zeile befinden sind gesperrte Zellen und ungesperrte Zellen. Zudem ist auch dem gesamten Tabellenblatt ein Blattschutz.
Ich möchte gern den Nutzer des Blattes erlaube, dass dieser einfach eine Zeile löschen kann, ohne das die gesperrten sondern ausschließlich die ungesperrten Zellen gelöscht werden.
Soweit ich mich bereits eingelesen habe, kann man da was in VBA machen?!
Vielen Dank
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.
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?
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.
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
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.
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
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
Jetzt funktioniert es, und auch super schnell. Ich danke dir sehr.
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?
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
If Target.Rows.Count = 1 And Target.Columns.Count > 10 Then
Fehlermeldung: Objekt erforderlich ?
oh - sorry
füg davor mal folgendes ein - dann müsste es funktionieren
Dim Target as Range
Set Target = Selection
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.
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?
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.