excel中用vba实现按条件锁定单元格

问题:当B2到B10这些单元格中有数值=“按合同总额付款”的单元格,则自动锁定这个单元格前面一个单元格。比如:如果是B8=“正确",则C8就锁定。其他单元格也是这样。帮忙看看哪里错了啊?谢谢!(我是菜鸟)
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect
Dim i As Long
For i = 2 To 10
If Range("B" & i) = "按合同总额付款" Then
Range("C" & i).Locked = True
Else
Range("C" & i).Locked = False
End If
Next i
ActiveSheet.Protect DrawingObjects:=ture, Contents:=True, Scenarios:=True
End Sub
不好意思,上面写错了,应该是:如果是B8=“按合同总额付款",则C8就锁定。

也许是因为这里有个错误(倒数第二句锁定表的代码DrawingObjects:=ture, ),代码根本就没运行。

要不要来个简单的,从另外的思路来满足你的需求:当达到条件时,你选取不了要锁定的单元格,变相锁定了这个单元格,不改变对整个表的其他操作,方便多了。只有一句代码。试试吧!
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 3 And Target(1).Offset(0, -1) = "按合同总额付款" Then Target.Offset(0, 1).Select
End Sub追问

试过了,但是为什么选择第一列的单元格的时候,会出现错误呢?求解,谢谢啦!

追答

虽然出错,但我的电脑上运行并不影响效果,程序并没有出现错误提示框。如果如下修改就不会出错了。见附件

   If Target.Column = 3 Then If Target(1).Offset(0, -1) = "按合同总额付款" Then Target.Offset(0, 1).Select


温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-26
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 And Target.Row >= 2 And Target.Row <= 10 Then

ActiveSheet.Unprotect
Target.Offset(, 1).Locked = (Target.Value = "按合同总额付款")

ActiveSheet.Protect DrawingObjects:=ture, Contents:=True, Scenarios:=True
End If
 End Sub

代码要放在需要保护的工作表项目里

第2个回答  2013-07-26
EXCEL默认的是所有单元格锁定因此需要在ActiveSheet.Unprotect的下面加上一句
Cells.Locked = False
第3个回答  2013-07-26
没什么问题啊。
只是这样会锁定整个表,不知道你本意是否如此。追问

就是一个单元格为某个值时,右边的单元格锁定,不能编辑。
为什么我A2= "按合同总额付款"时,B2没有锁定呢。还是我的操作有问题?

追答Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect
Dim R1  As Range
Dim R2  As Range
Dim Rng As Range
Application.ScreenUpdating = False
For Each Rng In Target
    If Rng = "按合同总额付款" Then
        If R1 Is Nothing Then Set R1 = Rng.Offset(, 1) Else Set R1 = Union(R1, Rng.Offset(, 1))
    Else
        If R2 Is Nothing Then Set R2 = Rng.Offset(, 1) Else Set R2 = Union(R2, Rng.Offset(, 1))
    End If
Next
If Not R1 Is Nothing Then R1.Locked = True
If Not R2 Is Nothing Then R2.Locked = False
ActiveSheet.Protect DrawingObjects:=ture, Contents:=True, Scenarios:=True
End Sub

尽量不要大范围修改单元格,否则可能会卡久点。

第一次运行代码前,全选单元格,将单元格解锁。

相似回答