excel中用vba实现按条件锁定单元格
问题:当B2到B10这些单元格中有数值=“按合同总额付款”的单元格,则自动锁定这个单元格前面一个单元格。比如:如果是B8=“正确",则C8就锁定。其他单元格也是这样。帮忙...
问题:当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就锁定。 展开
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就锁定。 展开
4个回答
展开全部
也许是因为这里有个错误(倒数第二句锁定表的代码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
要不要来个简单的,从另外的思路来满足你的需求:当达到条件时,你选取不了要锁定的单元格,变相锁定了这个单元格,不改变对整个表的其他操作,方便多了。只有一句代码。试试吧!
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
展开全部
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
代码要放在需要保护的工作表项目里
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
EXCEL默认的是所有单元格锁定因此需要在ActiveSheet.Unprotect的下面加上一句
Cells.Locked = False
Cells.Locked = False
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没什么问题啊。
只是这样会锁定整个表,不知道你本意是否如此。
只是这样会锁定整个表,不知道你本意是否如此。
追问
就是一个单元格为某个值时,右边的单元格锁定,不能编辑。
为什么我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
尽量不要大范围修改单元格,否则可能会卡久点。
第一次运行代码前,全选单元格,将单元格解锁。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询