Schützen einer Zelle, aber Zulassen von Dropdown-Optionen

Schützen einer Zelle, aber Zulassen von Dropdown-Optionen

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_SelectionChangeum 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.

verwandte Informationen