我想保護單元格,但也允許用戶從下拉清單中選擇選項?
我讀了下面的問題,但沒有提供答案。
取消對單元格的保護不是我想要做的,因為用戶可以簡單地貼上到單元格上,然後資料驗證就會消失。
有沒有辦法鎖定儲存格並開啟工作表保護,但仍允許選擇資料驗證清單選項?
我會嘗試任何選項,包括 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)
檢查並在失敗時撤消。