Ich möchte eine Zelle schützen, einem Benutzer aber auch erlauben, Optionen aus der Dropdown-Liste auszuwählen?
Ich habe die folgende Frage gelesen, die keine Antwort liefert.
Schützen einer Zelle, aber Zulassen der Funktion der Dropdown-Liste
Den Schutz der Zelle aufzuheben, ist nicht das, was ich tun möchte, da ein Benutzer die Zelle einfach überkleben könnte und die Datenüberprüfung dann weg wäre.
Gibt es eine Möglichkeit, eine gesperrte ZELLE und den Blattschutz zu aktivieren, die Auswahl von Listenoptionen zur Datenüberprüfung aber trotzdem zuzulassen?
Ich werde alle Optionen ausprobieren, einschließlich VBA.
Antwort1
Es gibt vielleicht eine bessere Möglichkeit, das zu tun, aber ich hatte eine Idee und bei meinen Tests scheint es bisher gut zu funktionieren.
Ich verwende es also, Worksheet_SelectionChange
um zu überwachen, was der Benutzer mit der Liste macht.
Ich entsperre das Blatt einfach, wenn die Zelle ausgewählt ist, und sperre es wieder, wenn etwas anderes ausgewählt wird:
Beachten Sie, dass meine Liste in N26 ist
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("N26")) Is Nothing Then
ActiveSheet.Unprotect
Else
ActiveSheet.Protect
End If
End Sub
Das Problem dabei ist offensichtlich, dass Sie die Zelle auswählen und dann irgendetwas einfügen können sollten.
Wir müssen also prüfen, ob der Benutzer etwas einfügt, und ich habe hier ein paar interessante Sachen gefunden:https://stackoverflow.com/questions/27818152/excel-vba-wie-erkennt-man-ob-etwas-in-ein-arbeitsblatt-eingefügt-wurde
Damit können wir prüfen, ob etwas eingefügt wurde, und es rückgängig machen.
Ich habe sie zusammengestellt, geändert, und so kann der Benutzer in alle nicht blockierten Zellen einfügen, aber nicht in N26
.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("N26")) Is Nothing Then 'Data validation list adress
ActiveSheet.Unprotect
Else
ActiveSheet.Protect
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("N26")) Is Nothing Then
Dim UndoList As String
'~~> Get the undo List to capture the last action performed by user
UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1)
'~~> Check if the last action was not a paste nor an autofill
If Left(UndoList, 5) = "Paste" Then
With Application
.EnableEvents = False
.Undo 'Undo paste
.EnableEvents = True
End With
End If
End If
End Sub
Beachten Sie, dass sich einige dieser Werte ändern können, wenn Sie keine englische Version von Excel verwenden. Ich musste sie "&Undo"
an (UndoList, 5) = "Paste"
meine Sprache anpassen.
Ich denke, Sie können dies auch für Ihre nächste Frage verwenden. Wenn Sie das Einfügen erneut zulassen, überprüfen Sie dann aber jede Änderung auf Einfügen, und wenn dies zutrifft, führen Sie IsNumeric(Target.value)
die Überprüfung aus und machen Sie sie rückgängig, wenn es fehlschlägt.