我有一个电子表格,我用它来跟踪报告发送给我的时间。对于那些我没有收到的报告,我有一个黑色的细胞(一个黑色的细胞)。锁定单元并不真正起作用,因为它们无法更改单元格中的数据。 (完全披露,它是一个条件格式进行填充,如果单元格有"客户端"在单元格中,它填充黑色)。
如何阻止用户更改"客户端"细胞?有些细胞不是黑色的,有些是黑色的。我知道我可以使用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
答案 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