防止用户编辑单元格,实际单元格数据除外

时间:2016-01-29 15:18:12

标签: excel excel-vba vba

我有一个电子表格,我用它来跟踪报告发送给我的时间。对于那些我没有收到的报告,我有一个黑色的细胞(一个黑色的细胞)。锁定单元并不真正起作用,因为它们无法更改单元格中的数据。 (完全披露,它是一个条件格式进行填充,如果单元格有"客户端"在单元格中,它填充黑色)。

如何阻止用户更改"客户端"细胞?有些细胞不是黑色的,有些是黑色的。我知道我可以使用Worksheet_Change,但在用户更改之前,我无法确定的单元格颜色。

我在想我可能需要一个Worksheet_SelectionChange事件?

关键是我无法想到在更改之前检查单元格填充颜色的方法,如果它与之后不同 / em>改变,做一个消息框或其他什么。 (实际上,我会在用户更改之前检查该单元格是否为#34;客户端"如果是,则不允许更改)。

我是否过度思考并忽略了一些明显的东西?我想找到一个解决方案,我不打算编写哪些单元格已填充,并检查这些单元格是否已更改。

编辑:我只是想尝试将这两个Change事件结合起来,这似乎有效,但我不确定它是否是最好的方法: (这是在工作表模块中)

Option Explicit
Dim isClient As Boolean

Private Sub worksheet_SelectionChange(ByVal target As Range)
If target.Column = 5 Or target.Column = 6 Then
    If target.Value = "Client" Then
        isClient = True
    Else
        isClient = False
    End If
End If
End Sub


Private Sub Worksheet_Change(ByVal target As Range)
If target.Column = 5 Or target.Column = 6 And isClient = True Then
    Debug.Print "This has 'client'"
    target.Value = "Client"
    isClient = False
End If
End Sub

1 个答案:

答案 0 :(得分:1)

要在更改前知道旧颜色,我们可以使用Application.Undo

Private Sub Worksheet_Change(ByVal target As Range)
  Dim newValue As Variant
  If target.Column = 5 Or target.Column = 6 Then

   newValue = target.Value
   Application.EnableEvents = False
    Application.Undo
    Debug.Print target.Value 'old value
    Debug.Print target.DisplayFormat.Interior.Color 'old color
    'if it_is_OK then target.Value = newValue
   Application.EnableEvents = True

  End If
End Sub

或者只是当它的值更改为"客户端"时,您可以锁定该单元格。 :

Private Sub Worksheet_Change(ByVal target As Range)

  If target.Column = 5 Or target.Column = 6 And target.Value = "Client" Then

    target.Worksheet.Unprotect
     target.Locked = True
    target.Worksheet.Protect

  End If
End Sub