3

我制作了一个电子表格,用户可以将邮政编码和数量输入到 2 个单元格中,我让其他单元格进行计算并显示结果。

我添加了一些 VBA 以防止任何人删除行和列,但我想防止删除范围内的任何单元格,但也允许用户更改某些单元格,但也防止编辑带有公式的单元格。

在单元格E4中,用户可以输入邮政编码。在E6中,用户可以输入数量。这些可以编辑但不能删除。E8:E9并且E11:E14都是包含列表数据的下拉列表(验证)。这些可以使用下拉菜单更改,但不能删除。

L10:L14, L16, L23:L27, L29,L30:L33都可以对其数据进行编辑但不能删除。

用于此的 VBA 会是什么样子?我想它会使用Worksheet_Change() event.

4

2 回答 2

6

这是你正在尝试的吗?用户可以编辑单元格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 THEN 负载的情况,还是我们可以使用 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
于 2012-05-04T11:06:53.073 回答
1

您部分正确,但 Worksheet_Change() 在更改后触发,因此在删除后触发。我要做的是有一个隐藏的工作表来存储用户输入的值,然后您可以在 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
于 2012-05-04T09:39:57.383 回答