Excel VBA防止删除单元格,但允许编辑

我做了一个电子表格,用户可以input一个邮政编码和一个数量到2个单元格,我有其他单元格进行计算并显示结果。

我已经添加了一些VBA,以防止任何人删除行和列,但我想要防止删除的范围内的任何单元格,但也允许用户对某些单元格进行更改,但也阻止在那里编辑公式的单元格。

在单元格E4 ,用户可以input邮政编码。 在E6 ,用户可以input数量。 这些可以编辑但不能删除。 E8:E9E11:E14都是从列表中保存数据的下拉列表(validation)。 这些可以使用下拉菜单进行更改,但不能删除。

L10:L14L16L23:L27L29L30:L33都可以编辑它们的数据但不能删除。

什么VBA这个样子? 我想这将使用Worksheet_Change() event

这是你正在尝试? 用户可以编辑单元格E4E6但不能留空。 我也假设手中的细胞不是空的。

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo Whoa Application.EnableEvents = False If Not Intersect(Target, Range("E4")) Is Nothing Then If Len(Trim(Range("E4").Value)) = 0 Then Application.Undo ElseIf Not Intersect(Target, Range("E6")) Is Nothing Then If Len(Trim(Range("E6").Value)) = 0 Then Application.Undo End If LetsContinue: Application.EnableEvents = True Exit Sub Whoa: MsgBox Err.Description Resume LetsContinue End Sub 

跟进

谢谢你是我想要做的。 其他范围呢? 这只是一个IF的负载的情况下,或者我们可以使用CASE和循环? – AdRock 2分钟前

根据需要从下面添加/删除单元格地址。

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo Whoa Application.EnableEvents = False If Not Intersect(Target, Range("E4,E6,E8:E9,E11:E14,L10:L14,L16,L23:L27,L29,L30:L33")) Is Nothing Then If Len(Trim(Target.Value)) = 0 Then Application.Undo End If LetsContinue: Application.EnableEvents = True Exit Sub Whoa: MsgBox Err.Description Resume LetsContinue End Sub 

你是部分正确的,但是Worksheet_Change()是在更改后触发的,所以在删除之后。 我要做的是有一个隐藏的工作表来存储用户input的值,然后你可以检查Worksheet_Change()新值是否为空(删除)。

 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$E$4" Then ' check the previous value on the hidden sheet here, if changed, then save it, if empty, then restore it End If End Sub