ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 783|回复: 22

[已解决] 满足条件锁定单元格,不满足条件保持当前状态!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-7-1 08:24 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 amansbj 于 2024-7-3 10:19 编辑

image.png
求助内容:


1.F列单元格  <> “” 时,并且BF列所在单元格 为 “已完成”或“已停止”时,BF列及以前的单元格全部锁定,不允许更改。
2.F列单元格   =“”   时,即使BF列所在单元格 为 “已完成”或“已停止”时,BF列及以前的单元格也不会锁定可编辑单元格(当前锁定单元格仍然为锁定状态,未锁定单元格仍然可编辑)。


例如:    F5=11103221&BF5=“已完成”,A5:BF5 锁定。
              F3=11106141&BF3=“已停止”,A3:BF3 锁定。
              F7:F10000=””    BF7:BF10000=”已完成” ,A7:BF10000  不锁定。

示例.rar

252.11 KB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2024-7-2 14:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
试试是不是这样

示例.zip

312.95 KB, 下载次数: 10

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-2 16:57 | 显示全部楼层
Peny2020 发表于 2024-7-2 14:39
试试是不是这样

image.jpg
老师  似乎没有锁上
总体思路:
F列的单元格   有数据时,并且  BF列  =   已停止OR   已完成
满足以上条件后   BF列以前的单元格全部锁定单元格

F列的单元格   无数据时,即使  BF列  =   已停止OR   已完成,  保护工作表 原来锁定的单元格,保持锁定,原来为锁定的单元格,继续保持为锁定(例如G列)
老师您可以先将保护工作表开启,然后再去编辑。我为了各位老师编辑方便,所以没有进行工作表保护。

TA的精华主题

TA的得分主题

发表于 2024-7-2 17:22 | 显示全部楼层
amansbj 发表于 2024-7-2 16:57
老师  似乎没有锁上
总体思路:
F列的单元格   有数据时,并且  BF列  =   已停止OR   已完成

你双击一下F 列的内容,或者输入内容回车后就会判断是否需要锁了。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-3 07:47 | 显示全部楼层
Peny2020 发表于 2024-7-2 17:22
你双击一下F 列的内容,或者输入内容回车后就会判断是否需要锁了。

哦哦   效果差不多,只不过F列是需要先输入,F列填写后基本不会更改,所以需要先判断F列,然后BF列会根据BE列来进行判断,所以最终是判断BF列是  什么,所以当前基本可实现,只不过判断先后顺序有点问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-3 07:53 | 显示全部楼层
Peny2020 发表于 2024-7-2 17:22
你双击一下F 列的内容,或者输入内容回车后就会判断是否需要锁了。

代码我看不懂,但是大致能猜到一点点:  6代表F列    58代表BF列,但是这个52没看懂是什么!
image.png

TA的精华主题

TA的得分主题

发表于 2024-7-3 08:49 | 显示全部楼层
amansbj 发表于 2024-7-3 07:53
代码我看不懂,但是大致能猜到一点点:  6代表F列    58代表BF列,但是这个52没看懂是什么!

rng就是代表你点击的所在F 列的单元格,rng.offset(0,52)意思就是与这个F列单元格右边相距52格的位置,即BF列。因为我的excel是英文版,所以要把你的“已完成”“已停止”转换成X,Y,如果你是中文版的,就可以直接等于。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-3 09:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Peny2020 发表于 2024-7-3 08:49
rng就是代表你点击的所在F 列的单元格,rng.offset(0,52)意思就是与这个F列单元格右边相距52格的位置,即 ...

哦哦  您这个就是以F列为基准,最终根据F列的情况来确定是锁定还是不锁定!
而我的期望 正好和您相反,最终根据BF(BE)列状态为基准,来决定锁定还是不锁定,F列只是一个前提判断条件。   根据您的指点我自己随便改了一个,先说明我不懂VBA,仅仅是根据您的讲解和自己的理解瞎改的。 只是运行时出了错误,不知道是那里有问题。若老师不忙的情况下请指点。

更改依据:
前提 1: BF列状态是与BE列绑定的,BE列下拉菜单 "完成" "未完成" "停止",BF列自动跟随BE列对应变更为"已完成" "未完成" "已停止"。
前提 2: F列数据空时,或者BE列<>"完成"or"停止"时,所有单元格保持之前的状态(原锁定的还锁定,为锁定仍为锁定)
前提 3 : F列<> "" and BE列="完成"or"停止"时,A:BF列相应单元格进行锁定。
锁定与未锁定,最终还是要根据BE列的    更改状态来决定,F列仅是前提条件,填写后基本上是不会更改的。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
'Dim x, y As String
ActiveSheet.Unprotect
Cells.Locked = False
'x = ChrW(24050) & ChrW(20572) & ChrW(27490) ' stop
'y = ChrW(24050) & ChrW(23436) & ChrW(25104) 'complete

For Each rng In Target
If rng.Column = 57 And rng.Row > 2 Then                                                          '根据BE列的"完成" "未完成" "停止"来决定BF列显示"已完成" "未完成" "已停止"状态

  If rng.Value = "完成" Or rng.Value = "停止" And rng.Offset(51, 0).Value <> "" Then             '当BE列="完成" 或者 "停止",并且F列不为空时
  
        rng.Offset(-57, 0).Resize(1, 58).Locked = True                                           'A列-BF列锁定单元格
    End If                                                                                       'BE列<> "完成" or "停止"or  F列<>""时,单元格锁定状态不做改变,保持原来的状态
End If
Next
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Protect "123" '恢复保护
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-3 09:53 | 显示全部楼层
Peny2020 发表于 2024-7-3 08:49
rng就是代表你点击的所在F 列的单元格,rng.offset(0,52)意思就是与这个F列单元格右边相距52格的位置,即 ...

老师 根据您的提点  我自己改的那个VBA 当前是锁定了BE列之后的单元格,然后我只要修改这里的参数就提示我调试错误。
image.png
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-3 10:15 | 显示全部楼层
Peny2020 发表于 2024-7-3 08:49
rng就是代表你点击的所在F 列的单元格,rng.offset(0,52)意思就是与这个F列单元格右边相距52格的位置,即 ...

老师   并且同时我又测试了一下您之前的代码和我的代码,发现了一个问题:
您的代码:  当前已经满足全部条件的情况下,锁定A1-BF1单元格,然后我更改F2和BF2状态,然后回头看A1-BF单元格,再次变成了未锁定状态。
我的代码:  与您的代码相同问题,其次,我更改的代码只能锁定BE列之后的单元格

期望:满足F列和BF列状态后锁定的行,需要一直锁定。未满足条件的行重新根据条件判断。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 22:29 , Processed in 0.050957 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表