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就锁定。
展开
 我来答
姓王的wy451

2013-07-26 · TA获得超过48.3万个赞
知道大有可为答主
回答量:8万
采纳率:78%
帮助的人:8857万
展开全部
也许是因为这里有个错误(倒数第二句锁定表的代码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


TAT萝卜
2013-07-26 · TA获得超过4972个赞
知道大有可为答主
回答量:3084
采纳率:66%
帮助的人:1107万
展开全部
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

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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友2ee1cd4
2013-07-26 · TA获得超过605个赞
知道小有建树答主
回答量:424
采纳率:80%
帮助的人:101万
展开全部
EXCEL默认的是所有单元格锁定因此需要在ActiveSheet.Unprotect的下面加上一句
Cells.Locked = False
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
crazy0qwer
2013-07-26 · TA获得超过3299个赞
知道大有可为答主
回答量:4020
采纳率:71%
帮助的人:1310万
展开全部
没什么问题啊。
只是这样会锁定整个表,不知道你本意是否如此。
追问
就是一个单元格为某个值时,右边的单元格锁定,不能编辑。
为什么我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

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

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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式