首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel VBA宏- Pt2

Excel VBA宏- Pt2
EN

Stack Overflow用户
提问于 2020-03-20 01:21:18
回答 1查看 31关注 0票数 1

试图限制用户从具有数据验证列表的3列中选择任何内容

目标范围:(三列L:N),即L3,M3,N3,直至L40,M40,N40。

除非用户首先填充列U中的字段

目标范围: U3-U40

我已经尝试搜索如何锁定单元格选择,除非在过去几天中选择了相应的单元格,但没有结果。考虑到这个问题,是因为目标单元格实际上没有输入一个值,而是使用了一个来自条件格式的列表。

编辑:我不确定我是否说清楚了,但是每一行都应该独立地工作,比如想要锁定L3、M3和N3,除非U3被填充,否则L4、M4和N4也是这样,除非U4是填充的。等

谢谢!安德鲁。

EN

回答 1

Stack Overflow用户

发布于 2020-03-20 02:04:44

在您希望保护的工作表的代码模块中,请输入以下内容.

代码语言:javascript
复制
Private Sub Worksheet_Activate()
    Shield
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Shield
    If Len(Me.[u5]) Then Me.Unprotect '<-- change 'u5' to the cell in column U that unlocks
End Sub

Sub Shield()
    With Me
        .Unprotect
        .Cells.Locked = False
        .[L3:n40].Locked = True
        .Protect , 0, 1, 1, 1, 1, 1, 1, 1, 1, 1
    End With
End Sub

更新

上面的代码可以工作,只键掉一个单元格U5来控制整个范围的L3:N40是否被锁定。

现在我理解了,您希望根据同一行范围L3:N40是否有一个值而独立地锁定/解锁每一行U3:U40

以下代码适用于此新场景.

代码语言:javascript
复制
Private Sub Worksheet_Activate()
    Shield
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Shield
End Sub

Sub Shield()
    Dim c
    With Me
        .Unprotect
        .Cells.Locked = False
        For Each c In .[u3:u40]
            If Len(c) = 0 Then c.Offset(, -9).Resize(, 3).Locked = True
        Next
        .Protect , 0, 1, 1, 1, 1, 1, 1, 1, 1, 1
    End With
End Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60767311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档