VBA根据表的数据列表锁定/解锁每一行

Posted

技术标签:

【中文标题】VBA根据表的数据列表锁定/解锁每一行【英文标题】:VBA to Lock/Unlock each row based on Data list for table 【发布时间】:2019-12-23 15:08:05 【问题描述】:

我需要一些指导。我不想使用数据验证来限制单元格中的数据输入,因为意外输入的警告会降低工作效率。我希望用户能够从表列 C 中的列表中进行选择,并锁定不必要的单元格,以便他们可以快速切换锁定的单元格。我将需要代码来为表中的每一行工作。我将目标范围用作 ActiveSheet.ListObjects,因此它也将继续与下个月复制的工作表一起工作。我也尝试过 C3:C(我的数据确实从第 3 行开始)作为目标范围,但仍然无法使其工作。

我在 C 列(表列标题是付款类型)中的下拉框有 3 种可能性 PDPM- 应在每行锁定 AE:AJ(如果选择) RUGs IV- 应该在每一行锁定 AA:AD 级别 - 应该锁定 AA:AJ

好沮丧!

数据验证 - 没有做我想做的事 目标 C3:C 在这里找到多个代码哈哈

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range(ActiveSheet.ListObjects(1).Name & "[[#All],[Payment Type]]")) Is Nothing Then Exit Sub
    ActiveSheet.Unprotect Password:="Protection"
    Select Case Target.Value
        Case "PDPM"
            Range("AE" & Target.Row & ":AJ" & Target.Row).Locked = True
        Case "RUGs IV"
            Range("AA" & Target.Row & ":AD" & Target.Row).Locked = True
        Case "Levels"
            Range("AA" & Target.Row & ":AJ" & Target.Row).Locked = True
        Case Else
            Range("AA" & Target.Row & ":AJ" & Target.Row).Locked = False
    End Select
    ActiveSheet.Protect Password:="Protection"
End Sub

什么都不做!没有错误

【问题讨论】:

【参考方案1】:

您写道:“意外输入的警告会降低工作效率”。因此,我认为您的解决方案可能只是通过取消选中以下窗口中的复选框来禁用验证错误消息:

如果这还不足以解决您的问题,请随时对此答案发表评论,如果需要,我会编辑我的答案。

编辑:

来自 cmets:

试着用F8逐行调试你的代码,看看代码执行是否正确? 关于仅在 Target 在 C 列时运行代码,您可以在代码开头添加:If Target.Column = 3 then

【讨论】:

我现在看到我可以禁用警告,但它仍然不允许用户像使用锁定单元格一样在不需要填写的区域上切换 @PokeCoder : 你试过用F8逐行调试你的代码,看看代码执行是否正确吗? 终于搞定了。希望找到一种仅在 C 列更改时触发的方法。让我的工作表变慢了很多 @PokeCoder - 太棒了。关于仅在目标位于 C 列时运行代码,您可以在代码开头添加:If Target.Column = 3 then 效果很好,现在工作表速度更快了!

以上是关于VBA根据表的数据列表锁定/解锁每一行的主要内容,如果未能解决你的问题,请参考以下文章

VBA如何根据某单元格内容锁定某区域

jdbc如何锁定某一条数据或者表,不让别人操作?

高分跪求 VBA word中实现循环搜索 并在WORD中找到列表 再根据已有数据自动填写进本行其它列

如何对行 表 数据库加锁

SqlServer查看锁表与解锁

利用vba怎样编写将工作表中第三行到最后一行(不确定)的数据复制并插入到另一个工作表的第二行前?