保護 CELL 但允許下拉選項

保護 CELL 但允許下拉選項

我想保護單元格,但也允許用戶從下拉清單中選擇選項?

我讀了下面的問題,但沒有提供答案。

保護單元格,但允許下拉列表工作

取消對單元格的保護不是我想要做的,因為用戶可以簡單地貼上到單元格上,然後資料驗證就會消失。

有沒有辦法鎖定儲存格並開啟工作表保護,但仍允許選擇資料驗證清單選項?

我會嘗試任何選項,包括 VBA。

答案1

可能有更好的方法,但我有一個想法,到目前為止,它似乎與我的測試配合得很好。

所以我用來Worksheet_SelectionChange監控使用者對清單的操作。
我只需在選擇單元格時解鎖工作表,然後在選擇其他內容時再次鎖定它:
請注意,我的清單位於 N26 中

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

這樣做的問題顯然是您應該能夠選擇單元格,然後貼上任何內容。

所以我們需要檢查用戶是否貼了某些內容,我在這裡發現了一些有趣的東西:https://stackoverflow.com/questions/27818152/excel-vba-how-to-detect-if-something-was-pasted-in-a-worksheet

因此,我們可以檢查是否貼上了某些內容,並撤銷它。

我將它們放在一起並進行修改,這樣用戶就可以粘貼到任何未鎖定的單元格中,但不能粘貼到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

請注意,如果您使用的不是英文版 Excel,則其中一些值可能會變更。我必須改變"&Undo"(UndoList, 5) = "Paste"的語言。

我想你也可以用它來回答你的下一個問題。如果您再次允許貼上,但隨後檢查貼上的每個更改,如果為 true,則運行IsNumeric(Target.value)檢查並在失敗時撤消。

相關內容